mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Merge branch 'imperas'
This commit is contained in:
		
						commit
						026071e247
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -134,3 +134,5 @@ fpga/src/CopiedFiles_do_not_add_to_repo/* | ||||
| /fpga/generator/sim/imp-timesim.sdf | ||||
| /fpga/generator/sim/imp-timesim.v | ||||
| /fpga/generator/sim/syn-funcsim.v | ||||
| external | ||||
| pipelined/regression/results | ||||
|  | ||||
							
								
								
									
										26
									
								
								pipelined/regression/imperas.ic
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								pipelined/regression/imperas.ic
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| #--showoverrides | ||||
| --override cpu/show_c_prefix=T | ||||
| --override cpu/unaligned=F | ||||
| --override cpu/mstatus_FS=1 | ||||
| 
 | ||||
| # Enable the Imperas instruction coverage | ||||
| -extlib    refRoot/cpu/cv=imperas.com/intercept/riscvInstructionCoverage/1.0 | ||||
| -override  refRoot/cpu/cv/cover=basic | ||||
| -override  refRoot/cpu/cv/extensions=RV32I | ||||
| 
 | ||||
| # Add Imperas simulator application instruction tracing | ||||
| --trace | ||||
| --tracechange | ||||
| --traceshowicount | ||||
| --tracemode | ||||
| --monitornetschange | ||||
| 
 | ||||
| # Turn on verbose output for Imperas simulator | ||||
| --verbose | ||||
| 
 | ||||
| # Turn on verbose output for RISCV model | ||||
| --override  cpu/verbose=1 | ||||
| 
 | ||||
| # Store simulator output to logfile | ||||
| --output imperas.log | ||||
| 
 | ||||
							
								
								
									
										22
									
								
								pipelined/regression/run-imperasdv-tests.bash
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										22
									
								
								pipelined/regression/run-imperasdv-tests.bash
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,22 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| if [ -d results ]; then | ||||
|     rm -rf results | ||||
| fi | ||||
| mkdir -p results | ||||
| 
 | ||||
| ALL=$(find ${WALLY}/external/ImperasDV-HMC/tests/riscof/work/riscv-arch-test/rv64i_m -name "ref" -type d) | ||||
| 
 | ||||
| export IMPERAS_TOOLS=$(pwd)/imperas.ic | ||||
| export OTHERFLAGS="+TRACE2LOG_ENABLE=1 VERBOSE=1" | ||||
| 
 | ||||
| for t in $ALL; do | ||||
|     export TESTDIR=$(dirname ${t}) | ||||
|     OUTLOG=$(echo ${TESTDIR} | sed "s|${WALLY}/external/ImperasDV-HMC/tests/riscof/work|results|").log | ||||
|     OUTDIR=$(dirname ${OUTLOG}) | ||||
|     echo "Running test ${TESTDIR} -> ${OUTDIR} :: ${OUTLOG}" | ||||
| 
 | ||||
|     mkdir -p ${OUTDIR} | ||||
|     vsim -c -do "do wally-pipelined-imperas.do rv64gc" | ||||
|     mv transcript ${OUTLOG} | ||||
| done | ||||
							
								
								
									
										55
									
								
								pipelined/regression/wally-pipelined-imperas-no-idv.do
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								pipelined/regression/wally-pipelined-imperas-no-idv.do
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | ||||
| # wally-pipelined.do  | ||||
| # | ||||
| # Modification by Oklahoma State University & Harvey Mudd College | ||||
| # Use with Testbench  | ||||
| # James Stine, 2008; David Harris 2021 | ||||
| # Go Cowboys!!!!!! | ||||
| # | ||||
| # Takes 1:10 to run RV64IC tests using gui | ||||
| 
 | ||||
| # run with vsim -do "do wally-pipelined.do rv64ic riscvarchtest-64m" | ||||
| 
 | ||||
| # Use this wally-pipelined.do file to run this example. | ||||
| # Either bring up ModelSim and type the following at the "ModelSim>" prompt: | ||||
| #     do wally-pipelined.do | ||||
| # or, to run from a shell, type the following at the shell prompt: | ||||
| #     vsim -do wally-pipelined.do -c | ||||
| # (omit the "-c" to see the GUI while running from the shell) | ||||
| 
 | ||||
| onbreak {resume} | ||||
| 
 | ||||
| # create library | ||||
| if [file exists work] { | ||||
|     vdel -all | ||||
| } | ||||
| vlib work | ||||
| 
 | ||||
| # compile source files | ||||
| # suppress spurious warnngs about  | ||||
| # "Extra checking for conflicts with always_comb done at vopt time" | ||||
| # because vsim will run vopt | ||||
| 
 | ||||
| # start and run simulation | ||||
| # remove +acc flag for faster sim during regressions if there is no need to access internal signals | ||||
|         # *** modelsim won't take `PA_BITS, but will take other defines for the lengths of DTIM_RANGE and IROM_LEN.  For now just live with the warnings. | ||||
| vlog +incdir+../config/$1 \ | ||||
|      +incdir+../config/shared \ | ||||
|      ../../external/ImperasDV-HMC/Imperas/ImpPublic/source/host/rvvi/rvvi-trace.sv \ | ||||
|      ../testbench/testbench_imperas.sv \ | ||||
|      ../testbench/common/*.sv   \ | ||||
|      ../src/*/*.sv \ | ||||
|      ../src/*/*/*.sv \ | ||||
|      -suppress 2583 \ | ||||
|      -suppress 7063  | ||||
| vopt +acc work.testbench -G DEBUG=1 -o workopt  | ||||
| vsim workopt +nowarn3829  -fatal 7 \ | ||||
|      +testDir=$env(TESTDIR) $env(OTHERFLAGS) | ||||
| view wave | ||||
| #-- display input and output signals as hexidecimal values | ||||
| add log -recursive /* | ||||
| do wave.do | ||||
| 
 | ||||
| run -all | ||||
| 
 | ||||
| noview ../testbench/testbench_imperas.sv | ||||
| view wave | ||||
							
								
								
									
										63
									
								
								pipelined/regression/wally-pipelined-imperas.do
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								pipelined/regression/wally-pipelined-imperas.do
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,63 @@ | ||||
| # wally-pipelined.do  | ||||
| # | ||||
| # Modification by Oklahoma State University & Harvey Mudd College | ||||
| # Use with Testbench  | ||||
| # James Stine, 2008; David Harris 2021 | ||||
| # Go Cowboys!!!!!! | ||||
| # | ||||
| # Takes 1:10 to run RV64IC tests using gui | ||||
| 
 | ||||
| # run with vsim -do "do wally-pipelined.do rv64ic riscvarchtest-64m" | ||||
| 
 | ||||
| # Use this wally-pipelined.do file to run this example. | ||||
| # Either bring up ModelSim and type the following at the "ModelSim>" prompt: | ||||
| #     do wally-pipelined.do | ||||
| # or, to run from a shell, type the following at the shell prompt: | ||||
| #     vsim -do wally-pipelined.do -c | ||||
| # (omit the "-c" to see the GUI while running from the shell) | ||||
| 
 | ||||
| onbreak {resume} | ||||
| 
 | ||||
| # create library | ||||
| if [file exists work] { | ||||
|     vdel -all | ||||
| } | ||||
| vlib work | ||||
| 
 | ||||
| # compile source files | ||||
| # suppress spurious warnngs about  | ||||
| # "Extra checking for conflicts with always_comb done at vopt time" | ||||
| # because vsim will run vopt | ||||
| 
 | ||||
| # start and run simulation | ||||
| # remove +acc flag for faster sim during regressions if there is no need to access internal signals | ||||
|         # *** modelsim won't take `PA_BITS, but will take other defines for the lengths of DTIM_RANGE and IROM_LEN.  For now just live with the warnings. | ||||
| vlog +incdir+../config/$1 \ | ||||
|      +incdir+../config/shared \ | ||||
|      +define+USE_IMPERAS_DV \ | ||||
|      +incdir+$env(IMPERAS_HOME)/ImpPublic/include/host \ | ||||
|      +incdir+$env(IMPERAS_HOME)/ImpProprietary/include/host \ | ||||
|      $env(IMPERAS_HOME)/ImpPublic/source/host/rvvi/rvvi-api-pkg.sv    \ | ||||
|      $env(IMPERAS_HOME)/ImpPublic/source/host/rvvi/rvvi-trace.sv      \ | ||||
|      $env(IMPERAS_HOME)/ImpProprietary/source/host/rvvi/rvvi-pkg.sv   \ | ||||
|      $env(IMPERAS_HOME)/ImpProprietary/source/host/rvvi/trace2api.sv  \ | ||||
|      $env(IMPERAS_HOME)/ImpProprietary/source/host/rvvi/trace2log.sv  \ | ||||
|      ../testbench/testbench_imperas.sv \ | ||||
|      ../testbench/common/*.sv   \ | ||||
|      ../src/*/*.sv \ | ||||
|      ../src/*/*/*.sv \ | ||||
|      -suppress 2583 \ | ||||
|      -suppress 7063  | ||||
| vopt +acc work.testbench -G DEBUG=1 -o workopt  | ||||
| vsim workopt +nowarn3829  -fatal 7 \ | ||||
|      -sv_lib $env(IMPERAS_HOME)/lib/Linux64/ImperasLib/imperas.com/verification/riscv/1.0/model \ | ||||
|      +testDir=$env(TESTDIR) $env(OTHERFLAGS) | ||||
| view wave | ||||
| #-- display input and output signals as hexidecimal values | ||||
| add log -recursive /* | ||||
| do wave.do | ||||
| 
 | ||||
| run -all | ||||
| 
 | ||||
| noview ../testbench/testbench_imperas.sv | ||||
| view wave | ||||
| @ -6,28 +6,28 @@ add wave -noupdate /testbench/reset | ||||
| add wave -noupdate /testbench/reset_ext | ||||
| add wave -noupdate /testbench/memfilename | ||||
| add wave -noupdate /testbench/dut/core/SATP_REGW | ||||
| add wave -noupdate -group HDU -expand -group hazards /testbench/dut/core/hzu/BPPredWrongE | ||||
| add wave -noupdate -group HDU -expand -group hazards /testbench/dut/core/hzu/RetM | ||||
| add wave -noupdate -group HDU -expand -group hazards -color Pink /testbench/dut/core/hzu/TrapM | ||||
| add wave -noupdate -group HDU -expand -group hazards /testbench/dut/core/hzu/LoadStallD | ||||
| add wave -noupdate -group HDU -expand -group hazards /testbench/dut/core/ifu/IFUStallF | ||||
| add wave -noupdate -group HDU -expand -group hazards /testbench/dut/core/hzu/LSUStallM | ||||
| add wave -noupdate -group HDU -expand -group hazards /testbench/dut/core/MDUStallD | ||||
| add wave -noupdate -group HDU -expand -group hazards /testbench/dut/core/hzu/DivBusyE | ||||
| add wave -noupdate -group HDU -expand -group hazards /testbench/dut/core/hzu/FDivBusyE | ||||
| add wave -noupdate -group HDU -expand -group traps /testbench/dut/core/priv/priv/trap/InstrMisalignedFaultM | ||||
| add wave -noupdate -group HDU -expand -group traps /testbench/dut/core/priv/priv/trap/InstrAccessFaultM | ||||
| add wave -noupdate -group HDU -expand -group traps /testbench/dut/core/priv/priv/trap/IllegalInstrFaultM | ||||
| add wave -noupdate -group HDU -expand -group traps /testbench/dut/core/priv/priv/trap/BreakpointFaultM | ||||
| add wave -noupdate -group HDU -expand -group traps /testbench/dut/core/priv/priv/trap/LoadMisalignedFaultM | ||||
| add wave -noupdate -group HDU -expand -group traps /testbench/dut/core/priv/priv/trap/StoreAmoMisalignedFaultM | ||||
| add wave -noupdate -group HDU -expand -group traps /testbench/dut/core/priv/priv/trap/LoadAccessFaultM | ||||
| add wave -noupdate -group HDU -expand -group traps /testbench/dut/core/priv/priv/trap/StoreAmoAccessFaultM | ||||
| add wave -noupdate -group HDU -expand -group traps /testbench/dut/core/priv/priv/trap/EcallFaultM | ||||
| add wave -noupdate -group HDU -expand -group traps /testbench/dut/core/priv/priv/trap/InstrPageFaultM | ||||
| add wave -noupdate -group HDU -expand -group traps /testbench/dut/core/priv/priv/trap/LoadPageFaultM | ||||
| add wave -noupdate -group HDU -expand -group traps /testbench/dut/core/priv/priv/trap/StoreAmoPageFaultM | ||||
| add wave -noupdate -group HDU -expand -group traps /testbench/dut/core/priv/priv/trap/InterruptM | ||||
| add wave -noupdate -group HDU -group hazards /testbench/dut/core/hzu/BPPredWrongE | ||||
| add wave -noupdate -group HDU -group hazards /testbench/dut/core/hzu/RetM | ||||
| add wave -noupdate -group HDU -group hazards -color Pink /testbench/dut/core/hzu/TrapM | ||||
| add wave -noupdate -group HDU -group hazards /testbench/dut/core/hzu/LoadStallD | ||||
| add wave -noupdate -group HDU -group hazards /testbench/dut/core/ifu/IFUStallF | ||||
| add wave -noupdate -group HDU -group hazards /testbench/dut/core/hzu/LSUStallM | ||||
| add wave -noupdate -group HDU -group hazards /testbench/dut/core/MDUStallD | ||||
| add wave -noupdate -group HDU -group hazards /testbench/dut/core/hzu/DivBusyE | ||||
| add wave -noupdate -group HDU -group hazards /testbench/dut/core/hzu/FDivBusyE | ||||
| add wave -noupdate -group HDU -group traps /testbench/dut/core/priv/priv/trap/InstrMisalignedFaultM | ||||
| add wave -noupdate -group HDU -group traps /testbench/dut/core/priv/priv/trap/InstrAccessFaultM | ||||
| add wave -noupdate -group HDU -group traps /testbench/dut/core/priv/priv/trap/IllegalInstrFaultM | ||||
| add wave -noupdate -group HDU -group traps /testbench/dut/core/priv/priv/trap/BreakpointFaultM | ||||
| add wave -noupdate -group HDU -group traps /testbench/dut/core/priv/priv/trap/LoadMisalignedFaultM | ||||
| add wave -noupdate -group HDU -group traps /testbench/dut/core/priv/priv/trap/StoreAmoMisalignedFaultM | ||||
| add wave -noupdate -group HDU -group traps /testbench/dut/core/priv/priv/trap/LoadAccessFaultM | ||||
| add wave -noupdate -group HDU -group traps /testbench/dut/core/priv/priv/trap/StoreAmoAccessFaultM | ||||
| add wave -noupdate -group HDU -group traps /testbench/dut/core/priv/priv/trap/EcallFaultM | ||||
| add wave -noupdate -group HDU -group traps /testbench/dut/core/priv/priv/trap/InstrPageFaultM | ||||
| add wave -noupdate -group HDU -group traps /testbench/dut/core/priv/priv/trap/LoadPageFaultM | ||||
| add wave -noupdate -group HDU -group traps /testbench/dut/core/priv/priv/trap/StoreAmoPageFaultM | ||||
| add wave -noupdate -group HDU -group traps /testbench/dut/core/priv/priv/trap/InterruptM | ||||
| add wave -noupdate -group HDU -expand -group Flush -color Yellow /testbench/dut/core/FlushD | ||||
| add wave -noupdate -group HDU -expand -group Flush -color Yellow /testbench/dut/core/FlushE | ||||
| add wave -noupdate -group HDU -expand -group Flush -color Yellow /testbench/dut/core/FlushM | ||||
|  | ||||
| @ -68,6 +68,7 @@ module csrsr ( | ||||
|                           STATUS_XS, STATUS_FS, /*STATUS_MPP, 2'b0*/ 4'b0, | ||||
|                           STATUS_SPP, /*STATUS_MPIE*/ 1'b0, STATUS_UBE, STATUS_SPIE, | ||||
|                           /*1'b0, STATUS_MIE, 1'b0*/ 3'b0, STATUS_SIE, 1'b0}; | ||||
| 	assign MSTATUSH_REGW = '0; // *** does not exist when XLEN=64, but don't want it to have an undefined value.  Spec is not clear what it should be.
 | ||||
