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

How to simulate output delay using next_trigger() in SystemC?

我一直在 Stack Overflow 上阅读这个被赞成的答案:

它说将 SC_THREAD 中的 wait(delay, units); 替换为 SC_METHOD 中的 next_trigger(delay, units) 有效。

但是当我尝试时,它不起作用。我正在尝试构建具有 2 ns 输出延迟的加法器模块。加法器输出不再有 2 ns 的输出延迟,而是每 2 ns 更新一次。

设计:

#include "systemc.h"

#define WIDTH  4

SC_MODULE(adder) {
  sc_in<sc_uint<WIDTH> > A, B;  
  sc_out<sc_uint<WIDTH> > OUT;
 
  void add(){
    sc_time t1 = sc_time_stamp();
    int current_time  = t1.value();
    int intermediate = A.read() + B.read();
    next_trigger(2, SC_NS);
    OUT.write(intermediate);
    cout << " SC_METHOD add triggered at "<<sc_time_stamp() <<endl; 
  }
  
  
  SC_CTOR(adder){
    SC_METHOD(add);
    sensitive << A << B;  
  }
};

我知道如何使用 2 种技术模拟延迟:sc_eventSC_METHOD 以及 SC_THREAD 中的 wait 语句,但我想模拟延迟使用next_trigger()。我已经阅读了语言参考手册,但不知道如何去做。

此处在 EDA Playground 上模拟:https://edaplayground.com/x/dFzc

我想我需要在输入改变后触发 2 NS,该怎么做?

您必须手动跟踪状态:

sc_uint<WIDTH> intermediate;

void add(){
    if (A->event() || B->event() || sc_delta_count() == 0) {
        intermediate = A.read() + B.read();
        next_trigger(2, SC_NS);
    } else {
        OUT->write(intermediate);
    }
}

问题是使用 next_trigger 并不能神奇地将 SC_METHOD 转换为 SC_THREAD。总的来说,我发现 next_trigger 的任何用法都不方便,使用 sc_event.

有更好的方法