微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > modelsim版本不同仿真不同吗

modelsim版本不同仿真不同吗

时间:10-02 整理:3721RD 点击:
本来一直在用6.5的在仿真,前几天老师说用新版本,于是装了10.0的。可是仿真结果竟然与6.5的不太一样。而我用ISIM仿真的结果却和6.5的一样,不知道什么原因,是不是10.0的版本对于verilog语法要求更严格呢?望指点!

确实是如此的,还是需要就具体问题来具体分析。

个人认为这种情况不应该出现,这样不就说明至少有一个软件有问题了吗!



    恩,我也是这么觉得。我觉得ISIM肯定不会有问题,那么就说明10.0c的有问题



    但是我感觉不应该啊,应该是软件的不稳定或者其他原因吧

ISE1.24不支持modelsim10.0,ISE10.0能调用modelsim10.1,但结果有时候出错!如果用modelsim10.1,最好用ISE13.4,回答完毕,我也遇到过类似问题。

modelsim的仿真结果跟ise的版本没有一点关系。
再说用ise调用modelsim实在不是一个好的选择。
碰到这种情况最好保存一下波形,然后比较一下,modelsim是可以比较波形文件的。
也不好说哪个对那个错,最好实际情况实际分析。一般来说高版本错误的可能性稍微小一点。

另外一个可能性就是小编的代码有问题。比方说下面的语法在不同的仿真器就有不同的行为。
代码综合没有问题,仿真有可能有问题。一般认为是编码风格问题 。

always @(posedge clk or posedge rst)
begin
    if(rst)
         a = 0;
   else
         a = b;
end
老版本的modelsim认为这个是一个非阻塞赋值,仿真没有问题。貌似ncsim也认为没有问题。
vcs就把这个认为是一个阻塞赋值。仿真结果和老版本的modelsim查一拍。



    谢谢你的回答啊。我现在的问题是这样的,在modelsim6.5和ISIM中仿真图是这样的


     而在modelsim10.0c中是这样的


     我本来设计的代码是希望按modelsim6.5显示的那样的结果。代码如下:
    always@(posedge CLK)
    if(zhuanzhi_enable)
       begin
       ram1_ena<=(ram1_addra==17'd65280)?1'b0:1'b1;
      if(cntt==17'd256)
       begin
      ram1_addra<=ram1_addra+17'd257;
      cntt<=17'd1;
     end
    else
       begin
       ram1_addra<=ram1_addra+1;
       cntt<=cntt+1;
      end
  end
   else
        ram1_ena<=1'b0;


always@(posedge CLK)
   if(addr_reset_write)
    begin
  ram1_addra<=ram1_addra;
在ram1_addra到65280的时候,之后一直是65280。不知到是不 是放在两个alway模块中了,10.0版本就出现问题了

看起来6.5是错的。不太确定,
你在代码中没有限定ram1_addra到65280以后就不继续增加了。
第二个always块是什么意思,ram1_addra <= ram1_addra ?

不至于吧,我没有试过,是不是因为其它设置不一样呢



   就是在第二个always模块中规定的ram1_addra等于65280时,一直保持65280这个数。这个代码我在6,5和ISIM中仿真都是图1的结果,跟我预想的也一样,在10.0中就出现图2的结果了,在65280的时候,只保持了两个始终。
   你觉得是我代码上出问题了吗?如果要对ram1_addra设定一直重复65280的话,是要放在一个always中吗?



    第二个always块就是为了是ram1_addra一直维持65280这个数啊,
    我在想是不是10.0版本中不允许放在两个always模块中啊?但是6.5和ISIM是可以的啊。

always@(posedge CLK)
    if(zhuanzhi_enable)
       ram1_ena<=(ram1_addra==17'hff00)?1'b0:1'b1;
   else
        ram1_ena<=1'b0;

always@(posedge CLK)
    if(zhuanzhi_enable)
       begin
      if(cntt==17'h100)
       begin
           cntt<=17'd1;
       end
       else
       begin
            cntt<=cntt+1;
       end
  end
   else ;

always@(posedge CLK)
    if(zhuanzhi_enable)
       begin
      if(cntt==17'h100)
       begin
      ram1_addra<=ram1_addra+17'h101;
     end
    else
       begin
       ram1_addra<=ram1_addra+1;
      end
  end
   else;

always@(posedge CLK)
   if(addr_reset_write)
    begin
  ram1_addra<=ram1_addra;

你这个地方属于多重赋值。
两个always块里面都有对ram1_addra的赋值。
第二个图里面zhuanzhi_enable 一直是1,一直在变是正确的啊

搞了七八天,软件卸了装装了卸,总算是把ISE和modelsim整合到一起了。试来试去,感觉上述问题真的是版本的问题,可能是10.0d对verilog语法要求更为严格。可是可是?我该按照ISIM和之前的版本还是按照10.0d的版本啊!事情真是一桩接着一桩啊!

重大消息::
   
     我刚才在10.0d的modelsim.ini文件中将自动优化去掉了,猜怎么着?哈哈!结果和6.5及ISIM版本的一样啦!说明我上述的语法完全是正确的。可谓是经验啊!提供给大家,愿者分享!

我是菜鸟,modelsim的版本和altera的modelsim对应的版本如何对应?

这是由于你代码风格不好,导致程序优化结果不一样.所以改好你的代码风格吧,否则综合的时候一样可能会有这样的问题

oh,那我win7 64位系统使用什么版本的modelsim好一些啊

第二个always是怎么会,“ram1_addra<=ram1_addra”;不能将一个reg 变量仿真两个always中进行赋值操作,10最近也在用,感觉和6.5没什么区别。

mark mark

如果你的语法正确,仿真结果应该一样



    恩,是的。现在好了,原因是新版本modelsim配置文件中将优化没有去掉。



    不要在两个always里对同一个信号赋值。
   千万不要。
即使在TB里也不要。
养成好习惯,否则吃大亏。

还真有可能

学习中!

最好还是一个 sequential always 对应一个 variable,不容易出问题,也就省了多天的折腾。

24L正解,先去看看代码风格,仅能编译通过的Verilog离真正的硬件还有段距离。

这个是有问题的,ram1_addra出现在两个always的块中,这就算仿真通过了,在ise中综合也会通不过的,需要好好的更改自己的编程风格,这个可以参考华为的编程规范

学习了,编码风格

上一篇:在线课程
下一篇:请教formality的问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top