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 がすべての同時スレッドを処理する必要があります。