如何在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
相关产品推荐
相关产品推荐

