Skip to content

Commit

Permalink
Add Zicbom and Zicbop extension
Browse files Browse the repository at this point in the history
  • Loading branch information
trdthg committed Oct 15, 2024
1 parent 7b78ae0 commit bb90765
Show file tree
Hide file tree
Showing 9 changed files with 217 additions and 43 deletions.
37 changes: 37 additions & 0 deletions coverage/cmo/cbom.cgf
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# For Licence details look at https://github.com/riscv-software-src/riscv-ctg/-/blob/master/LICENSE.incore

cbo.clean:
config:
- check ISA:=regex(.*I.*Zicbom.*Zicsr.*)
mnemonics:
cbo.clean: 0
rs1:
<<: *all_regs_mx0
val_comb:
<<: [*base_rs1val_unsgn]
abstract_comb:
<<: [*rs1val_walking_unsgn]

cbo.flush:
config:
- check ISA:=regex(.*I.*Zicbom.*Zicsr.*)
mnemonics:
cbo.flush: 0
rs1:
<<: *all_regs_mx0
val_comb:
<<: [*base_rs1val_unsgn]
abstract_comb:
<<: [*rs1val_walking_unsgn]

cbo.inval:
config:
- check ISA:=regex(.*I.*Zicbom.*Zicsr.*)
mnemonics:
cbo.inval: 0
rs1:
<<: *all_regs_mx0
val_comb:
<<: [*base_rs1val_unsgn]
abstract_comb:
<<: [*rs1val_walking_unsgn]
37 changes: 37 additions & 0 deletions coverage/cmo/cbop.cgf
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# For Licence details look at https://github.com/riscv-software-src/riscv-ctg/-/blob/master/LICENSE.incore

prefetch.i:
config:
- check ISA:=regex(.*I.*Zicbop.*Zicsr.*)
mnemonics:
prefetch.i: 0
rs1:
<<: *all_regs
val_comb:
<<: [*zicbop_ifmt_val_comb_unsgn, *base_rs1val_unsgn, *ifmt_base_immval11_5_sgn]
abstract_comb:
<<: [*rs1val_walking_unsgn, *ifmt_immval_walking_11_5]

prefetch.r:
config:
- check ISA:=regex(.*I.*Zicbop.*Zicsr.*)
mnemonics:
prefetch.r: 0
rs1:
<<: *all_regs
val_comb:
<<: [*zicbop_ifmt_val_comb_unsgn, *base_rs1val_unsgn, *ifmt_base_immval11_5_sgn]
abstract_comb:
<<: [*rs1val_walking_unsgn, *ifmt_immval_walking_11_5]

prefetch.w:
config:
- check ISA:=regex(.*I.*Zicbop.*Zicsr.*)
mnemonics:
prefetch.w: 0
rs1:
<<: *all_regs
val_comb:
<<: [*zicbop_ifmt_val_comb_unsgn, *base_rs1val_unsgn, *ifmt_base_immval11_5_sgn]
abstract_comb:
<<: [*rs1val_walking_unsgn, *ifmt_immval_walking_11_5]
2 changes: 1 addition & 1 deletion coverage/rv32i_cbo.cgf → coverage/cmo/cboz.cgf
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# For Licence details look at https://github.com/riscv-software-src/riscv-ctg/-/blob/master/LICENSE.incore

cbozero:
cbo.zero:
config:
- check ISA:=regex(.*I.*Zicboz.*Zicsr.*)
mnemonics:
Expand Down
14 changes: 0 additions & 14 deletions coverage/cmo/rvi_cmo.cgf

This file was deleted.

35 changes: 25 additions & 10 deletions coverage/dataset.cgf
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ datasets:
x13: 0
x14: 0
x15: 0

all_regs_mx2: &all_regs_mx2
x1: 0
x3: 0
Expand Down Expand Up @@ -295,7 +295,7 @@ datasets:
r0fmt_op_comb: &r0fmt_op_comb
'rs1 == 0': 0
'rs1 != 0': 0

base_rs1val_sgn: &base_rs1val_sgn
'rs1_val == (-2**(xlen-1))': 0
'rs1_val == 0': 0
Expand All @@ -307,7 +307,7 @@ datasets:
'rs1_val == 0 and rs2_val == 0': 0
'rs1_val == (2**(xlen-1)-1) and rs2_val == 0': 0
'rs1_val == 1 and rs2_val == 0': 0

base_rs2val_sgn: &base_rs2val_sgn
'rs2_val == (-2**(xlen-1))': 0
'rs2_val == 0': 0
Expand All @@ -320,12 +320,11 @@ datasets:
'rs3_val == (2**(xlen-1)-1)': 0
'rs3_val == 1': 0


base_rs1val_unsgn: &base_rs1val_unsgn
'rs1_val == 0': 0
'rs1_val == (2**(xlen)-1)': 0
'rs1_val == 1': 0

