如何在 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_event
和 SC_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
.
有更好的方法
我一直在 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_event
和 SC_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
.