Compare commits
	
		
			1 Commits
		
	
	
		
			916de2a26d
			...
			d330307ed5
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| d330307ed5 | 
| @@ -14,9 +14,11 @@ puts "instantiate testbench elements" | |||||||
| ::BLWizard::generateFramework i_Bus SBLTLM2FT  * {} \ | ::BLWizard::generateFramework i_Bus SBLTLM2FT  * {} \ | ||||||
| 						{ common_configuration:BackBone:/advanced/num_resources_per_target:1 } | 						{ common_configuration:BackBone:/advanced/num_resources_per_target:1 } | ||||||
| ::pct::set_bounds i_Bus 700 300 100 400 | ::pct::set_bounds i_Bus 700 300 100 400 | ||||||
| ::pct::create_connection C_init i_core_complex/initiator i_Bus/i_core_complex_initiator | ::pct::create_connection C_ibus i_core_complex/ibus i_Bus/i_core_complex_ibus | ||||||
| ::pct::set_location_on_owner i_Bus/i_core_complex_initiator 10 | ::pct::set_location_on_owner i_Bus/i_core_complex_ibus 10 | ||||||
| ::pct::create_connection C_targ i_Bus/i_Memory_Generic_MEM i_Memory_Generic/MEM | ::pct::create_connection C_dbus i_core_complex/dbus i_Bus/i_core_complex_dbus | ||||||
|  | ::pct::set_location_on_owner i_Bus/i_core_complex_dbus 10 | ||||||
|  | ::pct::create_connection C_mem i_Bus/i_Memory_Generic_MEM i_Memory_Generic/MEM | ||||||
|  |  | ||||||
| puts "instantiating clock manager" | puts "instantiating clock manager" | ||||||
| set clock "Clk" | set clock "Clk" | ||||||
| @@ -44,7 +46,8 @@ puts "connecting reset/clock" | |||||||
|  |  | ||||||
| puts "setting parameters for DBT-RISE-TGC/Bus and memory components" | puts "setting parameters for DBT-RISE-TGC/Bus and memory components" | ||||||
| ::pct::set_param_value $hardware/i_${top_design_name} {Extra properties} elf_file ${FW_name} | ::pct::set_param_value $hardware/i_${top_design_name} {Extra properties} elf_file ${FW_name} | ||||||
| ::pct::set_address $hardware/i_${top_design_name}/initiator:i_Memory_Generic/MEM 0x0 | ::pct::set_address $hardware/i_${top_design_name}/ibus:i_Memory_Generic/MEM 0x0 | ||||||
|  | ::pct::set_address $hardware/i_${top_design_name}/dbus:i_Memory_Generic/MEM 0x0 | ||||||
| ::BLWizard::updateFramework i_Bus {} { common_configuration:BackBone:/advanced/num_resources_per_target:1 } | ::BLWizard::updateFramework i_Bus {} { common_configuration:BackBone:/advanced/num_resources_per_target:1 } | ||||||
|  |  | ||||||
| ::pct::set_main_configuration Default {{#include <scc/report.h>} {::scc::init_logging(::scc::LogConfig().logLevel(::scc::log::INFO).coloredOutput(false).logAsync(false));} {} {} {}} | ::pct::set_main_configuration Default {{#include <scc/report.h>} {::scc::init_logging(::scc::LogConfig().logLevel(::scc::log::INFO).coloredOutput(false).logAsync(false));} {} {} {}} | ||||||
|   | |||||||
| @@ -330,6 +330,7 @@ SC_HAS_PROCESS(core_complex);// NOLINT | |||||||
| #ifndef CWR_SYSTEMC | #ifndef CWR_SYSTEMC | ||||||
| core_complex::core_complex(sc_module_name const& name) | core_complex::core_complex(sc_module_name const& name) | ||||||
| : sc_module(name) | : sc_module(name) | ||||||
|  | , fetch_lut(tlm_dmi_ext()) | ||||||
| , read_lut(tlm_dmi_ext()) | , read_lut(tlm_dmi_ext()) | ||||||
| , write_lut(tlm_dmi_ext()) | , write_lut(tlm_dmi_ext()) | ||||||
| { | { | ||||||
| @@ -339,7 +340,13 @@ core_complex::core_complex(sc_module_name const& name) | |||||||
|  |  | ||||||
| void core_complex::init(){ | void core_complex::init(){ | ||||||
| 	trc=new core_trace(); | 	trc=new core_trace(); | ||||||
|     initiator.register_invalidate_direct_mem_ptr([=](uint64_t start, uint64_t end) -> void { |     ibus.register_invalidate_direct_mem_ptr([=](uint64_t start, uint64_t end) -> void { | ||||||
|  |         auto lut_entry = fetch_lut.getEntry(start); | ||||||
|  |         if (lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address() + 1) { | ||||||
|  |             fetch_lut.removeEntry(lut_entry); | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  |     dbus.register_invalidate_direct_mem_ptr([=](uint64_t start, uint64_t end) -> void { | ||||||
|         auto lut_entry = read_lut.getEntry(start); |         auto lut_entry = read_lut.getEntry(start); | ||||||
|         if (lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address() + 1) { |         if (lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address() + 1) { | ||||||
|             read_lut.removeEntry(lut_entry); |             read_lut.removeEntry(lut_entry); | ||||||
| @@ -516,13 +523,15 @@ void core_complex::run() { | |||||||
| } | } | ||||||
|  |  | ||||||
| bool core_complex::read_mem(uint64_t addr, unsigned length, uint8_t *const data, bool is_fetch) { | bool core_complex::read_mem(uint64_t addr, unsigned length, uint8_t *const data, bool is_fetch) { | ||||||
|     auto lut_entry = read_lut.getEntry(addr); |     auto& dmi_lut = is_fetch?fetch_lut:read_lut; | ||||||
|  |     auto lut_entry = dmi_lut.getEntry(addr); | ||||||
|     if (lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && addr + length <= lut_entry.get_end_address() + 1) { |     if (lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && addr + length <= lut_entry.get_end_address() + 1) { | ||||||
|         auto offset = addr - lut_entry.get_start_address(); |         auto offset = addr - lut_entry.get_start_address(); | ||||||
|         std::copy(lut_entry.get_dmi_ptr() + offset, lut_entry.get_dmi_ptr() + offset + length, data); |         std::copy(lut_entry.get_dmi_ptr() + offset, lut_entry.get_dmi_ptr() + offset + length, data); | ||||||
|         quantum_keeper.inc(lut_entry.get_read_latency()); |         quantum_keeper.inc(lut_entry.get_read_latency()); | ||||||
|         return true; |         return true; | ||||||
|     } else { |     } else { | ||||||
|  |         auto& sckt = is_fetch? ibus : dbus; | ||||||
|         tlm::tlm_generic_payload gp; |         tlm::tlm_generic_payload gp; | ||||||
|         gp.set_command(tlm::TLM_READ_COMMAND); |         gp.set_command(tlm::TLM_READ_COMMAND); | ||||||
|         gp.set_address(addr); |         gp.set_address(addr); | ||||||
| @@ -537,7 +546,7 @@ bool core_complex::read_mem(uint64_t addr, unsigned length, uint8_t *const data, | |||||||
|             auto preExt = new tlm::scc::scv::tlm_recording_extension(trc->tr_handle, this); |             auto preExt = new tlm::scc::scv::tlm_recording_extension(trc->tr_handle, this); | ||||||
|             gp.set_extension(preExt); |             gp.set_extension(preExt); | ||||||
|         } |         } | ||||||
|         initiator->b_transport(gp, delay); |         sckt->b_transport(gp, delay); | ||||||
|         quantum_keeper.set(delay); |         quantum_keeper.set(delay); | ||||||
|         SCCTRACE(this->name()) << "read_mem(0x" << std::hex << addr << ") : 0x" << (length==4?*(uint32_t*)data:length==2?*(uint16_t*)data:(unsigned)*data); |         SCCTRACE(this->name()) << "read_mem(0x" << std::hex << addr << ") : 0x" << (length==4?*(uint32_t*)data:length==2?*(uint16_t*)data:(unsigned)*data); | ||||||
|         if (gp.get_response_status() != tlm::TLM_OK_RESPONSE) { |         if (gp.get_response_status() != tlm::TLM_OK_RESPONSE) { | ||||||
| @@ -547,9 +556,9 @@ bool core_complex::read_mem(uint64_t addr, unsigned length, uint8_t *const data, | |||||||
|             gp.set_command(tlm::TLM_READ_COMMAND); |             gp.set_command(tlm::TLM_READ_COMMAND); | ||||||
|             gp.set_address(addr); |             gp.set_address(addr); | ||||||
|             tlm_dmi_ext dmi_data; |             tlm_dmi_ext dmi_data; | ||||||
|             if (initiator->get_direct_mem_ptr(gp, dmi_data)) { |             if (sckt->get_direct_mem_ptr(gp, dmi_data)) { | ||||||
|                 if (dmi_data.is_read_allowed()) |                 if (dmi_data.is_read_allowed()) | ||||||
|                     read_lut.addEntry(dmi_data, dmi_data.get_start_address(), |                     dmi_lut.addEntry(dmi_data, dmi_data.get_start_address(), | ||||||
|                                       dmi_data.get_end_address() - dmi_data.get_start_address() + 1); |                                       dmi_data.get_end_address() - dmi_data.get_start_address() + 1); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -579,7 +588,7 @@ bool core_complex::write_mem(uint64_t addr, unsigned length, const uint8_t *cons | |||||||
|             auto preExt = new tlm::scc::scv::tlm_recording_extension(trc->tr_handle, this); |             auto preExt = new tlm::scc::scv::tlm_recording_extension(trc->tr_handle, this); | ||||||
|             gp.set_extension(preExt); |             gp.set_extension(preExt); | ||||||
|         } |         } | ||||||
|         initiator->b_transport(gp, delay); |         dbus->b_transport(gp, delay); | ||||||
|         quantum_keeper.set(delay); |         quantum_keeper.set(delay); | ||||||
|         SCCTRACE() << "write_mem(0x" << std::hex << addr << ") : 0x" << (length==4?*(uint32_t*)data:length==2?*(uint16_t*)data:(unsigned)*data); |         SCCTRACE() << "write_mem(0x" << std::hex << addr << ") : 0x" << (length==4?*(uint32_t*)data:length==2?*(uint16_t*)data:(unsigned)*data); | ||||||
|         if (gp.get_response_status() != tlm::TLM_OK_RESPONSE) { |         if (gp.get_response_status() != tlm::TLM_OK_RESPONSE) { | ||||||
| @@ -589,7 +598,7 @@ bool core_complex::write_mem(uint64_t addr, unsigned length, const uint8_t *cons | |||||||
|             gp.set_command(tlm::TLM_READ_COMMAND); |             gp.set_command(tlm::TLM_READ_COMMAND); | ||||||
|             gp.set_address(addr); |             gp.set_address(addr); | ||||||
|             tlm_dmi_ext dmi_data; |             tlm_dmi_ext dmi_data; | ||||||
|             if (initiator->get_direct_mem_ptr(gp, dmi_data)) { |             if (dbus->get_direct_mem_ptr(gp, dmi_data)) { | ||||||
|                 if (dmi_data.is_write_allowed()) |                 if (dmi_data.is_write_allowed()) | ||||||
|                     write_lut.addEntry(dmi_data, dmi_data.get_start_address(), |                     write_lut.addEntry(dmi_data, dmi_data.get_start_address(), | ||||||
|                                        dmi_data.get_end_address() - dmi_data.get_start_address() + 1); |                                        dmi_data.get_end_address() - dmi_data.get_start_address() + 1); | ||||||
| @@ -606,7 +615,7 @@ bool core_complex::read_mem_dbg(uint64_t addr, unsigned length, uint8_t *const d | |||||||
|     gp.set_data_ptr(data); |     gp.set_data_ptr(data); | ||||||
|     gp.set_data_length(length); |     gp.set_data_length(length); | ||||||
|     gp.set_streaming_width(length); |     gp.set_streaming_width(length); | ||||||
|     return initiator->transport_dbg(gp) == length; |     return dbus->transport_dbg(gp) == length; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool core_complex::write_mem_dbg(uint64_t addr, unsigned length, const uint8_t *const data) { | bool core_complex::write_mem_dbg(uint64_t addr, unsigned length, const uint8_t *const data) { | ||||||
| @@ -618,7 +627,7 @@ bool core_complex::write_mem_dbg(uint64_t addr, unsigned length, const uint8_t * | |||||||
|     gp.set_data_ptr(write_buf.data()); |     gp.set_data_ptr(write_buf.data()); | ||||||
|     gp.set_data_length(length); |     gp.set_data_length(length); | ||||||
|     gp.set_streaming_width(length); |     gp.set_streaming_width(length); | ||||||
|     return initiator->transport_dbg(gp) == length; |     return dbus->transport_dbg(gp) == length; | ||||||
| } | } | ||||||
| } /* namespace SiFive */ | } /* namespace SiFive */ | ||||||
| } /* namespace sysc */ | } /* namespace sysc */ | ||||||
|   | |||||||
| @@ -40,8 +40,10 @@ | |||||||
| #include <tlm/scc/scv/tlm_rec_initiator_socket.h> | #include <tlm/scc/scv/tlm_rec_initiator_socket.h> | ||||||
| #ifdef CWR_SYSTEMC | #ifdef CWR_SYSTEMC | ||||||
| #include <scmlinc/scml_property.h> | #include <scmlinc/scml_property.h> | ||||||
|  | #define SOCKET_WIDTH 32 | ||||||
| #else | #else | ||||||
| #include <cci_configuration> | #include <cci_configuration> | ||||||
|  | #define SOCKET_WIDTH scc::LT | ||||||
| #endif | #endif | ||||||
| #include <tlm> | #include <tlm> | ||||||
| #include <tlm_utils/tlm_quantumkeeper.h> | #include <tlm_utils/tlm_quantumkeeper.h> | ||||||
| @@ -69,7 +71,9 @@ struct core_trace; | |||||||
|  |  | ||||||
| class core_complex : public sc_core::sc_module, public scc::traceable { | class core_complex : public sc_core::sc_module, public scc::traceable { | ||||||
| public: | public: | ||||||
|     tlm::scc::initiator_mixin<tlm::tlm_initiator_socket<32>> initiator{"intor"}; |     tlm::scc::initiator_mixin<tlm::tlm_initiator_socket<SOCKET_WIDTH>> ibus{"ibus"}; | ||||||
|  |  | ||||||
|  |     tlm::scc::initiator_mixin<tlm::tlm_initiator_socket<SOCKET_WIDTH>> dbus{"dbus"}; | ||||||
|  |  | ||||||
|     sc_core::sc_in<bool> rst_i{"rst_i"}; |     sc_core::sc_in<bool> rst_i{"rst_i"}; | ||||||
|  |  | ||||||
| @@ -141,6 +145,7 @@ public: | |||||||
|     , dump_ir{"dump_ir", false} |     , dump_ir{"dump_ir", false} | ||||||
|     , mhartid{"mhartid", 0} |     , mhartid{"mhartid", 0} | ||||||
|     , plugins{"plugins", ""} |     , plugins{"plugins", ""} | ||||||
|  |     , fetch_lut(tlm_dmi_ext()) | ||||||
|     , read_lut(tlm_dmi_ext()) |     , read_lut(tlm_dmi_ext()) | ||||||
|     , write_lut(tlm_dmi_ext()) |     , write_lut(tlm_dmi_ext()) | ||||||
|     { |     { | ||||||
| @@ -185,7 +190,7 @@ protected: | |||||||
|     void ext_irq_cb(); |     void ext_irq_cb(); | ||||||
|     void local_irq_cb(); |     void local_irq_cb(); | ||||||
|     uint64_t last_sync_cycle = 0; |     uint64_t last_sync_cycle = 0; | ||||||
|     util::range_lut<tlm_dmi_ext> read_lut, write_lut; |     util::range_lut<tlm_dmi_ext> fetch_lut, read_lut, write_lut; | ||||||
|     tlm_utils::tlm_quantumkeeper quantum_keeper; |     tlm_utils::tlm_quantumkeeper quantum_keeper; | ||||||
|     std::vector<uint8_t> write_buf; |     std::vector<uint8_t> write_buf; | ||||||
|     core_wrapper* cpu{nullptr}; |     core_wrapper* cpu{nullptr}; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user