FFT 发表于 2010-6-28 00:21:41

延迟时间置于赋值语句不同位置得到的不同结果

本帖最后由 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

HANG 发表于 2010-6-28 02:18:07

原帖由 jason_2001 于 2006-10-9 23:02 发表<br>
完整程序如下,如方便可考下仿真,仿真结果是C1和C3这两种不同的延迟方式结果却相同,而与C2结果不同,十分困惑,不知什么原因,望大侠赐教!<br>
module delaytest;<br>
reg&nbsp; &nbsp;A;<br>
reg&nbsp; &nbsp;B;<br>
reg&nbsp; &nbsp;C1;<br>
reg&nbsp; &nbsp;D1;<br>
wi ... 这个有什么困惑啊<br>
你觉得什么样子才是正确的啊?

HDL 发表于 2010-6-28 02:36:11

按照书上的说法,C1属于内定延迟,C2属于正规延迟,所以仿真出来结果不一样,而我用过程赋值在C3加入了正规延迟,却和C1的结果一样,我不太清楚,结果不一样的原因是延迟方式不一样还是赋值方式(连续赋值或过程赋值)不一样?另外,为什么当A和B分别变为7和2时,C1和C3延迟后却没有变化?谢谢!

ngtim 发表于 2010-6-28 03:19:16

我刚才把你的程序跑了一下, 把延迟从4改到了7,C1就可以从8变成9了。<br>
感觉是你的always块里面A,B的变化并没有引起敏感表的注意,我想是不是说C1之后的#3之内的变化都不会引起always块的工作。<br>
(自己也不是很明白,所以讲的很乱)

HDL 发表于 2010-6-28 05:07:41

学习哈,呵呵

longt 发表于 2010-6-28 06:32:45

想了一下,觉得always@(A or B)被激活的条件应该是遇到上升沿或下降沿(包括变化到z或x),而执行完D1和D3后,正好A和B已经变化到7和2,变化沿已过,所以always@(A or B)没有被激活,仍保持原值,不知是不是这样^_^
页: [1]
查看完整版本: 延迟时间置于赋值语句不同位置得到的不同结果