#include "systemc.h" typedef sc_biguint<121> atom; // Value to be pipe delayed. //============================================================================== // esc_dpipe - DELAY PIPELINE FOR AN ARBITRARY CLASS: //============================================================================== template SC_MODULE(esc_dpipe) { public: typedef sc_export > in; // To pipe port type. typedef sc_export > out; // From pipe port type. public: SC_CTOR(esc_dpipe) { m_in(m_pipe[0]); m_out(m_pipe[N-1]); SC_METHOD(rachet); sensitive << m_clk.pos(); } protected: void rachet() { for ( int i = N-1; i > 0; i-- ) { m_pipe[i].write(m_pipe[i-1].read()); } } public: sc_in_clk m_clk; // Pipe synchronization. in m_in; // Input to delay pipe. out m_out; // Output from delay pipe. protected: sc_signal m_pipe[N]; // Pipeline stages. }; // Testbench reader of values from the pipe: SC_MODULE(Reader) { SC_CTOR(Reader) { SC_METHOD(extract) sensitive << m_clk.pos(); dont_initialize(); } void extract() { cout << sc_time_stamp() << ": " << m_from_pipe.read() << endl; } sc_in_clk m_clk; // Module synchronization. sc_in m_from_pipe; // Output from delay pipe. }; // Testbench writer of values to the pipe: SC_MODULE(Writer) { SC_CTOR(Writer) { SC_METHOD(insert) sensitive << m_clk.pos(); m_counter = 0; } void insert() { m_to_pipe.write(m_counter); m_counter++; } sc_in_clk m_clk; // Module synchronization. atom m_counter; // Write value. sc_inout m_to_pipe; // Input for delay pipe. }; // Main program int sc_main(int argc, char* argv[]) { sc_clock clock; esc_dpipe delay("pipe"); Reader reader("reader"); Writer writer("writer"); delay.m_clk(clock); reader.m_clk(clock); reader.m_from_pipe(delay.m_out); writer.m_clk(clock); writer.m_to_pipe(delay.m_in); sc_start(50, SC_NS); return 0; }