1

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

这是一个简单的逻辑,由 (a,b,c) 触发并将 a&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

如果使用intra-delay,结果如下图

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

有人可以解释其中的区别吗?

4

1 回答 1

1

间延迟

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

所以:

#5    d = a & b & c;

将恰好等待5 个时间步,然后执行并将a & b & c分配给d

内部延迟

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

所以:

d = #5 a & b & c;

将存储a & b & c的结果,并在5 个时间步后将其分配给d 。


至于解释你的输出:

间延迟

always 块在执行 a & b & c 之前等待 5 个时间步,并在执行命令时取 5 个时间步之前的值。在 5 个时间步之前,它是 x,因为它是未分配的。在 5 个时间步,它执行 a&b&c,a=1,b=1,c=1(4 个时间步的值)并得出 d=1。

d 将保持此值,直到 5 个进一步的时间步长,它将在 9 个时间步长处执行 a&b&c。这将导致 d=0。d 将在 0 进一步保持 5 个时间步长。

这个循环一直重复,直到你告诉它 $finish。

帧内延迟

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

time=0 a & b & c with a=0,b=0,c=0 导致 d=0 被执行并将在 time=5 时分配。

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

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

于 2013-09-23T09:08:44.140 回答