非阻塞赋值是Verilog作为硬件描述语言与普通编程语言的一个重大区别。 带有两个触发器输出端的简单示例如下 always @ (posedge reset or posedge clock) begin a <= b; b <= a; end endmodule 上面的例子如果没有使用非阻塞赋值,而使用阻塞赋值,那么a和b的数值就不能被交换。a和b在执行完毕后的数值都与之前b的数值相同。在传统的编程语言中,可能需要一个临时的变量,或者使用指针,才能够达到交换两个变量的目的。这里使用了非阻塞赋值,相当于引入了一个隐含的临时变量。第二个非阻塞赋值右边的a是第一句赋值之前的数值,变量交换的目的得以实现。信号边缘敏感的过程语句块内常使用非阻塞赋值,使语句块的诸赋值语句同时进行,虽然功能上似乎可以用阻塞赋值实现,但是仿真时会产生不正常的结果。 通常的过程赋值语句往往只有在触发或循环等情况,即赋值语句被执行到时候,才会使左边的寄存器变量改变一次;而线网变量的连续赋值则一直“监视”右边表达式的变化,一旦其结果发生变化,立即会左边的线网变量更新为此结果。如果需要对寄存器变量进行过程连续赋值,则可以使用Verilog提供的assign或force关键字“强制地”将赋值运算符右边表达式的结果连续不断地施加在左边的寄存器变量上。 线网变量的连续赋值 对线网类型变量的连续赋值是数字电路数据流建模的重要步骤,数字系统不含时的组合逻辑部分可以使用线网的连续赋值描述。线网不能够像寄存器那样储存当前数值,它需要驱动源提供信号,这种驱动是连续不断的,因此线网变量的赋值称为连续赋值,这与寄存器变量在过程中的单次赋值不同,而且所用的运算符也有区别。在Verilog里,线网连续赋值的关键字为assign,下面为一个例子: module and wire out; wire in1, in2; assign out = in1 & in2; 在这个例子中,线网变量out在系统运行过程中总为两个输入线网变量in1和in2逻辑与的结果。 线网的连续赋值可以在关键字assgin附加延迟信息,例如上面的代码可以改为: assign #5 out = in1 & in2; //in1和in2逻辑与的结果在5个时间周期后才施加在out上 时序控制 Verilog能够描述过程中的时序特性,这也是硬件描述语言与普通计算机