-1

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

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

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

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

有人有什么建议吗?

4

1 回答 1

0

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

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

2) 有许多函数调用其他函数来完成基本的单线工作。减少了函数的数量,从而减少了堆栈混乱的机会。这对我有用,因为我提到我的函数正在做一个衬里的东西......将我的四个函数与 15 个变量组合成一个具有 4 行的单个函数。

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

我的 for 循环中有这样的声明

int a = func();

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

将其更改为:

诠释一个;

在循环内部: a =func();

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

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

于 2014-06-02T17:25:36.137 回答