硬件编程:非阻塞赋值的细节探究(附带实际代码验证)

问题描述
本人的FPGA工程需要融合多人的程序,其中以Verilog和VHDL为编程语言的模块皆有。而VHDL和Verilog在赋值语句上就有一些区别,虽然都分为非阻塞赋值和阻塞赋值。但是在我仿真过程中发现下图的非阻塞复制在VHDL中不会延后一拍,而Verilog会延后一拍(该发现错误,在后续内容中验证)。
硬件编程:非阻塞赋值的细节探究(附带实际代码验证)_第1张图片
在之前的仿真中发现:
VHDL的赋值不会延后一拍,而Verilog的赋值会延后。由此有了以下的探究过程。

探究过程

之前的疑问是在整个工程中产生的,为了进行探究,我专门写了两个文件分别只进行Verilog和VHDL的非阻塞赋值,并创建sim文件进行仿真。

情景一
a的赋值来源于sim文件中的阻塞赋值

Verilog文件如下:
硬件编程:非阻塞赋值的细节探究(附带实际代码验证)_第2张图片
VHDL文件如下:
硬件编程:非阻塞赋值的细节探究(附带实际代码验证)_第3张图片
在仿真文件中,对a赋值为1,得到结果如下:
硬件编程:非阻塞赋值的细节探究(附带实际代码验证)_第4张图片
可以看到b并不会相对于a延后一拍,而c相对于b延后一拍;Verilog和VHDL没有区别。已经和预想不同(我认为Verilog中b会相对于a延后一拍,而VHDL中不会)。

情景二
在实验室师兄的指导下,我修改了a的赋值处,将其改到两个文件内部,且用非阻塞赋值:
硬件编程:非阻塞赋值的细节探究(附带实际代码验证)_第5张图片
修改方式为添加一个计数器随时钟增长,在计数器增长到100时,通过非阻塞给a赋值。在VHDL中同样如此,得到的仿真结果如下:
硬件编程:非阻塞赋值的细节探究(附带实际代码验证)_第6张图片
可以看到结果如上:b比起a延后一拍,而c又相对于b延后一拍;同样Verilog和VHDL没有区别。

总结

针对上面的两个小实验结果做个总结:
1、Verilog和VHDL的非阻塞赋值没有任何区别(虽然在很多人听起来是个没用的结论,但 确实困扰了一阵子)
2、同样的赋值方式(b<=a,c<=b),b是否相对于a延后一拍取决于a的值如何变化,如果a的赋值是随着时钟上升沿一起进行的(assign语句等非阻塞赋值得到,或来源于ram、fifo等),那么b不会相对于a延后,如果a本身的值是通过非阻塞赋值得到的,那么b会相对于a延后一拍。

你可能感兴趣的:(硬件编程:非阻塞赋值的细节探究(附带实际代码验证))