搜索
bottom↓
回复: 4

Modelsim前仿真波形与NC-verilog/Active-HDL不一致?

[复制链接]

出0入0汤圆

发表于 2012-3-26 22:29:55 | 显示全部楼层 |阅读模式
本帖最后由 xiaocat85 于 2012-3-26 22:40 编辑

本贴我已经在eetop上发过,得到了高手解答,在此贴出来给大家参考。


非常简单的加法运算,code和testbench如下:

module adder(a,b,en,clk,m,m_1,m_2);
input[3:0]a;
input[3:0]b;
input en;
input clk;
output [3:0] m;
output [3:0] m_1;
output [3:0] m_2;

wire [3:0] p;

assign p=a + b;

reg [3:0] m;
reg [3:0] m_1;
reg [3:0] m_2;

always@(posedge clk)
if(en==1'b1)
    begin
     m <= p;
     m_2 <= a + b;
     end
else
    begin
    m<=4'd0;
    m_2<=4'd0;
    end

always@(posedge clk)
m_1<=m;

endmodule




module adder_tb;

reg[3:0]a;
reg[3:0]b;
reg en;
reg clk;
wire[3:0] m;
wire[3:0] m_1;
wire[3:0] m_2;

adder u_adder_0(
.a(a),
.b(b),
.en(en),
.clk(clk),
.m(m),
.m_1(m_1),
.m_2(m_2));

always #1 clk=~clk;

initial begin

#0;
clk=1;
a=4'd3;
b=4'd2;
en=1'b0;

#10;
@(posedge clk)
en=1'b1;

#10;
@(posedge clk)
a=4'd5;

#10;
@(posedge clk)
b=4'd7;

#10;
@(posedge clk)
begin
a=4'd6;
b=4'd1;
end

#10;
@(posedge clk)
en=1'b0;

#20  $stop;
end
endmodule




在testbench中已经写明是“边沿对齐”。Modeslim中仿真波形如下:



m与m_2 波形一样,m_1被打一拍。

但是,在NC-VERILOG和ACTIVE-HDL这两个软件中,仿真结果却不一样:






NC与active-hdl的仿真波形一致,当a或者b在时钟边沿变化的时候,m_2比m要早一拍,m_2是a与b直接输入的,m只是用了一个wire变量p,综合后的电路应该是一样的,但为什么出现这样的结果呢?

不知道modelsim与NC/active-hdl的结果,谁更合理?对于直接输入的input跟经过wire后的input的默认延迟不一样吗,尝试修改NC中的延时模型,结果还是一样。另外在开源仿真器Icarus仿真的结果更诡异,
输入量都默认没有延迟?




修改testbench,去掉“@(posedge clk)”:

module adder_tb;
reg[3:0]a;
reg[3:0]b;
reg en;
reg clk;
wire[3:0] m;
wire[3:0] m_1;
wire[3:0] m_2;

adder u_adder_0(
.a(a),
.b(b),
.en(en),
.clk(clk),
.m(m),
.m_1(m_1),
.m_2(m_2));

always #1 clk=~clk;

initial begin

#0;
clk=1;
a=4'd3;
b=4'd2;
en=1'b0;

#10;
en=1'b1;

#10;
a=4'd5;

#10;
b=4'd7;

#10;
a=4'd6;
b=4'd1;


#10;
en=1'b0;

#20  $stop;
end

endmodule


直接用时间对齐后,NC和ACTIVE-HDL的波形没有变,但modelsim的结果又发生变化了:



波形与上面的Icarus结果的一样了。

是软件中的设置有什么问题吗?到底怎么理解这些差异呢,虽然在实际中肯定会有延时。
软件版本(modelsim:10.0d/6.5g  NC:5.4-S020  ACTIVE-HDL:8.2-SP3    Icarus:0.9.5)


eetop3个高手回复:

it's a easy question. the reason is different simulators has different algorithm to process concurrent statement. you know the simulator must tackle many concurrent statements, but the computer we use is usually one or dual core, so the concurrent statements are processed in procedural one by one. The Verilog language reference manual doesn't give a clear rule, so it depends on simulator supplier to decide the order. Do you understand?


写tb时注意信号的生成不要在pos clk的同时用阻塞赋值(当你的模块是pos clk时)。这就是多事件同时发生:如果都是非阻塞赋值就不存在问题。但阻塞赋值时,不同仿真器的处理顺序不一样,会导致结果差异。
可用3种方式:
1:neg clk 和阻塞赋值;
2:pos clk和非阻塞赋值;
3:pos clk +单位延时 + 阻塞赋值。



将testbench中的赋值,改为:
@(posedge clk);
a <= 。。。。。
b<=。。。。。。
en<=。。。。。。
不要用阻塞赋值,会和DUT中的赋值产生竞争。
不管是什么仿真器,只要结果不一致的地方一般来说都是出现了竞争现象,在没有出现竞争的时候,结果肯定一样,和用什么算法没有关系。
主要是因为:在调度过程中,非阻塞赋值右边表达式的值的计算是和阻塞赋值的处理是同时处理的,但是它们这两件事情谁先谁后是不定的,不同的仿真器可以有不同的处理方法,这是verilog包括systemverilog标准里规定的。
什么意思呢,举个例子来说:在时刻10ns有如下操作:
事件1,阻塞赋值  a = 1 ; b = 2 ;(假设之前a,b的值都是0)
事件2,非阻塞赋值 c <= a + b ;
那么我们把这三个语句写在一起会出现什么样的结果呢?
c的值在此时刻有两种可能:
c可能等于3也可能等于0还可能是其它值,为什么?
因为非阻塞赋值右边表达式a+b的计算和a=1,b=2这三件事情是同时进行的,但是呢这三个事情先后顺序IEEE是没有规定的,仿真器可能如下操作:
(1)a=1;b=2;a+b  此时c的值会是3
(2)a+b;a=1;b=2  此时c的值会是0
(3)a=1;a+b;b=2  此时c的值会是1
(4)b=2;a+b;a=1  此时c的值会是2
(5)a+b;b=2;a=1  此时c的值会是0
.......一共6种可能4种结果
在调度的下一步才是执行用a+b的值来更新c的值,所以非阻塞赋值主要分为两步:第一步是先计算右边表达式的值,第二步才是用这个值更新左边的变量的值,而且这两步是离散的。
而阻塞赋值是一步就完成了计算右边表达式的值并且更新,比如c = a+b ,那么a+b和赋值是一气呵成的,是有个原子步骤,而不是可分割的两个离散的步骤。
多读verilog的standard,体会其中含义,这样才能精通verilog,而不是光会几个if else 等等,表面上懂了,实际上碰到有问题的代码就分析不出来其中问题的源头了,祝进步!


PS:晚上回来后修改了tb的代码,全部改成非阻塞的赋值,4个仿真器的结果一致了,此问题也就得到了完美解答。在编写RTL代码时需要注意 阻塞与非阻塞,在编写tb的时候也需要跟DUT联合起来考虑这个问题,另外如果加入延时参数,阻塞与非阻塞的差异就容易看出来了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-3-26 22:36:21 | 显示全部楼层
用modelsim,没有这样比较过,顶楼主的比较和探索。。。

出0入0汤圆

发表于 2012-3-26 22:42:35 | 显示全部楼层
加入延时参数,阻塞与非阻塞的差异就容易看出来了,谢谢提醒

出0入8汤圆

发表于 2012-3-27 00:49:16 | 显示全部楼层
顶楼主的分享精神,赞!

出0入0汤圆

发表于 2012-3-27 13:12:36 | 显示全部楼层
不错,不错,赞一个
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 11:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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