Initial commit
This commit is contained in:
		
							
								
								
									
										28
									
								
								Libs/RiscV/NEORV32/sw/isa-test/port-neorv32/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								Libs/RiscV/NEORV32/sw/isa-test/port-neorv32/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| # NEORV32 Port for running the RISC-V Architecture Tests | ||||
|  | ||||
|  | ||||
| The following tasks are executed by the device makefiles: | ||||
|  | ||||
| * replace the original processor's IMEM rtl file by a simulation-optimized IMEM (ROM!) | ||||
| * `sed` command is used to modify the default testbench (`neorv32/sim/neorv32_tb.simple.vhd`): | ||||
|   * enable/disable the required `CPU_EXTENSION_RISCV_xxx` VHDL configuration generics in the testbench (`neorv32/sim/neorv32_tb.simple.vhd`) | ||||
|   * set the processor memory configuration | ||||
| * compile test code and install application image to processor's `rtl/core` folder | ||||
|   * compilation uses the `link.imem_rom.ld` linker script as default; code (the test code) is executed from simulation-optimized IMEM (which is read-only); data including signature is stored to DMEM | ||||
|   * certain areas in the DMEM are initialized using port code in `model_test.h` (`RVTEST` = 0xbabecafe and `SIGNATURE` = 0xdeadbeef); can be disabled using `RISCV_TARGET_FLAGS=-DNEORV32_NO_DATA_INIT` | ||||
| * the processor is simulated using the default testbench | ||||
| * the results are dumped via the SIM_MODE feature of UART0 | ||||
|   * the according code can be found in the `RVMODEL_HALT` macro in `model_test.h` | ||||
|   * data output (the "signature") is zero-padded to be always a multiple of 16 bytes | ||||
|  | ||||
|  | ||||
| **Notes** | ||||
|  | ||||
| :warning: The `Zifencei` test requires the r/w/e capabilities of the original IMEM rtl file. | ||||
| Hence, the original file is restored for this test. Also, this test uses `link.imem_ram.ld` as linker script since the | ||||
| IMEM is used as RAM to allow self-modifying code. | ||||
|  | ||||
| :information_source: The `RVMODEL_BOOT` macro in `model_test.h` provides a simple "dummy trap handler" that just advances | ||||
| to the next instruction. This trap handler is required for some `C` tests as the NEORV32 will raise an illegal instruction | ||||
| exception for **all** unimplemented instructions. The trap handler can be overriden (by changing `mtval` CSR) if a test | ||||
| uses the defualt trap handler of the test framework. | ||||
| @@ -0,0 +1,6 @@ | ||||
| NEORV32_MARCH ?= rv32ec | ||||
| NEORV32_MABI ?= ilp32e | ||||
| NEORV32_CPU_EXTENSION_RISCV_C ?= true | ||||
| NEORV32_CPU_EXTENSION_RISCV_E ?= true | ||||
|  | ||||
| include $(NEORV32_ROOT)/sw/isa-test/common.mk | ||||
| @@ -0,0 +1,5 @@ | ||||
| NEORV32_MARCH ?= rv32e | ||||
| NEORV32_MABI ?= ilp32e | ||||
| NEORV32_CPU_EXTENSION_RISCV_E ?= true | ||||
|  | ||||
| include $(NEORV32_ROOT)/sw/isa-test/common.mk | ||||
| @@ -0,0 +1,6 @@ | ||||
| NEORV32_MARCH ?= rv32em | ||||
| NEORV32_MABI ?= ilp32e | ||||
| NEORV32_CPU_EXTENSION_RISCV_E ?= true | ||||
| NEORV32_CPU_EXTENSION_RISCV_M ?= true | ||||
|  | ||||
| include $(NEORV32_ROOT)/sw/isa-test/common.mk | ||||
| @@ -0,0 +1,4 @@ | ||||
| NEORV32_MARCH ?= rv32ic | ||||
| NEORV32_CPU_EXTENSION_RISCV_C ?= true | ||||
|  | ||||
| include $(NEORV32_ROOT)/sw/isa-test/common.mk | ||||
| @@ -0,0 +1 @@ | ||||
| include $(NEORV32_ROOT)/sw/isa-test/common.mk | ||||
| @@ -0,0 +1,4 @@ | ||||
| NEORV32_MARCH ?= rv32im | ||||
| NEORV32_CPU_EXTENSION_RISCV_M ?= true | ||||
|  | ||||
| include $(NEORV32_ROOT)/sw/isa-test/common.mk | ||||
| @@ -0,0 +1,6 @@ | ||||
| NEORV32_MARCH ?= rv32im | ||||
| NEORV32_LINK ?= link.imem_ram.ld | ||||
| NEORV32_MEM_INT_IMEM_SIZE ?= '16384' | ||||
| NEORV32_CPU_EXTENSION_RISCV_ZIFENCEI ?= true | ||||
|  | ||||
| include $(NEORV32_ROOT)/sw/isa-test/common.mk | ||||
| @@ -0,0 +1,3 @@ | ||||
| NEORV32_CPU_EXTENSION_RISCV_C ?= true | ||||
|  | ||||
| include $(NEORV32_ROOT)/sw/isa-test/common.mk | ||||
							
								
								
									
										22
									
								
								Libs/RiscV/NEORV32/sw/isa-test/port-neorv32/link.imem_ram.ld
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Libs/RiscV/NEORV32/sw/isa-test/port-neorv32/link.imem_ram.ld
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| OUTPUT_ARCH( "riscv" ) | ||||
| ENTRY(rvtest_entry_point) | ||||
|  | ||||
| SECTIONS | ||||
| { | ||||
|   . = 0x00000000; | ||||
|   .text : | ||||
|   { | ||||
|     *(.text.init) | ||||
|     . = ALIGN(0x1000); | ||||
|     *(.text) | ||||
|     . = ALIGN(0x1000); | ||||
|     *(.tohost) | ||||
|     *(.data) | ||||
|     *(.data.string) | ||||
|     *(.bss) | ||||
|     . = ALIGN(0x1000); | ||||
|  | ||||
|     _end = .; | ||||
|   } | ||||
| } | ||||
|  | ||||
							
								
								
									
										26
									
								
								Libs/RiscV/NEORV32/sw/isa-test/port-neorv32/link.imem_rom.ld
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								Libs/RiscV/NEORV32/sw/isa-test/port-neorv32/link.imem_rom.ld
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| OUTPUT_ARCH( "riscv" ) | ||||
| ENTRY(rvtest_entry_point) | ||||
|  | ||||
| SECTIONS | ||||
| { | ||||
|   . = 0x00000000; | ||||
|   .text : | ||||
|   { | ||||
|     *(.text.init) | ||||
|     . = ALIGN(0x1000); | ||||
|     *(.text) | ||||
|     . = ALIGN(0x1000); | ||||
|     _end = .; | ||||
|   } | ||||
|  | ||||
|   . = 0x80000000; | ||||
|   .data : | ||||
|   { | ||||
|     . = ALIGN(0x1000); | ||||
|     *(.tohost) | ||||
|     *(.data) | ||||
|     *(.data.string) | ||||
|     *(.bss) | ||||
|   } | ||||
| } | ||||
|  | ||||
							
								
								
									
										212
									
								
								Libs/RiscV/NEORV32/sw/isa-test/port-neorv32/model_test.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										212
									
								
								Libs/RiscV/NEORV32/sw/isa-test/port-neorv32/model_test.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,212 @@ | ||||
| // SPDX-License-Identifier: BSD-3-Clause | ||||
|  | ||||
| // Modified by Stephan Nolting for the NEORV32 Processor | ||||
|  | ||||
| #ifndef _COMPLIANCE_MODEL_H | ||||
| #define _COMPLIANCE_MODEL_H | ||||
|  | ||||
| #define RVMODEL_DATA_SECTION \ | ||||
|         .pushsection .tohost,"aw",@progbits;                                  \ | ||||
|         .align 8; .global tohost; tohost: .dword 0;                           \ | ||||
|         .align 8; .global fromhost; fromhost: .dword 0;                       \ | ||||
|         .popsection;                                                          \ | ||||
|         .align 8; .global begin_regstate; begin_regstate:                     \ | ||||
|         .word 128;                                                            \ | ||||
|         .align 8; .global end_regstate; end_regstate:                         \ | ||||
|         .word 4; | ||||
|  | ||||
| //RV_COMPLIANCE_HALT | ||||
| // neorv32: this will dump the results via the UART0_SIM_MODE data file output | ||||
| // neorv32: due to the modifications on "end_signature" (not 4-aligned) we need to make sure we output a 4-aligned number of data here | ||||
| // neorv32: -> for zero-padding of the rest of the SIGNATURE section | ||||
| #define RVMODEL_HALT                                                          \ | ||||
|       signature_dump:                                                         \ | ||||
|   			la   a0, begin_signature;                                             \ | ||||
| 				la   a1, end_signature;                                               \ | ||||
|         li   a2, 0xFFFFFFA4;                                                  \ | ||||
|       signature_dump_loop:                                                    \ | ||||
|         beq  a0, a1, signature_dump_padding;                                  \ | ||||
|         lw   t0, 0(a0);                                                       \ | ||||
|         sw   t0, 0(a2);                                                       \ | ||||
|         addi a0, a0, 4;                                                       \ | ||||
|         j    signature_dump_loop;                                             \ | ||||
| nop;                                                                          \ | ||||
| nop;                                                                          \ | ||||
|       signature_dump_padding:                                                 \ | ||||
|         andi a0, a1, 0x0000000C;                                              \ | ||||
|         beq  a0, zero, signature_dump_end;                                    \ | ||||
|         li   t0, 16;                                                          \ | ||||
|         sub  a0, t0, a0;                                                      \ | ||||
|       signature_dump_padding_loop:                                            \ | ||||
|         beq  a0, zero, signature_dump_end;                                    \ | ||||
|         sw   zero, 0(a2);                                                     \ | ||||
|         addi a0, a0, -4;                                                      \ | ||||
|         j    signature_dump_padding_loop;                                     \ | ||||
|       signature_dump_end:                                                     \ | ||||
|         j    signature_dump_end | ||||
|  | ||||
| //TODO: declare the start of your signature region here. Nothing else to be used here. | ||||
| // The .align 4 ensures that the signature ends at a 16-byte boundary | ||||
| #define RVMODEL_DATA_BEGIN                                                    \ | ||||
|   .align 4; .global begin_signature; begin_signature: | ||||
|  | ||||
| //TODO: declare the end of the signature region here. Add other target specific contents here. | ||||
| //neorv32: DO NOT use align_4 here! end_signature is used to indicate the actual "number" of signature words | ||||
| #define RVMODEL_DATA_END                                                      \ | ||||
|   .global end_signature; end_signature:                                       \ | ||||
|   RVMODEL_DATA_SECTION | ||||
|  | ||||
| //RVMODEL_BOOT | ||||
| // neorv32: enable UART0 (ctrl(28)) and enable UART0_SIM_MODE (ctrl(12)) | ||||
| // neorv32: initialize the complete RVTEST_DATA section in data RAM (DMEM) with 0xBABECAFE | ||||
| // neorv32: initialize the complete SIGNATURE section (that is a multiple of four 32-bit entries) in data RAM (DMEM) with 0xDEADBEEF | ||||
| // neorv32: this code also provides a dummy trap handler that just moves on to the next instruction | ||||
| // neorv32: -> this trap handler can be overridden by the compliance-suite by modifying mtval | ||||
| // neorv32: -> the dummy trap handler is required to deal with the neorv32 X extension (-> all illegal/undefined instruction trigger an exception) | ||||
| #ifdef NEORV32_NO_DATA_INIT | ||||
| // ------------------------- WITHOUT DATA INIT ------------------------- | ||||
| #define RVMODEL_BOOT                                                          \ | ||||
|       core_init:                                                              \ | ||||
|         la x1, core_dummy_trap_handler;                                       \ | ||||
|         csrw   mtvec, x1;                                                     \ | ||||
|         csrw   mie, x0;                                                       \ | ||||
|         j      uart0_sim_mode_init;                                           \ | ||||
| nop;                                                                          \ | ||||
| nop;                                                                          \ | ||||
|       .balign 4;                                                              \ | ||||
|       core_dummy_trap_handler:                                                \ | ||||
|         csrw  mscratch, sp;                                                   \ | ||||
|         la    sp, end_signature;                                              \ | ||||
|         addi  sp, sp, 32;                                                     \ | ||||
|         sw	  x8, 0(sp);                                                      \ | ||||
|         sw	  x9, 4(sp);                                                      \ | ||||
|         csrr  x8, mcause;                                                     \ | ||||
|         blt   x8, zero, core_dummy_trap_handler_irq;                          \ | ||||
|         csrr  x8, mepc;                                                       \ | ||||
|       core_dummy_trap_handler_exc_c_check:                                    \ | ||||
|         lh    x9, 0(x8);                                                      \ | ||||
|         andi  x9, x9, 3;                                                      \ | ||||
|         addi  x8, x8, +2;                                                     \ | ||||
|         csrw  mepc, x8;                                                       \ | ||||
|         addi  x8, zero, 3;                                                    \ | ||||
|         bne   x8, x9, core_dummy_trap_handler_irq;                            \ | ||||
|       core_dummy_trap_handler_exc_uncrompressed:                              \ | ||||
|         csrr  x8, mepc;                                                       \ | ||||
|         addi  x8, x8, +2;                                                     \ | ||||
|         csrw  mepc, x8;                                                       \ | ||||
|       core_dummy_trap_handler_irq:                                            \ | ||||
|         lw    x9, 0(sp);                                                      \ | ||||
|         lw    x8, 4(sp);                                                      \ | ||||
|         csrr  sp, mscratch;                                                   \ | ||||
|         mret;                                                                 \ | ||||
| nop;                                                                          \ | ||||
| nop;                                                                          \ | ||||
|       uart0_sim_mode_init:                                                    \ | ||||
|         li    a0,   0xFFFFFFA0;                                               \ | ||||
|         sw    zero, 0(a0);                                                    \ | ||||
|         li    a1,   1 << 28;                                                  \ | ||||
|         li    a2,   1 << 12;                                                  \ | ||||
|         or    a1,   a1, a2;                                                   \ | ||||
|         sw    a1,   0(a0); | ||||
|  | ||||
| #else | ||||
|  | ||||
| // ------------------------- WITH DATA INIT ------------------------- | ||||
| #define RVMODEL_BOOT                                                          \ | ||||
|       core_init:                                                              \ | ||||
|         la x1, core_dummy_trap_handler;                                       \ | ||||
|         csrw   mtvec, x1;                                                     \ | ||||
|         csrw   mie, x0;                                                       \ | ||||
| nop;                                                                          \ | ||||
| nop;                                                                          \ | ||||
|       init_rvtest_data:                                                       \ | ||||
|   			la   a0, rvtest_data_begin;                                           \ | ||||
| 				la   a1, rvtest_data_end;                                             \ | ||||
|         li   a2, 0xBABECAFE;                                                  \ | ||||
|       init_rvtest_data_loop:                                                  \ | ||||
|         beq  a0, a1, init_rvtest_data_loop_end;                               \ | ||||
|         sw   a2, 0(a0);                                                       \ | ||||
|         addi a0, a0, 4;                                                       \ | ||||
|         j    init_rvtest_data_loop;                                           \ | ||||
|       init_rvtest_data_loop_end:                                              \ | ||||
| nop;                                                                          \ | ||||
| nop;                                                                          \ | ||||
|       init_signature:                                                         \ | ||||
|   			la   a0, begin_signature;                                             \ | ||||
| 				la   a1, end_signature;                                               \ | ||||
|         li   a2, 0xDEADBEEF;                                                  \ | ||||
|       init_signature_loop:                                                    \ | ||||
|         beq  a0, a1, init_signature_loop_end;                                 \ | ||||
|         sw   a2, 0(a0);                                                       \ | ||||
|         addi a0, a0, 4;                                                       \ | ||||
|         j    init_signature_loop;                                             \ | ||||
|       init_signature_loop_end:                                                \ | ||||
|         j    uart0_sim_mode_init;                                             \ | ||||
| nop;                                                                          \ | ||||
| nop;                                                                          \ | ||||
|       .balign 4;                                                              \ | ||||
|       core_dummy_trap_handler:                                                \ | ||||
|         csrw  mscratch, sp;                                                   \ | ||||
|         la    sp, end_signature;                                              \ | ||||
|         addi  sp, sp, 32;                                                     \ | ||||
|         sw	  x8, 0(sp);                                                      \ | ||||
|         sw	  x9, 4(sp);                                                      \ | ||||
|         csrr  x8, mcause;                                                     \ | ||||
|         blt   x8, zero, core_dummy_trap_handler_irq;                          \ | ||||
|         csrr  x8, mepc;                                                       \ | ||||
|       core_dummy_trap_handler_exc_c_check:                                    \ | ||||
|         lh    x9, 0(x8);                                                      \ | ||||
|         andi  x9, x9, 3;                                                      \ | ||||
|         addi  x8, x8, +2;                                                     \ | ||||
|         csrw  mepc, x8;                                                       \ | ||||
|         addi  x8, zero, 3;                                                    \ | ||||
|         bne   x8, x9, core_dummy_trap_handler_irq;                            \ | ||||
|       core_dummy_trap_handler_exc_uncrompressed:                              \ | ||||
|         csrr  x8, mepc;                                                       \ | ||||
|         addi  x8, x8, +2;                                                     \ | ||||
|         csrw  mepc, x8;                                                       \ | ||||
|       core_dummy_trap_handler_irq:                                            \ | ||||
|         lw    x9, 0(sp);                                                      \ | ||||
|         lw    x8, 4(sp);                                                      \ | ||||
|         csrr  sp, mscratch;                                                   \ | ||||
|         mret;                                                                 \ | ||||
| nop;                                                                          \ | ||||
| nop;                                                                          \ | ||||
|       uart0_sim_mode_init:                                                    \ | ||||
|         li    a0,   0xFFFFFFA0;                                               \ | ||||
|         sw    zero, 0(a0);                                                    \ | ||||
|         li    a1,   1 << 28;                                                  \ | ||||
|         li    a2,   1 << 12;                                                  \ | ||||
|         or    a1,   a1, a2;                                                   \ | ||||
|         sw    a1,   0(a0); | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| //RVTEST_IO_INIT | ||||
| #define RVMODEL_IO_INIT | ||||
| //RVTEST_IO_WRITE_STR | ||||
| #define RVMODEL_IO_WRITE_STR(_R, _STR) | ||||
| //RVTEST_IO_CHECK | ||||
| #define RVMODEL_IO_CHECK() | ||||
|  | ||||
| //RVTEST_IO_ASSERT_GPR_EQ | ||||
| #define RVMODEL_IO_ASSERT_GPR_EQ(_S, _R, _I) | ||||
| //RVTEST_IO_ASSERT_SFPR_EQ | ||||
| #define RVMODEL_IO_ASSERT_SFPR_EQ(_F, _R, _I) | ||||
| //RVTEST_IO_ASSERT_DFPR_EQ | ||||
| #define RVMODEL_IO_ASSERT_DFPR_EQ(_D, _R, _I) | ||||
|  | ||||
| // TODO: specify the routine for setting machine software interrupt | ||||
| #define RVMODEL_SET_MSW_INT | ||||
|  | ||||
| // TODO: specify the routine for clearing machine software interrupt | ||||
| #define RVMODEL_CLEAR_MSW_INT | ||||
|  | ||||
| // TODO: specify the routine for clearing machine timer interrupt | ||||
| #define RVMODEL_CLEAR_MTIMER_INT | ||||
|  | ||||
| // TODO: specify the routine for clearing machine external interrupt | ||||
| #define RVMODEL_CLEAR_MEXT_INT | ||||
|  | ||||
| #endif // _COMPLIANCE_MODEL_H | ||||
		Reference in New Issue
	
	Block a user