SystemC dont_initialize的应用场景详解(二)
摘要:下面给出一个稍复杂一点的 SystemC 示例,包含三个模块(Producer/Filter/Consumer)和一个 Testbench(Top)模块,演示了在不同的进程类型中如何使用 dont_initialize()
来抑制 time 0 的自动调用。
一、源代码
#include <systemc.h>
#include <iostream>
//------------------------------------------------------------------------------
// DataProducer:等待 start_event,再在时钟上升沿产生一组数据
//------------------------------------------------------------------------------
struct DataProducer : sc_module {
sc_in<bool> clk;
sc_out<int> data_out;
sc_out<bool> valid_out;
sc_event& start_evt;
SC_HAS_PROCESS(DataProducer);
DataProducer(sc_module_name name, sc_event& ev)
: sc_module(name)
, clk("clk")
, data_out("data_out")
, valid_out("valid_out")
, start_evt(ev)
{
// 用 SC_THREAD 且对 start_evt 静态敏感,抑制 time 0 调用
SC_THREAD(producer);
sensitive << start_evt;
dont_initialize();
}
void producer() {
while (true) {
wait(); // 等待 start_evt.notify()
std::cout << sc_time_stamp() << " [Producer] started\n";
for (int i = 0; i < 5; ++i) {
data_out.write(i);
valid_out.write(true);
wait(clk.posedge_event());
std::cout << sc_time_stamp()
<< " [Producer] wrote data = " << i << "\n";
}
valid_out.write(false);
std::cout << sc_time_stamp() << " [Producer] done\n";
}
}
};
//------------------------------------------------------------------------------
// DataFilter:组合逻辑,将有效数据乘 2
//-----------