-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して解放したことを確認しました。

また、C 部分をスタンドアロンとして実行してみましたが、エラーはなく、リグレッションはクリーンです。

唯一の問題は、C 回帰ルーチンを呼び出す UVM テストを実行するときです。

これをデバッグするのに多くの時間を費やしましたが、役に立ちませんでした。

誰か提案はありますか?

4

1 に答える 1