Adapted simple_system to demonstrate use of tlm_target by reference and
by ingeritance
This commit is contained in:
		| @@ -26,7 +26,6 @@ add_executable (simple_system | ||||
|     sc_main.cpp | ||||
| ) | ||||
|  | ||||
|  | ||||
| # Link the executable to the sc_components library. Since the sc_components library has | ||||
| # public include directories we will use those link directories when building | ||||
| # simple_system | ||||
|   | ||||
| @@ -19,18 +19,16 @@ | ||||
|  | ||||
| #include <util/bit_field.h> | ||||
| #include <sysc/register.h> | ||||
| #include <sysc/tlmtarget.h> | ||||
| #include <sysc/utilities.h> | ||||
| #include <sysc/tlm_target.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| template<unsigned BUSWIDTH=32> | ||||
| class gpio_regs : | ||||
|         public sc_core::sc_module, | ||||
|         public sysc::tlm_target<BUSWIDTH>, | ||||
|         public sysc::resetable | ||||
|  { | ||||
| protected: | ||||
| { | ||||
| public: | ||||
|     // storage declarations | ||||
|     uint32_t r_value; | ||||
|      | ||||
| @@ -86,17 +84,19 @@ protected: | ||||
|     sysc::sc_register<uint32_t> out_xor; | ||||
|      | ||||
|     gpio_regs(sc_core::sc_module_name nm); | ||||
| protected: | ||||
|     sc_core::sc_time clk; | ||||
|  | ||||
|     template<unsigned BUSWIDTH=32> | ||||
|     void registerResources(sysc::tlm_target<BUSWIDTH>& target); | ||||
|  | ||||
| }; | ||||
| } | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
| // member functions | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| template<unsigned BUSWIDTH> | ||||
| gpio_regs<BUSWIDTH>::gpio_regs(sc_core::sc_module_name nm) | ||||
| inline sysc::gpio_regs::gpio_regs(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , sysc::tlm_target<BUSWIDTH>(clk) | ||||
| , NAMED(value, r_value, 0, *this) | ||||
| , NAMED(input_en, r_input_en, 0, *this) | ||||
| , NAMED(output_en, r_output_en, 0, *this) | ||||
| @@ -115,24 +115,27 @@ gpio_regs<BUSWIDTH>::gpio_regs(sc_core::sc_module_name nm) | ||||
| , NAMED(iof_sel, r_iof_sel, 0, *this) | ||||
| , NAMED(out_xor, r_out_xor, 0, *this) | ||||
| { | ||||
|     this->socket_map.addEntry(&value, 0x0UL, 0x4UL); | ||||
|     this->socket_map.addEntry(&input_en, 0x4UL, 0x4UL); | ||||
|     this->socket_map.addEntry(&output_en, 0x8UL, 0x4UL); | ||||
|     this->socket_map.addEntry(&port, 0xcUL, 0x4UL); | ||||
|     this->socket_map.addEntry(&pue, 0x10UL, 0x4UL); | ||||
|     this->socket_map.addEntry(&ds, 0x14UL, 0x4UL); | ||||
|     this->socket_map.addEntry(&rise_ie, 0x18UL, 0x4UL); | ||||
|     this->socket_map.addEntry(&rise_ip, 0x1cUL, 0x4UL); | ||||
|     this->socket_map.addEntry(&fall_ie, 0x20UL, 0x4UL); | ||||
|     this->socket_map.addEntry(&fall_ip, 0x24UL, 0x4UL); | ||||
|     this->socket_map.addEntry(&high_ie, 0x28UL, 0x4UL); | ||||
|     this->socket_map.addEntry(&high_ip, 0x2cUL, 0x4UL); | ||||
|     this->socket_map.addEntry(&low_ie, 0x30UL, 0x4UL); | ||||
|     this->socket_map.addEntry(&low_ip, 0x34UL, 0x4UL); | ||||
|     this->socket_map.addEntry(&iof_en, 0x38UL, 0x4UL); | ||||
|     this->socket_map.addEntry(&iof_sel, 0x3cUL, 0x4UL); | ||||
|     this->socket_map.addEntry(&out_xor, 0x40UL, 0x4UL); | ||||
| } | ||||
|   | ||||
|  | ||||
| template<unsigned BUSWIDTH> | ||||
| inline void sysc::gpio_regs::registerResources(sysc::tlm_target<BUSWIDTH>& target) { | ||||
|     target.addResource(value, 0x0UL, 0x4UL); | ||||
|     target.addResource(input_en, 0x4UL, 0x4UL); | ||||
|     target.addResource(output_en, 0x8UL, 0x4UL); | ||||
|     target.addResource(port, 0xcUL, 0x4UL); | ||||
|     target.addResource(pue, 0x10UL, 0x4UL); | ||||
|     target.addResource(ds, 0x14UL, 0x4UL); | ||||
|     target.addResource(rise_ie, 0x18UL, 0x4UL); | ||||
|     target.addResource(rise_ip, 0x1cUL, 0x4UL); | ||||
|     target.addResource(fall_ie, 0x20UL, 0x4UL); | ||||
|     target.addResource(fall_ip, 0x24UL, 0x4UL); | ||||
|     target.addResource(high_ie, 0x28UL, 0x4UL); | ||||
|     target.addResource(high_ip, 0x2cUL, 0x4UL); | ||||
|     target.addResource(low_ie, 0x30UL, 0x4UL); | ||||
|     target.addResource(low_ip, 0x34UL, 0x4UL); | ||||
|     target.addResource(iof_en, 0x38UL, 0x4UL); | ||||
|     target.addResource(iof_sel, 0x3cUL, 0x4UL); | ||||
|     target.addResource(out_xor, 0x40UL, 0x4UL); | ||||
| } | ||||
|  | ||||
| #endif // _GPIO_REGS_H_ | ||||
|   | ||||
| @@ -19,8 +19,8 @@ | ||||
|  | ||||
| #include <util/bit_field.h> | ||||
| #include <sysc/register.h> | ||||
| #include <sysc/tlmtarget.h> | ||||
| #include <sysc/utilities.h> | ||||
| #include <sysc/tlm_target.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
|   | ||||
| @@ -19,8 +19,8 @@ | ||||
|  | ||||
| #include <util/bit_field.h> | ||||
| #include <sysc/register.h> | ||||
| #include <sysc/tlmtarget.h> | ||||
| #include <sysc/utilities.h> | ||||
| #include <sysc/tlm_target.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
|   | ||||
| @@ -15,22 +15,35 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #include "gpio.h" | ||||
| #include "gen/gpio_regs.h" | ||||
| #include "sysc/utilities.h" | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| gpio::gpio(sc_core::sc_module_name nm) | ||||
| : gpio_regs<>(nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , tlm_target<>(clk) | ||||
| , NAMED(clk_i) | ||||
| , NAMEDD(gpio_regs, regs) | ||||
| { | ||||
|     regs->registerResources(*this); | ||||
|     SC_METHOD(clock_cb); | ||||
|     sensitive<<clk_i; | ||||
|     SC_METHOD(reset_cb); | ||||
|     sensitive<<rst_i; | ||||
| } | ||||
|  | ||||
| gpio::~gpio() { | ||||
| } | ||||
|  | ||||
| void gpio::clock_cb() { | ||||
|     this->clk=clk_i.read(); | ||||
| } | ||||
|  | ||||
| void gpio::reset_cb() { | ||||
|     if(rst_i.read()) | ||||
|         regs->reset_start(); | ||||
|     else | ||||
|         regs->reset_stop(); | ||||
| } | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|   | ||||
| @@ -17,18 +17,24 @@ | ||||
| #ifndef _GPIO_H_ | ||||
| #define _GPIO_H_ | ||||
|  | ||||
| #include "gen/gpio_regs.h" | ||||
| #include <sysc/tlm_target.h> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| class gpio: public gpio_regs<> { | ||||
| class gpio_regs; | ||||
|  | ||||
| class gpio: public sc_core::sc_module, public tlm_target<> { | ||||
| public: | ||||
|     SC_HAS_PROCESS(gpio); | ||||
|     sc_core::sc_in<sc_core::sc_time> clk_i; | ||||
|     sc_core::sc_in<bool>             rst_i; | ||||
|     gpio(sc_core::sc_module_name nm); | ||||
|     virtual ~gpio(); | ||||
| protected: | ||||
|     void clock_cb(); | ||||
|     void reset_cb(); | ||||
|     sc_core::sc_time clk; | ||||
|     std::unique_ptr<gpio_regs> regs; | ||||
| }; | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|   | ||||
| @@ -22,8 +22,11 @@ | ||||
|  | ||||
| #include "simple_system.h" | ||||
| #include <sysc/tracer.h> | ||||
| #include "sysc/scv_tr_db.h" | ||||
| #include <sysc/scv_tr_db.h> | ||||
| #include <sr_report/sr_report.h> | ||||
| #include <boost/program_options.hpp> | ||||
| #include <sysc/report.h> | ||||
| #include <sstream> | ||||
|  | ||||
| using namespace sysc; | ||||
| namespace po = boost::program_options; | ||||
| @@ -35,6 +38,8 @@ const size_t ERROR_UNHANDLED_EXCEPTION = 2; | ||||
| } // namespace | ||||
|  | ||||
| int sc_main(int argc, char* argv[]){ | ||||
| //    sc_report_handler::set_handler(my_report_handler); | ||||
|     sysc::Logger::reporting_level()=log::DEBUG; | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     // CLI argument parsing | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
| @@ -66,11 +71,13 @@ int sc_main(int argc, char* argv[]){ | ||||
|     // instantiate top level | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     simple_system i_simple_system("i_simple_system"); | ||||
|     //sr_report_handler::add_sc_object_to_filter(&i_simple_system.i_master, sc_core::SC_WARNING, sc_core::SC_MEDIUM); | ||||
|  | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     // run simulation | ||||
|     /////////////////////////////////////////////////////////////////////////// | ||||
|     sc_start(sc_core::sc_time(100, sc_core::SC_NS)); | ||||
|  | ||||
|     if(!sc_end_of_simulation_invoked()) sc_stop(); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -32,6 +32,7 @@ simple_system::simple_system(sc_core::sc_module_name nm) | ||||
| , NAMED(i_spi) | ||||
| , NAMED(i_gpio) | ||||
| , NAMED(s_clk) | ||||
| , NAMED(s_rst) | ||||
| { | ||||
|     i_master.intor(i_router.target[0]); | ||||
|     size_t i=0; | ||||
| @@ -43,10 +44,17 @@ simple_system::simple_system(sc_core::sc_module_name nm) | ||||
|     i_uart.clk_i(s_clk); | ||||
|     i_spi.clk_i(s_clk); | ||||
|     i_gpio.clk_i(s_clk); | ||||
|     s_clk.write(sc_core::sc_time(10, sc_core::SC_NS)); | ||||
|     s_clk.write(10_ns); | ||||
|     i_gpio.rst_i(s_rst); | ||||
|     i_master.rst_i(s_rst); | ||||
|  | ||||
|     SC_THREAD(gen_reset); | ||||
| } | ||||
|  | ||||
| simple_system::~simple_system() { | ||||
| void simple_system::gen_reset() { | ||||
|     s_rst=true; | ||||
|     wait(10_ns); | ||||
|     s_rst=false; | ||||
| } | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|   | ||||
| @@ -37,15 +37,19 @@ namespace sysc { | ||||
|  | ||||
| class simple_system: public sc_core::sc_module { | ||||
| public: | ||||
|     SC_HAS_PROCESS(simple_system); | ||||
|  | ||||
|     test_initiator i_master; | ||||
|     router<> i_router; | ||||
|     uart i_uart; | ||||
|     spi i_spi; | ||||
|     gpio i_gpio; | ||||
|     sc_core::sc_signal<sc_core::sc_time> s_clk; | ||||
|     sc_core::sc_signal<bool> s_rst; | ||||
|  | ||||
|     simple_system(sc_core::sc_module_name nm); | ||||
|     virtual ~simple_system(); | ||||
| protected: | ||||
|     void gen_reset(); | ||||
|  | ||||
| #include "gen/e300_plat_t.h" | ||||
| }; | ||||
|   | ||||
| @@ -21,6 +21,7 @@ | ||||
|  */ | ||||
|  | ||||
| #include "test_initiator.h" | ||||
| #include <sr_report/sr_report.h> | ||||
| #include <sysc/utilities.h> | ||||
| #include <array> | ||||
|  | ||||
| @@ -29,15 +30,19 @@ namespace sysc { | ||||
| test_initiator::test_initiator(sc_core::sc_module_name nm) | ||||
| : sc_core::sc_module(nm) | ||||
| , NAMED(intor) | ||||
| , NAMED(rst_i) | ||||
| { | ||||
|     SC_THREAD(run); | ||||
|  | ||||
| } | ||||
|  | ||||
| void test_initiator::run() { | ||||
|     wait(10, sc_core::SC_NS); | ||||
|     if(rst_i.read()==false) wait(rst_i.posedge_event()); | ||||
|     wait(rst_i.negedge_event()); | ||||
|     wait(10_ns); | ||||
|     tlm::tlm_generic_payload gp; | ||||
|     std::array<uint8_t, 4> data; | ||||
|     srInfo()("group", "comm")("read access"); | ||||
|     gp.set_command(tlm::TLM_READ_COMMAND); | ||||
|     gp.set_address(0x10012000); | ||||
|     gp.set_data_ptr(data.data()); | ||||
| @@ -45,7 +50,13 @@ void test_initiator::run() { | ||||
|     gp.set_streaming_width(4); | ||||
|     sc_core::sc_time delay; | ||||
|     intor->b_transport(gp, delay); | ||||
|     wait(10, sc_core::SC_NS); | ||||
|     wait(10_ns); | ||||
|     srWarn()("group", "comm")("write access"); | ||||
|     gp.set_command(tlm::TLM_WRITE_COMMAND); | ||||
|     gp.set_address(0x10012000); | ||||
|     data[0]=0xA5; | ||||
|     intor->b_transport(gp, delay); | ||||
|     wait(10_ns); | ||||
| } | ||||
|  | ||||
| } /* namespace sysc */ | ||||
|   | ||||
| @@ -23,8 +23,8 @@ | ||||
| #ifndef _TEST_INITIATOR_H_ | ||||
| #define _TEST_INITIATOR_H_ | ||||
|  | ||||
| #include <sysc/utilities.h> | ||||
| #include <tlm_utils/simple_initiator_socket.h> | ||||
| #include <systemc> | ||||
|  | ||||
| namespace sysc { | ||||
|  | ||||
| @@ -33,6 +33,7 @@ public: | ||||
|     SC_HAS_PROCESS(test_initiator); | ||||
|     tlm_utils::simple_initiator_socket<test_initiator, 32> intor; | ||||
|  | ||||
|     sc_core::sc_in<bool> rst_i; | ||||
|     test_initiator(sc_core::sc_module_name nm); | ||||
| protected: | ||||
|     void run(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user