SystemC プロジェクトに取り組んでいるときに、シグナルとポートについて混乱した考えを持っている可能性があることに気付きました。私はこのようなものを持っているとしましょう:
//cell.hpp
SC_MODULE(Cell)
{
sc_in<sc_uint<16> > datain;
sc_in<sc_uint<1> > addr_en;
sc_in<sc_uint<1> > enable;
sc_out<sc_uint<16> > dataout;
SC_CTOR(Cell)
{
SC_THREAD(memory_cell);
sensitive << enable << datain << addr_en;
}
private:
void memory_cell();
};
//cell.cpp
void Cell::memory_cell()
{
unsigned short data_cell=11;
while(true)
{
//wait for some input
wait();
if (enable->read()==1 && addr_en->read()==1)
{
data_cell=datain->read();
}
else
{
if(enable->read()==0 && addr_en->read()==1)
{
dataout->write(data_cell);
}
}
}
}
//test.cpp
SC_MODULE(TestBench)
{
sc_signal<sc_uint<1> > address_en_s;
sc_signal<sc_uint<16> > datain_s;
sc_signal<sc_uint<1> > enable_s;
sc_signal<sc_uint<16> > dataout_s;
Cell cella;
SC_CTOR(TestBench) : cella("cella")
{
// Binding
cella.addr_en(address_en_s);
cella.datain(datain_s);
cella.enable(enable_s);
cella.dataout(dataout_s);
SC_THREAD(stimulus_thread);
}
private:
void stimulus_thread() {
//write a value:
datain_s.write(81);
address_en_s.write(1);
enable_s.write(1);
wait(SC_ZERO_TIME);
//read what we have written:
enable_s.write(0);
address_en_s.write(1);
wait(SC_ZERO_TIME);
cout << "Output value: " << dataout_s.read() << endl;
//let's cycle the memory again:
address_en_s.write(0);
wait(SC_ZERO_TIME);
cout << "Output value: " << dataout_s.read() << endl;
}
};
このモジュールを実行してみましたが、奇妙なことに気付きました (少なくとも、私にとっては奇妙です): 刺激が値 (81) を書き込むとき、wait(SC_ZERO_TIME)
メモリ スレッドがその を見つけたdatain
後enable
、address_enable
値は既に更新されています。これは私が期待していたことです。メモリ スレッドで別のサイクルを実行し、値をメモリ セルポートにenable_es
コピーするために、スティミュラスが値を変更するときにも同じことが起こります。私が理解していないのは、メモリモジュールがそのポートに書き込み、while ループの最初のステートメントに戻った後、スティミュラスモジュールがまだ古い値を持っている理由です。data_cell
dataout
dataout
wait()
dataout_s
チャネル (0) であり、メモリ モジュールによってコピーされたばかりの新しい値 (81) ではありません。次に、メモリ ループの別のサイクルを実行すると (たとえば、スティミュラス チャネルの値を変更するなど)、最終的にデータ出力チャネルが更新されます。
つまり、スティミュラス チャネルに書き込みを行ってからメモリ スレッドに切り替えると、メモリは更新された値を検出するように見えます。しかし、メモリ スレッドがそのポートに書き込みを行った後でスティミュラス スレッドに切り替えた場合、スレッドはそのチャネル (メモリ ポートにバインドされている) で古い値を引き続き認識します。