2018-09-11 00:44:54 +08:00
|
|
|
# Another RISC-V ISA simulator.
|
|
|
|
|
|
|
|
**This code is suitable to hard refactor at any time**
|
|
|
|
|
|
|
|
This is another RISC-V ISA simulator, this is coded in SystemC + TLM-2.
|
2018-09-17 18:35:52 +08:00
|
|
|
It partially supports RV32I Instruction set by now.
|
2018-09-11 00:44:54 +08:00
|
|
|
|
|
|
|
Brief description of the modules:
|
|
|
|
|
|
|
|
* CPU: Top entity that includes all other modules.
|
|
|
|
* Memory: Memory highly based on TLM-2 example with read file capability
|
2018-09-17 18:35:52 +08:00
|
|
|
* Registers: Implements the register file, PC register & CSR registers
|
|
|
|
* RISC_V_execute: Executes ISA instructions
|
2018-09-11 00:44:54 +08:00
|
|
|
* Instruction: Decodes instruction and acces to any instruction field
|
2018-09-21 17:23:31 +08:00
|
|
|
* Simulator: Top-level entity that builds & starts the simulation
|
|
|
|
* BusCtrl: Simple bus manager
|
|
|
|
* Trace: Simple trace peripheral
|
2018-09-11 00:44:54 +08:00
|
|
|
|
2018-09-15 17:43:33 +08:00
|
|
|
Current performance is about 284500 instructions / sec in a Core-i5@2.2Ghz
|
2018-09-12 05:34:30 +08:00
|
|
|
|
2018-09-11 00:44:54 +08:00
|
|
|
Helper classes:
|
|
|
|
* Performance: Performance indicators stores here (singleton class)
|
|
|
|
* Log: Log class to log them all (singleton class)
|
|
|
|
|
|
|
|
|
2018-09-15 17:43:33 +08:00
|
|
|
### Structure
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-09-11 00:44:54 +08:00
|
|
|
## TODO
|
|
|
|
This is a preliminar and incomplete version.
|
|
|
|
|
|
|
|
Task to do:
|
2018-09-20 05:51:01 +08:00
|
|
|
* Implement all missing instructions (RISC_V_execute)
|
2018-09-17 18:35:52 +08:00
|
|
|
* Implement CSRs (where?)
|
2018-09-20 05:51:01 +08:00
|
|
|
* Add full support to .elf ~~and .hex~~ filetypes to memory.h
|
2018-09-11 00:44:54 +08:00
|
|
|
(only partial .hex support)
|
|
|
|
* Connect some TLM peripherals
|
2018-09-20 05:51:01 +08:00
|
|
|
* ~~Debug module similiar to ARM's ITM~~
|
2018-09-17 18:35:52 +08:00
|
|
|
* Some standard UART model
|
|
|
|
* ...
|
2018-09-11 00:44:54 +08:00
|
|
|
* Test, test, test & test. I'm sure there are a lot of bugs in the code
|
2018-09-17 18:35:52 +08:00
|
|
|
* Improve structure and modules hierarchy
|
|
|
|
* Add 64 & 128 bits architecture (RV64I, RV128I)
|
2018-09-11 00:44:54 +08:00
|
|
|
|
2018-09-20 06:06:25 +08:00
|
|
|
## Compile
|
2018-09-11 00:44:54 +08:00
|
|
|
In order to compile the project you need SystemC-2.3.2 installed in your system.
|
|
|
|
Just change SYSTEMC path in Makefile.
|
|
|
|
|
|
|
|
```
|
|
|
|
$ make
|
|
|
|
```
|
|
|
|
|
|
|
|
Then, you need to modifiy your LD_LIBRARY_PATH environtment variable to add
|
|
|
|
path systemc library. In my case:
|
|
|
|
```
|
|
|
|
$ export LD_LIBRARY_PATH=/home/marius/Work/RiscV/code/systemc-2.3.2/lib-linux64
|
|
|
|
```
|
|
|
|
|
|
|
|
And then you can execute the simulator:
|
|
|
|
```
|
|
|
|
$ ./RISCV_TLM asm/BasicLoop.hex
|
|
|
|
```
|
|
|
|
|
|
|
|
## Test
|
|
|
|
In the asm directory there are some basic assembly examples.
|
|
|
|
|
|
|
|
I "compile" one file with the follwing command:
|
|
|
|
```
|
|
|
|
$ cd asm
|
2018-09-20 05:51:01 +08:00
|
|
|
$ riscv32-unknown-linux-gnu-as EternalLoop.asm -o EternalLoop.o
|
|
|
|
$ riscv32-unknown-linux-gnu-ld -T ../my_linker_script.ld EternalLoop.o -o EternalLoop.elf
|
|
|
|
$ objcopy -O ihex EternalLoop.elf EternalLoop.hex
|
2018-09-11 00:44:54 +08:00
|
|
|
$ cd ..
|
|
|
|
$ ./RISCV_SCTLM asm/EternalLoop.hex
|
|
|
|
```
|
|
|
|
This example needs that you hit Ctr+C to stop execution.
|
|
|
|
|
2018-09-20 06:06:25 +08:00
|
|
|
### C code
|
|
|
|
The C directory contains simple examples in C. Each directory contains
|
|
|
|
an example, to compile it just:
|
|
|
|
```
|
|
|
|
$ make
|
|
|
|
```
|
|
|
|
and then execute the .hex file like the example before.
|
|
|
|
|
2018-09-11 00:44:54 +08:00
|
|
|
## Documentation
|
|
|
|
The code is documented using doxygen. In the doc folder there is a Doxygen.cfg
|
|
|
|
file ready to be used.
|
|
|
|
|
|
|
|
## Contribute
|
|
|
|
There are several ways to contribute to this project:
|
|
|
|
* Test
|
|
|
|
* Pull request are welcome (see TODO list)
|
|
|
|
* Good documentation
|
|
|
|
|
|
|
|
## License
|
|
|
|
|
|
|
|
Copyright (C) 2018 Màrius Montón ([\@mariusmonton](https://twitter.com/mariusmonton/))
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
2018-09-15 17:43:33 +08:00
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
2018-09-11 00:44:54 +08:00
|
|
|
|
2018-09-15 17:43:33 +08:00
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
2018-09-11 00:44:54 +08:00
|
|
|
|
2018-09-15 17:43:33 +08:00
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|