我有一个特殊的问题,我办公室里的所有人都没有遇到或知道如何处理,也许你们会发现它们的位置。
在我的verilog测试平台中,我有以下比较代码:
if (refFifo[7:0] != DUT.fifo[7:0] && rnd == 1) begin
$display("Error! ref Fifo %h not equal DUT fifo %h after 1 byte", refFifo[7:0], DUT.fifo[7:0]);
$stop;
end
else if (refFifo[15:0] != DUT.fifo[15:0] && rnd == 2) begin
$display("Error! ref Fifo %h not equal DUT fifo %h after 2 byte", refFifo[15:0], DUT.fifo[15:0]);
$stop;
end
......(直到5个字节)
else
$display("Success!");
现在,问题是2的比较始终失败,而其余的比较顺利通过(这与我的运行搞砸了):
'>错误:参考Fifo 090c在2字节之后不等于DUT fifo 090c'
我尝试在过程中更改比较的位置,在比较之前打印值(如果它们在比较期间以某种方式改变),添加括号,将比较范围更改为[7:0]并构建新环境但没有任何帮助或者说明了2字节比较出了什么问题
有没有人遇到过这样的问题?有没有人知道如何解决它?
我在没有优化的情况下运行ModelSim 10.1d_1,以防它与我的谜团有关
更新也在ModelSim 10.0d_1上尝试过,但没有任何帮助。
答案 0 :(得分:0)
我看不出你的代码有什么问题。 &&
的结果必须为1'b1
才能执行$display
。这意味着两次比较的结果也必须为1'b1
,因此resFifo
,DUT.fifo
或rnd
中没有任何未知数。您应该将比较运算符更改为!==
和===
以确认这一点。 ModelSim也不会使用%h
修饰符打印任何X.为了确定,我将其更改为%b
。
除非我错过了一些明显的内容,否则我会删除跨模块引用(DUT.fifo
)并重试。从DUT中获取fifo端口,并对端口值进行比较。这可能有助于追踪问题。
答案 1 :(得分:0)
您的代码对我来说很好。你可能会遇到模拟器错误;如果您可以在测试用例中重现这一点,则应将其提交给Mentor支持。
以下是其他一些尝试:
if
语句之前为DUT值创建一个5字节的局部变量,并在检查中使用它。rnd
。这样表达式就会短路并避免比较你不需要检查的情况下的DUT值。case
上使用rnd
语句。包括默认情况可能有助于调试rnd != 2
。