base_rs2val_unsgn: &base_rs2val_unsgn
'rs2_val == 0': 0
'rs2_val == (2**(xlen)-1)': 0
Expand All @@ -346,7 +345,7 @@ datasets:

div_corner_case: &div_corner_case
'rs1_val == -(2**(xlen-1)) and rs2_val == -0x01': 0

rfmt_val_comb_unsgn: &rfmt_val_comb_unsgn
'rs1_val > 0 and rs2_val > 0': 0
'rs1_val == rs2_val and rs1_val > 0 and rs2_val > 0': 0
Expand All @@ -364,12 +363,23 @@ datasets:
'rs1_val == imm_val and rs1_val > 0 and imm_val > 0': 0
'rs1_val != imm_val and rs1_val > 0 and imm_val > 0': 0

zicbop_ifmt_val_comb_unsgn: &zicbop_ifmt_val_comb_unsgn
'rs1_val == imm_val and rs1_val == 0': 0
'rs1_val < imm_val and rs1_val != 0': 0
'rs1_val > imm_val and imm_val == 0': 0

ifmt_base_immval_sgn: &ifmt_base_immval_sgn
'imm_val == (-2**(12-1))': 0
'imm_val == 0': 0
'imm_val == (2**(12-1)-1)': 0
'imm_val == 1': 0

ifmt_base_immval11_5_sgn: &ifmt_base_immval11_5_sgn
'imm_val == (-2**(12-1)) & 0b00000': 0
'imm_val == 0': 0
'imm_val == (2**(12-1)-1) & 0b00000': 0
'imm_val == 1<<5': 0

ifmt_base_immval_sgn_len: &ifmt_base_immval_sgn_len
'imm_val == (-2**(ceil(log(xlen,2))-1))': 0
'imm_val == 0': 0
Expand Down Expand Up @@ -435,7 +445,7 @@ datasets:
'rs1_val > rs2_val and imm_val < 0 and imm_val & 0x03 == 0': 0
'rs1_val < rs2_val and imm_val > 0 and imm_val & 0x03 == 0': 0
'rs1_val < rs2_val and imm_val < 0 and imm_val & 0x03 == 0': 0

bfmt_base_branch_val_align_unsgn: &bfmt_base_branch_val_align_unsgn
'rs1_val > 0 and rs2_val > 0': 0
'rs1_val > 0 and rs2_val > 0 and rs1_val == rs2_val and imm_val > 0': 0
Expand Down Expand Up @@ -480,12 +490,17 @@ datasets:
'walking_ones("imm_val", 5, False)': 0
'walking_zeros("imm_val", 5, False)': 0
'alternate("imm_val", 5, False)': 0


ifmt_immval_walking_11_5: &ifmt_immval_walking_11_5
'walking_ones("imm_val", 7, signed = True, scale_func = lambda x: x << 5)': 0
'walking_zeros("imm_val", 7, signed = True, scale_func = lambda x: x << 5)': 0
'alternate("imm_val", 7, signed = True, scale_func = lambda x: x << 5)': 0

rs1val_walking_unsgn: &rs1val_walking_unsgn
'walking_ones("rs1_val", xlen,False)': 0
'walking_zeros("rs1_val", xlen,False)': 0
'alternate("rs1_val",xlen,False)': 0

rs2val_walking_unsgn: &rs2val_walking_unsgn
'walking_ones("rs2_val", xlen,False)': 0
'walking_zeros("rs2_val", xlen,False)': 0
Expand All @@ -499,7 +514,7 @@ datasets:
'walking_ones("imm_val", 6)': 0
'walking_zeros("imm_val", 6)': 0
'alternate("imm_val",6)': 0

ifmt_immval_walking_unsgn: &ifmt_immval_walking_unsgn
'walking_ones("imm_val", 12,False)': 0
'walking_zeros("imm_val", 12,False)': 0
Expand Down
14 changes: 0 additions & 14 deletions coverage/rv64i_cbo.cgf

This file was deleted.

