【问题标题】:How do I debug Verilog code where simulation functions as intended, but implementation doesn't?如何调试 Verilog 代码,其中模拟功能按预期运行,但实现没有?
【发布时间】:2014-12-25 18:53:30
【问题描述】:

我有点难过。

我有一个相当大的 verilog 模块,我已经在 Simulation (iSim) 中进行了测试,它可以按我的意愿运行。现在我已经在现实生活中使用 SPI 将它连接到另一个设备,有些东西可以工作,有些东西不能。

例如,

我可以使用命令 A 发送一个值,并验证使用命令 B 接收到正确的值。没有问题。

但是如果我使用命令 C 发送一个值,我无法验证它是使用命令 D 接收到的。在模拟中它工作正常,所以我觉得我无法从模拟中获得任何收益。

我查看了逻辑分析仪上的信号,控制器设备(不是我的设计)发送了正确的消息。当我发出命令 B 时,我可以从我的设备中看到正确的返回值(我知道 SPI 无论如何都可以工作)。我不知道 C 或 D 是否正常工作。 D 只返回 0,所以也许 C 一开始就不起作用。没有办法单步执行 Verilog,这个模块被打包为 Vivado 的 IP。

这里有两张截图。首先是模拟(我发送 5,然后发送 2,然后我希望它在下一次发送时返回 4,它确实如此;然后是零)。

这是我在现实中得到的(前两个字节无关紧要,5 是先前发送的值的剩余部分):

这是一个返回正确值的命令 (B)(它响应正在发送的 0x01):

有人对调试有什么建议吗?我真的不知道如何进行。 我无法在模拟中真正重现这种行为。

【问题讨论】:

  • 你是否合成了 RTL 以获得 gates 文件。您应该能够模拟门并获得等效的结果。 RTL 与门的不匹配通常是由于未遵循 RTL 最佳实践。您能否创建一个显示问题的最小示例?

标签: debugging verilog fpga


【解决方案1】:

由于您要综合到 FPGA,因此您可以通过更多选项来调试综合的片上设计。当您使用 Vivado 时,您可以使用 ChipScope 查看系统中的任何信号;允许您像在模拟中一样查看该信号随时间变化的波形(尽管受到更多限制)。通过将 ChipScope IP 包含到您的合成中,您可以将波形数据发送回 Vivaod 软件,该软件将显示您选择的信号的波形,以帮助您查看系统运行时 FPGA 内部发生的情况。 (注意,如果你使用的是 Altera 的东西,你可以使用它们的等价物 SignalTap;它几乎是一样的东西)

网上有很多关于如何整合和运行 ChipScope 的教程,这里有一个来自 Xilinx 网站: http://www.xilinx.com/support/documentation/sw_manuals/xilinx2012_4/ug936-vivado-tutorial-programming-debugging.pdf 许多其他人使用 ISE,但步骤非常相似,因为两者通常都涉及使用 coregen 工具(尽管我认为您也可以通过综合流程添加 ChipScope,因此有多种选择可以将其整合到您的设计中)。

在 FPGA 上,您可以访问实际上是内部逻辑分析器的东西。请注意,它确实会占用 FPGA 上的一些 LE,并且可能会占用相当多的 Block RAM,具体取决于您要取出信号的样本数量。

如果您纯粹为 ASIC 设计,Tim 的回答很好地说明了如何处理片上调试;如果您想了解有关标准非 FPGA 调试解决方案的更多信息,请查看他的回答。

【讨论】:

  • 谢谢!我一直试图让 ChipScope 做任何事情,但事实证明这很困难(例如,一个“困难”的孩子)。我不明白为什么,但它并没有让我查看所有信号。例如,我只能查看控制寄存器的第 5 位和第 7 位。其次,与 Xilinx SDK(ARM 代码)的集成很痛苦。我目前正在为在 C++ 代码中设置断点而斗争,当然它不想这样做。它似乎也没有执行 C++ 代码,只是永远坐在反汇编器中的某个随机点。
  • 有趣;不幸的是,我已经有一段时间没有使用 ChipScope 做过任何事情并且无法访问我可能会帮助您的 FPGA。它是正确的工具,但使用起来可能有点烦人。祝你好运!
【解决方案2】:

在这种情况下,您可能需要考虑添加仅用于调试的额外逻辑。 ('Design for debug') 是用于思考这种逻辑的常用术语。

所以你有一个芯片接口 (SPI),你不知道它是否正常工作。由于它似乎不起作用,因此您不能相信通过此接口进行调试,因为如果您得到一个奇怪的结果,您将无法确定它的含义。

