C代码独立工作。但是当UVM测试调用C DPI时,c变量会搞砸

时间:2014-05-21 22:14:41

标签: c dpi uvm

我正在使用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测试时。

我花了很多时间调试这个无济于事。

有人有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我是这个问题的副本,我尝试了三件事,就重组我的代码而言,我不再看到这种行为了:)

1)使某些关键变量全球化。因此,他们没有C堆栈的业务,可以从堆栈问题中保存

2)有许多函数调用其他函数来做基本的单行内容。减少了函数的数量,从而减少了堆栈混乱的可能性。这对我来说很有用,因为我提到我的功能是做一个衬里的东西......将我的四个函数和15个变量组合成一个4行的功能。

3)第三,我认为最重要的是:

我在for for循环中有这样的陈述

int a = func();

因此,这意味着每次遍历循环时都会创建一个局部变量...堆栈将不必要地增长。

将其更改为:

int a;

循环内部: a = func();

现在,堆栈只会增长一次,这也可以防止堆栈混乱。

这些是我采取的步骤,我不再看到这种行为了。