阻塞赋值操作符用等号(即 =)表示。“阻塞”是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行。而且阻塞赋值可以看成是一步完成的,即:计算等号右边的值并同时赋给左边变量。从理论上讲,它与后面的赋值语句只有概念上的先后,而无实质上的延迟。若在RHS 加上延迟,则在延迟期间会阻止赋值语句的执行,延迟后才执行赋值,这种赋值语句是不可综合的,在需要综合的模块设计中不可使用这种风格的代码。
非阻塞赋值操作符用小于等于号(即 <=)表示。“非阻塞”是指在进程语句(initial和always)中,当前的赋值语句不会阻断其后的语句。非阻塞语句可以认为是分为两个步骤进行的: ①计算等号右边的表达式的值,(我的理解是:在进入进程后,所有的非阻塞语句的右端表达式同时计算,赋值动作只发生在顺序执行到当前非阻塞语句那一刻)。 ②在本条赋值语句结束时,将等号右边的值赋给等号左边的变量。 非阻塞赋值操作只能用于对寄存器类型变量进行赋值,因此只能用在"initial"块和"always"块等过程块中。非阻塞赋值不允许用于连续赋值。
掌握可综合风格的Verilog模块编程的八个原则会有很大的帮助。在编写时牢记这八个要点可以为绝大多数的Verilog用户解决在综合后仿真中出现的90-100%的冒险竞争问题。 1)时序电路建模时,用非阻塞赋值。 2)锁存器电路建模时,用非阻塞赋值。 3)用always块建立组合逻辑模型时,用阻塞赋值。 4)在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。 5)在同一个always块中不要既用非阻塞赋值又用阻塞赋值。 6)不要在一个以上的always块中为同一个变量赋值。 7)用$strobe系统任务来显示用非阻塞赋值的变量值 8) 在赋值时不要使用 #0延迟
|