我有一个实现硬件块的SystemC模块,其中输入按原样指向输出(例如,关于非反相缓冲区)。我说定义了:
sc_in<bool> ip;
sc_out<bool> op;
我是否可以仅使用sc_signal
对象将输入转发到输出(即,不创建带有输入灵敏度列表的方法)?
sc_signal<bool> net;
....
// in the constructor:
ip(net);
op(net);
答案 0 :(得分:3)
您可以,但不应该,因为通常端口应绑定在模块之外。这不是强制执行,而是一种常见的编码约定。这样,模块的用户总是知道会发生什么:&#34;我应该将模块实例的每个端口绑定到某个信号&#34;
分层绑定端口(即输入到子模块输入)被认为是OK。由于顶级模块仍然持有合同,因此它的端口必须绑定到外部&#34;信号。
考虑你的缓冲区,例如:
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;
}
如您所见,以这种方式编写的缓冲区非常无用!
请注意,正如Rahul建议的那样,直接将输入端口连接到输出端口也是一个坏主意:
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;
}
答案 1 :(得分:0)
是的,如果您愿意,可以直接连接op(in)。
答案 2 :(得分:0)
我认为输入敏感列表的方法是这种情况的最佳选择。