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):

graph TD; X[mkTbSoC] --> A(mkSoC) X --> B(mkbram) X --> C(mkbootrom) A --> D(mkccore_axi4) A --> E(mkuart) A --> F(mkclint) A --> G(mksignature_dump) D --> H(mkriscv) D --> I(mkdmem) D --> J(mkimem)

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.