在Verilog中有两种赋值方式,一种是连续赋值,另外一种就是过程赋值。这其中还有另外一个概念就是阻塞式赋值和非阻塞式赋值。
首先讲讲自己对连续赋值和过程赋值的理解。
举个例子
module Procedual; reg A,B,Z; always@(B) begin Z = A; A = B; end endmodule | module Continuous; wire A,B,Z; assign Z = A; assign A = B; endmodule |
如果在某一时刻B的值发生了改变,那么左边的赋值模块中两个赋值语句Z=A;A=B;讲依次执行,(这是阻塞式赋值,后面分析非阻塞式赋值“<=”两者的区别)。A在这一时刻将被赋为B的新值,而Z没有得到B的值,因为这句是在A=B;之前执行。如果A发生变化的话,这个赋值模块将不会被执行,因为A不是在always的敏感信号列表里面。
同样的情况在右边的语句中由于B发生变化,引发了assign A=B;的执行,这样继而引发assign Z=A;的执行,这样两个语句都将执行。如果A发生变化,同样会使这两个语句执行。
总结一下:
过程赋值 | 连续赋值 |
在always语句或者initial语句内出现 执行与周围其他语句有关 驱动寄存器变量(reg) 使用“=”或者“<=”赋值符号 | 在一个模块内出现 与其他语句并行执行 在右端操作数的值发生变化的时候执行 驱动线网变量(wire) 有assign关键字 |
阻塞和非阻塞
1:阻塞赋值“=”
阻塞赋值语句是在这句之后所有语句执行之前执行的,也就是这句没有执行的话后面的语句就无法执行,这也是“阻塞”的意思。可以理解为为顺序执行。
2:非阻塞赋值“<=”
非阻塞赋值语句是和后面的相关语句同时执行,可以理解为并行执行。
说明:
(1).时序电路建模时候,使用非阻塞赋值
(2).组合逻辑建模时候,使用阻塞赋值
一般assign语句使用“=”阻塞赋值。
以上内容参考之夏宇闻的《Verilog数字系统设计教程》,这是很好的一本书,讲的比较实在,值得学习FPGA的看看。
文章评论(0条评论)
登录后参与讨论