仿真遇到的一个诡异问题
时间:10-02
整理:3721RD
点击:
把问题简化一下,即:
已知信号a,以及按某种规则生成b。
想检测a、b是否一直相等,一旦发现不相等,就触发一个行为。
代码为
- assign b=a;
- assign delta = a-b;
- initial begin
- @ (delta)
- $display("not equal");
- 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?(好像网上搜不到……)谢谢!
我是
- always @(posedge clk) begin
- #1;
- if (条件) begin
- if (比对两信号不一致)
- $display ("ERROR");
- end
- end
这么干的
懂了,谢谢谢谢!
好像跟仿真的事件所在区域有关,我不会翻译,自己翻看sv标准第四章节 scheduling semantics。
详细第4.8节 竞争冒险。
下面我自己的理解:
你的例子,a变化触发两个事件,一个是更新b,一个是更新delta,仿真工具的算法,如果更新b在前,delta就不会触发变化,如果更新delta在前,delta就可能会总是被触发,两种结果都是正确的,标准说的很清楚。
time slot问题。楼上说的对 sv里有讲
对,的确就是竞争导致的。加延时后问题解决,谢谢楼上几位兄台!