verilog testbench比较导致错误

时间:2013-10-10 08:59:55

标签: verilog

我有一个特殊的问题,我办公室里的所有人都没有遇到或知道如何处理,也许你们会发现它们的位置。

在我的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上尝试过,但没有任何帮助。

2 个答案:

答案 0 :(得分:0)

我看不出你的代码有什么问题。 &&的结果必须为1'b1才能执行$display。这意味着两次比较的结果也必须为1'b1,因此resFifoDUT.fifornd中没有任何未知数。您应该将比较运算符更改为!=====以确认这一点。 ModelSim也不会使用%h修饰符打印任何X.为了确定,我将其更改为%b

除非我错过了一些明显的内容,否则我会删除跨模块引用(DUT.fifo)并重试。从DUT中获取fifo端口,并对端口值进行比较。这可能有助于追踪问题。

答案 1 :(得分:0)

您的代码对我来说很好。你可能会遇到模拟器错误;如果您可以在测试用例中重现这一点,则应将其提交给Mentor支持。

以下是其他一些尝试:

  • if语句之前为DUT值创建一个5字节的局部变量,并在检查中使用它。
  • 更改支票的顺序,以便首先查看rnd。这样表达式就会短路并避免比较你不需要检查的情况下的DUT值。
  • 重构检查以在case上使用rnd语句。包括默认情况可能有助于调试rnd != 2
  • 中的任何问题
  • 删除该行并手动重新输入。或者复制/粘贴另一行并更改数字。我见过一些奇怪的情况,隐藏/坏/ unicode字符会编译运行,但会导致行为异常。