微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > 仿真遇到的一个诡异问题

仿真遇到的一个诡异问题

时间:10-02 整理:3721RD 点击:

把问题简化一下,即:
已知信号a,以及按某种规则生成b。
想检测a、b是否一直相等,一旦发现不相等,就触发一个行为。

代码为

  1. assign b=a;
  2. assign delta = a-b;

  3. initial begin
  4. @ (delta)
  5. $display("not equal");
  6. end

复制代码


显然,因为b恒等于a,所以delta应该一直为0,所以$display("not equal");应该永远不被触发。
但在实际仿真中发现,如果用vcs仿真,那么$display("not equal");会被不断地触发,触发位置是b的跳变沿。
而如果用ModelSim仿真,结果就一切正常。

怀疑是某处竞争导致,以至于不同的编译器仿出不同的结果。
但这应该是一个很基本的case,按说编译器不应该如此弱智才是……
或者在vcs中该怎样避免遇到的问题呢?

恳请高人指点,谢谢!

何不用 clock qualify 過?

遇到过,我是加上了‘#1’在做检测的

您好!请问兄台可以具体写一下code吗?(#1是加在哪个位置?)谢谢!

您好!请问clock qualify是什么呢?兄台可以给个链接吗?谢谢!

请问,什么是clock qualify?(好像网上搜不到……)谢谢!

我是

  1. always @(posedge clk) begin
  2. #1;
  3. if (条件) begin
  4. if (比对两信号不一致)
  5. $display ("ERROR");
  6. end
  7. end

复制代码


这么干的

懂了,谢谢谢谢!

好像跟仿真的事件所在区域有关,我不会翻译,自己翻看sv标准第四章节 scheduling semantics。
详细第4.8节 竞争冒险。
下面我自己的理解:
你的例子,a变化触发两个事件,一个是更新b,一个是更新delta,仿真工具的算法,如果更新b在前,delta就不会触发变化,如果更新delta在前,delta就可能会总是被触发,两种结果都是正确的,标准说的很清楚。

time slot问题。楼上说的对 sv里有讲

对,的确就是竞争导致的。加延时后问题解决,谢谢楼上几位兄台!

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

网站地图

Top