updated documentation
This commit is contained in:
		
							parent
							
								
									e6b95298cd
								
							
						
					
					
						commit
						afbf317941
					
				|  | @ -12,7 +12,9 @@ Brief description of the modules: | ||||||
| * Registers: Implements the register file, PC register & CSR registers | * Registers: Implements the register file, PC register & CSR registers | ||||||
| * RISC_V_execute: Executes ISA instructions | * RISC_V_execute: Executes ISA instructions | ||||||
| * Instruction: Decodes instruction and acces to any instruction field | * Instruction: Decodes instruction and acces to any instruction field | ||||||
| * Simulation: Top-level entity that builds & starts the simulation | * Simulator: Top-level entity that builds & starts the simulation | ||||||
|  | * BusCtrl: Simple bus manager | ||||||
|  | * Trace: Simple trace peripheral | ||||||
| 
 | 
 | ||||||
| Current performance is about 284500 instructions / sec in a Core-i5@2.2Ghz | Current performance is about 284500 instructions / sec in a Core-i5@2.2Ghz | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,8 +1,8 @@ | ||||||
| /*!
 | /**
 | ||||||
|    \file Trace.h |    @file BusCtrl.h | ||||||
|    \brief Basic TLM-2 Trace module |    @brief Basic TLM-2 Bus controller | ||||||
|    \author Màrius Montón |    @author Màrius Montón | ||||||
|    \date September 2018 |    @date September 2018 | ||||||
| */ | */ | ||||||
| 
 | 
 | ||||||
| #ifndef __BUSCTRL_H__ | #ifndef __BUSCTRL_H__ | ||||||
|  | @ -25,22 +25,54 @@ using namespace sc_core; | ||||||
| using namespace sc_dt; | using namespace sc_dt; | ||||||
| using namespace std; | using namespace std; | ||||||
| 
 | 
 | ||||||
