前言
之前在做笔试题的时候,有一道题是给代码画波形的,代码如下
always @(posedge clk)begin
#9 DO1 <= DI;
end
always @(posedge clk)begin
DO2 <= #9 DI;
end
always @(posedge clk)begin
DO3 = #9 DI;
end
always @(posedge clk)begin
#9 DO4 = DI;
end
我只会画DO2的波形,即每个时钟上升沿沿采样,然后隔9ns以后输出变为刚才上升沿采样后的值
就是模拟触发器的从时钟到输出的延时Tcq
其他三个就不会了,于是用questasim仿真跑了一下:

首先来看DO1: DO1是先延时,然后再采样,从时钟上升沿开始,延时9ns以后采样,采样的的值即为输出的值,由于延时大于一个时钟周期,所以中间会间隔一个时钟上升沿。
DO3: 阻塞赋值,先采样后延时,在每个时钟上升沿采样,然后延时9个时钟周期给输出赋值,由于采用阻塞赋值,所以这个延时是真正的延时,也就是说过了9ns,输出确实变成之前上升沿采样的值了,但是也是由于采用阻塞赋值,所以9ns已经过去了,中间会经过一个时钟上升沿,但是这个时钟上升沿已经被漏掉了,这个时钟上升沿是不会采样的了。
DO4: 阻塞赋值, 先延时后采样,与DO1一样,
总结:
当延时在前面时,一定是先经过一段时间的延时,然后再进行采样,输出值等于采样的值。
当延时在赋值后面,一定是先采样, 对于非阻塞赋值,可以理解为Tcq, 仍然是每个时钟周期采样。对于阻塞赋值,这个延时就是真正的延时了,当延时大于一个时钟周期的时候,就会漏掉中间的一个采样时钟沿。
版权声明:本文为m0_52090088原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。