[SC]SystemC dont_initialize的应用场景详解(二)
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
//-----------