You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:58:11