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 テストを実行するときです。
これをデバッグするのに多くの時間を費やしましたが、役に立ちませんでした。
誰か提案はありますか?