verilog测试台比较原因错误
我有一个最奇怪的问题,我办公室的人都没有遇到过,也不知道如何处理,也许你们会发现问题出在哪里 在我的verilog测试台中,我有以下比较代码:verilog测试台比较原因错误,verilog,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 i
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上试用过,但没有任何帮助。我看不出您的代码有任何问题。&
的结果必须是1'b1
,才能执行$display
。这意味着两个比较的结果必须是1'b1
,因此resFifo
、DUT.fifo
或rnd
中没有任何未知项。您应该将比较运算符更改为==
和===
来确认这一点。ModelSim也没有使用%h
修改器打印任何X。我想把它改成%b
,只是为了确定一下
除非我遗漏了一些明显的内容,否则我会删除跨模块引用(DUT.fifo
),然后重试。从DUT中获取fifo端口,并与端口值进行比较。这可能有助于跟踪问题。我觉得您的代码很好。您可能遇到了一个模拟器错误;如果您可以在测试用例中复制此内容,则应将其提交给Mentor支持部门
以下是其他一些可以尝试的东西:
- 在
if
语句之前为DUT值创建一个5字节的局部变量,并在检查中使用该变量
- 更改检查顺序,以便首先查看
rnd
。这样,表达式将短路,并避免在不需要检查的情况下比较DUT值
- 重构检查以使用
rnd
上的case
语句。包括默认情况可能有助于调试rnd!=2
- 删除该行并手动重新键入。或者复制/粘贴另一行并更改数字。我见过一些奇怪的情况,其中一个隐藏的/bad/unicode字符将编译并运行,但会导致某些行为异常
试过!==和%b,但没有用。由于所有其他比较都使用相同的机制(resFifo与DUT.fifo比较),我不认为这会是个问题,但当我在wave上使用它们时,我可以看到它们是相同的。这是一个棘手的问题,不是吗?我会尝试DUT.fifo
的东西-删除跨模块引用,看看它是否有区别。哇,真奇怪。。。如果您添加这样的括号((refFifo[15:0]!=DUT.fifo[15:0])&&rnd==2)以确保操作按正确的顺序完成,该怎么办?这只是黑暗中的一个镜头。。。我要检查的另一件事是查看您的另一段代码是否干扰了这个IF语句。试着从这个文件中取出这个进程,并在它自己的文件中运行它。@Russell我已经尝试了你建议的括号,但没有用。比较过程在一个漫长的过程结束时起作用,请详细说明您将其从文件中删除的意思。还有其他方法可以尝试。这不太可能是一个争用问题,因为ModelSim几乎肯定只会在调度程序到达代码中的事件控件时运行调度程序,而这里没有事件控件。但是,它也可能在到达$display
时运行调度程序,并且另一个进程在显示产生输出之前正在更改resFifo
或DUT.fifo
。通过在$display
之前存储它们的值并打印存储的值来测试这一点。我添加了一个聊天室来讨论这个问题: