集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2839|回复: 5

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

[复制链接]
FFT 发表于 2010-6-28 00:21:41 | 显示全部楼层 |阅读模式
本帖最后由 fpgaw 于 2010-7-6 05:32 编辑

完整程序如下,如方便可考下仿真,仿真结果是C1和C3这两种不同的延迟方式结果却相同,而与C2结果不同,十分困惑,不知什么原因,望大侠赐教!
module delaytest;
reg[3:0] A;
reg[3:0] B;
reg[3:0] C1;
reg[3:0] D1;
wire [3:0] C2;
wire [3:0] D2;
reg[3:0] C3;
reg[3:0] D3;

initial
begin
    A=0;B=0;
#10 A=5;B=3;
#4  A=4'd7;B=4'd2;
#4 A=4'd6;B=4'd7;
#4  A=4'd5;B=4'd6;
#4  A=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 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-4-30 19:23 , Processed in 0.082888 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表