Verilog中的#延时

前言

之前在做笔试题的时候,有一道题是给代码画波形的,代码如下

  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版权协议,转载请附上原文出处链接和本声明。