阻止与非阻塞分配

时间:2013-09-23 05:15:36

标签: verilog blocking

有人可以解释内部延迟和延迟声明吗?

这是一个简单的逻辑,由(a,b,c)触发并将& b& c分配给d。

module abcd(input a,b,c,output d);
    reg d;
    always @ (a, b, c)
        begin
        // d = #5 a & b & c;  //intra-delay
      #5    d = a & b & c;        //delay statement
        end
endmodule 

module tb;
    reg a,b,c;
    wire d;

    abcd a0(a,b,c,d);
    initial
        begin
            $monitor("time=%d, a=%b, b=%b, c=%b, d=%b",$time,a,b,c,d);
            a=0; b=0; c=0;
            #4 a=1; b=1; c=1;   //4
            #1 a=0; //5
            #1 a=1; //6
            #1 a=0; //7
            #1 a=1; //8
            #1 a=0; //9
            #1 a=1; //10
            #1 a=0; //11
            #1 a=1; //12
            #1 a=0; //13

            #100 $finish;
        end
endmodule

如果使用内部延迟,结果如下所示

time=                   0, a=0, b=0, c=0, d=x
time=                   4, a=1, b=1, c=1, d=x
time=                   5, a=0, b=1, c=1, d=0
time=                   6, a=1, b=1, c=1, d=0
time=                   7, a=0, b=1, c=1, d=0
time=                   8, a=1, b=1, c=1, d=0
time=                   9, a=0, b=1, c=1, d=0
time=                  10, a=1, b=1, c=1, d=0
time=                  11, a=0, b=1, c=1, d=0
time=                  12, a=1, b=1, c=1, d=0
time=                  13, a=0, b=1, c=1, d=0
time=                  15, a=0, b=1, c=1, d=1

如果使用延迟语句,结果如下所示。

time=                   0, a=0, b=0, c=0, d=x
time=                   4, a=1, b=1, c=1, d=x
time=                   5, a=0, b=1, c=1, d=1
time=                   6, a=1, b=1, c=1, d=1
time=                   7, a=0, b=1, c=1, d=1
time=                   8, a=1, b=1, c=1, d=1
time=                   9, a=0, b=1, c=1, d=1
time=                  10, a=1, b=1, c=1, d=0
time=                  11, a=0, b=1, c=1, d=0
time=                  12, a=1, b=1, c=1, d=0
time=                  13, a=0, b=1, c=1, d=0

有人可以解释一下这个区别吗?

1 个答案:

答案 0 :(得分:1)

Inter延迟

等待指定的延迟,然后执行命令。

所以:

#5    d = a & b & c;

将等待 5 时间步长,然后执行并指定 a& b& c d

帧内延迟

立即执行命令并存储该值。在指定的延迟后分配值。

所以:

d = #5 a & b & c;

会存储 a&的结果b& c 并稍后将其分配给 d 完全 5 时间步。


至于解释你的输出:

Inter Delay

在执行& amp;之前,always块等待5次步骤b& c,并在执行命令时在5次步骤之前获取值。在5次步骤之前它是x,因为它是未分配的。在5个时间步长时,它执行& b& c,其中a = 1,b = 1,c = 1(4步时的值),并且d = 1。

d将保持此值直到5个其他时间步长,它将执行& b& c,其值为9个时间步长。这将导致d = 0。 d将继续保持0为5步。

这个循环重复,直到你告诉它完成。

内部延迟

在5次步骤之前没有分配任何内容,因此输出为x。

时间= 0 a& b& c,a = 0,b = 0,c = 0,执行d = 0,并在时间= 5时分配。

时间= 5 a& b& c执行a = 0,b = 1,c = 1导致d = 0。这将在时间= 10时分配。

时间= 10 a& b& c执行a = 1,b = 1,c = 1导致d = 1。这将在时间= 15时分配。