有人能解释一下延迟和延迟声明吗?
这是一个简单的逻辑,由(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如果使用内部延迟,则结果如下所示
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有人能解释一下这种区别吗?
发布于 2013-09-23 09:08:44
间延迟
等待指定的延迟,然后执行命令。
所以:
#5 d = a & b & c;将完全等待5时间步骤,然后执行并将a &b& c分配给d。
内延迟
立即执行该命令并存储该值。在指定的延迟后分配值。
所以:
d = #5 a & b & c;将存储a &b& c的结果,并将其分配给d,确切地说是5时间步骤。
至于解释你的产出:
间延迟
始终块在执行a&b& c之前等待5个时间步骤,并在执行命令时在5个时间步骤之前获得值。在5个时间步骤之前,它是x,因为它是未分配的。在5个时间步骤中,它使用a=1、b=1、c=1执行a&b&c (值为4个时间步骤),并使用d=1。
D将保持此值,直到5个进一步的时间步骤,其中它将执行a&b&c的值在9个时间步骤。这将导致d=0。D将保持在0,在5个进一步的时间步骤。
这个循环会重复,直到你告诉$finish。
内延迟
在5个时间步骤之前,没有分配任何内容,因此输出为x。
在time=0 a&c和a=0,b=0,c=0引起d=0被执行,并将在time=5分配。
在time=5 a&c与a=0、b=1、c=1导致d=0一起执行。这将在time=10分配。
在time=10 a&c由a=1、b=1、c=1引起d=1执行。这将在time=15分配。
https://stackoverflow.com/questions/18952159
复制相似问题