verilog代码中使用#1延迟
有这样子的一种“神话”,为了修正非阻塞赋值的问题,要求加上#1 delay。因此在一般的非阻塞赋值中经常会看到#1的延迟,工程师的解释是为了防止非阻塞赋值奔溃。实际上,加不加#1都不会导致非阻塞赋值奔溃!在非阻塞赋值的RHS加#1延迟,既有好的原因,也有很多坏的原因。
好的原因1:在非阻塞赋值上加#1,输出变化会有一个时间单位的延迟,便于查看波形。例如,看一下下面的寄存器模型:
`timescale 1ns/1ns
module delay_test ( q , d , clk , rst_n);
input clk , rst_n;
input d;
output reg q;
always@(posedge clk or negedge rst_n) begin
if(!rst_n) q <= #1 1'b0 ;
else q <= #1 d ;
end
endmodule
这个模型在posedge clk之后或在negedge rst_n之后让输出延迟1时间单位(1ns)。这个延迟有效地实现了1ns的clk-to-q 或者rst-to-q 的延迟,查看波形时更容易理解,因为这个延迟让我们更容易理解波形。波形上的小延迟也可以让人更容易地看到时序逻辑输出在时钟沿之前的值,通过把波形查看工具的一条竖线放在时钟沿上,在波形工具左侧就会把每个信号对应的值显示出来,然后把竖线移动到时钟沿1ns之后的位置,就可以看到因为时钟信号更改后的值。
好的原因2ÿ