#ifndef _TESTBENCH_H_ #define _TESTBENCH_H_ #include #include #include using namespace sc_core; class testbench : public sc_core::sc_module { public: enum { DATA_WIDTH = 32, ADDR_WIDTH = 32 }; using addr_t = typename apb::pin::initiator::addr_t; using data_t = apb::pin::initiator::data_t; using strb_t = sc_dt::sc_uint; sc_core::sc_time clk_period{10, sc_core::SC_NS}; sc_core::sc_clock clk{"clk", clk_period, 0.5, sc_core::SC_ZERO_TIME, true}; sc_core::sc_signal rst_n{"rst_n"}; // initiator side tlm::scc::initiator_mixin> isck{"isck"}; apb::pin::initiator intor_bfm{"intor_bfm"}; // signal accurate bus sc_core::sc_signal PADDR{"PADDR"}; sc_core::sc_signal> PPROT{"PPROT"}; sc_core::sc_signal PNSE{"PNSE"}; sc_core::sc_signal PSELx{"PSELx"}; sc_core::sc_signal PENABLE{"PENABLE"}; sc_core::sc_signal PWRITE{"PWRITE"}; sc_core::sc_signal PWDATA{"PWDATA"}; sc_core::sc_signal PSTRB{"PSTRB"}; sc_core::sc_signal PREADY{"PREADY"}; sc_core::sc_signal PRDATA{"PRDATA"}; sc_core::sc_signal PSLVERR{"PSLVERR"}; sc_core::sc_signal PWAKEUP{"PWAKEUP"}; // target side apb::pin::target tgt_bfm{"tgt_bfm"}; tlm::scc::target_mixin> tsck{"tsck"}; public: SC_HAS_PROCESS(testbench); testbench() : testbench("testbench") {} testbench(sc_core::sc_module_name nm) : sc_core::sc_module(nm) { intor_bfm.PCLK_i(clk); tgt_bfm.PCLK_i(clk); // bfm to signals isck(intor_bfm.tsckt); intor_bfm.PRESETn_i(rst_n); intor_bfm.PADDR_o(PADDR); intor_bfm.PPROT_o(PPROT); intor_bfm.PNSE_o(PNSE); intor_bfm.PSELx_o(PSELx); intor_bfm.PENABLE_o(PENABLE); intor_bfm.PWRITE_o(PWRITE); intor_bfm.PWDATA_o(PWDATA); intor_bfm.PSTRB_o(PSTRB); intor_bfm.PREADY_i(PREADY); intor_bfm.PRDATA_i(PRDATA); intor_bfm.PSLVERR_i(PSLVERR); intor_bfm.PWAKEUP_o(PWAKEUP); tgt_bfm.PRESETn_i(rst_n); tgt_bfm.PADDR_i(PADDR); tgt_bfm.PPROT_i(PPROT); tgt_bfm.PNSE_i(PNSE); tgt_bfm.PSELx_i(PSELx); tgt_bfm.PENABLE_i(PENABLE); tgt_bfm.PWRITE_i(PWRITE); tgt_bfm.PWDATA_i(PWDATA); tgt_bfm.PSTRB_i(PSTRB); tgt_bfm.PREADY_o(PREADY); tgt_bfm.PRDATA_o(PRDATA); tgt_bfm.PSLVERR_o(PSLVERR); tgt_bfm.PWAKEUP_i(PWAKEUP); tgt_bfm.isckt(tsck); tsck.register_b_transport([this](tlm::tlm_base_protocol_types::tlm_payload_type& trans, sc_core::sc_time& d) { if(cb_delegate) cb_delegate(trans, d); }); } void run1() {} void register_b_transport(std::function cb) { cb_delegate = cb; } std::function cb_delegate; }; #endif // _TESTBENCH_H_