在SystemVerilog+;C新闻部的电话?
我有一个情况,我有两个C函数。这些C函数有许多错误检查场景,在这些场景中,我使用出口(1)来逃避。系统verilog代码中有一百万个地方通过DPI调用调用这两个C函数 我在C例程中使用了execinfo.h和backtrace()函数,但是堆栈跟踪 info显示C函数,但上面只显示一些随机vcs_exe.sim.1234_1.so作为主调用函数 我甚至试着在发布区域中查找这个vcs_exe.sim.1234.so,但它没有指向任何已知的Sv文件在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/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文件叫它…但这是一个很好的开始和探索的地方..谢谢你