如何在SystemC中通过sc_signal中转连接sc_in与sc_out端口?
在SystemC中用sc_signal中转Wrapper端口与核心模块端口的实现方案
你想要的用sc_signal作为中转媒介的实现方式完全可行,SystemC支持端口与信号、信号与端口之间的直接绑定,不需要冗余的read/write操作。以下是符合你需求的具体实现:
核心实现逻辑
1. 输入信号中转(Wrapper的sc_in驱动多个核心模块的sc_in)
Wrapper的sc_in端口可以直接绑定到多个sc_signal,这些信号再分别绑定到对应核心模块的sc_in端口。SystemC中允许一个输入端口驱动多个信号(本质是信号监听端口的变化)。
2. 输出信号中转(单个核心模块驱动Wrapper的sc_out)
每个核心模块的sc_out端口绑定到专属的sc_signal,再将Wrapper的sc_out端口绑定到这个信号。由于每个sc_out对应唯一驱动源,不会触发SystemC的多驱动错误。
完整代码示例
Wrapper模块实现
#include <systemc.h> // 核心模块示例 class CoreModule : public sc_module { public: sc_in<bool> in; sc_out<bool> out; SC_CTOR(CoreModule) { SC_THREAD(process); sensitive << in; } void process() { while(true) { wait(); out.write(in.read()); // 示例逻辑:将输入直接输出 } } }; // Wrapper模块 class Wrapper : public sc_module { public: sc_in<bool> port_in; sc_out<bool> port_out_m0; // 对应m0的输出端口 // 内部中转信号 sc_signal<bool> m0_sig_in_s; sc_signal<bool> m1_sig_in_s; sc_signal<bool> m0_sig_out_s; // 核心模块实例 CoreModule m0; CoreModule m1; SC_CTOR(Wrapper) : m0("m0"), m1("m1") { // 输入中转:Wrapper的port_in绑定到内部信号,再绑定到核心模块的in端口 m0_sig_in_s.bind(port_in); m1_sig_in_s.bind(port_in); m0.in.bind(m0_sig_in_s); m1.in.bind(m1_sig_in_s); // 输出中转:m0的out绑定到内部信号,再绑定到Wrapper的port_out_m0 m0.out.bind(m0_sig_out_s); port_out_m0.bind(m0_sig_out_s); } };
Top层级实现
int sc_main(int argc, char* argv[]) { sc_signal<bool> clock; sc_signal<bool> m0_result; // 实例化Wrapper Wrapper wrapper("wrapper"); // 绑定Top层级信号到Wrapper端口 wrapper.port_in.bind(clock); wrapper.port_out_m0.bind(m0_result); // 模拟时钟驱动 sc_start(0, SC_NS); for(int i=0; i<10; i++) { clock.write(true); sc_start(10, SC_NS); clock.write(false); sc_start(10, SC_NS); cout << "m0_result at " << sc_time_stamp() << ": " << m0_result.read() << endl; } return 0; }
关键说明
- 绑定方式:可以使用
bind()方法,也可以直接用赋值运算符(如m0_sig_in_s = port_in;),两种方式效果完全一致。 - 命名规范保留:通过内部
sc_signal的命名(如m0_sig_in_s、m1_sig_in_s),既能保留Wrapper对外端口的命名规范,也能清晰区分不同核心模块的信号通路。 - 多驱动检查:由于每个输出中转信号仅对应一个核心模块的
sc_out端口,完全符合SystemC对信号单驱动的要求,不会出现运行时错误。
内容的提问来源于stack exchange,提问作者DR. Palson_PH.d
相关产品推荐
相关产品推荐

