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

如何在SystemC中使用sc_method模拟输出延迟且不调用next_trigger()?

在SystemC的sc_method模块中不使用next_trigger()实现输出延迟

要实现需求,核心是利用SystemC信号的延迟写入机制——sc_out或sc_signal的write()方法支持传入延迟参数,由信号内部调度完成值的延迟更新,无需依赖next_trigger()重新触发sc_method。以下提供两种可行实现方案:


方案1:直接使用sc_out的延迟写入

直接在process()中调用带延迟参数的write()方法,指定输出值的更新时间:

SC_MODULE(example) {
  sc_in<int> a, b;
  sc_out<int> out;

  void process() {
    // 计算输出逻辑(此处以a+b为例)
    int result = a.read() + b.read();
    // 模拟2纳秒的输出延迟,第二个参数为延迟时长
    out.write(result, sc_time(2, SC_NS));
  }

  SC_CTOR(example) {
    SC_METHOD(process);
    sensitivity << a << b;
  }
};

关键说明

  • 当输入a/b变化时,sc_method会被立即触发执行process()
  • out.write()的延迟参数会让输出值在当前时间点之后的指定时长生效,延迟逻辑由SystemC内核负责调度
  • 全程无需next_trigger(),sc_method仅负责发起延迟写入操作,不需要被重复触发

方案2:使用带延迟属性的中间信号

通过定义一个带延迟策略的sc_signal作为缓冲,将延迟特性绑定到信号本身:

SC_MODULE(example) {
  sc_in<int> a, b;
  sc_out<int> out;
  // 定义带延迟策略的中间信号,允许多写者
  sc_signal<int, SC_MANY_WRITERS, SC_DELAYED> intermediate_signal;

  void process() {
    int result = a.read() + b.read();
    // 正常写入中间信号,延迟由信号自身处理
    intermediate_signal.write(result);
  }

  SC_CTOR(example) {
    SC_METHOD(process);
    sensitivity << a << b;
    // 将输出端口绑定到中间信号,继承延迟特性
    out.bind(intermediate_signal);
    // 设置中间信号的延迟时长为2纳秒
    intermediate_signal.set_delay(sc_time(2, SC_NS));
  }
};

关键说明

  • SC_DELAYED策略会让中间信号的更新延迟指定时长
  • sc_method只需完成计算并写入中间信号,延迟更新由信号内部机制完成
  • 输出端口绑定后会自动同步中间信号的延迟结果,实现输出延迟

内容的提问来源于stack exchange,提问作者anu ch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 18:26:03