Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SystemVerilog+;C新闻部的电话?_C_Stack Trace_System Verilog_System Verilog Dpi - Fatal编程技术网

在SystemVerilog+;C新闻部的电话?

在SystemVerilog+;C新闻部的电话?,c,stack-trace,system-verilog,system-verilog-dpi,C,Stack Trace,System Verilog,System Verilog Dpi,我有一个情况,我有两个C函数。这些C函数有许多错误检查场景,在这些场景中,我使用出口(1)来逃避。系统verilog代码中有一百万个地方通过DPI调用调用这两个C函数 我在C例程中使用了execinfo.h和backtrace()函数,但是堆栈跟踪 info显示C函数,但上面只显示一些随机vcs_exe.sim.1234_1.so作为主调用函数 我甚至试着在发布区域中查找这个vcs_exe.sim.1234.so,但它没有指向任何已知的Sv文件 那么,在显示堆栈跟踪时,如何获取调用方的非C/SV

我有一个情况,我有两个C函数。这些C函数有许多错误检查场景,在这些场景中,我使用出口(1)来逃避。系统verilog代码中有一百万个地方通过DPI调用调用这两个C函数

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

我甚至试着在发布区域中查找这个vcs_exe.sim.1234.so,但它没有指向任何已知的Sv文件


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

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

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

svScope scope;
scope = svGetScope();

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

这假设
svGetCallerInfo(…)
返回true,我想对于contextDPI方法应该返回true。

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

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();
}
#包括
extern void pringStack();
void testStack(){
svScope范围;
scope=svGetScopeFromName(“$unit”);
svSetScope(范围);
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
=$unit::printStack=====
#dpis处打印堆栈中的0。sv:9
#1在DPI功能中
#2在dpis.sub中
=$单位::打印堆栈=====
#dpis处打印堆栈中的0。sv:9
#1在DPI功能中
#2英寸
#3在dpis的abc中。sv:30
#美国广播公司

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

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


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

这不起作用,因为这些变量在回归中失败,我希望回归运行时转储的堆栈跟踪能够为我提供一条线索,说明哪个SV函数是错误的。我想尝试一下这里提出的一些想法。会更新发生了什么这对我来说很有效。。。它说找不到printstack,但它明确地告诉我们哪个sv文件叫它…但这是一个很好的开始和探索的地方..谢谢你