URL
https://opencores.org/ocsvn/neorv32/neorv32/trunk
Subversion Repositories neorv32
Compare Revisions
- This comparison shows the changes necessary to convert path
/neorv32/trunk/sim
- from Rev 59 to Rev 60
- ↔ Reverse comparison
Rev 59 → Rev 60
/ghdl/ghdl_sim.sh
1,33 → 1,34
#!/bin/bash |
#!/usr/bin/env bash |
|
# `GHDL` is used to check all VHDL files for syntax errors and to simulate the default testbench. The previously |
# installed CPU test program is executed and the console output (UART0 primary UART) is dumped to a text file. After the |
# simulation has finished, the text file is searched for a specific string. If the string is found, the CPU test was |
# successful. |
|
# Abort if any command returns != 0 |
set -e |
|
cd $(dirname "$0")/../.. |
|
# Default simulation configuration |
SIM_CONFIG=--stop-time=8ms |
|
# Project home folder |
homedir="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" |
homedir=$homedir/../.. |
|
# The directories of the hw source files |
srcdir_core=$homedir/rtl/core |
srcdir_sim=$homedir/sim |
srcdir_top_templates=$homedir/rtl/top_templates |
|
# Show GHDL version |
ghdl -v |
|
# Simulation time define by user? |
echo "" |
if [ -z ${1} ]; then echo "Using default simulation config: $SIM_CONFIG"; else SIM_CONFIG=$1; echo "Using user simulation config: $SIM_CONFIG"; fi |
[ -z ${1} ] && echo "Using default simulation config: $SIM_CONFIG" || ( |
SIM_CONFIG=$1; |
echo "Using user simulation config: $SIM_CONFIG"; |
) |
echo "" |
|
# List files |
#echo "Simulation source files:" |
#ls -l $srcdir_core |
#ls -l $srcdir_sim |
#ls -l $srcdir_top_templates |
#ls -l simrtl/core |
#ls -l sim |
#ls -l rtl/top_templates |
#echo "" |
|
# Just a hint |
35,68 → 36,26
echo "" |
|
# Analyse sources; libs and images at first! |
ghdl -a --work=neorv32 $srcdir_core/neorv32_package.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_application_image.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_bootloader_image.vhd |
# |
ghdl -a --work=neorv32 $srcdir_core/neorv32_boot_rom.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_busswitch.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_bus_keeper.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_icache.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cfs.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_alu.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_bus.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_control.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_cp_bitmanip.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_cp_fpu.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_cp_muldiv.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_decompressor.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_cpu_regfile.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_debug_dm.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_debug_dtm.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_dmem.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_gpio.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_imem.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_mtime.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_nco.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_neoled.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_pwm.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_spi.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_sysinfo.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_top.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_trng.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_twi.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_uart.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_wdt.vhd |
ghdl -a --work=neorv32 $srcdir_core/neorv32_wishbone.vhd |
# |
ghdl -a --work=neorv32 $srcdir_top_templates/neorv32_test_setup.vhd |
ghdl -a --work=neorv32 $srcdir_top_templates/neorv32_top_axi4lite.vhd |
ghdl -a --work=neorv32 $srcdir_top_templates/neorv32_top_stdlogic.vhd |
# |
ghdl -a --work=neorv32 $srcdir_sim/neorv32_tb.vhd |
ghdl -i --work=neorv32 rtl/core/*.vhd |
ghdl -i --work=neorv32 rtl/top_templates/*.vhd |
ghdl -i --work=neorv32 sim/*.vhd |
|
# Prepare simulation output files for UART0 |
# Testbench receiver log file |
touch neorv32.testbench_uart0.out |
chmod 777 neorv32.testbench_uart0.out |
# UART0 direct simulation output |
touch neorv32.uart0.sim_mode.text.out |
chmod 777 neorv32.uart0.sim_mode.text.out |
touch neorv32.uart0.sim_mode.data.out |
chmod 777 neorv32.uart0.sim_mode.data.out |
# Prepare simulation output files for UART0 and UART 1 |
# - Testbench receiver log file (neorv32.testbench_uart?.out) |
# - Direct simulation output (neorv32.uart?.sim_mode.[text|data].out) |
for item in \ |
testbench_uart0 \ |
uart0.sim_mode.text \ |
uart0.sim_mode.data \ |
testbench_uart1 \ |
uart1.sim_mode.text \ |
uart1.sim_mode.data; do |
touch neorv32."$item".out |
chmod 777 neorv32."$item".out |
done |
|
# Prepare simulation output files for UART1 |
# Testbench receiver log file |
touch neorv32.testbench_uart1.out |
chmod 777 neorv32.testbench_uart1.out |
# UART1 direct simulation output |
touch neorv32.uart1.sim_mode.text.out |
chmod 777 neorv32.uart1.sim_mode.text.out |
touch neorv32.uart1.sim_mode.data.out |
chmod 777 neorv32.uart1.sim_mode.data.out |
|
# Run simulation |
ghdl -e --work=neorv32 neorv32_tb |
ghdl -m --work=neorv32 neorv32_tb |
ghdl -r --work=neorv32 neorv32_tb --max-stack-alloc=0 --ieee-asserts=disable --assert-level=error $SIM_CONFIG |
|
cat neorv32.uart0.sim_mode.text.out | grep "CPU TEST COMPLETED SUCCESSFULLY!" |
/neorv32_tb.vhd
155,7 → 155,7
begin |
mem_v := (others => (others => '0')); |
for i in 0 to init'length-1 loop -- init only in range of source data array |
if (xbus_big_endian_c = true) then |
if (xbus_big_endian_c = false) then |
mem_v(i) := init(i); |
else |
mem_v(i) := bswap32_f(init(i)); |
197,7 → 197,6
ON_CHIP_DEBUGGER_EN => true, -- implement on-chip debugger |
-- RISC-V CPU Extensions -- |
CPU_EXTENSION_RISCV_A => true, -- implement atomic extension? |
CPU_EXTENSION_RISCV_B => true, -- implement bit manipulation extensions? |
CPU_EXTENSION_RISCV_C => true, -- implement compressed extension? |
CPU_EXTENSION_RISCV_E => false, -- implement embedded RF extension? |
CPU_EXTENSION_RISCV_M => true, -- implement muld/div extension? |
215,7 → 214,7
PMP_MIN_GRANULARITY => 64*1024, -- minimal region granularity in bytes, has to be a power of 2, min 8 bytes |
-- Hardware Performance Monitors (HPM) -- |
HPM_NUM_CNTS => 12, -- number of implemented HPM counters (0..29) |
HPM_CNT_WIDTH => 40, -- total size of HPM counters (1..64) |
HPM_CNT_WIDTH => 40, -- total size of HPM counters (0..64) |
-- Internal Instruction memory -- |
MEM_INT_IMEM_EN => int_imem_c , -- implement processor-internal instruction memory |
MEM_INT_IMEM_SIZE => imem_size_c, -- size of processor-internal instruction memory in bytes |
238,7 → 237,7
IO_UART1_EN => true, -- implement secondary universal asynchronous receiver/transmitter (UART1)? |
IO_SPI_EN => true, -- implement serial peripheral interface (SPI)? |
IO_TWI_EN => true, -- implement two-wire interface (TWI)? |
IO_PWM_EN => true, -- implement pulse-width modulation unit (PWM)? |
IO_PWM_NUM_CH => 30, -- number of PWM channels to implement (0..60); 0 = disabled |
IO_WDT_EN => true, -- implement watch dog timer (WDT)? |
IO_TRNG_EN => false, -- trng cannot be simulated |
IO_CFS_EN => true, -- implement custom functions subsystem (CFS)? |
294,7 → 293,7
-- TWI (available if IO_TWI_EN = true) -- |
twi_sda_io => twi_sda, -- twi serial data line |
twi_scl_io => twi_scl, -- twi serial clock line |
-- PWM (available if IO_PWM_EN = true) -- |
-- PWM (available if IO_PWM_NUM_CH > 0) -- |
pwm_o => open, -- pwm channels |
-- Custom Functions Subsystem IO -- |
cfs_in_i => (others => '0'), -- custom CFS inputs |
603,7 → 602,7
if rising_edge(clk_gen) then |
-- bus interface -- |
wb_irq.rdata <= (others => '0'); |
wb_irq.ack <= wb_irq.cyc and wb_irq.stb and wb_irq.we and and_all_f(wb_irq.sel); |
wb_irq.ack <= wb_irq.cyc and wb_irq.stb and wb_irq.we and and_reduce_f(wb_irq.sel); |
wb_irq.err <= '0'; |
-- trigger IRQ using CSR.MIE bit layout -- |
nmi_ring <= '0'; |
610,7 → 609,7
msi_ring <= '0'; |
mei_ring <= '0'; |
soc_firq_ring <= (others => '0'); |
if ((wb_irq.cyc and wb_irq.stb and wb_irq.we and and_all_f(wb_irq.sel)) = '1') then |
if ((wb_irq.cyc and wb_irq.stb and wb_irq.we and and_reduce_f(wb_irq.sel)) = '1') then |
nmi_ring <= wb_irq.wdata(00); -- non-maskable interrupt |
msi_ring <= wb_irq.wdata(03); -- machine software interrupt |
mei_ring <= wb_irq.wdata(11); -- machine software interrupt |