由于您使用的是 FPGA,除了 SPI 之外,还有其他接口可以让您正常工作吗?也许是 7 段显示器、LED、JTAG、VGA 等?

尝试想出其他不需要 SPI 接口的创造性方法来从芯片中获取数据。

  • 如果您有 4 个 LED(A 到 D),您能否在每次收到该类型的命令时点亮每个 LED 1 秒?

  • 能否以 7 段显示 SPI 接收器状态机的当前状态,或者在收到未知命令时指示某些错误代码?

  • 您能否通过 VGA 将传入 SPI 比特流的二进制序列绘制到监视器上?

一旦您可以开始使用数据缩小硬件内部实际发生的情况,您就可以缩小问题空间以检查可能存在的问题。

【讨论】:

  • 自从他使用 Vivado 以来有点酷的事情:他可以使用 ChipScope 模块直接查看内部信号。 ChipScope 是 Xilinx 的 FPGA 调试工具,它将充当逻辑分析器并将波形数据直接发送到 Vivado 软件,让他在芯片上进行调试,而无需实现可能存在自身错误的新接口。如果去 ASIC,有 JTAG 什么的真的很理想,但对于 FPGA 工作,ChipScope 是相当不错的。 (Altera 板上的 SignalTap)
  • 蒂姆,谢谢。我知道 SPI 接口是独立工作的,它的内部工作原理显然与模拟中的工作方式不同。我使用板上的 8 个 LED 来显示 RX 数据。我还检查了命令 C (write) 是否有效,但我认为它不会在寄存器之间传输,这很奇怪。但无论如何,命令 D 返回 0,因为所需的寄存器实际上是 0。我将尝试连接其他一些状态信号。我有VGA接口,但没有实现字符打印接口。
  • @Unn,ChipScope 是一个单独的调试工具,对吧?我现在只是使用 USB 数据线。我要去看看我能不能在实验室里找到一个 ChipScope。
  • @Mewa 不,ChipScope 实际上并不是一个硬逻辑分析仪(尽管拥有其中一个或至少一个示波器并不是一件可怕的事情)。与大多数赛灵思 IP 一样,它是一个可综合的 IP,您可以在设计中对其进行实例化(或在综合过程中将其合并)。如果你在网上看,你可以找到一堆关于如何将它集成到你的设计中的教程。设置并放入芯片后,它将通过您的 USB 串行连接将缓冲的波形数据传回 Vivado。
  • @Unn,太棒了,我会试一试。这种设计快把我逼疯了 :) 我有一个已经在使用的逻辑分析仪,但这应该更有帮助。
【解决方案3】:

在 RTL 仿真中运行正常的代码在 FPGA 中表现不同的原因有多种。考虑所有可能性很重要。上面建议的 Chipscope 绝对是朝着正确方向迈出的一步,它可以给你提示,在哪里可以看得更远。这些原因可能是:

  • FPGA 实现流程未正确执行。您是否有正确的时序约束,是否在实施过程中得到满足,尤其是 P&R 阶段、引脚布局、I/O 属性、正确的时钟属性。通常您可以在检查 FPGA 实现报告时找到提示。这是一个乏味的部分,但有时需要。不正确的实现流程还可能导致 FPGA 实现工作或不工作取决于运行或小的无关更改(多次看到这个问题!)。

  • RTL/网表差异,例如由于在设计中或综合阶段使用不正确的`ifdef,选择不正确的综合文件或在多个地方定义的相同verily模块。通常,可以通过检查已删除的翻牌列表或综合警告来找到提示。

  • RTL 仿真与电路板环境之间存在差异。它们可能是外部的,如接口上的时钟/数据对齐,但也可能是内部的:不正确的 CDC、未正确处理时钟或重置树延迟。请注意,X-propagation 和 CDC 在 RTL 中没有正确处理,除非您以某种方式编码。这些问题通常只能在网表仿真环境中看到。

  • 最后,FPGA板的问题,如时钟源或电源故障,热量也可能是故障。它们值得检查,但我会把它们作为最后的资源。有些人有专门的电路板/FPGA 测试设计,证明可以在可以解决其中一些问题的好电路板上工作。

最后一点,最大的回报是投资于模拟环境。有些人认为,既然FPGA可以用chipscope调试并快速重新编程,那么在良好的仿真环境中是没有必要的。这可能取决于项目的规模,但我的经验是,对于大多数现代 FPGA 项目而言,良好的仿真环境可以节省大量在实验室查看芯片示波器和逻辑分析仪捕获的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    相关资源
    最近更新 更多