【SystemC】 cannot have more than one driverエラー

SystemCでバスのモデルを書いてみました。Read/Write Enable信号とアドレスバスはバスマスター側からドライブするから良いのだけど、データバスは双方向からドライブする必要がある。そこでsc_inoutを使って入出力ポートを指定してみました。

SC_MODULE(MOD1) {
    sc_inout<sc_uint<32> > DATA;
};

SC_MODULE(MOD2) {
    sc_signal<sc_uint<32> > DATA;
};

こんな感じにモジュールを作成して、ポートを接続すると、MOD1とMOD2の両方から駆動する事になります。

すると…ラインタイムエラーが…[E:sweat02]正確なメッセージは忘れたけど

*** signal cannot have more than one driver.

つまり、sc_signalには単一のドライバしか接続できないっちゅー事です。
バスって事はRead/Write Enable信号で切り替えるわけやから同時ドライブする事はないのやけど、SystemCのシミュレーション環境では1回のシミュレーション内でシグナルを複数プロセスからドライブする事が許されていないらしい。しかもこれ、SytemC 2.1.0までは許可されていたそうな。つまりSystemC 2.2.0での現象らしいですわ。

さて、困ったぞ。本来はバスプロトコルを変更して対応すべきなんやけど、別に論理合成するわけでもないし、単にアーキテクチャの検討したいだけなんやけどなぁ。

結論から言うとなんと環境変数の設定で、このチェックを外せるらしい。[E:coldsweats02]
SystemC 2.2.0のnoteに書かれていました。

set SC_SIGNAL_WRITE_CHECK=DISABLE

とやってビルドしたバイナリを実行したら無事に動作しました。ちなみに大文字でなければダメでした。いやはや、まさか環境変数とはね。

Author: kan
初めてプログラムらしきものを作ったのは幼稚園の時。それから約40年経ち、現在はデジタル回路設計から信号処理、機械学習まで幅広い経験を活かしてシステムアーキテクトとして活動中。超並列処理、デジタル回路とソフトウェアのバランス設計が得意分野。 Linux/Mac/Windows使い。 C/C++を主要言語として、Unity、Qtなどのフレームワーク興味あり。UI/UXデザイン、STL拡張など。 音声処理、画像処理、技術コンサルは仕事でも請け負います。 一般ソフトウェア開発プロセス、医療機器ソフトウェア開発プロセス作成も進行中。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください