diff --git a/riscv_ctg/data/imc.yaml b/riscv_ctg/data/imc.yaml index a724f52..945deee 100644 --- a/riscv_ctg/data/imc.yaml +++ b/riscv_ctg/data/imc.yaml @@ -1894,38 +1894,40 @@ c.flw: sig: stride: 1 sz: 'XLEN/8' - rs1_op_data: *all_regs_mx0 - rd_op_data: *all_fregs + rs1_op_data: *c_regs + rd_op_data: *c_fregs xlen: [32] std_op: isa: - - IFC + - IF_Zcf fcsr_data: '[x<<5|y for x,y in itertools.product([0,1,2,3,4],range(0,2**5))]' formattype: 'clformat' ea_align_data: '[0,1,2,3]' rs1_val_data: '[0]' imm_val_data: '[x*4 for x in gen_usign_dataset(5)]' template: |- + // $comment - // opcode:$inst op1:$rs1; dest:$rd; immval:$imm_val; align:$ea_align; flagreg:$flagreg + // opcode: $inst; op1:$rs1; dest:$rd; immval:$imm_val; align:$ea_align; flagreg:$flagreg; fcsr: $fcsr TEST_LOAD_F($swreg,$testreg,$fcsr,$rs1,$rd,$imm_val,$inst,$ea_align,$flagreg) c.flwsp: sig: stride: 1 sz: 'XLEN/8' - rd_op_data: *all_fregs + rd_op_data: *c_fregs xlen: [32] std_op: isa: - - IFC + - IF_Zcf formattype: 'ciformat' fcsr_data: '[x<<5|y for x,y in itertools.product([0,1,2,3,4],range(0,2**5))]' ea_align_data: '[0,1,2,3]' imm_val_data: '[x*4 for x in gen_usign_dataset(6)]' template: |- + // $comment - // opcode:$inst op1:$rs1; dest:$rd; immval:$imm_val; align:$ea_align; flagreg:$flagreg + // opcode: $inst op1:$rs1; dest:$rd; immval:$imm_val; align:$ea_align; flagreg:$flagreg; fcsr: $fcsr TEST_LOAD_F($swreg,$testreg,$fcsr,$rs1,$rd,$imm_val,$inst,$ea_align,$flagreg) @@ -1934,21 +1936,23 @@ c.fsw: stride: 1 sz: 'XLEN/8' xlen: [32] - rs1_op_data: *all_regs_mx0 - rs2_op_data: *all_fregs + rs1_op_data: *c_regs + rs2_op_data: *c_fregs + std_op: isa: - - IFC + - IF_Zcf fcsr_data: '[x<<5|y for x,y in itertools.product([0,1,2,3,4],range(0,2**5))]' - std_op: formattype: 'csformat' ea_align_data: '[0,1,2,3]' rs1_val_data: '[0]' rs2_val_data: 'gen_sign_dataset(xlen)' imm_val_data: '[x*4 for x in gen_usign_dataset(5)]' template: |- + // $comment - // opcode: $inst; op1:$rs1; op2:$rs2; op2val:$rs2_val; immval:$imm_val; align:$ea_align; flagreg:$flagreg; - // valreg: $valaddr_reg; valoffset: $val_offset + /* opcode: $inst; op1:$rs1; op2:$rs2; op2val:$rs2_val; immval:$imm_val; align:$ea_align; flagreg:$flagreg; + valreg: $valaddr_reg; valoffset: $val_offset + */ TEST_STORE_F($swreg,$testreg,$fcsr,$rs1,$rs2,$imm_val,$offset,$inst,$ea_align,$flagreg,$valaddr_reg, $val_offset) @@ -1956,20 +1960,22 @@ c.fswsp: sig: stride: 1 sz: 'XLEN/8' - rs2_op_data: *all_fregs + rs2_op_data: *c_fregs xlen: [32] std_op: isa: - - IFC + - IF_Zcf fcsr_data: '[x<<5|y for x,y in itertools.product([0,1,2,3,4],range(0,2**5))]' formattype: 'cssformat' ea_align_data: '[0,1,2,3]' rs2_val_data: 'gen_sign_dataset(xlen)' imm_val_data: '[x*4 for x in gen_usign_dataset(6)]' template: |- + // $comment - // opcode: $inst; op1:$rs1; op2:$rs2; op2val:$rs2_val; immval:$imm_val; align:$ea_align; flagreg:$flagreg; - // valreg: $valaddr_reg; valoffset: $val_offset + /* opcode: $inst; op1:$rs1; op2:$rs2; op2val:$rs2_val; immval:$imm_val; align:$ea_align; flagreg:$flagreg; + valreg: $valaddr_reg; valoffset: $val_offset + */ TEST_STORE_F($swreg,$testreg,$fcsr,$rs1,$rs2,$imm_val,$offset,$inst,$ea_align,$flagreg,$valaddr_reg, $val_offset) c.fld: @@ -1986,7 +1992,7 @@ c.fld: xlen: [32,64] std_op: isa: - - IFDC + - IFD_Zcd formattype: 'clformat' fcsr_data: '[x<<5|y for x,y in itertools.product([0,1,2,3,4],range(0,2**5))]' ea_align_data: '[0,1,2,3]' @@ -1994,24 +2000,24 @@ c.fld: template: |- // $comment - // opcode:$inst; op1:$rs1; dest:$rd; immval:$imm_val; align:$ea_align; flagreg:$flagreg + // opcode: $inst; op1:$rs1; dest:$rd; immval:$imm_val; align:$ea_align; flagreg:$flagreg TEST_LOAD_F($swreg,$testreg,$fcsr,$rs1,$rd,$imm_val,$inst,$ea_align,$flagreg) c.fldsp: sig: stride: 2 sz: 'SIGALIGN' - rd_op_data: *all_fregs + rd_op_data: *c_fregs xlen: [32,64] std_op: isa: - - IFDC + - IFD_Zcd formattype: 'ciformat' imm_val_data: '[x*8 for x in gen_usign_dataset(6)]' template: |- // $comment - // opcode:$inst; op1:x2; dest:$rd; immval:$imm_val; align:$ea_align; flagreg:x4 + // opcode: $inst; op1:x2; dest:$rd; immval:$imm_val; align:$ea_align; flagreg:x4 TEST_LOAD_F($swreg,$testreg,$fcsr,x2,$rd,$imm_val,$inst,$ea_align,x4) c.fsd: @@ -2026,20 +2032,21 @@ c.fsd: rs1_op_data: *c_regs rs2_op_data: *c_fregs xlen: [32,64] + std_op: isa: - - IFDC + - IFD_Zcd fcsr_data: '[x<<5|y for x,y in itertools.product([0,1,2,3,4],range(0,2**5))]' - std_op: formattype: 'csformat' ea_align_data: '[0,1,2,3]' rs2_val_data: 'gen_sign_dataset(xlen)' imm_val_data: '[x*8 for x in gen_usign_dataset(5)]' template: |- - + // $comment - // opcode: $inst; op1:$rs1; op2:$rs2; op2val:$rs2_val; immval:$imm_val; align:$ea_align; flagreg:$flagreg; - // valreg: $valaddr_reg; valoffset: $val_offset; - TEST_STORE_F($swreg,$testreg,0,$rs1,$rs2,$imm_val,$offset,$inst,0,$flagreg,$valaddr_reg, $val_offset) + /* opcode: $inst; op1:$rs1; op2:$rs2; op2val:$rs2_val; immval:$imm_val; align:$ea_align; flagreg:$flagreg; + valreg: $valaddr_reg; valoffset: $val_offset + */ + TEST_STORE_F($swreg,$testreg,$fcsr,$rs1,$rs2,$imm_val,$offset,$inst,$ea_align,$flagreg,$valaddr_reg, $val_offset) c.fsdsp: sig: @@ -2050,19 +2057,21 @@ c.fsdsp: sz: 'FLEN/8' val_template: "''" load_instr: "FLREG" - rs2_op_data: *all_fregs + rs2_op_data: *c_fregs xlen: [32,64] std_op: isa: - - IFDC + - IFD_Zcd fcsr_data: '[x<<5|y for x,y in itertools.product([0,1,2,3,4],range(0,2**5))]' formattype: 'cssformat' ea_align_data: '[0,1,2,3]' rs2_val_data: 'gen_sign_dataset(xlen)' imm_val_data: '[x*8 for x in gen_usign_dataset(6)]' template: |- - + // $comment - // opcode: $inst; op1:x2; op2:$rs2; op2val:$rs2_val; immval:$imm_val; align:$ea_align; flagreg:$flagreg; - // valreg: $valaddr_reg ; valoffset: $val_offset - TEST_STORE_F($swreg,$testreg,$fcsr,$rs1,$rs2,$imm_val,$offset,$inst,0,$flagreg,$valaddr_reg,$val_offset) + /* opcode: $inst; op1:$rs1; op2:$rs2; op2val:$rs2_val; immval:$imm_val; align:$ea_align; flagreg:$flagreg; + valreg: $valaddr_reg; valoffset: $val_offset + */ + TEST_STORE_F($swreg,$testreg,$fcsr,$rs1,$rs2,$imm_val,$offset,$inst,$ea_align,$flagreg,$valaddr_reg, $val_offset) + diff --git a/riscv_ctg/generator.py b/riscv_ctg/generator.py index 373787c..01dd0b9 100644 --- a/riscv_ctg/generator.py +++ b/riscv_ctg/generator.py @@ -132,8 +132,8 @@ def get_rm(opcode): 'jformat': "['imm_val']", 'crformat': "['rs1_val', 'rs2_val']", 'cmvformat': "['rs2_val']", - 'ciformat': "['rs1_val', 'imm_val']", - 'cssformat': "['rs2_val', 'imm_val']", + 'ciformat': "[ 'imm_val','fcsr']", + 'cssformat': "['rs2_val', 'imm_val','fcsr']", 'ciwformat': "['imm_val']", 'clformat': "['rs1_val', 'imm_val', 'fcsr']", 'cuformat': "['rs1_val']", @@ -281,7 +281,7 @@ def __init__(self,fmt,opnode,opcode,randomization, xl, fl, ifl ,base_isa_str,inx self.inxFlag = inxFlag self.is_sgn_extd = is_sgn_extd - if opcode in ['sw', 'sh', 'sb', 'lw', 'lhu', 'lh', 'lb', 'lbu', 'ld', 'lwu', 'sd',"jal","beq","bge","bgeu","blt","bltu","bne","jalr","c.jalr","c.jr","flw","fsw","fld","fsd","flh","fsh","c.lbu","c.lhu","c.lh","c.sb","c.sh","c.flw","c.fld","c.flwsp","c.fswsp","c.fldsp","c.fsdsp"]: + if opcode in ['sw', 'sh', 'sb', 'lw', 'lhu', 'lh', 'lb', 'lbu', 'ld', 'lwu', 'sd',"jal","beq","bge","bgeu","blt","bltu","bne","jalr","c.jalr","c.jr","flw","fsw","fld","fsd","flh","fsh","c.lbu","c.lhu","c.lh","c.sb","c.sh","c.fld","c.flwsp","c.fswsp","c.fldsp","c.fsdsp"]: self.val_vars = self.val_vars + ['ea_align'] self.template = opnode['template'] self.opnode = opnode @@ -812,7 +812,11 @@ def gen_inst(self,op_comb, val_comb, cgf): for y in op_inds[i:]: if op[y] == op[x]: val[ind_dict[y]] = val[ind_dict[x]] - if self.is_fext: + if self.is_fext and self.opcode in ['c.flwsp','c.fswsp','c.fldsp','c.fsdsp']: + if any([x == 'x2' for x in op]): + cont.append(val) + instr_dict.append(self.__cmemsp_instr__(op,val)) + elif self.is_fext: instr_dict.append(self.__fext_instr__(op,val)) elif self.opcode == 'c.lui': instr_dict.append(self.__clui_instr__(op,val)) @@ -1078,6 +1082,11 @@ def valreg(self,instr_dict): if self.is_nan_box: dval = nan_box(instr_dict[i]['rs{0}_nan_prefix'.format(j)], instr_dict[i]['rs{0}_val'.format(j)],self.flen,self.iflen) + elif self.is_fext and self.opcode in ['c.flwsp', 'c.fldsp']: + dval = (instr_dict[i]['rs{0}_val'.format(j)],width) + # instr_dict[i]['flagreg'] = available_reg[1] + elif self.is_fext and self.opcode in ['c.fswsp', 'c.fsdsp']: + dval = (instr_dict[i]['rs2_val'.format(j)],width) else: dval = (instr_dict[i]['rs{0}_val'.format(j)],width) if self.is_fext: diff --git a/sample_cgfs/dataset.cgf b/sample_cgfs/dataset.cgf index 1f510f0..0fa019b 100644 --- a/sample_cgfs/dataset.cgf +++ b/sample_cgfs/dataset.cgf @@ -181,7 +181,7 @@ datasets: x14: 0 x15: 0 - c_fregs: &c_fregs + c_fregs: &c_fregs f8: 0 f9: 0 f10: 0 diff --git a/sample_cgfs/sample_cgfs_fext/RV32Zcf/flw.cgf b/sample_cgfs/sample_cgfs_fext/RV32Zcf/flw.cgf index 4628400..3d0c568 100644 --- a/sample_cgfs/sample_cgfs_fext/RV32Zcf/flw.cgf +++ b/sample_cgfs/sample_cgfs_fext/RV32Zcf/flw.cgf @@ -1,6 +1,6 @@ c.flw: config: - - check ISA:=regex(.*I.*F.*C.*) + - check ISA:=regex(.*I.*F.*Zcf.*) opcode: c.flw: 0 rs1: @@ -8,31 +8,31 @@ c.flw: rd: <<: *c_fregs val_comb: - 'imm_val > 0 and fcsr == 0': 0 - 'imm_val == 0 and fcsr == 0': 0 - abstract_comb: - 'walking_ones("imm_val",5,False, scale_func = lambda x: x*4)': 0 - 'walking_zeros("imm_val",5,False, scale_func = lambda x: x*4)': 0 - 'alternate("imm_val",5, False,scale_func = lambda x: x*4)': 0 + 'imm_val > 0 and fcsr == 0': 0 + 'imm_val == 0 and fcsr == 0': 0 + abstract_comb: + 'walking_ones("imm_val",5,False, scale_func = lambda x: x*4)': 0 + 'walking_zeros("imm_val",5,False, scale_func = lambda x: x*4)': 0 + 'alternate("imm_val",5, False,scale_func = lambda x: x*4)': 0 c.flwsp: config: - - check ISA:=regex(.*I.*F.*C.*) + - check ISA:=regex(.*I.*F.*Zcf.*) opcode: c.flwsp: 0 rd: <<: *c_fregs val_comb: - 'imm_val > 0 and fcsr == 0': 0 - 'imm_val == 0 and fcsr == 0': 0 - abstract_comb: - 'walking_ones("imm_val",6,False, scale_func = lambda x: x*4)': 0 - 'walking_zeros("imm_val",6,False, scale_func = lambda x: x*4)': 0 - 'alternate("imm_val",6, False,scale_func = lambda x: x*4)': 0 + 'imm_val > 0 and fcsr == 0': 0 + 'imm_val == 0 and fcsr == 0': 0 + abstract_comb: + 'walking_ones("imm_val",6,False, scale_func = lambda x: x*4)': 0 + 'walking_zeros("imm_val",6,False, scale_func = lambda x: x*4)': 0 + 'alternate("imm_val",6, False,scale_func = lambda x: x*4)': 0 c.fsw: config: - - check ISA:=regex(.*I.*F.*C.*) + - check ISA:=regex(.*I.*F.*Zcf.*) opcode: c.fsw: 0 rs1: @@ -42,24 +42,24 @@ c.fsw: op_comb: 'rs1 != rs2': 0 val_comb: - 'imm_val > 0': 0 - 'imm_val == 0': 0 - abstract_comb: - 'walking_ones("imm_val",5,False, scale_func = lambda x: x*4)': 0 - 'walking_zeros("imm_val",5,False, scale_func = lambda x: x*4)': 0 - 'alternate("imm_val",5, False,scale_func = lambda x: x*4)': 0 + 'imm_val > 0': 0 + 'imm_val == 0': 0 + abstract_comb: + 'walking_ones("imm_val",5,False, scale_func = lambda x: x*4)': 0 + 'walking_zeros("imm_val",5,False, scale_func = lambda x: x*4)': 0 + 'alternate("imm_val",5, False,scale_func = lambda x: x*4)': 0 c.fswsp: config: - - check ISA:=regex(.*I.*F.*C.*) + - check ISA:=regex(.*I.*F.*Zcf.*) opcode: c.fswsp: 0 rs2: <<: *c_fregs val_comb: - 'imm_val > 0': 0 - 'imm_val == 0': 0 - abstract_comb: - 'walking_ones("imm_val",6,False, scale_func = lambda x: x*4)': 0 - 'walking_zeros("imm_val",6,False, scale_func = lambda x: x*4)': 0 - 'alternate("imm_val",6, False,scale_func = lambda x: x*4)': 0 + 'imm_val > 0': 0 + 'imm_val == 0': 0 + abstract_comb: + 'walking_ones("imm_val",6,False, scale_func = lambda x: x*4)': 0 + 'walking_zeros("imm_val",6,False, scale_func = lambda x: x*4)': 0 + 'alternate("imm_val",6, False,scale_func = lambda x: x*4)': 0 diff --git a/sample_cgfs/sample_cgfs_fext/Zcd/fld.cgf b/sample_cgfs/sample_cgfs_fext/Zcd/fld.cgf index 4c42779..b74b086 100644 --- a/sample_cgfs/sample_cgfs_fext/Zcd/fld.cgf +++ b/sample_cgfs/sample_cgfs_fext/Zcd/fld.cgf @@ -1,6 +1,6 @@ c.fld: config: - - check ISA:=regex(.*I.*F.*D.*C.*) + - check ISA:=regex(.*I.*F.*D.*Zcd.*) mnemonics: c.fld: 0 rs1: @@ -8,18 +8,18 @@ c.fld: rd: <<: *c_fregs op_comb: - 'rs1 != rd': 0 + 'rs1 != rd': 0 val_comb: - 'imm_val > 0 and fcsr == 0': 0 - 'imm_val == 0 and fcsr == 0': 0 - abstract_comb: - 'walking_ones("imm_val",5,False, scale_func = lambda x: x*8)': 0 - 'walking_zeros("imm_val",5,False, scale_func = lambda x: x*8)': 0 - 'alternate("imm_val",5, False,scale_func = lambda x: x*8)': 0 + 'imm_val > 0 and fcsr == 0': 0 + 'imm_val == 0 and fcsr == 0': 0 + abstract_comb: + 'walking_ones("imm_val",5,False, scale_func = lambda x: x*8)': 0 + 'walking_zeros("imm_val",5,False, scale_func = lambda x: x*8)': 0 + 'alternate("imm_val",5, False,scale_func = lambda x: x*8)': 0 c.fsd: config: - - check ISA:=regex(.*I.*F.*D.*C.*) + - check ISA:=regex(.*I.*F.*D.*Zcd.*) opcode: c.fsd: 0 rs1: @@ -27,41 +27,41 @@ c.fsd: rs2: <<: *c_fregs op_comb: - 'rs1 != rs2': 0 + 'rs1 != rs2': 0 val_comb: - 'imm_val > 0': 0 - 'imm_val == 0': 0 - abstract_comb: - 'walking_ones("imm_val",5,False, scale_func = lambda x: x*8)': 0 - 'walking_zeros("imm_val",5,False, scale_func = lambda x: x*8)': 0 - 'alternate("imm_val",5, False,scale_func = lambda x: x*8)': 0 + 'imm_val > 0': 0 + 'imm_val == 0': 0 + abstract_comb: + 'walking_ones("imm_val",5,False, scale_func = lambda x: x*8)': 0 + 'walking_zeros("imm_val",5,False, scale_func = lambda x: x*8)': 0 + 'alternate("imm_val",5, False,scale_func = lambda x: x*8)': 0 c.fldsp: config: - - check ISA:=regex(.*I.*F.*D.*C.*) + - check ISA:=regex(.*I.*F.*D.*Zcd.*) opcode: c.fldsp: 0 rd: - <<: *all_fregs + <<: *c_fregs val_comb: - 'imm_val > 0': 0 - 'imm_val == 0': 0 - abstract_comb: - 'walking_ones("imm_val",6,False, scale_func = lambda x: x*8)': 0 - 'walking_zeros("imm_val",6,False, scale_func = lambda x: x*8)': 0 - 'alternate("imm_val",6, False,scale_func = lambda x: x*8)': 0 + 'imm_val > 0': 0 + 'imm_val == 0': 0 + abstract_comb: + 'walking_ones("imm_val",6,False, scale_func = lambda x: x*8)': 0 + 'walking_zeros("imm_val",6,False, scale_func = lambda x: x*8)': 0 + 'alternate("imm_val",6, False,scale_func = lambda x: x*8)': 0 c.fsdsp: config: - - check ISA:=regex(.*I.*F.*D.*C.*) + - check ISA:=regex(.*I.*F.*D.*Zcd.*) opcode: c.fsdsp: 0 rs2: - <<: *all_fregs + <<: *c_fregs val_comb: - 'imm_val > 0': 0 - 'imm_val == 0': 0 - abstract_comb: - 'walking_ones("imm_val",6,False, scale_func = lambda x: x*8)': 0 - 'walking_zeros("imm_val",6,False, scale_func = lambda x: x*8)': 0 - 'alternate("imm_val",6, False,scale_func = lambda x: x*8)': 0 + 'imm_val > 0': 0 + 'imm_val == 0': 0 + abstract_comb: + 'walking_ones("imm_val",6,False, scale_func = lambda x: x*8)': 0 + 'walking_zeros("imm_val",6,False, scale_func = lambda x: x*8)': 0 + 'alternate("imm_val",6, False,scale_func = lambda x: x*8)': 0