updates initial CXS test
This commit is contained in:
		
							
								
								
									
										2
									
								
								scc
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								scc
									
									
									
									
									
								
							 Submodule scc updated: fa87148727...dc097db73a
									
								
							@@ -1,5 +1,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define SC_INCLUDE_FX
 | 
					#define SC_INCLUDE_FX
 | 
				
			||||||
#include <cxs/tlm_network_cxs.h>
 | 
					#include <cxs/cxs_tlm.h>
 | 
				
			||||||
#include <scc/cci_util.h>
 | 
					#include <scc/cci_util.h>
 | 
				
			||||||
#include <scc/configurer.h>
 | 
					#include <scc/configurer.h>
 | 
				
			||||||
#include <scc/observer.h>
 | 
					#include <scc/observer.h>
 | 
				
			||||||
@@ -11,54 +12,71 @@
 | 
				
			|||||||
using namespace sc_dt;
 | 
					using namespace sc_dt;
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace cxs;
 | 
					using namespace cxs;
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
enum { PHIT_WIDTH = 664 };
 | 
					 * to be tested:
 | 
				
			||||||
 | 
					 * PHITSIZE: 256, messages: 4*12bytes, 4*16bytes, 4x20bytes, 2x32bytes, 2x48bytes, 2x64bytes
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					enum { PHIT_WIDTH = 256 };
 | 
				
			||||||
struct testbench : public sc_core::sc_module,
 | 
					struct testbench : public sc_core::sc_module,
 | 
				
			||||||
                   public tlm::nw::tlm_network_fw_transport_if<tlm_network_cxs_types>,
 | 
					                   public tlm::nw::tlm_network_fw_transport_if<cxs_packet_types>,
 | 
				
			||||||
                   public tlm::nw::tlm_network_bw_transport_if<tlm_network_cxs_types> {
 | 
					                   public tlm::nw::tlm_network_bw_transport_if<cxs_packet_types> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    using transaction_type = tlm_network_cxs_types::tlm_payload_type;
 | 
					    using transaction_type = cxs_packet_types::tlm_payload_type;
 | 
				
			||||||
    using phase_type = tlm_network_cxs_types::tlm_phase_type;
 | 
					    using phase_type = cxs_packet_types::tlm_phase_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sc_core::sc_clock clk{"clk", 1_ns};
 | 
					    sc_core::sc_clock clk{"clk", 1_ns};
 | 
				
			||||||
    tlm_network_cxs_initiator_socket<PHIT_WIDTH> isck{"isck"};
 | 
					    sc_core::sc_signal<bool> rst{"rst"};
 | 
				
			||||||
 | 
					    cxs_pkt_initiator_socket<> isck{"isck"};
 | 
				
			||||||
 | 
					    cxs_transmitter<PHIT_WIDTH> tx{"tx"};
 | 
				
			||||||
    cxs_channel<PHIT_WIDTH> cxs_chan{"cxs_chan"};
 | 
					    cxs_channel<PHIT_WIDTH> cxs_chan{"cxs_chan"};
 | 
				
			||||||
    tlm_network_cxs_target_socket<PHIT_WIDTH> tsck{"tsck"};
 | 
					    cxs_receiver<PHIT_WIDTH> rx{"rx"};
 | 
				
			||||||
 | 
					    cxs_pkt_target_socket<> tsck{"tsck"};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    testbench(sc_core::sc_module_name const& nm)
 | 
					    testbench(sc_core::sc_module_name const& nm)
 | 
				
			||||||
    : sc_module(nm) {
 | 
					    : sc_module(nm) {
 | 
				
			||||||
        isck(*this);
 | 
					        isck(*this);
 | 
				
			||||||
        tsck(*this);
 | 
					        tsck(*this);
 | 
				
			||||||
        cxs_chan.rcv_clk_i(clk);
 | 
					        isck(tx.tsck);
 | 
				
			||||||
        isck(cxs_chan.tsck);
 | 
					        tx.clk_i(clk);
 | 
				
			||||||
        cxs_chan.isck(tsck);
 | 
					        tx.isck(cxs_chan.tsck);
 | 
				
			||||||
 | 
					        cxs_chan.isck(rx.tsck);
 | 
				
			||||||
 | 
					        rx.clk_i(clk);
 | 
				
			||||||
 | 
					        rx.rst_i(rst);
 | 
				
			||||||
 | 
					        rx.isck(tsck);
 | 
				
			||||||
        SC_HAS_PROCESS(testbench);
 | 
					        SC_HAS_PROCESS(testbench);
 | 
				
			||||||
        SC_THREAD(run);
 | 
					        SC_THREAD(run);
 | 
				
			||||||
        cxs_chan.channel_delay.set_value(100_ns);
 | 
					        cxs_chan.channel_delay.set_value(100_ns);
 | 
				
			||||||
 | 
					        rx.max_credit.set_value(15);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void run() {
 | 
					    void run() {
 | 
				
			||||||
        cxs::tlm_network_cxs_payload trans;
 | 
					        rst = true;
 | 
				
			||||||
        trans.set_command(cxs::CXS_CMD::DATA);
 | 
					        for(auto i = 0u; i < 11u; ++i)
 | 
				
			||||||
 | 
					            wait(clk.posedge_event());
 | 
				
			||||||
 | 
					        rst = false;
 | 
				
			||||||
 | 
					        cxs::cxs_packet_payload trans;
 | 
				
			||||||
        sc_core::sc_time t = sc_core::SC_ZERO_TIME;
 | 
					        sc_core::sc_time t = sc_core::SC_ZERO_TIME;
 | 
				
			||||||
        isck->b_transport(trans, t);
 | 
					        isck->b_transport(trans, t);
 | 
				
			||||||
        tlm_cxs_shared_ptr trans_ptr = tlm_mm_cxs::get().allocate();
 | 
					        wait(t);
 | 
				
			||||||
 | 
					        cxs_pkt_shared_ptr trans_ptr = cxs_pkt_mm::get().allocate();
 | 
				
			||||||
 | 
					        trans_ptr->get_data().resize(16);
 | 
				
			||||||
        auto phase{tlm::nw::REQUEST};
 | 
					        auto phase{tlm::nw::REQUEST};
 | 
				
			||||||
        auto status = isck->nb_transport_fw(*trans_ptr, phase, t);
 | 
					        auto status = isck->nb_transport_fw(*trans_ptr, phase, t);
 | 
				
			||||||
        if(status == tlm::TLM_UPDATED) {
 | 
					 | 
				
			||||||
        sc_assert(phase == tlm::nw::CONFIRM);
 | 
					        sc_assert(phase == tlm::nw::CONFIRM);
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        wait(target_received_evt);
 | 
					        wait(target_received_evt);
 | 
				
			||||||
 | 
					        wait(1_us);
 | 
				
			||||||
        sc_core::sc_stop();
 | 
					        sc_core::sc_stop();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void b_transport(transaction_type& trans, sc_core::sc_time& t) override { SCCINFO(SCMOD) << "Received blocking transaction"; }
 | 
					    void b_transport(transaction_type& trans, sc_core::sc_time& t) override {
 | 
				
			||||||
 | 
					        SCCINFO(SCMOD) << "Received blocking transaction at local time " << (sc_core::sc_time_stamp() + t);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tlm::tlm_sync_enum nb_transport_fw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t) override {
 | 
					    tlm::tlm_sync_enum nb_transport_fw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t) override {
 | 
				
			||||||
        if(phase == tlm::nw::INDICATION) {
 | 
					        if(phase == tlm::nw::REQUEST) {
 | 
				
			||||||
            SCCINFO(SCMOD) << "Received non-blocking transaction with phase " << phase.get_name();
 | 
					            SCCINFO(SCMOD) << "Received non-blocking transaction with phase " << phase.get_name();
 | 
				
			||||||
            target_received_evt.notify(sc_core::SC_ZERO_TIME);
 | 
					            target_received_evt.notify(sc_core::SC_ZERO_TIME);
 | 
				
			||||||
            phase = tlm::nw::RESPONSE;
 | 
					            phase = tlm::nw::CONFIRM;
 | 
				
			||||||
            return tlm::TLM_UPDATED;
 | 
					            return tlm::TLM_UPDATED;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        throw std::runtime_error("illegal request in forward path");
 | 
					        throw std::runtime_error("illegal request in forward path");
 | 
				
			||||||
@@ -66,6 +84,7 @@ struct testbench : public sc_core::sc_module,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    tlm::tlm_sync_enum nb_transport_bw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t) override {
 | 
					    tlm::tlm_sync_enum nb_transport_bw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t) override {
 | 
				
			||||||
        if(phase == tlm::nw::CONFIRM) {
 | 
					        if(phase == tlm::nw::CONFIRM) {
 | 
				
			||||||
 | 
					            confirmation_evt.notify(sc_core::SC_ZERO_TIME);
 | 
				
			||||||
            return tlm::TLM_ACCEPTED;
 | 
					            return tlm::TLM_ACCEPTED;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        throw std::runtime_error("illegal response in backward path");
 | 
					        throw std::runtime_error("illegal response in backward path");
 | 
				
			||||||
@@ -73,11 +92,12 @@ struct testbench : public sc_core::sc_module,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    unsigned int transport_dbg(transaction_type& trans) override { return 0; }
 | 
					    unsigned int transport_dbg(transaction_type& trans) override { return 0; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sc_core::sc_event confirmation_evt;
 | 
				
			||||||
    sc_core::sc_event target_received_evt;
 | 
					    sc_core::sc_event target_received_evt;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int sc_main(int sc_argc, char* sc_argv[]) {
 | 
					int sc_main(int sc_argc, char* sc_argv[]) {
 | 
				
			||||||
    scc::init_logging(scc::log::INFO);
 | 
					    scc::init_logging(scc::log::DEBUG);
 | 
				
			||||||
    scc::configurer cfg("");
 | 
					    scc::configurer cfg("");
 | 
				
			||||||
    scc::tracer trc("cxs_tlm");
 | 
					    scc::tracer trc("cxs_tlm");
 | 
				
			||||||
    testbench tb("tb");
 | 
					    testbench tb("tb");
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user