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