|   end else begin: csrsr32 // RV32
 | ||||
|     assign MSTATUS_REGW = {STATUS_SD, 8'b0, | ||||
|                           STATUS_TSR, STATUS_TW, STATUS_TVM, STATUS_MXR, STATUS_SUM, STATUS_MPRV, | ||||
|  | ||||
							
								
								
									
										291
									
								
								pipelined/testbench/common/wallyTracer.sv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										291
									
								
								pipelined/testbench/common/wallyTracer.sv
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,291 @@ | ||||
| `include "wally-config.vh" | ||||
| 
 | ||||
| `define NUM_REGS 32 | ||||
| `define NUM_CSRS 4096 | ||||
| 
 | ||||
| `define PRINT_PC_INSTR 0 | ||||
| `define PRINT_MOST 0 | ||||
| `define PRINT_ALL 0 | ||||
| `define PRINT_CSRS 0 | ||||
| 
 | ||||
| module wallyTracer(rvviTrace rvvi); | ||||
| 
 | ||||
|   localparam NUMREGS = `E_SUPPORTED ? 16 : 32; | ||||
|    | ||||
|   // wally specific signals
 | ||||
|   logic 						 reset; | ||||
|    | ||||
|   logic [`XLEN-1:0] 			 PCNextF, PCF, PCD, PCE, PCM, PCW; | ||||
|   logic [`XLEN-1:0] 			 InstrRawD, InstrRawE, InstrRawM, InstrRawW; | ||||
|   logic 						 InstrValidM, InstrValidW; | ||||
|   logic 						 StallE, StallM, StallW; | ||||
|   logic 						 FlushD, FlushE, FlushM, FlushW; | ||||
|   logic 						 TrapM, TrapW; | ||||
|   logic 						 IntrF, IntrD, IntrE, IntrM, IntrW; | ||||
|   logic 						 HaltM, HaltW; | ||||
|   logic [1:0] 					 PrivilegeModeW; | ||||
|   logic [`XLEN-1:0] 			 rf[NUMREGS]; | ||||
|   logic [NUMREGS-1:0] 			 rf_wb; | ||||
|   logic [4:0] 					 rf_a3; | ||||
|   logic 						 rf_we3; | ||||
|   logic [`XLEN-1:0] 			 frf[32]; | ||||
|   logic [`NUM_REGS-1:0] 		 frf_wb; | ||||
|   logic [4:0] 					 frf_a4; | ||||
|   logic 						 frf_we4; | ||||
|   logic [`XLEN-1:0]              CSRArray [logic[11:0]]; | ||||
|   logic [`XLEN-1:0] 			 CSRArrayOld [logic[11:0]]; | ||||
|   logic [`NUM_CSRS-1:0] 		 CSR_W; | ||||
|   logic 						 CSRWriteM, CSRWriteW; | ||||
|   logic [11:0] 					 CSRAdrM, CSRAdrW; | ||||
|    | ||||
|   assign clk = testbench.dut.clk; | ||||
|   //  assign InstrValidF = testbench.dut.core.ieu.InstrValidF;  // not needed yet
 | ||||
|   assign InstrValidD    = testbench.dut.core.ieu.c.InstrValidD; | ||||
|   assign InstrValidE    = testbench.dut.core.ieu.c.InstrValidE; | ||||
|   assign InstrValidM    = testbench.dut.core.ieu.InstrValidM; | ||||
|   assign InstrRawD      = testbench.dut.core.ifu.InstrRawD; | ||||
|   assign PCNextF        = testbench.dut.core.ifu.PCNextF; | ||||
|   assign PCF            = testbench.dut.core.ifu.PCF; | ||||
|   assign PCD            = testbench.dut.core.ifu.PCD; | ||||
|   assign PCE            = testbench.dut.core.ifu.PCE; | ||||
|   assign PCM            = testbench.dut.core.ifu.PCM; | ||||
|   assign reset          = testbench.reset; | ||||
|   assign StallF         = testbench.dut.core.StallF; | ||||
|   assign StallD         = testbench.dut.core.StallD; | ||||
|   assign StallE         = testbench.dut.core.StallE; | ||||
|   assign StallM         = testbench.dut.core.StallM; | ||||
|   assign StallW         = testbench.dut.core.StallW; | ||||
|   assign FlushD         = testbench.dut.core.FlushD; | ||||
|   assign FlushE         = testbench.dut.core.FlushE; | ||||
|   assign FlushM         = testbench.dut.core.FlushM; | ||||
|   assign FlushW         = testbench.dut.core.FlushW; | ||||
|   assign TrapM          = testbench.dut.core.TrapM; | ||||
|   assign HaltM          = testbench.DCacheFlushStart; | ||||
|   assign PrivilegeModeW = testbench.dut.core.priv.priv.privmode.PrivilegeModeW; | ||||
|   assign STATUS_SXL     = testbench.dut.core.priv.priv.csr.csrsr.STATUS_SXL; | ||||
|   assign STATUS_UXL     = testbench.dut.core.priv.priv.csr.csrsr.STATUS_UXL; | ||||
| 
 | ||||
|   logic valid; | ||||
| 
 | ||||
|   always_comb begin | ||||
| 	// Since we are detected the CSR change by comparing the old value we need to
 | ||||
| 	// ensure the CSR is detected when the pipeline's Writeback stage is not
 | ||||
| 	// stalled.  If it is stalled we want CSRArray to hold the old value.
 | ||||
| 	if(valid) begin  | ||||
| 	  // machine CSRs
 | ||||
| 	  // *** missing PMP and performance counters.
 | ||||
| 	  CSRArray[12'h300] = testbench.dut.core.priv.priv.csr.csrm.MSTATUS_REGW; | ||||
| 	  CSRArray[12'h310] = testbench.dut.core.priv.priv.csr.csrm.MSTATUSH_REGW; | ||||
| 	  CSRArray[12'h305] = testbench.dut.core.priv.priv.csr.csrm.MTVEC_REGW; | ||||
| 	  CSRArray[12'h341] = testbench.dut.core.priv.priv.csr.csrm.MEPC_REGW; | ||||
| 	  CSRArray[12'h306] = testbench.dut.core.priv.priv.csr.csrm.MCOUNTEREN_REGW; | ||||
| 	  CSRArray[12'h320] = testbench.dut.core.priv.priv.csr.csrm.MCOUNTINHIBIT_REGW; | ||||
| 	  CSRArray[12'h302] = testbench.dut.core.priv.priv.csr.csrm.MEDELEG_REGW; | ||||
| 	  CSRArray[12'h303] = testbench.dut.core.priv.priv.csr.csrm.MIDELEG_REGW; | ||||
| 	  CSRArray[12'h344] = testbench.dut.core.priv.priv.csr.csrm.MIP_REGW; | ||||
| 	  CSRArray[12'h304] = testbench.dut.core.priv.priv.csr.csrm.MIE_REGW; | ||||
| 	  CSRArray[12'h301] = testbench.dut.core.priv.priv.csr.csrm.MISA_REGW; | ||||
| 	  CSRArray[12'hF14] = testbench.dut.core.priv.priv.csr.csrm.MHARTID_REGW; | ||||
| 	  CSRArray[12'h340] = testbench.dut.core.priv.priv.csr.csrm.MSCRATCH_REGW; | ||||
| 	  CSRArray[12'h342] = testbench.dut.core.priv.priv.csr.csrm.MCAUSE_REGW; | ||||
| 	  CSRArray[12'h343] = testbench.dut.core.priv.priv.csr.csrm.MTVAL_REGW; | ||||
| 	  CSRArray[12'hF11] = 0; | ||||
| 	  CSRArray[12'hF12] = 0; | ||||
| 	  CSRArray[12'hF13] = `XLEN'h100; | ||||
| 	  CSRArray[12'hF15] = 0; | ||||
| 	  CSRArray[12'h34A] = 0; | ||||
| 	  // MCYCLE and MINSTRET
 | ||||
| 	  CSRArray[12'hB00] = testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[0]; | ||||
| 	  CSRArray[12'hB02] = testbench.dut.core.priv.priv.csr.counters.counters.HPMCOUNTER_REGW[2]; | ||||
| 	  // supervisor CSRs
 | ||||
| 	  CSRArray[12'h100] = testbench.dut.core.priv.priv.csr.csrs.SSTATUS_REGW; | ||||
| 	  CSRArray[12'h104] = testbench.dut.core.priv.priv.csr.csrm.MIE_REGW & 12'h222; | ||||
| 	  CSRArray[12'h105] = testbench.dut.core.priv.priv.csr.csrs.STVEC_REGW; | ||||
| 	  CSRArray[12'h141] = testbench.dut.core.priv.priv.csr.csrs.SEPC_REGW; | ||||
| 	  CSRArray[12'h106] = testbench.dut.core.priv.priv.csr.csrs.SCOUNTEREN_REGW; | ||||
| 	  CSRArray[12'h180] = testbench.dut.core.priv.priv.csr.csrs.SATP_REGW; | ||||
| 	  CSRArray[12'h140] = testbench.dut.core.priv.priv.csr.csrs.csrs.SSCRATCH_REGW; | ||||
| 	  CSRArray[12'h143] = testbench.dut.core.priv.priv.csr.csrs.csrs.STVAL_REGW; | ||||
| 	  CSRArray[12'h142] = testbench.dut.core.priv.priv.csr.csrs.csrs.SCAUSE_REGW; | ||||
| 	  CSRArray[12'h144] = testbench.dut.core.priv.priv.csr.csrm.MIP_REGW & & 12'h222 & testbench.dut.core.priv.priv.csr.csrm.MIDELEG_REGW; | ||||
| 	  // user CSRs
 | ||||
| 	  CSRArray[12'h001] = testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW; | ||||
| 	  CSRArray[12'h002] = testbench.dut.core.priv.priv.csr.csru.FRM_REGW; | ||||
| 	  CSRArray[12'h003] = {testbench.dut.core.priv.priv.csr.csru.FRM_REGW, testbench.dut.core.priv.priv.csr.csru.csru.FFLAGS_REGW}; | ||||
| 	end else begin // hold the old value if the pipeline is stalled.
 | ||||
| 	  CSRArray[12'h300] = CSRArrayOld[12'h300]; | ||||
| 	  CSRArray[12'h310] = CSRArrayOld[12'h310]; | ||||
| 	  CSRArray[12'h305] = CSRArrayOld[12'h305]; | ||||
| 	  CSRArray[12'h341] = CSRArrayOld[12'h341]; | ||||
| 	  CSRArray[12'h306] = CSRArrayOld[12'h306]; | ||||
| 	  CSRArray[12'h320] = CSRArrayOld[12'h320]; | ||||
| 	  CSRArray[12'h302] = CSRArrayOld[12'h302]; | ||||
| 	  CSRArray[12'h303] = CSRArrayOld[12'h303]; | ||||
| 	  CSRArray[12'h344] = CSRArrayOld[12'h344]; | ||||
| 	  CSRArray[12'h304] = CSRArrayOld[12'h304]; | ||||
| 	  CSRArray[12'h301] = CSRArrayOld[12'h301]; | ||||
| 	  CSRArray[12'hF14] = CSRArrayOld[12'hF14]; | ||||
| 	  CSRArray[12'h340] = CSRArrayOld[12'h340]; | ||||
| 	  CSRArray[12'h342] = CSRArrayOld[12'h342]; | ||||
| 	  CSRArray[12'h343] = CSRArrayOld[12'h343]; | ||||
| 	  CSRArray[12'hF11] = CSRArrayOld[12'hF11]; | ||||
| 	  CSRArray[12'hF12] = CSRArrayOld[12'hF12]; | ||||
| 	  CSRArray[12'hF13] = CSRArrayOld[12'hF13]; | ||||
| 	  CSRArray[12'hF15] = CSRArrayOld[12'hF15]; | ||||
| 	  CSRArray[12'h34A] = CSRArrayOld[12'h34A]; | ||||
| 	  // MCYCLE and MINSTRET
 | ||||
| 	  CSRArray[12'hB00] = CSRArrayOld[12'hB00]; | ||||
| 	  CSRArray[12'hB02] = CSRArrayOld[12'hB02]; | ||||
| 	  // supervisor CSRs
 | ||||
| 	  CSRArray[12'h100] = CSRArrayOld[12'h100]; | ||||
| 	  CSRArray[12'h104] = CSRArrayOld[12'h104]; | ||||
| 	  CSRArray[12'h105] = CSRArrayOld[12'h105]; | ||||
| 	  CSRArray[12'h141] = CSRArrayOld[12'h141]; | ||||
| 	  CSRArray[12'h106] = CSRArrayOld[12'h106]; | ||||
| 	  CSRArray[12'h180] = CSRArrayOld[12'h180]; | ||||
| 	  CSRArray[12'h140] = CSRArrayOld[12'h140]; | ||||
| 	  CSRArray[12'h143] = CSRArrayOld[12'h143]; | ||||
| 	  CSRArray[12'h142] = CSRArrayOld[12'h142]; | ||||
| 	  CSRArray[12'h144] = CSRArrayOld[12'h144]; | ||||
| 	  // user CSRs
 | ||||
| 	  CSRArray[12'h001] = CSRArrayOld[12'h001]; | ||||
| 	  CSRArray[12'h002] = CSRArrayOld[12'h002]; | ||||
| 	  CSRArray[12'h003] = CSRArrayOld[12'h003]; | ||||
| 	end	   | ||||
|   end | ||||
| 
 | ||||
|   genvar 							index; | ||||
|   assign rf[0] = '0; | ||||
|   for(index = 1; index < NUMREGS; index += 1)  | ||||
| 	assign rf[index] = testbench.dut.core.ieu.dp.regf.rf[index]; | ||||
| 
 | ||||
|   assign rf_a3  = testbench.dut.core.ieu.dp.regf.a3; | ||||
|   assign rf_we3 = testbench.dut.core.ieu.dp.regf.we3; | ||||
|    | ||||
|   always_comb begin | ||||
| 	rf_wb <= '0; | ||||
| 	if(rf_we3) | ||||
| 	  rf_wb[rf_a3] <= 1'b1; | ||||
|   end | ||||
| 
 | ||||
|   for(index = 0; index < NUMREGS; index += 1)  | ||||
| 	assign frf[index] = testbench.dut.core.fpu.fpu.fregfile.rf[index]; | ||||
|    | ||||
|   assign frf_a4  = testbench.dut.core.fpu.fpu.fregfile.a4; | ||||
|   assign frf_we4 = testbench.dut.core.fpu.fpu.fregfile.we4; | ||||
|    | ||||
|   always_comb begin | ||||
| 	frf_wb <= '0; | ||||
| 	if(frf_we4) | ||||
| 	  frf_wb[frf_a4] <= 1'b1; | ||||
|   end | ||||
| 
 | ||||
|   assign CSRAdrM  = testbench.dut.core.priv.priv.csr.CSRAdrM; | ||||
|   assign CSRWriteM = testbench.dut.core.priv.priv.csr.CSRWriteM; | ||||
|    | ||||
|   // pipeline to writeback stage
 | ||||
|   flopenrc #(`XLEN) InstrRawEReg (clk, reset, FlushE, ~StallE, InstrRawD, InstrRawE); | ||||
|   flopenrc #(`XLEN) InstrRawMReg (clk, reset, FlushM, ~StallM, InstrRawE, InstrRawM); | ||||
|   flopenrc #(`XLEN) InstrRawWReg (clk, reset, FlushW, ~StallW, InstrRawM, InstrRawW); | ||||
|   flopenrc #(`XLEN) PCWReg (clk, reset, FlushW, ~StallW, PCM, PCW); | ||||
|   flopenrc #(1)     InstrValidMReg (clk, reset, FlushW, ~StallW, InstrValidM, InstrValidW); | ||||
|   flopenrc #(1)     TrapWReg (clk, reset, 1'b0, ~StallW, TrapM, TrapW); | ||||
|   flopenrc #(1)     HaltWReg (clk, reset, 1'b0, ~StallW, HaltM, HaltW); | ||||
| 
 | ||||
|   flopenrc #(1)     IntrFReg (clk, reset, 1'b0, ~StallF, TrapM, IntrF); | ||||
|   flopenrc #(1)     IntrDReg (clk, reset, FlushD, ~StallD, IntrF, IntrD); | ||||
|   flopenrc #(1)     IntrEReg (clk, reset, FlushE, ~StallE, IntrD, IntrE); | ||||
|   flopenrc #(1)     IntrMReg (clk, reset, FlushM, ~StallM, IntrE, IntrM); | ||||
|   flopenrc #(1)     IntrWReg (clk, reset, FlushW, ~StallW, IntrM, IntrW); | ||||
| 
 | ||||
|   flopenrc #(12)    CSRAdrWReg (clk, reset, FlushW, ~StallW, CSRAdrM, CSRAdrW); | ||||
|   flopenrc #(1)     CSRWriteWReg (clk, reset, FlushW, ~StallW, CSRWriteM, CSRWriteW); | ||||
| 
 | ||||
|   // Initially connecting the writeback stage signals, but may need to use M stage
 | ||||
|   // and gate on ~FlushW.
 | ||||
| 
 | ||||
|   assign valid  = InstrValidW & ~StallW; | ||||
|   assign rvvi.clk = clk; | ||||
|   assign #1 rvvi.valid[0][0]    = valid; | ||||
|   assign rvvi.order[0][0]    = CSRArray[12'hB02];  // TODO: IMPERAS Should be event order
 | ||||
|   assign rvvi.insn[0][0]     = InstrRawW; | ||||
|   assign rvvi.pc_rdata[0][0] = PCW; | ||||
|   assign rvvi.trap[0][0]     = 0; // TODO: IMPERAS TrapW;
 | ||||
|   assign rvvi.halt[0][0]     = HaltW; | ||||
|   assign rvvi.intr[0][0]     = IntrW; | ||||
|   assign rvvi.mode[0][0]     = PrivilegeModeW; | ||||
|   assign rvvi.ixl[0][0]      = PrivilegeModeW == 2'b11 ? 2'b10 : | ||||
| 					           PrivilegeModeW == 2'b01 ? STATUS_SXL : STATUS_UXL; | ||||
|   assign rvvi.pc_wdata[0][0] = ~FlushW ? PCM : | ||||
| 						       ~FlushM ? PCE : | ||||
| 						       ~FlushE ? PCD : | ||||
| 						       ~FlushD ? PCF : PCNextF; | ||||
| 
 | ||||
|   for(index = 0; index < `NUM_REGS; index += 1) begin | ||||
| 	assign rvvi.x_wdata[0][0][index] = rf[index]; | ||||
| 	assign rvvi.x_wb[0][0][index]    = rf_wb[index]; | ||||
| 	assign rvvi.f_wdata[0][0][index] = frf[index]; | ||||
| 	assign rvvi.f_wb[0][0][index]    = frf_wb[index]; | ||||
|   end | ||||
| 
 | ||||
|   // record previous csr value.
 | ||||
|   integer index4; | ||||
|   always_ff @(posedge clk) begin | ||||
| 	for (index4 = 0; index4 < `NUM_CSRS; index4 += 1) begin | ||||
| // IMPERAS
 | ||||
| 	  //CSR_W[index4] = (CSRArrayOld[index4] != CSRArray[index4]) ? 1 : 0;
 | ||||
| 	  CSRArrayOld[index4] = CSRArray[index4]; | ||||
| 	end | ||||
|   end | ||||
|    | ||||
|   // check for csr value change.
 | ||||
|   genvar index5; | ||||
|   for(index5 = 0; index5 < `NUM_CSRS; index5 += 1) begin | ||||
| 	// CSR_W should only indicate the change when the Writeback stage is not stalled and valid.
 | ||||
|     assign #2 CSR_W[index5] = (CSRArrayOld[index5] != CSRArray[index5]) ? 1 : 0; | ||||
|     assign rvvi.csr_wb[0][0][index5] = CSR_W[index5]; | ||||
|     assign rvvi.csr[0][0][index5]    = CSRArray[index5]; | ||||
|   end | ||||
|    | ||||
| //  always @rvvi.clk $display("%t @rvvi.clk=%X", $time, rvvi.clk);
 | ||||
| //  always @rvvi.csr[0][0]['h300] $display("%t rvvi.csr[0][0]['h300]=%X", $time, rvvi.csr[0][0]['h300]);
 | ||||
| //  always @rvvi.csr_wb[0][0]['h300] $display("%t rvvi.csr_wb[0][0]['h300]=%X", $time, rvvi.csr_wb[0][0]['h300]);
 | ||||
| //  always @rvvi.valid[0][0] $display("%t rvvi.valid[0][0]=%X", $time, rvvi.valid[0][0]);
 | ||||
|    | ||||
|   // *** implementation only cancel? so sc does not clear?
 | ||||
|   assign rvvi.lrsc_cancel[0][0] = '0; | ||||
| 
 | ||||
|   integer index2; | ||||
| 
 | ||||
|   always_ff @(posedge clk) begin | ||||
| 	if(rvvi.valid[0][0]) begin | ||||
| 	  if(`PRINT_PC_INSTR & !(`PRINT_ALL | `PRINT_MOST)) | ||||
| 		$display("order = %08d, PC = %08x, insn = %08x", rvvi.order[0][0], rvvi.pc_rdata[0][0], rvvi.insn[0][0]); | ||||
| 	  else if(`PRINT_MOST & !`PRINT_ALL) | ||||
| 		$display("order = %08d, PC = %010x, insn = %08x, trap = %1d, halt = %1d, intr = %1d, mode = %1x, ixl = %1x, pc_wdata = %010x, x%02d = %016x, f%02d = %016x, csr%03x = %016x",  | ||||
| 		        rvvi.order[0][0], rvvi.pc_rdata[0][0], rvvi.insn[0][0], rvvi.trap[0][0], rvvi.halt[0][0], rvvi.intr[0][0], rvvi.mode[0][0], rvvi.ixl[0][0], rvvi.pc_wdata[0][0], rf_a3, rvvi.x_wdata[0][0][rf_a3], frf_a4, rvvi.f_wdata[0][0][frf_a4], CSRAdrW, rvvi.csr[0][0][CSRAdrW]); | ||||
| 	  else if(`PRINT_ALL) begin | ||||
| 		$display("order = %08d, PC = %08x, insn = %08x, trap = %1d, halt = %1d, intr = %1d, mode = %1x, ixl = %1x, pc_wdata = %08x",  | ||||
| 				 rvvi.order[0][0], rvvi.pc_rdata[0][0], rvvi.insn[0][0], rvvi.trap[0][0], rvvi.halt[0][0], rvvi.intr[0][0], rvvi.mode[0][0], rvvi.ixl[0][0], rvvi.pc_wdata[0][0]); | ||||
| 	  	for(index2 = 0; index2 < `NUM_REGS; index2 += 1) begin | ||||
| 		  $display("x%02d = %08x", index2, rvvi.x_wdata[0][0][index2]); | ||||
| 		end | ||||
| 		for(index2 = 0; index2 < `NUM_REGS; index2 += 1) begin | ||||
| 		  $display("f%02d = %08x", index2, rvvi.f_wdata[0][0][index2]); | ||||
| 		end | ||||
| 	  end | ||||
| 	  if (`PRINT_CSRS) begin | ||||
| 		for(index2 = 0; index2 < `NUM_CSRS; index2 += 1) begin | ||||
| 		  if(CSR_W[index2]) begin | ||||
| 			$display("%t: CSR %03x = %x", $time(), index2, CSRArray[index2]); | ||||
| 		  end | ||||
| 		end | ||||
| 	  end | ||||
| 	end | ||||
|     if(HaltW) $finish; | ||||
|   end | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| @ -31,10 +31,21 @@ | ||||
| 
 | ||||
| `include "wally-config.vh" | ||||
| 
 | ||||
| // This is set from the commsnd line script
 | ||||
| // `define USE_IMPERAS_DV
 | ||||
| 
 | ||||
| `ifdef USE_IMPERAS_DV | ||||
|   `include "rvvi/imperasDV.svh" | ||||
| `endif | ||||
| 
 | ||||
| module testbench; | ||||
|   parameter DEBUG=0; | ||||
|   | ||||
| 
 | ||||
| `ifdef USE_IMPERAS_DV | ||||
|   import rvviPkg::*; | ||||
|   import rvviApiPkg::*; | ||||
| `endif | ||||
| 
 | ||||
|   logic        clk; | ||||
|   logic        reset_ext, reset; | ||||
| 
 | ||||
| @ -63,7 +74,7 @@ module testbench; | ||||
|   integer   	ProgramAddrLabelArray [string] = '{ "begin_signature" : 0, "tohost" : 0 }; | ||||
|   logic 	    DCacheFlushDone, DCacheFlushStart; | ||||
|   string 		testName; | ||||
|   string memfilename, pathname, adrstr; | ||||
|   string memfilename, testDir, adrstr, elffilename; | ||||
| 
 | ||||
|   logic [31:0] GPIOPinsIn, GPIOPinsOut, GPIOPinsEn; | ||||
|   logic        UARTSin, UARTSout; | ||||
| @ -92,28 +103,90 @@ module testbench; | ||||
|       testadr = 0; | ||||
|       testadrNoBase = 0; | ||||
| 
 | ||||
| 	  //testName =     "rv64i_m/I/src/add-01.S";
 | ||||
| 	  testName =     "rv64i_m/privilege/src/WALLY-mmu-sv48-01.S"; | ||||
| 	   | ||||
|       if ($value$plusargs("testDir=%s", testDir)) begin | ||||
|           memfilename = {testDir, "/ref/ref.elf.memfile"}; | ||||
|           elffilename = {testDir, "/ref/ref.elf"}; | ||||
|           $display($sformatf("%m @ t=%0t: loading testDir %0s", $time, testDir)); | ||||
|       end else begin | ||||
|           $error("Must specify test directory using plusarg testDir"); | ||||
|       end | ||||
| 
 | ||||
| 	  //pathname =     "../../tests/riscof/work/riscv-arch-test/";
 | ||||
| 	  pathname = "../../tests/riscof/work/wally-riscv-arch-test/"; | ||||
| 	   | ||||
| 	  memfilename = {pathname, testName, "/ref/ref.elf.memfile"}; | ||||
|       if (`BUS_SUPPORTED) $readmemh(memfilename, dut.uncore.uncore.ram.ram.memory.RAM); | ||||
| 	  else $error("Imperas test bench requires BUS_SUPPORTED."); | ||||
| 
 | ||||
|       ProgramAddrMapFile = {pathname, testName, "/ref/ref.elf.objdump.addr"}; | ||||
|       ProgramLabelMapFile = {pathname, testName, "/ref/ref.elf.objdump.lab"}; | ||||
|       if (`BUS) $readmemh(memfilename, dut.uncore.uncore.ram.ram.memory.RAM); | ||||
| 	  else $error("Imperas test bench requires BUS."); | ||||
| 
 | ||||
|       ProgramAddrMapFile = {testDir, "/ref/ref.elf.objdump.addr"}; | ||||
|       ProgramLabelMapFile = {testDir, "/ref/ref.elf.objdump.lab"}; | ||||
|        | ||||
|       // declare memory labels that interest us, the updateProgramAddrLabelArray task will find the addr of each label and fill the array
 | ||||
|       // to expand, add more elements to this array and initialize them to zero (also initilaize them to zero at the start of the next test)
 | ||||
|       updateProgramAddrLabelArray(ProgramAddrMapFile, ProgramLabelMapFile, ProgramAddrLabelArray); | ||||
|       $display("Read memfile %s", memfilename); | ||||
|        | ||||
|     end | ||||
| 
 | ||||
|   rvviTrace rvviTrace(); | ||||
|   rvviTrace #(.XLEN(`XLEN), .FLEN(`FLEN)) rvvi(); | ||||
|   wallyTracer wallyTracer(rvvi); | ||||
| 
 | ||||
| `ifdef USE_IMPERAS_DV | ||||
|     trace2log idv_trace2log(rvvi); | ||||
| 
 | ||||
|     // enabling of comparison types
 | ||||
|     trace2api #(.CMP_PC      (1), | ||||
|                 .CMP_INS     (1), | ||||
|                 .CMP_GPR     (1), | ||||
|                 .CMP_FPR     (1), | ||||
|                 .CMP_VR      (0), | ||||
|                 .CMP_CSR     (1) | ||||
|                ) idv_trace2api(rvvi); | ||||
| 
 | ||||
|     initial begin  | ||||
|       MAX_ERRS = 3; | ||||
| 
 | ||||
|       // Initialize REF (do this before initializing the DUT)
 | ||||
|       if (!rvviVersionCheck(RVVI_API_VERSION)) begin | ||||
|         msgfatal($sformatf("%m @ t=%0t: Expecting RVVI API version %0d.", $time, RVVI_API_VERSION)); | ||||
|       end | ||||
|       void'(rvviRefConfigSetString(IDV_CONFIG_MODEL_VENDOR,  "riscv.ovpworld.org")); | ||||
|       void'(rvviRefConfigSetString(IDV_CONFIG_MODEL_NAME,    "riscv")); | ||||
|       void'(rvviRefConfigSetString(IDV_CONFIG_MODEL_VARIANT, "RV64GC")); | ||||
|       if (!rvviRefInit(elffilename)) begin | ||||
|         msgfatal($sformatf("%m @ t=%0t: rvviRefInit failed", $time)); | ||||
|       end | ||||
| 
 | ||||
|       // Volatile CSRs
 | ||||
|       void'(rvviRefCsrSetVolatile(0, 32'hC00));   // CYCLE
 | ||||
|       void'(rvviRefCsrSetVolatile(0, 32'hB00));   // MCYCLE
 | ||||
|       void'(rvviRefCsrSetVolatile(0, 32'hC02));   // INSTRET
 | ||||
|       void'(rvviRefCsrSetVolatile(0, 32'hB02));   // MINSTRET
 | ||||
|       void'(rvviRefCsrSetVolatile(0, 32'hC01));   // TIME
 | ||||
| 
 | ||||
|       if(`XLEN==32) begin | ||||
|           void'(rvviRefCsrSetVolatile(0, 32'hC80));   // CYCLEH
 | ||||
|           void'(rvviRefCsrSetVolatile(0, 32'hB80));   // MCYCLEH
 | ||||
|           void'(rvviRefCsrSetVolatile(0, 32'hC82));   // INSTRETH
 | ||||
|           void'(rvviRefCsrSetVolatile(0, 32'hB82));   // MINSTRETH
 | ||||
|       end | ||||
| 
 | ||||
|   //    // Temporary fix for inexact difference
 | ||||
| //      void'(rvviRefCsrSetVolatile(0, 32'h001));   // fflags
 | ||||
| //      void'(rvviRefCsrSetVolatile(0, 32'h003));   // fcsr
 | ||||
|        | ||||
|        | ||||
|       // Enable the trace2log module
 | ||||
|       if ($value$plusargs("TRACE2LOG_ENABLE=%d", TRACE2LOG_ENABLE)) begin | ||||
|         msgnote($sformatf("%m @ t=%0t: TRACE2LOG_ENABLE is %0d", $time, TRACE2LOG_ENABLE)); | ||||
|       end | ||||
|        | ||||
|       if ($value$plusargs("TRACE2COV_ENABLE=%d", TRACE2COV_ENABLE)) begin | ||||
|         msgnote($sformatf("%m @ t=%0t: TRACE2COV_ENABLE is %0d", $time, TRACE2COV_ENABLE)); | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     final begin | ||||
|       void'(rvviRefShutdown()); | ||||
|     end | ||||
| 
 | ||||
| `endif | ||||
| 
 | ||||
|   flopenr #(`XLEN) PCWReg(clk, reset, ~dut.core.ieu.dp.StallW, dut.core.ifu.PCM, PCW); | ||||
|   flopenr  #(32)   InstrWReg(clk, reset, ~dut.core.ieu.dp.StallW,  dut.core.ifu.InstrM, InstrW); | ||||
| @ -254,7 +327,6 @@ module testbench; | ||||
| 	end | ||||
|   end | ||||
| 
 | ||||
|    | ||||
| endmodule | ||||
| 
 | ||||
| module riscvassertions; | ||||
| @ -413,6 +485,7 @@ module copyShadow | ||||
|     end | ||||
|   end | ||||
|    | ||||
|    | ||||
| endmodule | ||||
| 
 | ||||
| task automatic updateProgramAddrLabelArray; | ||||
|  | ||||
							
								
								
									
										57
									
								
								setup.imperas.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								setup.imperas.sh
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,57 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| IMP_HASH=56b1479 | ||||
| 
 | ||||
| REPO=davidharrishmc | ||||
| REPO=eroom1966 | ||||
| git clone https://github.com/${REPO}/riscv-wally -b imperas | ||||
| 
 | ||||
| cd riscv-wally | ||||
| WALLY=$(dirname ${BASH_SOURCE[0]:-$0}) | ||||
| export WALLY=$(cd "$WALLY" && pwd) | ||||
| 
 | ||||
| # clone the Imperas repo | ||||
| if [ ! -d external ]; then | ||||
|     mkdir -p external | ||||
| fi | ||||
| pushd external | ||||
|     if [ ! -f ImperasDV-HMC ]; then | ||||
|         git clone git@github.com:Imperas/ImperasDV-HMC.git | ||||
|     fi | ||||
|     pushd ImperasDV-HMC | ||||
|         git checkout $IMP_HASH | ||||
|     popd | ||||
| popd | ||||
| 
 | ||||
| # Setup Imperas | ||||
| source ${WALLY}/external/ImperasDV-HMC/Imperas/bin/setup.sh | ||||
| setupImperas ${WALLY}/external/ImperasDV-HMC/Imperas | ||||
| export IMPERAS_PERSONALITY=CPUMAN_DV_ASYNC | ||||
| 
 | ||||
| # setup QUESTA (Imperas only command, YMMV) | ||||
| svsetup -questa | ||||
| 
 | ||||
| pushd pipelined/regression | ||||
|     # With IDV | ||||
|     IMPERAS_TOOLS=$(pwd)/imperas.ic \ | ||||
|         OTHERFLAGS="+TRACE2LOG_ENABLE=1 VERBOSE=1" \ | ||||
|         TESTDIR=${WALLY}/external/ImperasDV-HMC/tests/riscof/work/riscv-arch-test/rv64i_m/F/src/fadd_b1-01.S  \ | ||||
|         vsim -c -do "do wally-pipelined-imperas.do rv64gc" | ||||
| popd | ||||
| 
 | ||||
| # notes | ||||
| # run the pushd external  code | ||||
| 
 | ||||
| #source external/ImperasDV-HMC/Imperas/bin/setup.sh  | ||||
| #  setupImperas /home/ross/repos/active-wally/riscv-wally/external/ImperasDV-HMC/Imperas | ||||
| #  env | grep IMPERAS | ||||
| #  export IMPERAS_PERSONALITY=CPUMAN_DV_ASYNC | ||||
| 
 | ||||
| IMPERAS_TOOLS=$(pwd)/imperas.ic \ | ||||
| OTHERFLAGS="+TRACE2LOG_ENABLE=1 VERBOSE=1" \ | ||||
| TESTDIR=../../tests/riscof_lee/work/riscv-arch-test/rv64i_m/F/src/fadd_b1-01.S  \ | ||||
| vsim -c -do "do wally-pipelined-imperas.do rv64gc" | ||||
| 
 | ||||
| 
 | ||||
| # getting library issue. | ||||
| # try switching to modelsim 2022.01 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user