Skip to content

Commit

Permalink
add support for cbo.zero in cmo extension
Browse files Browse the repository at this point in the history
update CHANGELOG
  • Loading branch information
Weiwei Li committed Jun 25, 2023
1 parent 5a434be commit 07eceea
Show file tree
Hide file tree
Showing 6 changed files with 609 additions and 0 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# CHANGELOG

## [3.6.9] - 2023-06-25
- Add support for Zicboz extension

## [3.6.8] - 2023-06-22
- Fix broken hyperlink in README

Expand Down
14 changes: 14 additions & 0 deletions coverage/rvi_cmo.cgf
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# For Licence details look at https://github.com/riscv-software-src/riscv-ctg/-/blob/master/LICENSE.incore

cbozero:
config:
- check ISA:=regex(.*I.*Zicboz.*Zicsr.*)
opcode:
cbo.zero: 0
rs1:
<<: *all_regs_mx0
val_comb:
abstract_comb:
'walking_ones("rs1_val", 12, False)': 0
'walking_zeros("rs1_val", 12, False)': 0
'uniform_random(10, 100, ["rs1_val"], [12])': 0
10 changes: 10 additions & 0 deletions riscv-test-suite/env/arch_test.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,16 @@
#define EXCPT_CAUSE_MSK ((1<<4)-1)
#endif

// set defaults
#ifndef RVMODEL_CBZ_BLOCKSIZE
#define RVMODEL_CBZ_BLOCKSIZE 64
#endif

// set defaults
#ifndef RVMODEL_CMO_BLOCKSIZE
#define RVMODEL_CMO_BLOCKSIZE 64
#endif

//==========================================================================================
// By default, it is defined as nop for the implementation that does not support Zifencei
// Implementations that support Zifencei may use the fence.i instruction.
Expand Down
8 changes: 8 additions & 0 deletions riscv-test-suite/env/test_macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,14 @@ nop ;\
csrr flagreg, fcsr ;\
RVTEST_SIGUPD_F(swreg,destreg,flagreg)

#define TEST_CBO_ZERO(swreg,rs1,inst,imm_val) ;\
LI(rs1,imm_val&(RVMODEL_CBZ_BLOCKSIZE-1)) ;\
add rs1,rs1,swreg ;\
inst (rs1) ;\
nop ;\
nop ;\
ADDI(swreg, swreg, RVMODEL_CBZ_BLOCKSIZE)

#define TEST_CSR_FIELD(ADDRESS,TEMP_REG,MASK_REG,NEG_MASK_REG,VAL,DEST_REG,OFFSET,BASE_REG) ;\
LI(TEMP_REG,VAL) ;\
and TEMP_REG,TEMP_REG,MASK_REG ;\
Expand Down
312 changes: 312 additions & 0 deletions riscv-test-suite/rv32i_m/CMO/src/cbo.zero-01.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,312 @@

// -----------
// This file was generated by riscv_ctg (https://github.com/riscv-software-src/riscv-ctg)
// version : 0.10.4
// timestamp : Wed Feb 22 09:04:22 2023 GMT
// usage : riscv_ctg \
// -- cgf // --cgf /workspace/riscv-ctg/sample_cgfs/dataset.cgf \
// --cgf /workspace/riscv-ctg/sample_cgfs/rv32i_cbo.cgf \
\
// -- xlen 32 \
// --randomize \
// -----------
//
// -----------
// Copyright (c) 2020. RISC-V International. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
// -----------
//
// This assembly file tests the cbo.zero instruction of the RISC-V RV32ZicbozZicsr extension for the cbozero covergroup.
//
#include "model_test.h"
#include "arch_test.h"
RVTEST_ISA("RV32IZicbozZicsr")

.section .text.init
.globl rvtest_entry_point
rvtest_entry_point:
RVMODEL_BOOT
RVTEST_CODE_BEGIN

#ifdef TEST_CASE_1

RVTEST_CASE(0,"//check ISA:=regex(.*I.*Zicboz.*Zicsr.*);def TEST_CASE_1=True;",cbozero)

RVTEST_SIGBASE(x2,signature_x2_1)

inst_0:
// rs1==x30, rs1_val == 0x4a9
// opcode: cbo.zero ; op1:x30; op1val:0x4a9
TEST_CBO_ZERO(x2,x30,cbo.zero,0x4a9)

inst_1:
// rs1==x9, rs1_val == 0xeb4
// opcode: cbo.zero ; op1:x9; op1val:0xeb4
TEST_CBO_ZERO(x2,x9,cbo.zero,0xeb4)

inst_2:
// rs1==x22, rs1_val == 0xe8e
// opcode: cbo.zero ; op1:x22; op1val:0xe8e
TEST_CBO_ZERO(x2,x22,cbo.zero,0xe8e)

inst_3:
// rs1==x27, rs1_val == 0x597
// opcode: cbo.zero ; op1:x27; op1val:0x597
TEST_CBO_ZERO(x2,x27,cbo.zero,0x597)

