我正在使用Synopsis VCS编译器。我的测试平台用UVM编码。我有一组执行一些独立功能的C例程。我在UVM环境中通过DPI导入调用这些C例程。
这是一个简单的代码片段,
uint64_t blah, var1, blah_1;
var1 = UVM_class::C_function_1(uint64_t blah);
blah_1 = UVM_class::C_function_2(uint64_t var1);
if(blah_1 != blah) assert(0);
#
uint64_t C_function_1(uint64_t blah)
{
.....
.....
uint64_t x = function1(...);
return x;
}
#
uint64_t function1(...)
{
uint64_t y;
calculate some stuff
return y;
}
问题在于:如果我将其作为回归的一部分运行,大约10000次它完美无缺。
在第10001次,这就是发生的事情。
function1重新打开正确的值,当我打印y时,我看到了。但是,当我在C_function_1中打印x时,x有类似0xffffff_fffff_y的东西。那是y的值存在,但是附加了一些垃圾。这会扰乱后续涉及x的计算。
我读了很多关于堆栈搞砸了,并确保我malloc&d以及所有指针都是各种函数的参数。
我也尝试将C部分作为独立运行,并且没有错误,回归是干净的。
唯一的问题是当我运行调用C回归例程的UVM测试时。
我花了很多时间调试这个无济于事。
有人有什么建议吗?
答案 0 :(得分:0)
我是这个问题的副本,我尝试了三件事,就重组我的代码而言,我不再看到这种行为了:)
1)使某些关键变量全球化。因此,他们没有C堆栈的业务,可以从堆栈问题中保存
2)有许多函数调用其他函数来做基本的单行内容。减少了函数的数量,从而减少了堆栈混乱的可能性。这对我来说很有用,因为我提到我的功能是做一个衬里的东西......将我的四个函数和15个变量组合成一个4行的功能。
3)第三,我认为最重要的是:
我在for for循环中有这样的陈述
int a = func();
因此,这意味着每次遍历循环时都会创建一个局部变量...堆栈将不必要地增长。
将其更改为:
int a;
循环内部: a = func();
现在,堆栈只会增长一次,这也可以防止堆栈混乱。
这些是我采取的步骤,我不再看到这种行为了。