通常、ポートはモジュールの外部にバインドする必要があるため、は使用しないでください。これは強制されませんが、一般的なコーディング規則です。そうすれば、モジュールのユーザーはいつも期待していることを知ることができます。「モジュールインスタンスのすべてのポートを何らかの信号にバインドする必要があります」
ポートを階層的にバインドする(つまり、サブモジュール入力に入力する)トップレベルのモジュールは依然として契約を保持しているので、ポートは「外部」信号にバインドされなければなりません。
は、例えば、あなたのバッファを考えてみましょう:
template <typename T>
SC_MODULE(buffer) {
sc_in <int> ip{"ip"};
sc_out <int> op{"out"};
SC_CTOR(buffer) { ip(tmp_sig); op(tmp_sig); }
private:
sc_signal <int> tmp_sig{"sig"};
};
は、私がこのモジュールのテストベンチを書きたいとしよう:
int sc_main(int argc, char * argv[]) {
sc_signal<int> in_signal{"in_signal"};
sc_signal<int> out_signal{"out_signal"};
buffer buffer1{"buffer1"};
// Error ! **ip** is already bound to tmp_sig!!
buffer1.ip(in_signal);
// How can I write to **in** ??
buffer1.ip = 1; // Error! Writing to input port is not defined
sc_start();
return 0;
}
あなたが見ることができるように、書かれたこの方法はかなり無用であるバッファ!
、ラーフルが示唆したように、直接出力ポートに入力ポートを接続することに注意してくださいも悪い考えです:
SC_MODULE(buffer) {
sc_in <int> ip{"ip"};
sc_out <int> op{"op"};
SC_CTOR(buffer) { ip(op); }
};
int sc_main(int argc, char * argv[]) {
sc_signal<int> in_signal{"in_signal"};
sc_signal<int> out_signal{"out_signal"};
buffer buffer1{"buffer1"};
buffer1.ip(in_signal);
// Error, **op** is already bound to in_signal !
buffer1.op(out_signal);
sc_start();
return 0;
}
おかげで、ラーフル。私のモデルでは、信号はサブモジュールの入力にも接続されていました。ポートのバインド数を超えたというエラーが表示されました。私はそのエラーを取り除くために、入力変更時に値を明示的に代入するメソッドを使用しなければなりませんでした。 – ysap