inst_4:
// rs1==x16, rs1_val == 4094,
// opcode: cbo.zero ; op1:x16; op1val:0xffe
TEST_CBO_ZERO(x2,x16,cbo.zero,0xffe)

inst_5:
// rs1==x12, rs1_val == 4093,
// opcode: cbo.zero ; op1:x12; op1val:0xffd
TEST_CBO_ZERO(x2,x12,cbo.zero,0xffd)

inst_6:
// rs1==x21, rs1_val == 4091,
// opcode: cbo.zero ; op1:x21; op1val:0xffb
TEST_CBO_ZERO(x2,x21,cbo.zero,0xffb)

inst_7:
// rs1==x28, rs1_val == 4087,
// opcode: cbo.zero ; op1:x28; op1val:0xff7
TEST_CBO_ZERO(x2,x28,cbo.zero,0xff7)

inst_8:
// rs1==x25, rs1_val == 4079,
// opcode: cbo.zero ; op1:x25; op1val:0xfef
TEST_CBO_ZERO(x2,x25,cbo.zero,0xfef)

inst_9:
// rs1==x6, rs1_val == 4063,
// opcode: cbo.zero ; op1:x6; op1val:0xfdf
TEST_CBO_ZERO(x2,x6,cbo.zero,0xfdf)

inst_10:
// rs1==x1, rs1_val == 4031,
// opcode: cbo.zero ; op1:x1; op1val:0xfbf
TEST_CBO_ZERO(x2,x1,cbo.zero,0xfbf)

inst_11:
// rs1==x4, rs1_val == 3967,
// opcode: cbo.zero ; op1:x4; op1val:0xf7f
TEST_CBO_ZERO(x2,x4,cbo.zero,0xf7f)

inst_12:
// rs1==x7, rs1_val == 3839,
// opcode: cbo.zero ; op1:x7; op1val:0xeff
TEST_CBO_ZERO(x2,x7,cbo.zero,0xeff)

inst_13:
// rs1==x3, rs1_val == 3583,
// opcode: cbo.zero ; op1:x3; op1val:0xdff
TEST_CBO_ZERO(x2,x3,cbo.zero,0xdff)

inst_14:
// rs1==x18, rs1_val == 3071,
// opcode: cbo.zero ; op1:x18; op1val:0xbff
TEST_CBO_ZERO(x2,x18,cbo.zero,0xbff)

inst_15:
// rs1==x10, rs1_val == 2047,
// opcode: cbo.zero ; op1:x10; op1val:0x7ff
TEST_CBO_ZERO(x2,x10,cbo.zero,0x7ff)

inst_16:
// rs1==x8, rs1_val == 1,
// opcode: cbo.zero ; op1:x8; op1val:0x1
TEST_CBO_ZERO(x2,x8,cbo.zero,0x1)

inst_17:
// rs1==x23, rs1_val == 2,
// opcode: cbo.zero ; op1:x23; op1val:0x2
TEST_CBO_ZERO(x2,x23,cbo.zero,0x2)

inst_18:
// rs1==x13, rs1_val == 4,
// opcode: cbo.zero ; op1:x13; op1val:0x4
TEST_CBO_ZERO(x2,x13,cbo.zero,0x4)

inst_19:
// rs1==x17, rs1_val == 8,
// opcode: cbo.zero ; op1:x17; op1val:0x8
TEST_CBO_ZERO(x2,x17,cbo.zero,0x8)

inst_20:
// rs1==x31, rs1_val == 16,
// opcode: cbo.zero ; op1:x31; op1val:0x10
TEST_CBO_ZERO(x2,x31,cbo.zero,0x10)

inst_21:
// rs1==x29, rs1_val == 32,
// opcode: cbo.zero ; op1:x29; op1val:0x20
TEST_CBO_ZERO(x2,x29,cbo.zero,0x20)

inst_22:
// rs1==x11, rs1_val == 64,
// opcode: cbo.zero ; op1:x11; op1val:0x40
TEST_CBO_ZERO(x2,x11,cbo.zero,0x40)

inst_23:
// rs1==x5, rs1_val == 128,
// opcode: cbo.zero ; op1:x5; op1val:0x80
TEST_CBO_ZERO(x2,x5,cbo.zero,0x80)

inst_24:
// rs1==x24, rs1_val == 256,
// opcode: cbo.zero ; op1:x24; op1val:0x100
TEST_CBO_ZERO(x2,x24,cbo.zero,0x100)

inst_25:
// rs1==x15, rs1_val == 512,
// opcode: cbo.zero ; op1:x15; op1val:0x200
TEST_CBO_ZERO(x2,x15,cbo.zero,0x200)

inst_26:
// rs1==x14, rs1_val == 1024,
// opcode: cbo.zero ; op1:x14; op1val:0x400
TEST_CBO_ZERO(x2,x14,cbo.zero,0x400)

