SystemC で単純な NAND モジュールを開発しています。仕様では4nsの遅延が必要なので、SC_THREAD
次のように「待機」ステートメントとを含むプロセスで記述しようとしました。
//file: nand.h
#include "systemc.h"
SC_MODULE(nand2){
sc_in<bool> A, B;
sc_out<bool> F;
void do_nand2(){
bool a, b, f;
a = A.read();
b = B.read();
f = !(a && b);
wait(4, SC_NS);
F.write(f);
}
SC_CTOR(nand2){
SC_THREAD(do_nand2);
sensitive << A << B;
}
};
シミュレートするために、次のように、NAND の刺激を出力する別のモジュールを作成しました。
//file: stim.h
#include "systemc.h"
SC_MODULE(stim){
sc_out<bool> A, B;
sc_in<bool> Clk;
void stimGen(){
wait();
A.write(false);
B.write(false);
wait();
A.write(false);
B.write(true);
wait();
A.write(true);
B.write(true);
wait();
A.write(true);
B.write(false);
}
SC_CTOR(stim){
SC_THREAD(stimGen);
sensitive << Clk.pos();
}
};
これら 2 つのモジュールを説明すると、最上位のモジュール (ある場所sc_main
) は次のようになります。
//file: top.cpp
#include "systemc.h"
#include "nand.h"
#include "stim.h"
int sc_main(int argc, char* argv[]){
sc_signal<bool> ASig, BSig, FSig;
sc_clock Clk("Clock", 100, SC_NS, 0.5);
stim Stim("Stimulus");
Stim.A(ASig); Stim.B(BSig); Stim.Clk(Clk);
nand2 nand2("nand2");
nand2.A(ASig); nand2.B(BSig); nand2.F(FSig);
sc_trace_file *wf = sc_create_vcd_trace_file("sim");
sc_trace(wf, Stim.Clk, "Clock");
sc_trace(wf, nand2.A, "A");
sc_trace(wf, nand2.B, "B");
sc_trace(wf, nand2.F, "F");
sc_start(400, SC_NS);
sc_close_vcd_trace_file(wf);
return 0;
}
コードはエラーなしでコンパイルおよびシミュレートされ.vcd
ましたが、gtkwave でファイルを視覚化すると、出力 (F) が 1 でスタックし、シミュレーションの最初の遅延のみが表示されます。
コードにエラーがあるかどうかをテストするために、「待機」ステートメントを削除してファイルに変更SC_THREAD
し、再度シミュレートしました。正しい結果が得られましたが、もちろん遅延はありませんでした。SC_METHOD
nand.h
私は何を間違っていますか?