C代码独立工作.但是当UVM测试调用C DPI时,C变量变得混乱



我正在使用概要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和free'd了所有作为各种函数参数的指针。

我还尝试将C部分作为独立运行,没有错误,回归是干净的。

唯一的问题是当我运行UVM测试调用C回归例程。

我花了很多时间来调试这个,但是没有用。

谁有什么建议?

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

1)使某些关键变量全局化。因此,它们与C堆栈无关,可以避免堆栈问题

2)有许多函数调用其他函数来完成基本的一行内容。减少了函数的数量,从而减少了堆栈混乱的机会。这对我来说很有效,因为我提到过我的函数只做一行的事情,把我的四个函数每个函数有15个变量合并成一个4行的函数。

第三点,也是我认为最重要的一点:

我在for循环中有这样的语句

int a = func();

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

改成:

int;

在循环内:

= func ();

现在,堆栈只增长一次,这也可以避免堆栈混乱。

这些是我所采取的步骤,我再也没有看到这种行为了

最新更新