inst_27:
// rs1==x19, rs1_val == 2048,
// opcode: cbo.zero ; op1:x19; op1val:0x800
TEST_CBO_ZERO(x2,x19,cbo.zero,0x800)
RVTEST_SIGBASE(x1,signature_x1_0)

inst_28:
// rs1==x20, rs1_val == 0xc93
// opcode: cbo.zero ; op1:x20; op1val:0xc93
TEST_CBO_ZERO(x1,x20,cbo.zero,0xc93)

inst_29:
// rs1==x26, rs1_val == 0xb31
// opcode: cbo.zero ; op1:x26; op1val:0xb31
TEST_CBO_ZERO(x1,x26,cbo.zero,0xb31)

inst_30:
// rs1==x2, rs1_val == 0xddf
// opcode: cbo.zero ; op1:x2; op1val:0xddf
TEST_CBO_ZERO(x1,x2,cbo.zero,0xddf)

inst_31:
// rs1_val == 0x384
// opcode: cbo.zero ; op1:x31; op1val:0x384
TEST_CBO_ZERO(x1,x31,cbo.zero,0x384)

inst_32:
// rs1_val == 0x3e1
// opcode: cbo.zero ; op1:x31; op1val:0x3e1
TEST_CBO_ZERO(x1,x31,cbo.zero,0x3e1)

inst_33:
// rs1_val == 0x290
// opcode: cbo.zero ; op1:x31; op1val:0x290
TEST_CBO_ZERO(x1,x31,cbo.zero,0x290)

inst_34:
// rs1_val == 0xe97
// opcode: cbo.zero ; op1:x31; op1val:0xe97
TEST_CBO_ZERO(x1,x31,cbo.zero,0xe97)

inst_35:
// rs1_val == 0x86d
// opcode: cbo.zero ; op1:x31; op1val:0x86d
TEST_CBO_ZERO(x1,x31,cbo.zero,0x86d)

inst_36:
// rs1_val == 0x188
// opcode: cbo.zero ; op1:x31; op1val:0x188
TEST_CBO_ZERO(x1,x31,cbo.zero,0x188)

inst_37:
// rs1_val == 0x68b
// opcode: cbo.zero ; op1:x31; op1val:0x68b
TEST_CBO_ZERO(x1,x31,cbo.zero,0x68b)

inst_38:
// rs1_val == 0xabb
// opcode: cbo.zero ; op1:x31; op1val:0xabb
TEST_CBO_ZERO(x1,x31,cbo.zero,0xabb)

inst_39:
// rs1_val == 0x759
// opcode: cbo.zero ; op1:x31; op1val:0x759
TEST_CBO_ZERO(x1,x31,cbo.zero,0x759)

inst_40:
// rs1_val == 0x9e6
// opcode: cbo.zero ; op1:x31; op1val:0x9e6
TEST_CBO_ZERO(x1,x31,cbo.zero,0x9e6)

inst_41:
// rs1_val == 0x686
// opcode: cbo.zero ; op1:x31; op1val:0x686
TEST_CBO_ZERO(x1,x31,cbo.zero,0x686)

inst_42:
// rs1_val == 0x5b5
// opcode: cbo.zero ; op1:x31; op1val:0x5b5
TEST_CBO_ZERO(x1,x31,cbo.zero,0x5b5)

inst_43:
// rs1_val == 0x481
// opcode: cbo.zero ; op1:x31; op1val:0x481
TEST_CBO_ZERO(x1,x31,cbo.zero,0x481)
#endif


RVTEST_CODE_END
RVMODEL_HALT

RVTEST_DATA_BEGIN
.align 4
rvtest_data:
.word 0xbabecafe
.word 0xabecafeb
.word 0xbecafeba
.word 0xecafebab
RVTEST_DATA_END

RVMODEL_DATA_BEGIN
rvtest_sig_begin:
sig_begin_canary:
CANARY;



signature_x2_0:
.fill 0*((RVMODEL_CBZ_BLOCKSIZE)/4),4,0xdeadbeef


signature_x2_1:
.fill 28*((RVMODEL_CBZ_BLOCKSIZE)/4),4,0xdeadbeef


signature_x1_0:
.fill 16*((RVMODEL_CBZ_BLOCKSIZE)/4),4,0xdeadbeef

#ifdef rvtest_mtrap_routine
tsig_begin_canary:
CANARY;

mtrap_sigptr:
.fill 64*XLEN/32,4,0xdeadbeef

tsig_end_canary:
CANARY;
#endif

#ifdef rvtest_gpr_save

gpr_save:
.fill 32*XLEN/32,4,0xdeadbeef

#endif


sig_end_canary:
CANARY;
rvtest_sig_end:
RVMODEL_DATA_END
Loading

1 comment on commit 07eceea

@allenjbaum
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks good to me.
Note that we will eventually also need tests that execute in non-privileged modes that can trap to ensure the right thing happens
(for all the various types of traps - permissions, page fault, not not misaligned!), and even in privileged modes with PMP traps.

Please sign in to comment.