mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Moved the simple branch predictor custom test into the gshare.S
coverage test.
This commit is contained in:
		
							parent
							
								
									a56ef9e267
								
							
						
					
					
						commit
						ebdef07301
					
				| @ -1,3 +1,54 @@ | ||||
| /////////////////////////////////////////// | ||||
| // gshare.S | ||||
| // | ||||
| // Written: Rose Thompson rose@rosethompson.net
 | ||||
| // | ||||
| // Purpose: basic check that global history and gshare branch npredictors are working as expected.  Requires manual inspection. | ||||
| // TODO: *** Automate checking prediction accuracy. | ||||
| // | ||||
| // A component of the CORE-V-WALLY configurable RISC-V project. | ||||
| // https://github.com/openhwgroup/cvw | ||||
| //  | ||||
| // Copyright (C) 2021-24 Harvey Mudd College & Oklahoma State University | ||||
| // | ||||
| // SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 | ||||
| // | ||||
| // Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file 
 | ||||
| // except in compliance with the License, or, at your option, the Apache License version 2.0. You  | ||||
| // may obtain a copy of the License at | ||||
| // | ||||
| // https://solderpad.org/licenses/SHL-2.1/ | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, any work distributed under the  | ||||
| // License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,  | ||||
| // either express or implied. See the License for the specific language governing permissions  | ||||
| // and limitations under the License. | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| 
 | ||||
| // load code to initalize stack, handle interrupts, terminate | ||||
| 
 | ||||
| #include "WALLY-init-lib.h" | ||||
| 
 | ||||
| # run-elf.bash find this in project description | ||||
| main: | ||||
| 
 | ||||
|         addi sp, sp, 8 | ||||
|         sd ra, 0(sp) | ||||
|         jal ra, oneLoopTest | ||||
|         jal ra, global_hist_6_space_test | ||||
|         jal ra, global_hist_4_space_test | ||||
|         jal ra, global_hist_3_space_test | ||||
|         jal ra, global_hist_2_space_test | ||||
|         jal ra, global_hist_1_space_test | ||||
|         jal ra, global_hist_0_space_test | ||||
|          | ||||
|         fence.I | ||||
| 
 | ||||
| finished: | ||||
|     j done | ||||
| 
 | ||||
|         .data | ||||
| 
 | ||||
| .section .text | ||||
| .globl oneLoopTest
 | ||||
| .type oneLoopTest, @function
 | ||||
| @ -1,19 +0,0 @@ | ||||
| TARGETDIR	:= simple | ||||
| TARGET		:= $(TARGETDIR)/$(TARGETDIR).elf | ||||
| ROOT		:= .. | ||||
| LIBRARY_DIRS	:= ${ROOT}/crt0 | ||||
| LIBRARY_FILES	:= crt0 | ||||
| 
 | ||||
| MARCH           :=-march=rv64imfdczicbom | ||||
| MABI            :=-mabi=lp64d | ||||
| LINKER          := ${ROOT}/linker8000-0000.x | ||||
| LINK_FLAGS      :=$(MARCH) $(MABI) -nostartfiles -Wl,-Map=$(TARGET).map -L $(RISCV)/riscv64-unknown-elf/lib | ||||
| 
 | ||||
| CFLAGS =$(MARCH) $(MABI) -Wa,-alhs -Wa,-L -mcmodel=medany  -mstrict-align -O2 | ||||
| CC=riscv64-unknown-elf-gcc | ||||
| DA=riscv64-unknown-elf-objdump -d | ||||
| 
 | ||||
| 
 | ||||
| include $(ROOT)/makefile.inc | ||||
| 
 | ||||
| 
 | ||||
| @ -1,449 +0,0 @@ | ||||
| # Written: ross1728@gmail.com Rose Thompson 17 August 2023
 | ||||
| # Modified:  | ||||
| # Purpose: Tests the 3 Zicbom cache instructions which all operate on cacheline | ||||
| #          granularity blocks of memory.  Invalidate: Clears valid and dirty bits | ||||
| #          and does not write back.  Clean: Writes back dirty cacheline if needed | ||||
| #          and clears dirty bit.  Does NOT clear valid bit.  Flush:  Cleans and then | ||||
| #          Invalidates.  These operations apply to all caches in the memory system. | ||||
| #          The tests are divided into three parts one for the data cache, instruction cache | ||||
| #          and checks to verify the uncached regions of memory cause exceptions. | ||||
| # ----------- | ||||
| # Copyright (c) 2020. RISC-V International. All rights reserved. | ||||
| # SPDX-License-Identifier: BSD-3-Clause | ||||
| # ----------- | ||||
| # | ||||
| # This assembly file tests the fence.i instruction of the RISC-V Zifencei  extension. | ||||
| #  | ||||
| 
 | ||||
| .section .text | ||||
| .globl CBOMTest
 | ||||
| .type CBOMTest, @function
 | ||||
| CBOMTest: | ||||
|         # *** TODO | ||||
|         # first need to discover the length of the cacheline. | ||||
|         # for now assume it is 64 bytes | ||||
| 
 | ||||
|         addi sp, sp, -16 | ||||
|         sd s0, 0(sp) | ||||
|         sd ra, 8(sp) | ||||
| 
 | ||||
| 	la s0, signature | ||||
| 
 | ||||
|         ################################################################################ | ||||
|         # INVALIDATE  D$ | ||||
|         ################################################################################ | ||||
| 
 | ||||
|         # theory of operation | ||||
|         # 1. Read several cachelines of data from memory into the d cache and copy to a second region of memory | ||||
|         # 2. Then verify the second region has the same data | ||||
|         # 3. Invalidate the second region | ||||
|         # 4. Verify the second region has the original invalid data | ||||
|         # DON'T batch each step.  We want to see the transition between cachelines. The current should be invalidated | ||||
|         # but the next should have the copied data. | ||||
| 
 | ||||
|         # step 1 | ||||
| CBOMTest_inval_step1:  | ||||
|         la a0, SourceData | ||||
|         la a1, Destination1 | ||||
|         li a2, 64 | ||||
|         jal ra, memcpy8 | ||||
| 
 | ||||
|         # step 2 | ||||
| CBOMTest_inval_step2:  | ||||
|         la a0, SourceData | ||||
|         la a1, Destination1 | ||||
|         li a2, 64 | ||||
|         jal ra, memcmp8 | ||||
|         sd a0, 0(s0)     # should be -1 | ||||
|         addi s0, s0, 8 | ||||
| 
 | ||||
|         # step 3 | ||||
| CBOMTest_inval_step3:  | ||||
|         la a1, Destination1 | ||||
|         cbo.inval (a1) | ||||
|         # step 4  (should be Invalid) | ||||
|         la a0, DeadBeafData1 | ||||
|         la a1, Destination1 | ||||
|         li a2, 8 | ||||
|         jal ra, memcmp8 | ||||
|         sd a0, 0(s0)    # should be -1 | ||||
|         addi s0, s0, 8 | ||||
| 
 | ||||
|         # step 4 next line (should still be valid) | ||||
| CBOMTest_inval_step4:  | ||||
|         la a0, SourceData+64 | ||||
|         la a1, Destination1+64 | ||||
|         li a2, 8 | ||||
|         jal ra, memcmp8 | ||||
|         sd a0, 0(s0)    # should be -1 | ||||
|         addi s0, s0, 8 | ||||
| 
 | ||||
|         # step 3 (Invalidate all remaining lines) | ||||
| CBOMTest_inval_step3_all:  | ||||
|         la a1, Destination1+64 | ||||
|         cbo.inval (a1) | ||||
|         cbo.inval (a1)          # verify invalidating an already non present line does not cause an issue. | ||||
|         la a1, Destination1+128 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination1+192 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination1+256 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination1+320 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination1+384 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination1+448 | ||||
|         cbo.inval (a1) | ||||
| 	 | ||||
|         # step 4 All should be invalid | ||||
| CBOMTest_inval_step4_all:  | ||||
|         la a0, DeadBeafData1 | ||||
|         la a1, Destination1 | ||||
|         li a2, 64 | ||||
|         jal ra, memcmp8 | ||||
|         sd a0, 0(s0)    # should be -1 | ||||
|         addi s0, s0, 8 | ||||
| 
 | ||||
|         ################################################################################ | ||||
|         # Clean D$ | ||||
|         ################################################################################ | ||||
| 
 | ||||
|         # theory of operation | ||||
|         # 1. Read several cachelines of data from memory into the d cache and copy to a second region of memory | ||||
|         # 2. Then verify the second region has the same data | ||||
|         # 3. Invalidate the second region | ||||
|         # 4. Verify the second region has the original invalid data | ||||
|         # 5. Repeat step 1 | ||||
|         # 6. Clean cachelines | ||||
|         # 7. Verify the second region has the same data | ||||
|         # 8. Invalidate the second region | ||||
|         # 9. Verify again but this time it should contain the same data | ||||
|         # DON'T batch each step.  We want to see the transition between cachelines. The current should be invalidated | ||||
|         # but the next should have the copied data. | ||||
|          | ||||
|         # step 1 | ||||
| CBOMTest_clean_step1:  | ||||
|         la a0, SourceData | ||||
|         la a1, Destination2 | ||||
|         li a2, 64 | ||||
|         jal ra, memcpy8 | ||||
| 
 | ||||
|         # step 2 | ||||
| CBOMTest_clean_step2: | ||||
|          la a0, SourceData | ||||
|         la a1, Destination2 | ||||
|         li a2, 64 | ||||
|         jal ra, memcmp8 | ||||
|         sd a0, 0(s0)     # should be -1 | ||||
|         addi s0, s0, 8 | ||||
| 
 | ||||
|         # step 3 | ||||
| CBOMTest_clean_step3: | ||||
|         la a1, Destination2 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination2+64 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination2+128 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination2+192 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination2+256 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination2+320 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination2+384 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination2+448 | ||||
|         cbo.inval (a1) | ||||
|         cbo.inval (a1) | ||||
|         cbo.inval (a1) | ||||
|         cbo.inval (a1) | ||||
|         cbo.inval (a1) | ||||
|         cbo.inval (a1) | ||||
|         cbo.inval (a1) | ||||
|         cbo.inval (a1) | ||||
|         cbo.inval (a1) | ||||
|         cbo.inval (a1) | ||||
| 
 | ||||
|         # step 4 All should be invalid | ||||
| CBOMTest_clean_step4: | ||||
|         la a0, DeadBeafData1 | ||||
|         la a1, Destination2 | ||||
|         li a2, 64 | ||||
|         jal ra, memcmp8 | ||||
|         sd a0, 0(s0)    # should be -1 | ||||
|         addi s0, s0, 8 | ||||
|          | ||||
|         # step 5 | ||||
| CBOMTest_clean_step5: | ||||
|         la a0, SourceData | ||||
|         la a1, Destination2 | ||||
|         li a2, 64 | ||||
|         jal ra, memcpy8 | ||||
| 
 | ||||
|         # step 6  only clean 1 line | ||||
| CBOMTest_clean_step6: | ||||
|         la a1, Destination2 | ||||
|         cbo.clean (a1) | ||||
| 	 | ||||
|         # step 7  only check that 1 line | ||||
| CBOMTest_clean_step7: | ||||
|         la a0, SourceData | ||||
|         la a1, Destination2 | ||||
|         li a2, 8 | ||||
|         jal ra, memcmp8 | ||||
|         sd a0, 0(s0)     # should be -1 | ||||
|         addi s0, s0, 8 | ||||
| 
 | ||||
|         # step 8  invalidate that 1 line and the next | ||||
| CBOMTest_clean_step8: | ||||
|         la a1, Destination2 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination2+64 | ||||
|         cbo.inval (a1) | ||||
| 	 | ||||
|         # step 9  that 1 line should contain the valid data | ||||
| CBOMTest_clean_step9_line1: | ||||
|         la a0, SourceData | ||||
|         la a1, Destination2 | ||||
|         li a2, 8 | ||||
|         jal ra, memcmp8 | ||||
|         sd a0, 0(s0)     # should be -1 | ||||
|         addi s0, s0, 8 | ||||
| 
 | ||||
|         # step 9 the next should contain the invalid data | ||||
| CBOMTest_clean_step9_line2: | ||||
|         la a0, DeadBeafData1 | ||||
|         la a1, Destination2+64 | ||||
|         li a2, 8 | ||||
|         jal ra, memcmp8 | ||||
|         sd a0, 0(s0)     # should be -1 | ||||
|         addi s0, s0, 8 | ||||
| 
 | ||||
|         # step 5 # now recopy the one we just corrupted | ||||
| CBOMTest_clean_step5_recopy_line2: | ||||
|         la a0, SourceData+64 | ||||
|         la a1, Destination2+64 | ||||
|         li a2, 8 | ||||
|         jal ra, memcpy8 | ||||
| 
 | ||||
|         # step 6 # clean the remaining | ||||
| CBOMTest_clean_step6_clean_all: | ||||
|         la a1, Destination2+64 | ||||
|         cbo.clean (a1) | ||||
|         la a1, Destination2+128 | ||||
|         cbo.clean (a1) | ||||
|         la a1, Destination2+192 | ||||
|         cbo.clean (a1) | ||||
|         la a1, Destination2+256 | ||||
|         cbo.clean (a1) | ||||
|         la a1, Destination2+320 | ||||
|         cbo.clean (a1) | ||||
|         la a1, Destination2+384 | ||||
|         cbo.clean (a1) | ||||
|         la a1, Destination2+448 | ||||
|         cbo.clean (a1) | ||||
|         cbo.clean (a1) | ||||
|         cbo.clean (a1) | ||||
|         cbo.clean (a1) | ||||
|         cbo.clean (a1) | ||||
|         cbo.clean (a1) | ||||
|         cbo.clean (a1) | ||||
|         cbo.clean (a1) | ||||
|         cbo.clean (a1) | ||||
| 	 | ||||
|         # step 8 # invalidate all remaining | ||||
| CBOMTest_clean_step7_invalidate_all: | ||||
|         la a1, Destination2 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination2+64 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination2+128 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination2+192 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination2+256 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination2+320 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination2+384 | ||||
|         cbo.inval (a1) | ||||
|         la a1, Destination2+448 | ||||
|         cbo.inval (a1) | ||||
| 	 | ||||
|         # step 9 # check all | ||||
| CBOMTest_clean_step9_check_all: | ||||
|         la a0, SourceData | ||||
|         la a1, Destination2 | ||||
|         li a2, 64 | ||||
|         jal ra, memcmp8 | ||||
|         sd a0, 0(s0)     # should be -1 | ||||
|         addi s0, s0, 8 | ||||
| 
 | ||||
|         ################################################################################ | ||||
|         # Flush D$ line | ||||
|         ################################################################################ | ||||
| 
 | ||||
|         # theory of operation | ||||
|         # 1. Read several cachelines of data from memory into the d cache and copy to a second region of memory | ||||
|         # 2. Then verify the second region has the same data | ||||
|         # 3. For flush there is no way to create a negative control. We will flush 1 cache line | ||||
|         # 4. Verify whole region | ||||
|         # 5. Flush the remaining lines | ||||
|         # 6. Verify whole region | ||||
| 
 | ||||
|         # step 1 | ||||
| CBOMTest_flush_step1:  | ||||
|         la a0, SourceData | ||||
|         la a1, Destination3 | ||||
|         li a2, 64 | ||||
|         jal ra, memcpy8 | ||||
| 
 | ||||
|         # step 2 All should be valid | ||||
| CBOMTest_flush_step2_verify: | ||||
|         la a0, SourceData | ||||
|         la a1, Destination3 | ||||
|         li a2, 64 | ||||
|         jal ra, memcmp8 | ||||
|         sd a0, 0(s0)     # should be -1 | ||||
|         addi s0, s0, 8 | ||||
| 
 | ||||
|         # step 3 # flush 1 line | ||||
| CBOMTest_flush_step3: | ||||
|         la a1, Destination3 | ||||
|         cbo.flush (a1) | ||||
| 
 | ||||
|         # step 4  | ||||
| CBOMTest_flush_step4_verify: | ||||
|         la a0, SourceData | ||||
|         la a1, Destination3 | ||||
|         li a2, 64 | ||||
|         jal ra, memcmp8 | ||||
|         sd a0, 0(s0)     # should be -1 | ||||
|         addi s0, s0, 8 | ||||
| 
 | ||||
|         # step 5 | ||||
| CBOMTest_flush_step5_flush_all: | ||||
|         la a1, Destination3 | ||||
|         cbo.flush (a1) | ||||
|         la a1, Destination3+64 | ||||
|         cbo.flush (a1) | ||||
|         la a1, Destination3+128 | ||||
|         cbo.flush (a1) | ||||
|         la a1, Destination3+192 | ||||
|         cbo.flush (a1) | ||||
|         la a1, Destination3+256 | ||||
|         cbo.flush (a1) | ||||
|         la a1, Destination3+320 | ||||
|         cbo.flush (a1) | ||||
|         la a1, Destination3+384 | ||||
|         cbo.flush (a1) | ||||
|         la a1, Destination3+448 | ||||
|         cbo.flush (a1) | ||||
|         cbo.flush (a1) | ||||
|         cbo.flush (a1) | ||||
|         cbo.flush (a1) | ||||
|         cbo.flush (a1) | ||||
|         cbo.flush (a1) | ||||
| 	 | ||||
|         # step 6 | ||||
| CBOMTest_flush_step6_verify: | ||||
|         la a0, SourceData | ||||
|         la a1, Destination3 | ||||
|         li a2, 64 | ||||
|         jal ra, memcmp8 | ||||
|         sd a0, 0(s0)     # should be -1 | ||||
|         addi s0, s0, 8 | ||||
|          | ||||
| 
 | ||||
|         ld s0, 0(sp) | ||||
|         ld ra, 8(sp) | ||||
|         addi sp, sp, 16 | ||||
|         ret | ||||
| 
 | ||||
| 	 | ||||
| .section .text | ||||
| .type memcpy8, @function
 | ||||
| memcpy8:         | ||||
|         # a0 is the source | ||||
|         # a1 is the dst | ||||
|         # a2 is the number of 8 byte words | ||||
|         mv t0, a0 | ||||
|         mv t1, a1 | ||||
|         li t2, 0 | ||||
| memcpy8_loop:    | ||||
|         ld t3, 0(t0) | ||||
|         sd t3, 0(t1) | ||||
|         addi t0, t0, 8 | ||||
|         addi t1, t1, 8 | ||||
|         addi t2, t2, 1 | ||||
|         blt t2, a2, memcpy8_loop | ||||
|         ret | ||||
| 
 | ||||
| .section .text | ||||
| .type memcmp8, @function
 | ||||
| # returns which index mismatch, -1 if none | ||||
| memcmp8:         | ||||
|         # a0 is the source1 | ||||
|         # a1 is the source2 | ||||
|         # a2 is the number of 8 byte words | ||||
|         mv t0, a0 | ||||
|         mv t1, a1 | ||||
|         li t2, 0 | ||||
| memcmp8_loop: | ||||
|         ld t3, 0(t0) | ||||
|         ld t4, 0(t1) | ||||
|         bne t3, t4, memcmp8_ne | ||||
|         addi t0, t0, 8 | ||||
|         addi t1, t1, 8 | ||||
|         addi t2, t2, 1 | ||||
|         blt t2, a2, memcmp8_loop | ||||
|         li a0, -1 | ||||
|         ret | ||||
| memcmp8_ne: | ||||
|         mv a0, t2 | ||||
|         ret | ||||
| 
 | ||||
