diff --git a/tb/sw/src/check_intflag.py b/tb/sw/src/check_intflag.py new file mode 100644 index 0000000..b44265a --- /dev/null +++ b/tb/sw/src/check_intflag.py @@ -0,0 +1,56 @@ +#!/usr/bin/python3 + +import os +import sys +import traceback +import re + + + +def search_custom_inst(logfile, opcode, funct, xd = 0, xs1 = 0, xs2 = 0, xd_filter = 0, xs1_filter = 0, xs2_filter = 0): + lines = logfile.readlines() + funct3 = 0 + if xd != 0: + funct3 = funct3 | 0x4 + if xs1 != 0: + funct3 = funct3 | 0x2 + if xs2 != 0: + funct3 = funct3 | 0x1 + + for line in lines: + inst = re.findall(r"inst=\[[\da-fA-F]{8}\]", line) + wreg = re.findall(r"W\[r[\ \d]{2}=[\da-fA-F]{8}\]", line) + rreg = re.findall(r"R\[r[\ \d]{2}=[\da-fA-F]{8}\]", line) + if len(inst) > 0: + inst = int('0x' + inst[0][6:-1], 16) + wreg_val = int('0x' + wreg[0][6:-1], 16) + rreg1_val = int('0x' + rreg[0][6:-1], 16) + rreg2_val = int('0x' + rreg[1][6:-1], 16) + ins_opcode = inst & 0x7f + #只对R系列的custom0进行解码 + if opcode == ins_opcode: + ins_funct = (inst >> 25) & 0x7f + ins_funct3 = (inst >> 12) & 0x7 + if (ins_funct == funct) and (funct3 == ins_funct3): + outline = line.rstrip() + if (xs1 != 0) and ((rreg1_val & xs1_filter) != 0): + print(outline) + if (xd != 0) and ((wreg_val & xd_filter) != 0): + print(outline) + if (xs2 != 0) and ((rreg2_val & xs2_filter) != 0): + print(outline) + else: + pass + +if __name__ == '__main__': + path = sys.argv[0] + path = path.split('/')[0:-1] + path = '/'.join(path) + logfile_path = path + '/../build/cpu1_log.txt' + if len(sys.argv) > 1: + logfile_path = sys.argv[1] + print(logfile_path) + + with open(logfile_path, 'rt') as logfile: + search_custom_inst(logfile, 0xb, 0x17, xs1=1, xs1_filter=(1<<7)) + logfile.close()