| 
 | /**
 | ||||||
|  |  * Memory mapped Trace peripheral address | ||||||
|  |  */ | ||||||
| #define TRACE_MEMORY_ADDRESS 0x40000000 | #define TRACE_MEMORY_ADDRESS 0x40000000 | ||||||
| 
 | /**
 | ||||||
|  |  * @brief Simple bus controller | ||||||
|  |  * | ||||||
|  |  * This module manages instructon & data bus. It has 2 target ports, | ||||||
|  |  * cpu_instr_socket and cpu_data_socket that receives accesses from CPU and | ||||||
|  |  * has 2 initiator ports to access main Memory and Trace module. | ||||||
|  |  * It will be expanded with more ports when required (for DMA, | ||||||
|  |  * other peripherals, etc.) | ||||||
|  |  */ | ||||||
| class BusCtrl: sc_module { | class BusCtrl: sc_module { | ||||||
| public: | public: | ||||||
|     // TLM-2 socket, defaults to 32-bits wide, base protocol
 |     /**
 | ||||||
|  |      * @brief TLM target socket CPU instruction memory bus | ||||||
|  |      */ | ||||||
|     tlm_utils::simple_target_socket<BusCtrl> cpu_instr_socket; |     tlm_utils::simple_target_socket<BusCtrl> cpu_instr_socket; | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * @brief TLM target socket CPU data memory bus | ||||||
|  |      */ | ||||||
|     tlm_utils::simple_target_socket<BusCtrl> cpu_data_socket; |     tlm_utils::simple_target_socket<BusCtrl> cpu_data_socket; | ||||||
|     tlm_utils::simple_initiator_socket<BusCtrl> data_memory_socket; | 
 | ||||||
|  |     /**
 | ||||||
|  |      * @brief TLM initiator socket Main memory bus | ||||||
|  |      */ | ||||||
|  |     tlm_utils::simple_initiator_socket<BusCtrl> memory_socket; | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * @brief TLM initiator socket Trace module | ||||||
|  |      */ | ||||||
|     tlm_utils::simple_initiator_socket<BusCtrl> trace_socket; |     tlm_utils::simple_initiator_socket<BusCtrl> trace_socket; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     // Constructor
 |     /**
 | ||||||
|  |      * @brief constructor | ||||||
|  |      * @param name module's name | ||||||
|  |      */ | ||||||
|  | 
 | ||||||
|     BusCtrl(sc_module_name name); |     BusCtrl(sc_module_name name); | ||||||
| 
 | 
 | ||||||
|     // TLM-2 blocking transport method
 |     /**
 | ||||||
|  |      * @brief TLM-2 blocking mechanism | ||||||
|  |      * @param trans transtractino to perform | ||||||
|  |      * @param delay delay associated to this transaction | ||||||
|  |      */ | ||||||
|     virtual void b_transport( tlm::tlm_generic_payload& trans, sc_time& delay ); |     virtual void b_transport( tlm::tlm_generic_payload& trans, sc_time& delay ); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |  | ||||||
|  | @ -21,7 +21,11 @@ | ||||||
| using namespace sc_core; | using namespace sc_core; | ||||||
| using namespace sc_dt; | using namespace sc_dt; | ||||||
| using namespace std; | using namespace std; | ||||||
| 
 | /**
 | ||||||
|  |  * @brief Simple trace peripheral | ||||||
|  |  * | ||||||
|  |  * This peripheral outputs to cout any character written to its unique register | ||||||
|  |  */ | ||||||
| class Trace: sc_module { | class Trace: sc_module { | ||||||
| public: | public: | ||||||
|     // TLM-2 socket, defaults to 32-bits wide, base protocol
 |     // TLM-2 socket, defaults to 32-bits wide, base protocol
 | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ SC_HAS_PROCESS(BusCtrl); | ||||||
| BusCtrl::BusCtrl(sc_module_name name): sc_module(name) | BusCtrl::BusCtrl(sc_module_name name): sc_module(name) | ||||||
|   ,cpu_instr_socket("cpu_instr_socket") |   ,cpu_instr_socket("cpu_instr_socket") | ||||||
|   ,cpu_data_socket("cpu_data_socket") |   ,cpu_data_socket("cpu_data_socket") | ||||||
|   ,data_memory_socket("data_memory_socket") |   ,memory_socket("memory_socket") | ||||||
|   ,trace_socket("trace_socket") |   ,trace_socket("trace_socket") | ||||||
|    { |    { | ||||||
|     cpu_instr_socket.register_b_transport(this, &BusCtrl::b_transport); |     cpu_instr_socket.register_b_transport(this, &BusCtrl::b_transport); | ||||||
|  | @ -14,13 +14,13 @@ BusCtrl::BusCtrl(sc_module_name name): sc_module(name) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void BusCtrl::b_transport( tlm::tlm_generic_payload& trans, sc_time& delay ) { | void BusCtrl::b_transport( tlm::tlm_generic_payload& trans, sc_time& delay ) { | ||||||
|     tlm::tlm_command cmd = trans.get_command(); |     //tlm::tlm_command cmd = trans.get_command();
 | ||||||
|     sc_dt::uint64    adr = trans.get_address() / 4; |     sc_dt::uint64    adr = trans.get_address() / 4; | ||||||
| 
 | 
 | ||||||
|     if (adr == TRACE_MEMORY_ADDRESS / 4) { |     if (adr == TRACE_MEMORY_ADDRESS / 4) { | ||||||
|       trace_socket->b_transport(trans, delay); |       trace_socket->b_transport(trans, delay); | ||||||
|     } else { |     } else { | ||||||
|       data_memory_socket->b_transport(trans, delay); |       memory_socket->b_transport(trans, delay); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| #if 0 | #if 0 | ||||||
|  |  | ||||||
|  | @ -1,3 +1,10 @@ | ||||||
|  | /*!
 | ||||||
|  |    \file Simulator.cpp | ||||||
|  |    \brief Top level simulation entity | ||||||
|  |    \author Màrius Montón | ||||||
|  |    \date September 2018 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
| #define SC_INCLUDE_DYNAMIC_PROCESSES | #define SC_INCLUDE_DYNAMIC_PROCESSES | ||||||
| 
 | 
 | ||||||
| #include "systemc" | #include "systemc" | ||||||
|  | @ -18,7 +25,14 @@ using namespace std; | ||||||
| 
 | 
 | ||||||
| string filename; | string filename; | ||||||
| 
 | 
 | ||||||
| SC_MODULE(Top) | /**
 | ||||||
|  |  * @class Simulator | ||||||
|  |  * This class instiates all necessary modules, connects its ports and starts | ||||||
|  |  * the simulation. | ||||||
|  |  * | ||||||
|  |  * @brief Top simulation entity | ||||||
|  |  */ | ||||||
|  | SC_MODULE(Simulator) | ||||||
| { | { | ||||||
|   CPU    *cpu; |   CPU    *cpu; | ||||||
|   Memory *MainMemory; |   Memory *MainMemory; | ||||||
|  | @ -28,7 +42,7 @@ SC_MODULE(Top) | ||||||
|   uint32_t start_PC; |   uint32_t start_PC; | ||||||
|   sc_signal<bool> IRQ; |   sc_signal<bool> IRQ; | ||||||
| 
 | 
 | ||||||
|   SC_CTOR(Top) |   SC_CTOR(Simulator) | ||||||
|   { |   { | ||||||
|     MainMemory = new Memory("Main_Memory", filename); |     MainMemory = new Memory("Main_Memory", filename); | ||||||
|     start_PC = MainMemory->getPCfromHEX(); |     start_PC = MainMemory->getPCfromHEX(); | ||||||
|  | @ -41,13 +55,13 @@ SC_MODULE(Top) | ||||||
|     cpu->instr_bus.bind(Bus->cpu_instr_socket); |     cpu->instr_bus.bind(Bus->cpu_instr_socket); | ||||||
|     cpu->exec->data_bus.bind(Bus->cpu_data_socket); |     cpu->exec->data_bus.bind(Bus->cpu_data_socket); | ||||||
| 
 | 
 | ||||||
|     Bus->data_memory_socket.bind(MainMemory->socket); |     Bus->memory_socket.bind(MainMemory->socket); | ||||||
|     Bus->trace_socket.bind(trace->socket); |     Bus->trace_socket.bind(trace->socket); | ||||||
|     //cpu->interrupt.bind(IRQ);
 |     //cpu->interrupt.bind(IRQ);
 | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   ~Top() { |   ~Simulator() { | ||||||
|     cout << "Top destructor" << endl; |     cout << "Simulator destructor" << endl; | ||||||
|     delete cpu; |     delete cpu; | ||||||
|     delete MainMemory; |     delete MainMemory; | ||||||
|     delete Bus; |     delete Bus; | ||||||
|  | @ -55,7 +69,7 @@ SC_MODULE(Top) | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| Top *top; | Simulator *top; | ||||||
| 
 | 
 | ||||||
| void intHandler(int dummy) { | void intHandler(int dummy) { | ||||||
|   delete top; |   delete top; | ||||||
|  | @ -74,7 +88,7 @@ int sc_main(int argc, char* argv[]) | ||||||
|   } |   } | ||||||
|   filename = argv[1]; |   filename = argv[1]; | ||||||
| 
 | 
 | ||||||
|   top = new Top("top"); |   top = new Simulator("top"); | ||||||
|   sc_start(); |   sc_start(); | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue