SystemC 2.3変更点([async_]reset_signal_is)
前回までで、SystemCの thread(process)について語ってきました。
特に SC_CTHREADに対して細かく語ってきたのですが、SystemC-2.3の変更点を
見ていくと面白いことがわかります。
今回の記事はそのような内容になってます。
async_reset_signal_is の追加
SystemC-2.2では「reset_signal_is」というメンバ関数が存在していました。
このメンバ関数は
- 同期リセット
- 「SC_CTHREAD」のみ適用
SC_CTHREAD以外で宣言すると実行時に以下のようなエラーになります。
Error: (E567) reset_signal_is() is only allowed for SC_CTHREADs In file: ../../../../src/sysc/kernel/sc_reset.cpp:186
今回追加された「async_reset_signal_is」は
- 非同期リセット
- SC_METHOD, SC_THREADでも使用可能
となってます。
- サンプルコード
#include <systemc.h> SC_MODULE( hoge ){ sc_in <bool > clk; sc_in <bool > xrst; sc_in <sc_uint<32> > indata1; sc_in <sc_uint<32> > indata2; sc_out <sc_uint<64> > outdata_met; sc_out <sc_uint<64> > outdata_thr; sc_out <sc_uint<64> > outdata_cth; void method_process(); void thread_process(); void cthread_process(); SC_CTOR( hoge ): indata1("indata1") , indata2("indata2") , outdata_met("outdata_met") , outdata_thr("outdata_thr") , outdata_cth("outdata_cth") { SC_METHOD( method_process); sensitive << clk.pos(); async_reset_signal_is(xrst, false); SC_THREAD( thread_process); sensitive << clk.pos(); async_reset_signal_is(xrst, false); SC_CTHREAD( cthread_process, clk.pos() ); async_reset_signal_is(xrst, false); } }; void hoge::method_process(){ if(!xrst) { outdata_met.write(0); } else { outdata_met.write(indata1.read() * indata2.read()); } } void hoge::thread_process(){ while (true) { if(!xrst) { outdata_thr.write(0); } else { outdata_thr.write(indata1.read() * indata2.read()); } wait(); } } void hoge::cthread_process(){ outdata_cth.write(0); wait(); while (true) { outdata_cth.write(indata1.read() * indata2.read()); wait(); } }
- 実行結果
このようになります。
reset_signal_isの拡張
SystemC-2.3より、SC_METHOD や SC_THREADに対しても「reset_signal_is」が使えます。
つまり、先程のコードから SC_THREADを SC_CTHREADのように記述することができます。
- SC_THREADのプロセス内部記述を変更
void hoge::thread_process(){ outdata_thr.write(0); wait(); while (true) { outdata_thr.write(indata1.read() * indata2.read()); wait(); } }
これでも先ほどまでと同じ非同期リセットが有効になりますので、
動作させると、同じ波形になります。
- 「reset_signal_is」に変更
SC_THREADでも使えます。
SC_THREAD( thread_process);
sensitive << clk.pos();
reset_signal_is(xrst, false);
実行した結果がこちらになります。
意図した通りに動作していることがわかると思います。
前回(SC_CTHREADを活かすためにsc_signalに拡張を試みた話)トライしていたわたしは一体。。。 ということは、SC_CTHREAD要らないのでは\(^o^)/
リセット部分と動作部分を分けて書くことが出来るので、
この書き方が推奨されるようになるといいなと思います。