Test SoC¶
The C-class repository also contains a simple test-soc for the purpose of simulating applications and verifying the core. More enhanced and open-source SoCs can be found here.
Structure of SoC¶
The Test-SoC has the following structure (defined to a max of 4 levels of depth):
Description of the above modules:
Module-Name
Description
mkriscv
Contains the 5-stages of the core pipeline including the execution and only the interface to the memory subsystem
mkdmem
The Data memory subsystem. Includes the data-cache and data-tlbs
mkimem
The instruction memory subsystem. Includes the instruction-cache and the instruction-tlbs
mkccore_axi4
Contains the above modules and the integrations across them. Also provides 3 AXI-4 interfaces to be connected to the Cross-bar fabric
mkuart
UART module
mkclint
Core Level Interrupt
mksignature_dump
Signature dump module (for simulation only)
mkSoc
contains all the above modules and instantiates the AXI-4 crossbar fabric as well. The fabric has 2 additional slaves, which are brought out through the interface to connect to the boot-rom and bram-main-memory present in the Test-bench
mkbram
BRAM based memory acting as main-memory
mkbootrom
Bootrom slave
mkTbSoC
Testbench that instantiates the Soc, and integrates it with the bootrom and a bram memory
The details of the devices can be found in devices
Address Map of SoC¶
Module
Address Range
BRAM-Memory
0x80000000 - 0x8FFFFFFF
BootROM
0x00001000 - 0x00010FFF
UART
0x00011300 - 0x00011340
CLINT
0x02000000 - 0x020BFFFF
Debug-Halt Loop
0x00000000 - 0x0000000F
Signature Dump
0x00002000 - 0x0000200c
Please note that the bram-based memory in the test-bench can only hold upto 256MB of code. Thus the elf2hex arguments will need to applied accordingly
BootRom Content¶
By default, on system-reset the core will always jump to 0x1000 which is mapped to the bootrom.
The bootrom is initialized using the files boot.MSB and boot.LSB. The bootrom immediately
causes a re-direction to address 0x80000000 where the main program is expected to lie.
It is thus required that all programs are linked with text-section begining at 0x80000000.
The rest of the boot-rom holds a dummy device-tree-string information.
Synthesis of Core¶
When synthesizing for an FPGA/ASIC, the top module should be mkccore_axi4 (mkccore_axi4.v)
as the top module.
The mkimem and mkdmem module include SRAM instances which implement the respective data
and tag arrays. These are implemented as BRAMs and thus require no changes for FPGAs.
However for an ASIC flow, it is strictly advised to replace the BRAMs with respective SRAMs.
The user should refer to RAM Structures for correctly performing the replacement.