【问题标题】:vhdl modelsim return "1" or "0" status to command linevhdl modelsim 向命令行返回“1”或“0”状态
【发布时间】:2019-08-20 13:13:16
【问题描述】:

我正在尝试创建一个自测 VHDL 测试平台,在该测试平台中,我需要对调用 vsim 命令的命令行/shell 设置真或假状态(1 或 0)以传达整体通过/失败状态测试台。

我的模拟器工具是modelsim。有没有办法做到这一点?

【问题讨论】:

  • VHDL 2008 允许使用 std.env.stop(CODE) 或 std.env.finish(CODE) 返回代码。我不知道它们是否与 modelsim 一起正常工作——ActiveHDL 肯定不会正确地将代码返回到 shell。您需要使用 TCL 来检查 TB 中的信号以获得通过/失败状态。
  • 我有一段时间没有使用 modelsim,但是使用 Vivado,您有一个 simulate.log 文件,您可以在其中填充一些 asserts。或者你可以使用 textio 库来填充文件。

标签: vhdl modelsim test-bench


【解决方案1】:

VHDL-2008 标准没有定义应如何使用stop(code)finish(code) 提供的代码。由模拟器供应商决定。我所知道的唯一会返回该值的模拟器是 GHDL。

如果您将 VUnit 与 Modelsim 或任何其他受支持的模拟器一起使用,您将获得针对各种不同错误情况(VHDL 断言、PSL 断言、空指针取消引用等模拟器崩溃等)所期望的退出代码。在EdaPlayground 上可以找到完整的 VHDL 错误案例示例。

您还可以将 VUnit 与 SystemVerilog 和 UVM 一起使用,以达到与 here 相同的目的。请注意,UVM 不提供此类错误检测功能on its own

免责声明:我是 VUnit 的作者之一。

【讨论】:

  • +1 我不是VUnit的作者,所以我可以客观地说VUnit解决了很多这样的烦恼。
【解决方案2】:

执行此操作的常规方法是onbreak 命令。在手册中搜索exit命令,给出了一个例子。基本上,您调用onbreak,执行run -all,代码中的断言失败将让您返回到tcl 并以给定的错误代码退出。

但是,这不是一个好主意。它是特定于模拟器的,给您的报告和控制很少。一个更好的解决方案是从您的测试平台创建一个日志文件,然后将其与一个或多个已知良好的黄金日志文件进行比较。这很容易编写脚本,让您更加确信您的测试台确实做了某事,而不是在不应该做的时候错误地退出。

【讨论】:

    【解决方案3】:

    您可以使用report 语句。

    如果您将模拟状态声明为:

    signal simulation_status : std_logic;
    

    那么你可以使用:

    report "simulation status = " & std_logic'image(simulation_status);
    

    当然,您希望等到模拟结束后再报告状态,在您的测试平台中您可以创建一个合适的流程来执行此操作:

    process
    begin 
        wait for 1000 ns; -- until the end of your simulation
        report "simulation status = " & std_logic'image(simulation_status);
        wait;
    end process;
    

    默认情况下report 的严重性为note,但您也可以使用warningerrorfailure,例如:

    report "simulation status = " & std_logic'image(simulation_status) severity failure; 
    

    当达到report 的严重性为failure 时,它将停止模拟。

    【讨论】:

    • 这并没有回答关于以正确的返回码结束模拟的问题。
    • 我认为他只是想将模拟结果打印到shell,但也许我错了。
    • 在 shell 中,程序以 0(正常)或非 0(错误代码)返回/退出。例如,在 tcl 中,您可以调用 exit 1 以退出模拟器或合成器工具,或者将 1 替换为从模拟/环境中推导出的某个值。 CI 工具通常使用返回码来确定测试/构建是通过还是失败。当您在 CI 日志ERROR: Test has failed program exited with code (0) Test Passed 中看到类似的内容时,这非常令人不安,这可能是因为您的脚本不正确。
    【解决方案4】:

    vsim 支持增强的退出命令,因此要返回错误代码只需使用 exit -force -error_number。

    批处理文件示例:

    vsim -c ... -do "exit -force -code 3"

    IF %ERRORLEVEL% EQU 3 GOTO xxxx:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-15
      • 2019-05-01
      • 1970-01-01
      • 2023-04-06
      • 2016-10-07
      • 1970-01-01
      • 2010-11-12
      • 2021-01-11
      相关资源
      最近更新 更多