延迟时间置于赋值语句不同位置得到的不同结果
本帖最后由 fpgaw 于 2010-7-6 05:32 编辑完整程序如下,如方便可考下仿真,仿真结果是C1和C3这两种不同的延迟方式结果却相同,而与C2结果不同,十分困惑,不知什么原因,望大侠赐教!
module delaytest;
reg A;
reg B;
reg C1;
reg D1;
wire C2;
wire D2;
reg C3;
reg D3;
initial
begin
A=0;B=0;
#10 A=5;B=3;
#4A=4'd7;B=4'd2;
#4 A=4'd6;B=4'd7;
#4A=4'd5;B=4'd6;
#4A=4'd7;B=4'd8;
end
always@(A or B)
begin
C1 = #3 A+B;
D1 = #3 C1+1;
end
assign#3 C2 = A+B;
assign#3 D2 = C2+1;
always@(A or B)
begin
#3 C3 =A+B;
#3 D3 =C3+1;
end
initial
begin
$vcdplusfile("./dedalytest.vpd");
$vcdpluson(0);
end
endmodule 原帖由 jason_2001 于 2006-10-9 23:02 发表<br>
完整程序如下,如方便可考下仿真,仿真结果是C1和C3这两种不同的延迟方式结果却相同,而与C2结果不同,十分困惑,不知什么原因,望大侠赐教!<br>
module delaytest;<br>
reg A;<br>
reg B;<br>
reg C1;<br>
reg D1;<br>
wi ... 这个有什么困惑啊<br>
你觉得什么样子才是正确的啊? 按照书上的说法,C1属于内定延迟,C2属于正规延迟,所以仿真出来结果不一样,而我用过程赋值在C3加入了正规延迟,却和C1的结果一样,我不太清楚,结果不一样的原因是延迟方式不一样还是赋值方式(连续赋值或过程赋值)不一样?另外,为什么当A和B分别变为7和2时,C1和C3延迟后却没有变化?谢谢! 我刚才把你的程序跑了一下, 把延迟从4改到了7,C1就可以从8变成9了。<br>
感觉是你的always块里面A,B的变化并没有引起敏感表的注意,我想是不是说C1之后的#3之内的变化都不会引起always块的工作。<br>
(自己也不是很明白,所以讲的很乱) 学习哈,呵呵 想了一下,觉得always@(A or B)被激活的条件应该是遇到上升沿或下降沿(包括变化到z或x),而执行完D1和D3后,正好A和B已经变化到7和2,变化沿已过,所以always@(A or B)没有被激活,仍保持原值,不知是不是这样^_^
页:
[1]