【问题标题】:How do I stack trace info in the case of SystemVerilog+C DPI calls?在 SystemVerilog+C DPI 调用的情况下,如何堆栈跟踪信息?
【发布时间】:2017-08-06 22:16:52
【问题描述】:

我有一个情况,我有 2 个 C 函数。这些 C 函数有许多错误检查场景,我使用 exit(1) 来逃避。系统 verilog 代码中的一百万个位置通过 DPI 调用调用这 2 个 C 函数。

我在我的 C 例程中使用了 execinfo.h 和 backtrace() 函数,但堆栈跟踪 info 显示 C 函数,但在上面它只是显示一些随机的 vcs_exe.sim.1234_1.so 作为主调用函数。

我什至尝试在已发布区域中查找此 vcs_exe.sim.1234.so,但它不指向任何已知的 Sv 文件。

那么,在显示堆栈跟踪时如何获取调用方非 C/SV 函数?

【问题讨论】:

  • 我想尝试这里提出的一些想法。将更新会发生什么

标签: c stack-trace system-verilog system-verilog-dpi


【解决方案1】:

理想情况下,您的模拟器会有一个指南,向您展示如何执行此操作。这可能涉及更改构建脚本中的内容以提供额外的可见性。如果您在手册中找不到任何相关内容,供应商的支持部门应该能够为您提供帮助。

如果您的工具不允许这样做,您可以尝试自己实现一些东西。如果您的 DPI 方法是 context,您可以使用 svScope 概念来找出调用者信息。我没有测试过,但应该是这样的:

svScope scope;
scope = svGetScope();

char *fileName, *lineNumber;
scope.svGetCallerInfo(fileName, lineNumber);

这假设 svGetCallerInfo(...) 返回 true,我猜它应该适用于 context DPI 方法。

【讨论】:

    【解决方案2】:

    它对我使用 vcs 的方式是调用一个导出的函数,该函数将依次调用 $stack。在本例中,它适用于“默认”和“纯”绑定。

    import "DPI-C" context function void testStack();
    
    export "DPI-C" function printStack;
    
    function void printStack;
       $display("====%m=====");
    
       $stack;
    endfunction
    
    module dpis;
       sub sub();
    endmodule // dpis
    
    module sub;
       initial
         testStack();
    endmodule // sub
    
    class Test;
       function void test;
          testStack();
       endfunction // test
    endclass // Abc
    
    program abc;
       Test a = new;
       initial
         a.test();
    endprogram // abc
    

    和'c':

    #include <svdpi.h>
    
    extern void pringStack();
    
    void testStack() {
        svScope scope;
        scope = svGetScopeFromName("$unit");
        svSetScope(scope);
        printStack();
    }
    

    结果如下:

    ====$unit::printStack=====
    #0 in printStack at dpis.sv:9
    #1 in DPI function
    #2 in dpis.sub
    ====$unit::printStack=====
    #0 in printStack at dpis.sv:9
    #1 in DPI function
    #2 in <protected code>
    #3 in abc at dpis.sv:30
    #4 in abc
    

    因此,它以模块实例路径或文件/行号的形式提供有关位置的一些信息。

    【讨论】:

    • 这对我来说有点用......它说 printstack 找不到,但它明确地告诉了哪个 sv 文件调用它......但这是一个开始和探索的好地方......谢谢你
    【解决方案3】:

    如何更改 C 代码使其不会退出 (1),而只是打印错误消息并优雅地返回 SV 域?

    您需要调试问题的是在打印出错误消息的行处设置一个断点,然后逐步回到模拟器中的 SV 域。瞧!现在不仅知道哪个 SV 类对象调用了 C-DPI,还可以查看 SV 类对象的局部变量来帮助诊断问题。

    【讨论】:

    • 这不起作用,因为它们在回归中失败,我希望回归运行转储的堆栈跟踪给我一个关于哪个 SV 函数是有问题的线索。
    猜你喜欢
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    相关资源
    最近更新 更多