|          | ||||
| 
 | ||||
| .data | ||||
| .align 7
 | ||||
| 
 | ||||
| DeadBeafData1: | ||||
|         .fill 64, 8, 0xdeadbeefdeadbeef | ||||
| SourceData: | ||||
|         .int 0, 1, 2, 3, 4, 5, 6, 7 | ||||
|         .int 8, 9, 10, 11, 12, 13, 14, 15 | ||||
|         .int 16, 17, 18, 19, 20, 21, 22, 23 | ||||
|         .int 24, 25, 26, 27, 28, 29, 30, 31 | ||||
|         .int 32, 33, 34, 35, 36, 37, 38, 39 | ||||
|         .int 40, 41, 42, 43, 44, 45, 46, 47 | ||||
|         .int 48, 49, 50, 51, 52, 53, 54, 55 | ||||
|         .int 56, 57, 58, 59, 60, 61, 62, 63 | ||||
|         .int 64, 65, 66, 67, 68, 69, 70, 71 | ||||
|         .int 72, 73, 74, 75, 76, 77, 79, 79 | ||||
|         .int 80, 81, 82, 83, 84, 85, 86, 87 | ||||
|         .int 88, 89, 90, 91, 92, 93, 94, 95 | ||||
|         .int 96, 97, 98, 99, 100, 101, 102, 103 | ||||
|         .int 104, 105, 106, 107, 108, 109, 110, 111 | ||||
|         .int 112, 113, 114, 115, 116, 117, 118, 119 | ||||
|         .int 120, 121, 122, 123, 124, 125, 126, 127 | ||||
| 
 | ||||
| Destination1: | ||||
|         .fill 64, 8, 0xdeadbeefdeadbeef | ||||
| Destination2:    | ||||
|         .fill 64, 8, 0xdeadbeefdeadbeef | ||||
| Destination3: | ||||
|         .fill 64, 8, 0xdeadbeefdeadbeef | ||||
| Destination4: | ||||
|         .fill 64, 8, 0xdeadbeefdeadbeef | ||||
| 
 | ||||
| signature: | ||||
|         .fill 16, 8, 0x0bad0bad0bad0bad | ||||
| 
 | ||||
| 
 | ||||
| ExceptedSignature: | ||||
|         .fill 13, 8, 0xFFFFFFFFFFFFFFFF | ||||
|         .fill 3,  8, 0x0bad0bad0bad0bad | ||||
|          | ||||
| @ -1,11 +0,0 @@ | ||||
| # Rose Thompson | ||||
| # March 17, 2021 | ||||
| # Oklahoma State University | ||||
| 
 | ||||
| .section .text	 | ||||
| .global fail
 | ||||
| .type fail, @function
 | ||||
| fail: | ||||
| 	li gp, 1 | ||||
| 	li a0, -1 | ||||
| 	ecall | ||||
| @ -1,16 +0,0 @@ | ||||
| #ifndef __header | ||||
| #define __header | ||||
| 
 | ||||
| int fail(); | ||||
| int simple_csrbr_test(); | ||||
| int lbu_test(); | ||||
| int icache_spill_test(); | ||||
| void global_hist_0_space_test(); | ||||
| void global_hist_1_space_test(); | ||||
| void global_hist_2_space_test(); | ||||
| void global_hist_3_space_test(); | ||||
| void global_hist_4_space_test(); | ||||
| void global_hist_6_space_test(); | ||||
| void oneLoopTest(); | ||||
| void CBOMTest(); | ||||
| #endif | ||||
| @ -1,19 +0,0 @@ | ||||
| .section .text	 | ||||
| .global lbu_test
 | ||||
| .type lbu_test, @function
 | ||||
| 
 | ||||
| lbu_test: | ||||
| 
 | ||||
| 	li t0, 0x80000 | ||||
| 	lbu t1, 0(t0) | ||||
| 
 | ||||
| 
 | ||||
