之前一直对assign语句的延迟作用有一些疑问,特别是在指定的延迟时间内,输入有多次变化时。虽然都说在延迟时间内,输入如果有变化,就取最新的值,但看实际波形时,老感觉对不上。
后来搜到 https://blog.csdn.net/qq_20222919/article/details/107576195 这篇文章,感觉比较靠谱,说是输入停止变化后,延迟指定时间,再取最新的输入值做运算输出。
这里再做进一步分析。
"输入停止变化",应该是说变化后,至少要维持指定的延迟时间这么长。
第一个用例,延迟5个时间单位。
源码:
module D(out, a);
output out;
input a;
assign #5 out = a;
endmodule
测试代码:
module stimulus;
reg a;
wire out;
D d1(out, a);
initial
begin
a = 1'b0;
#10;
#1;
a = 1'b1;
#2;
a = 1'b0;
#3;
a = 1'b1;
#4;
a = 1'b0;
#5;
a = 1'b1;
#6;
a = 1'b0;
#20;
$finish;
end
endmodule
波形图如下:
![](https://img.haomeiwen.com/i12092667/d8376ddad624133b.jpg)
第二个用例,其他都一模一样,就是延迟改成6个时间单位。
波形图如下:
![](https://img.haomeiwen.com/i12092667/9c6cd9408472a096.jpg)
第三个用例,延迟改成10个时间单位。
波形图如下:
![](https://img.haomeiwen.com/i12092667/f915024e953d5fed.jpg)
网友评论