有人可以解释内部延迟和延迟声明吗?
这是一个简单的逻辑,由(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
有人可以解释一下这个区别吗?
答案 0 :(得分:1)
等待指定的延迟,然后执行命令。
所以:
#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时分配。