1

SystemC の使用中に、セグ フォールトが繰り返し発生します。初期化中に値を 0 に設定しました。テストベンチの操作中に、モジュール (proc) でこの値を 1 に設定しています。これは、別のモジュール imem のポートに接続される sc_signal 変数です。入力ポートのタイプは sc_in です。

理論的には、この割り当てにより入力ポートにも 1 が割り当てられ、.read() 関数を使用してアクセスしようとすると、1 が返され、imem 内の別の内部 sc_signal に割り当てられるはずです。

ただし、代わりにセグフォルトが発生しています。

gdb によると、これは私が行った sc_start(10,SC_NS) 呼び出し中に発生しています。これは値を更新する必要があるためです。特に .read() のリターンを実行しようとしていることがトレースされます。スタック リターンの簡単なスニペットを次に示します (g++ および gdb6.6、64 ビット システムを使用した -O0 および -g3)。

#0  0x00000000004c79a6 in sc_core::sc_in<bool>::read (this=0x881a38) at <redacted>/systemC/install_x64/include/sysc/communication/sc_signal_ports.h:515
#1  0x00000000004e4b60 in imem::reg_write (this=0x881910) at ../src/abstract_proc/mems/imem.cpp:33
#2  0x000000000050578e in sc_core::sc_simcontext::crunch(bool) ()
#3  0x00000000005042b4 in sc_core::sc_simcontext::simulate(sc_core::sc_time const&) ()
#4  0x00000000004c65b0 in sc_core::sc_start (duration=10, time_unit=sc_core::SC_NS)

ポート宣言:

SC_MODULE (imem) {
...
sc_in<bool> en_wr;

関数宣言 (SC_CTOR(imem) で発生):

SC_METHOD(reg_write);
sensitive << clk.pos();

それが死ぬ場所の機能:

void imem::reg_write() {
data_wr_d.write(data_wr.read());
wr_addr_d.write(addr_wr.read());
cout << "imem::reg_write()" << std::endl;
en_wr_d.write(en_wr.read());
cout << "imem::reg_write() done" << std::endl;
}

imem::reg_write()セグフォルトが発生する直前にコンソールに出力されます。

imem のポートの宣言とバインディング:

imem_i = new imem("imem");
imem_i->en_wr(imem_wr_en);

駆動信号の宣言:

sc_signal<bool> imem_wr_en;

何か案は?考え?私が試すべきことは?

編集:コード行を追加または削除すると、セグフォルトが消えることがあります。ある特定のインスタンスでは、デバッグcoutステートメントを追加して問題を修正しました<< std::endlが、末尾に a を追加した後、セグ フォールトが返されました。これは、私が競合状態にあることを暗示していましたが、理論的には SystemC がすべての同時スレッドを処理する必要があります。

4

2 に答える 2

0

メモリの問題のように聞こえます。どこかでバッファをオーバーランすると、何かが起こる可能性があります-あなたが説明したようなことでさえ、ランダムな場所でプログラムがクラッシュします。

良い単体テストができたことを本当に願っています。valgrind を使用してメモリの問題を検出してみてください。

于 2010-10-28T21:01:19.957 に答える