109 changes: 107 additions & 2 deletions riscv-ctg/riscv_ctg/data/template.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10423,15 +10423,120 @@ cbo.zero:
sz: 'RVMODEL_CBZ_BLOCKSIZE'
xlen: [32,64]
isa:
- IZicbozZicsr
- IZicboz_Zicsr
formattype: 'zformat'
rs1_op_data: *all_regs_mx0
rs1_val_data: 'gen_usign_dataset(12)'
template: |-
// $comment
// opcode: $inst ; op1:$rs1; op1val:$rs1_val
TEST_CBO_ZERO($swreg,$rs1,$inst,$rs1_val)
TEST_CBO($swreg,$rs1,$inst,$rs1_val)
cbo.clean:
std_op:
sig:
stride: 1
sz: 'XLEN/8'
xlen: [32,64]
isa:
- IZicbom_Zicsr
formattype: 'zformat'
rs1_op_data: *all_regs
rs1_val_data: 'gen_usign_dataset(xlen) + gen_sp_dataset(xlen,True)'
template: |-
// $comment
// opcode: $inst ; op1:$rs1; op1val:$rs1_val
TEST_CBO($swreg,$rs1,$inst,$rs1_val)
cbo.flush:
std_op:
sig:
stride: 1
sz: 'XLEN/8'
xlen: [32,64]
isa:
- IZicbom_Zicsr
formattype: 'zformat'
rs1_op_data: *all_regs
rs1_val_data: 'gen_usign_dataset(xlen) + gen_sp_dataset(xlen,True)'
template: |-
// $comment
// opcode: $inst ; op1:$rs1; op1val:$rs1_val
TEST_CBO($swreg,$rs1,$inst,$rs1_val)
cbo.inval:
std_op:
sig:
stride: 1
sz: 'XLEN/8'
xlen: [32,64]
isa:
- IZicbom_Zicsr
formattype: 'zformat'
rs1_op_data: *all_regs
rs1_val_data: 'gen_usign_dataset(xlen) + gen_sp_dataset(xlen,True)'
template: |-
// $comment
// opcode: $inst ; op1:$rs1; op1val:$rs1_val
TEST_CBO($swreg,$rs1,$inst,$rs1_val)
prefetch.i:
sig:
stride: 1
sz: 'XLEN/8'
xlen: [32,64]
std_op:
isa:
- IZicbop_Zicsr
formattype: 'iformat'
rs1_op_data: *all_regs
rs1_val_data: 'gen_usign_dataset(xlen) + gen_sp_dataset(xlen,True)'
imm_val_data: '[v << 5 for v in gen_sign_dataset(7)]'
template: |-
// $comment
// opcode: $inst ; op1:$rs1; dest:$rd; op1val:$rs1_val; immval:$imm_val
TEST_PREFETCH($swreg,$rs1,$inst,$imm_val)
prefetch.r:
sig:
stride: 1
sz: 'XLEN/8'
xlen: [32,64]
std_op:
isa:
- IZicbop_Zicsr
formattype: 'iformat'
rs1_op_data: *all_regs
rs1_val_data: 'gen_usign_dataset(xlen) + gen_sp_dataset(xlen,True)'
imm_val_data: '[v << 5 for v in gen_sign_dataset(7)]'
template: |-
// $comment
// opcode: $inst ; op1:$rs1; dest:$rd; op1val:$rs1_val; immval:$imm_val
TEST_PREFETCH($swreg,$rs1,$inst,$imm_val)
prefetch.w:
sig:
stride: 1
sz: 'XLEN/8'
xlen: [32,64]
std_op:
isa:
- IZicbop_Zicsr
formattype: 'iformat'
rs1_op_data: *all_regs
rs1_val_data: 'gen_usign_dataset(xlen) + gen_sp_dataset(xlen,True)'
imm_val_data: '[v << 5 for v in gen_sign_dataset(7)]'
template: |-
// $comment
// opcode: $inst ; op1:$rs1; dest:$rd; op1val:$rs1_val; immval:$imm_val
TEST_PREFETCH($swreg,$rs1,$inst,$imm_val)
amoadd.w:
sig:
Expand Down
3 changes: 2 additions & 1 deletion riscv-ctg/riscv_ctg/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ def get_rm(opcode):
'prrformat': '["rs1_val", "rs2_val"]',
'prrrformat': "['rs1_val', 'rs2_val' , 'rs3_val']",
'dcasrformat': '["rs1_val", "rs2_val"]',
'zformat': ['rs1']
'zformat': "['rs1_val']"
}
''' Dictionary mapping instruction formats to operand value variables used by those formats '''

Expand Down Expand Up @@ -1136,6 +1136,7 @@ def swreg(self, instr_dict):
else:
FLEN = 0
XLEN = max(self.opnode['xlen'])
RVMODEL_CBZ_BLOCKSIZE = XLEN
SIGALIGN = max(XLEN,FLEN)/8
stride_sz = eval(suffix)
for instr in instr_dict:
Expand Down
9 changes: 8 additions & 1 deletion riscv-test-suite/env/test_macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -769,14 +769,21 @@ nop ;\
csrr flagreg, fcsr ;\
RVTEST_SIGUPD_F(swreg,destreg,flagreg)

#define TEST_CBO_ZERO(swreg,rs1,inst,imm_val) ;\
#define TEST_CBO(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_PREFETCH(swreg,rs1,inst,imm_val) ;\
LI(rs1,rs1_val) ;\
inst imm_val(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

0 comments on commit bb90765

Please sign in to comment.