| pass: | ||||
| 	li a0, 0 | ||||
| done: | ||||
| 	ret | ||||
| 
 | ||||
| fail: | ||||
| 	li a0, -1 | ||||
| 	j done | ||||
| 	 | ||||
| @ -1,25 +0,0 @@ | ||||
| #include "header.h" | ||||
| 
 | ||||
| int main(){ | ||||
|   //int res = icache_spill_test();
 | ||||
|   oneLoopTest(); | ||||
|   global_hist_6_space_test();   | ||||
|   global_hist_4_space_test();   | ||||
|   global_hist_3_space_test();   | ||||
|   global_hist_2_space_test(); | ||||
|   global_hist_1_space_test(); | ||||
|   global_hist_0_space_test(); | ||||
|   CBOMTest(); | ||||
|   int res = 1; | ||||
|   if (res < 0) { | ||||
|     fail(); | ||||
|     return 0; | ||||
|   }else { | ||||
|     if((res = lbu_test()) < 0) { | ||||
|       fail(); | ||||
|       return 0; | ||||
|     } | ||||
|     res = simple_csrbr_test(); | ||||
|     return 0; | ||||
|   } | ||||
| } | ||||
| @ -1,62 +0,0 @@ | ||||
| .section .text	 | ||||
| .global simple_csrbr_test
 | ||||
| .type simple_csrbr_test, @function
 | ||||
| 
 | ||||
| simple_csrbr_test:	 | ||||
| 
 | ||||
| 	# step 1 enable the performance counters | ||||
| 	# by default the hardware enables all performance counters | ||||
| 	# however we will eventually want to manually enable incase | ||||
| 	# some other code disables them | ||||
| 
 | ||||
| 	# br count is counter 5 | ||||
| 	# br mp count is counter 4 | ||||
| 	li t0, 0x30 | ||||
| 	 | ||||
| 	csrrc x0, 0x320, t0  # clear bits 4 and 5 of inhibit register. | ||||
| 
 | ||||
| 	# step 2 read performance counters into general purpose registers | ||||
| 
 | ||||
| 	csrrw t2, 0xB05, x0 # t2 = BR COUNT (perf count 5) | ||||
| 	csrrw t3, 0xB04, x0 # t3 = BRMP COUNT (perf count 4) | ||||
| 
 | ||||
| 	# step 3 simple loop to show the counters are updated. | ||||
| 	li t0, 0   # this is the loop counter | ||||
| 	li t1, 100 # this is the loop end condition | ||||
| 
 | ||||
| 	# for(t1 = 0; t1 < t0; t1++);
 | ||||
| 
 | ||||
| loop:	 | ||||
| 	addi t0, t0, 1 | ||||
| 	blt t0, t1, loop | ||||
| 
 | ||||
| loop_done:	 | ||||
| 	 | ||||
| 	# step 2 read performance counters into general purpose registers | ||||
| 
 | ||||
| 	csrrw t4, 0xB05, x0 # t4 = BR COUNT (perf count 5) | ||||
| 	csrrw t5, 0xB04, x0 # t5 = BRMP COUNT (perf count 4) | ||||
| 
 | ||||
| 	sub t2, t4, t2 # this is the number of branch instructions committed. | ||||
| 	sub t3, t5, t3 # this is the number of branch mispredictions committed. | ||||
| 
 | ||||
| 	# now check if the branch count equals 100 and if the branch | ||||
| 	bne t4, t2, fail | ||||
| 	li  t5, 3 | ||||
| 	bne t3, t5, fail | ||||
| 	 | ||||
| pass: | ||||
| 	li a0, 0 | ||||
| done: | ||||
| 	li t0, 0x30 | ||||
| 	csrrs x0, 0x320, t0  # set bits 4 and 5 | ||||
| 	ecall | ||||
| 	ret | ||||
| 
 | ||||
| fail: | ||||
| 	li a0, -1 | ||||
| 	j done | ||||
| 
 | ||||
| .data  | ||||
| sample_data: | ||||
| .int 0	 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user