Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

Basic RISC-V Test SoC

NotificationsYou must be signed in to change notification settings

ultraembedded/riscv_soc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Github:http://github.com/ultraembedded/riscv_soc

A basic RISC-V test SoC with Timer, UART, SPI and GPIO peripherals...

Cloning

# Clone repository and submodulesgit clone https://github.com/ultraembedded/riscv_soc.git --recursive

Directories

NameContents
coreRISC-V core (http://github.com/ultraembedded/riscv)
fpga/artyDigilent Artix-7 Arty FPGA Dev Board project
socVerilog for peripherals, interconnect, etc
tbSystem-C testbench for the project

Features

The top (riscv_soc in riscv_soc.v) contains;

  • RISC-V core (RV32IM instructions supported).
  • 16KB (8KB x 2-way) instruction cache.
  • Timer, UART, SPI and interrupt controller peripherals.
  • AXI4-Lite slave port for external bus master/debug access to peripherals / main memory.
  • AXI4 master port for access to main memory, e.g. SDRAM (external to the design).

Interfaces

NameDescription
clk_iClock input
rst_iAsync reset, active-high. Reset SoC (excluding CPU core).
rst_cpu_iAsync reset, active-high. Reset CPU core.
reset_vector_iInitial boot address.
inport_*AXI4-Lite slave interface for access to SoC / memory.
mem_*AXI4 master interface to main memory.
spi_*SPI interface
gpio_*GPIO interface
uart_rxd_oUART Tx (connect to remote receiver)
uart_txd_iUART Rx (connect to remote transmitter)

Testbench

A basic System-C / Verilator based testbench for the design is provided.

Dependancies;

  • gcc
  • make
  • libelf
  • System-C (specify path using SYSTEMC_HOME)
  • Verilator (specify path using VERILATOR_SRC)

To build the testbench;

cd tbmake

To run the provided test executable;

cd tbmake run

FPGA

This project is ready to run on the 'Digilent Artix-7 Arty' FPGA dev board;

A pre-cooked bitstream for this board is located in 'fpga/arty/top.bit'.

The test project for FPGA uses theUART to AXI dbg bridge to allow code to be loaded into DDR prior to de-asserting the CPU's reset.

The 'rv32imsu' core (as used in the provided bitstream) is capable of booting Linux;

cd fpga/arty# Load bitstream onto targetvivado -mode tcl -source program.tcl# Load test app into DDR and release reset (change ttyUSB2 as appropriate)./run.py -d /dev/ttyUSB2 -f ../../images/linux_riscv_soc.elf ELF: Loading 0x80000000 - size 7KB |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX| 100.0% ELF: Loading 0x80400000 - size 5368KB |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX| 100.0% ELF: Loading 0x81f00000 - size 2KB |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX| 100.0% [Console]: Enter UART modeBooting...OF: fdt: Ignoring memory range 0x80000000 - 0x80400000Linux version 4.19.0-29706-g1479c35-dirty (build@vm) (gcc version 7.2.0 (GCC)) #531 Sat Mar 16 22:07:04 GMT 2019bootconsole [early0] enabledinitrd not found or empty - disabling initrdZone ranges:  Normal   [mem 0x0000000080400000-0x0000081effffffff]Movable zone start for each nodeEarly memory node ranges  node   0: [mem 0x0000000080400000-0x0000000081efffff]Initmem setup node 0 [mem 0x0000000080400000-0x0000000081efffff]On node 0 totalpages: 6912  Normal zone: 54 pages used for memmap  Normal zone: 0 pages reserved  Normal zone: 6912 pages, LIFO batch:0elf_hwcap is 0x1101pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768pcpu-alloc: [0] 0 Built 1 zonelists, mobility grouping on.  Total pages: 6858Kernel command line: console=ttyUL0,1000000 debugDentry cache hash table entries: 4096 (order: 2, 16384 bytes)Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)Sorting __ex_table...Memory: 21992K/27648K available (3664K kernel code, 138K rwdata, 547K rodata, 792K init, 220K bss, 5656K reserved, 0K cma-reserved)SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1NR_IRQS: 0, nr_irqs: 0, preallocated irqs: 0irq-xilinx: /soc/interrupt-controller@90000000: num_irq=9, edge=0x100clocksource: timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 76450417870 nsConsole: colour dummy device 80x25Calibrating delay loop (skipped), value calculated using timer frequency.. 50.00 BogoMIPS (lpj=100000)pid_max: default: 32768 minimum: 301Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)devtmpfs: initializedrandom: get_random_u32 called from bucket_table_alloc.isra.7+0xa0/0x208 with crng_init=0clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 nsfutex hash table entries: 256 (order: -1, 3072 bytes)NET: Registered protocol family 16random: fast init doneclocksource: Switched to clocksource timerNET: Registered protocol family 2tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 4096 bytes)TCP established hash table entries: 1024 (order: 0, 4096 bytes)TCP bind hash table entries: 1024 (order: 0, 4096 bytes)TCP: Hash tables configured (established 1024 bind 1024)UDP hash table entries: 256 (order: 0, 4096 bytes)UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)NET: Registered protocol family 1workingset: timestamp_bits=30 max_order=13 bucket_order=0NET: Registered protocol family 38Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254)io scheduler noop registeredio scheduler deadline registeredio scheduler cfq registered (default)io scheduler mq-deadline registeredio scheduler kyber registered92000000.serial: ttyUL0 at MMIO 0x92000000 (irq = 2, base_baud = 0) is a uartliteconsole [ttyUL0] enabledconsole [ttyUL0] enabledbootconsole [early0] disabledbootconsole [early0] disabledloop: module loadedNET: Registered protocol family 10Segment Routing with IPv6sit: IPv6, IPv4 and MPLS over IPv4 tunneling driverNET: Registered protocol family 17Freeing unused kernel memory: 792KThis architecture does not have kernel memory protection.Run /init as init processinit started: BusyBox v1.29.3 (2018-11-13 23:09:48 GMT)Please press Enter to activate this console. BusyBox v1.29.3 (2018-11-13 23:09:48 GMT) built-in shell (ash)# lsbin   dev   etc   init  lib   mnt   proc  sbin  sys   test#

Size

SoC + Small Core (core/rv32i_spartan6)

Xilinx Vivado (for XC7)Used
Slice LUTs3654
Slice Registers1468

SoC + Larger Core (core/rv32imsu)

Xilinx Vivado (for XC7)Used
Slice LUTs7046
Slice Registers3170

Memory Map

RangeDescription
0x8000_0000 - 0x8fff_ffffMain memory (external to the design)
0x9000_0000 - 0x90ff_ffffPeripheral - IRQ controller
0x9100_0000 - 0x91ff_ffffPeripheral - Timer
0x9200_0000 - 0x92ff_ffffPeripheral - UART
0x9300_0000 - 0x93ff_ffffPeripheral - SPI
0x9400_0000 - 0x94ff_ffffPeripheral - GPIO

Interrupt Sources

IndexSource
0Peripheral - Timer
1Peripheral - UART
2Peripheral - SPI
3Peripheral - GPIO

Peripheral Register Map

OffsetNameDescription
0x9000_0000IRQ_ISR[RW] Interrupt Status Register
0x9000_0004IRQ_IPR[R] Interrupt Pending Register
0x9000_0008IRQ_IER[RW] Interrupt Enable Register
0x9000_000cIRQ_IAR[W] Interrupt Acknowledge Register
0x9000_0010IRQ_SIE[W] Set Interrupt Enable bits
0x9000_0014IRQ_CIE[W] Clear Interrupt Enable bits
0x9000_0018IRQ_IVR[RW] Interrupt Vector Register
0x9000_001cIRQ_MER[RW] Master Enable Register
0x9100_0008TIMER_CTRL0[RW] Control
0x9100_000cTIMER_CMP0[RW] Compare value (interrupt on match)
0x9100_0010TIMER_VAL0[RW] Current Value
0x9100_0014TIMER_CTRL1[RW] Control
0x9100_0018TIMER_CMP1[RW] Compare value (interrupt on match)
0x9100_001cTIMER_VAL1[RW] Current Value
0x9200_0000ULITE_RX[R] UART Data Register
0x9200_0004ULITE_TX[W] UART Data Register
0x9200_0008ULITE_STATUS[R] UART Status Register
0x9200_000cULITE_CONTROL[RW] UART Configuration Register
0x9300_001cSPI_DGIER[RW] Device Global Interrupt Enable Register
0x9300_0020SPI_IPISR[RW] IP Interrupt Status Register
0x9300_0028SPI_IPIER[RW] IP Interrupt Enable Register
0x9300_0040SPI_SRR[RW] Software Reset Register
0x9300_0060SPI_CR[RW] SPI Control Register
0x9300_0064SPI_SR[R] SPI Status Register
0x9300_0068SPI_DTR[W] SPI Data Transmit Register
0x9300_006cSPI_DRR[R] SPI Data Receive Register
0x9300_0070SPI_SSR[RW] SPI Slave Select Register
0x9400_0000GPIO_DIRECTION[RW] Configuration Register
0x9400_0004GPIO_INPUT[R] GPIO Input Status
0x9400_0008GPIO_OUTPUT[RW] GPIO Output Control
0x9400_000cGPIO_OUTPUT_SET[W] GPIO Output Control Set Alias
0x9400_0010GPIO_OUTPUT_CLR[W] GPIO Output Control Clr Alias
0x9400_0014GPIO_INT_MASK[RW] GPIO Interrupt Enable Mask
0x9400_0018GPIO_INT_SET[W] GPIO Interrupt Set
0x9400_001cGPIO_INT_CLR[W] GPIO Interrupt Clear
0x9400_0020GPIO_INT_STATUS[R] GPIO Interrupt Raw Status
0x9400_0024GPIO_INT_LEVEL[RW] GPIO Interrupt Level
0x9400_0028GPIO_INT_MODE[RW] GPIO Interrupt Mode

Peripheral Register Fields

IRQ Register: IRQ_ISR
BitsNameDescription
3:0STATUSPending interrupt (unmasked) bitmap.
IRQ Register: IRQ_IPR
BitsNameDescription
3:0PENDINGPending interrupts (masked) bitmap.
IRQ Register: IRQ_IER
BitsNameDescription
3:0ENABLEInterrupt enable mask.
IRQ Register: IRQ_IAR
BitsNameDescription
3:0ACKBitmap of interrupts to acknowledge.
IRQ Register: IRQ_SIE
BitsNameDescription
3:0SETBitmap of interrupts to enable.
IRQ Register: IRQ_CIE
BitsNameDescription
3:0CLRBitmap of interrupts to disable.
IRQ Register: IRQ_IVR
BitsNameDescription
31:0VECTORHighest priority active interrupt number.
IRQ Register: IRQ_MER
BitsNameDescription
0MEMaster Enable
Timer Register: TIMER_CTRLx
BitsNameDescription
1INTERRUPTInterrupt enable.
2ENABLETimer enable.
Timer Register: TIMER_CMPx
BitsNameDescription
31:0VALUEMatch value.
Timer Register: TIMER_VALx
BitsNameDescription
31:0CURRENTCurrent timer value.
UART Register: ULITE_RX
BitsNameDescription
7:0DATADate byte
UART Register: ULITE_TX
BitsNameDescription
7:0DATADate byte
UART Register: ULITE_STATUS
BitsNameDescription
4IEInterrupt enabled
3TXFULLTransmit buffer full
2TXEMPTYTransmit buffer empty
1RXFULLReceive buffer full
0RXVALIDReceive buffer not empty
UART Register: ULITE_CONTROL
BitsNameDescription
4IEInterrupt enable
1RST_RXFlush Rx Buffer
0RST_TXFlush Tx Buffer
SPI Register: SPI_DGIER
BitsNameDescription
31GIEGlobal interrupt enable.
SPI Register: SPI_IPISR
BitsNameDescription
2TX_EMPTYTx FIFO empty interrupt status.
SPI Register: SPI_IPIER
BitsNameDescription
2TX_EMPTYTx FIFO interrupt enable.
SPI Register: SPI_SRR
BitsNameDescription
31:0RESETSoftware FIFO reset.
SPI Register: SPI_CR
BitsNameDescription
0LOOPLoopback enable (MOSI to MISO).
1SPESPI Enable.
2MASTERMaster mode (slave mode not currently supported).
3CPOLClock polarity.
4CPHAClock phase.
5TXFIFO_RSTTx FIFO reset.
6RXFIFO_RSTRx FIFO reset.
7MANUAL_SSManual chip select mode (auto mode not supported).
8TRANS_INHIBITTransfer inhibit.
9LSB_FIRSTData LSB first (1) or MSB first (0).
SPI Register: SPI_SR
BitsNameDescription
0RX_EMPTYRx FIFO empty.
1RX_FULLRx FIFO full.
2TX_EMPTYTx FIFO empty.
3TX_FULLTx FIFO full.
SPI Register: SPI_DTR
BitsNameDescription
7:0DATADate byte
SPI Register: SPI_DRR
BitsNameDescription
7:0DATADate byte
SPI Register: SPI_SSR
BitsNameDescription
0VALUEChip select value
GPIO Register: GPIO_DIRECTION
BitsNameDescription
31:0OUTPUT0 = Input, 1 = Output
GPIO Register: GPIO_INPUT
BitsNameDescription
31:0VALUERaw input status
GPIO Register: GPIO_OUTPUT
BitsNameDescription
31:0DATAGPIO output value
GPIO Register: GPIO_OUTPUT_SET
BitsNameDescription
31:0DATAGPIO output mask - set for high
GPIO Register: GPIO_OUTPUT_CLR
BitsNameDescription
31:0DATAGPIO output mask - set for low
GPIO Register: GPIO_INT_MASK
BitsNameDescription
31:0ENABLEGPIO Interrupt Enable Mask
GPIO Register: GPIO_INT_SET
BitsNameDescription
31:0SW_IRQWrite 1 to assert an interrupt
GPIO Register: GPIO_INT_CLR
BitsNameDescription
31:0ACKWrite 1 to clear an interrupt
GPIO Register: GPIO_INT_STATUS
BitsNameDescription
31:0RAWSet if interrupt active (regardless of INT_MASK)
GPIO Register: GPIO_INT_LEVEL
BitsNameDescription
31:0ACTIVE_HIGHGPIO Interrupt Level - 1 = active high / rising edge, 0 = active low / falling edge
GPIO Register: GPIO_INT_MODE
BitsNameDescription
31:0EDGEGPIO Interrupt Mode - 1 = edge triggered, 0 = level

[8]ページ先頭

©2009-2025 Movatter.jp