修改测试用例,采用自动化程序判别寄存器是否正确,尚未全部完成

This commit is contained in:
2025-07-28 22:41:02 +08:00
parent 5b5e455040
commit f6ea9410ad
8 changed files with 562 additions and 254 deletions

File diff suppressed because it is too large Load Diff

148
tb/shinTest/check_testcase.py Executable file
View File

@@ -0,0 +1,148 @@
#!/usr/bin/env python
#encoding=utf-8
import os
def parse_value(value):
"""Parse a value with bit-width specification and return its integer representation and mask.
The mask will have 1s where the bits are valid and 0s where they are 'x'.
"""
if 'h' in value.lower():
base = 16
prefix_length = value.find('h') + 1
elif 'o' in value.lower():
base = 8
prefix_length = value.find('o') + 1
elif 'b' in value.lower():
base = 2
prefix_length = value.find('b') + 1
else:
raise ValueError(f"Invalid format for value: {value}")
# Extract the numeric part
num_str = value[prefix_length:]
# Initialize parsed value and mask
parsed_value = 0
mask = 0
# Process each character in the numeric part
#print(num_str)
for char in num_str:
if char.lower() == 'x':
mask = mask * base
parsed_value = parsed_value * base
else:
mask = (mask * base) + (base - 1)
parsed_value = (parsed_value * base) + int(char, base)
#print(value, hex(parsed_value), hex(mask))
return parsed_value, mask
def compare_files(source_file, target_file):
try:
with open(source_file, 'r') as src, open(target_file, 'r') as tgt:
source_lines = src.readlines()
target_lines = tgt.readlines()
if len(source_lines) != len(target_lines):
print(f"Error: The number of lines in {source_file} and {target_file} do not match.")
return
all_match = True
for i, (src_line, tgt_line) in enumerate(zip(source_lines, target_lines)):
src_values = src_line.strip().split()
tgt_values = tgt_line.strip().split()
if len(src_values) != len(tgt_values):
print(f"Error: Line {i+1}: The number of values in {source_file} and {target_file} do not match.")
all_match = False
continue
line_match = True
for j, (src_val, tgt_val) in enumerate(zip(src_values, tgt_values)):
try:
src_int, src_mask = parse_value(src_val)
tgt_int, tgt_mask = parse_value(tgt_val)
except ValueError as e:
print(f"Error: Line {i+1}, Position {j+1}: {e}")
line_match = False
all_match = False
continue
# Combine masks to determine which bits to compare
combined_mask = src_mask #& tgt_mask
# Compare only the bits that are not 'x' in either source or target
if combined_mask == 0:
#print(f"Line {i+1}, Position {j+1}: Both values contain 'x' at all positions, skipping check.")
continue
masked_src = src_int & combined_mask
masked_tgt = tgt_int & combined_mask
#print(hex(masked_src), hex(masked_tgt), hex(combined_mask))
if masked_src == masked_tgt:
#print(f"Line {i+1}, Position {j+1}: Values match ({src_val} == {tgt_val}).")
pass
else:
print(f"\tLine {i+1}, Position {j+1}: Values differ ({src_val} != {tgt_val}).")
line_match = False
all_match = False
if line_match:
#print(f"Line {i+1}: All values on this line match.")
pass
if all_match:
#print("All lines match.")
#pass
return True
else:
#print("Some lines or positions do not match.")
#pass
return False
except FileNotFoundError as e:
print(f"Error: {e}")
except Exception as e:
print(f"An unexpected error occurred: {e}")
return False
def list_files_in_directory(directory):
try:
# 获取目录中的所有文件和子目录
files = os.listdir(directory)
# 过滤出文件(排除子目录)
files_only = [f for f in files if os.path.isfile(os.path.join(directory, f))]
return files_only
except FileNotFoundError:
print(f"Error: The directory '{directory}' does not exist.")
return []
except PermissionError:
print(f"Error: Permission denied to access the directory '{directory}'.")
return []
except Exception as e:
print(f"An unexpected error occurred: {e}")
return []
if __name__ == "__main__":
files = list_files_in_directory('generated/log')
src_files = list_files_in_directory('tb/shinTest/testcase_result')
for fi in files:
rst_f = 'generated/log/' + fi
src_f = 'tb/shinTest/testcase_result/' + fi
if not (fi in src_files):
print(f"Testcase:{fi}\t\t\t[\033[93mIGNORE\033[0m]")
continue
if compare_files(src_f, rst_f):
print(f"Testcase:{fi}\t\t\t[\033[92mPASS\033[0m]")
else:
print(f"Testcase:{fi}\t\t\t[\033[91mFAILED\033[0m]")

View File

@@ -204,32 +204,32 @@ class GenPkt(object):
def genWriteTransLenCode(gen_name, sm_idx):
def genWriteTransLenCode(gen_name, sm_idx, wlog=True):
return '''\n//写入发送长度\n'''\
+ '''$fdisplay(spidata_file, "--写数据交换长度");\n'''\
+ '''`DEF_%s_sm(txBuf);\n'''%(gen_name, )\
+ '''spi_trans( (`MST_TX%d_LEN_ADDR), (`SPI_WRITE), (2), (`IF_IDX(0)) );\n'''%(sm_idx,)\
+ '''spi_trans( (`MST_RX%d_LEN_ADDR), (`SPI_WRITE), (2), (`IF_IDX(0)) );\n'''%(sm_idx,)
+ '''%s( (`MST_TX%d_LEN_ADDR), (`SPI_WRITE), (2), (`IF_IDX(0)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", sm_idx,)\
+ '''%s( (`MST_RX%d_LEN_ADDR), (`SPI_WRITE), (2), (`IF_IDX(0)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", sm_idx,)
def genWriteTransPktCode(gen_name, sm_idx):
def genWriteTransPktCode(gen_name, sm_idx, wlog=True):
return '''\n$fdisplay(spidata_file, "<<发包:");\n'''\
+ '''`DEF_%s(txBuf);\n'''%(gen_name, )\
+ '''spi_trans( (`MST_TX%d_ADDR), (`SPI_WRITE), (`DEF_%s_len), (`IF_IDX(0)) );\n'''%(sm_idx, gen_name, )
+ '''%s( (`MST_TX%d_ADDR), (`SPI_WRITE), (`DEF_%s_len), (`IF_IDX(0)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", sm_idx, gen_name, )
def genTrgTransPktCode(gen_name, sm_idx):
def genTrgTransPktCode(gen_name, sm_idx, wlog=True):
return '''\n//请求发送\n'''\
+ '''$fdisplay(spidata_file, "--请求发送");\n'''\
+ '''txBuf[0+3] = `MST_TX_TRIGGER(%d);\n'''%(sm_idx, )\
+ '''spi_trans( (16'h20), (`SPI_WRITE), (1), (`IF_IDX(0)) );\n'''
+ '''%s( (16'h20), (`SPI_WRITE), (1), (`IF_IDX(0)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", )
def genReadAckPktCode(gen_name, sm_idx):
def genReadAckPktCode(gen_name, sm_idx, wlog=True):
return '''\n//等待回包\n'''\
+ '''_reset_deadline_ind = 1;\n'''\
+ '''@(posedge isResp or posedge _deadline_ind) #5 begin end\n'''\
+ '''$fdisplay(spidata_file, ">>回包:");\n'''\
+ '''spi_trans( (`MST_RX%d_ADDR), (`SPI_READ), (`DEF_%s_len), (`IF_IDX(0)) );\n'''%(sm_idx, gen_name,)
+ '''%s( (`MST_RX%d_ADDR), (`SPI_READ), (`DEF_%s_len), (`IF_IDX(0)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", sm_idx, gen_name,)
def genEnableInsertTimeCode(pos, enableTime=True, enableDelay=True):
def genEnableInsertTimeCode(pos, enableTime=True, enableDelay=True, wlog=True):
data = pos & 0x3fff
if enableTime:
data = data | 0x8000
@@ -239,22 +239,22 @@ def genEnableInsertTimeCode(pos, enableTime=True, enableDelay=True):
+ '''$fdisplay(spidata_file, "--增加时间戳插入");\n'''\
+ '''txBuf[0+3] = 8'h%x;\n'''%(data & 0xff, )\
+ '''txBuf[1+3] = 8'h%x;\n'''%((data >> 8) & 0xff, )\
+ '''spi_trans( (16'h24), (`SPI_WRITE), (2), (`IF_IDX(0)) );\n'''
+ '''%s( (16'h24), (`SPI_WRITE), (2), (`IF_IDX(0)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans",)
def genDisableInsertTimeCode():
def genDisableInsertTimeCode(wlog=True):
return '''\n//清除替换时间戳替换地址\n'''\
+ '''$fdisplay(spidata_file, "--清除时间戳插入");\n'''\
+ '''txBuf[0+3] = 8'h00;\n'''\
+ '''txBuf[1+3] = 8'h00;\n'''\
+ '''spi_trans( (16'h24), (`SPI_WRITE), (2), (`IF_IDX(0)) ); //清除替换时间戳替换地址寄存器\n'''
+ '''%s( (16'h24), (`SPI_WRITE), (2), (`IF_IDX(0)) ); //清除替换时间戳替换地址寄存器\n'''%("`SPI_TRANS" if wlog else "spi_trans", )
def genCheckInsertTimeCode():
def genCheckInsertTimeCode(wlog=True):
return '''\n//检查替换时间戳替换地址\n'''\
+ '''$fdisplay(spidata_file, "--检查时间戳插入");\n'''\
+ '''spi_trans( (16'h24), (`SPI_READ), (2), (`IF_IDX(0)) ); //检查替换时间戳替换地址寄存器\n'''
+ '''%s( (16'h24), (`SPI_READ), (2), (`IF_IDX(0)) ); //检查替换时间戳替换地址寄存器\n'''%("`SPI_TRANS" if wlog else "spi_trans", )
def genIFRwDataCode(dev, addr, isWrite = False, data_len=0, data = None):
def genIFRwDataCode(dev, addr, isWrite = False, data_len=0, data = None, wlog=True):
if isWrite == True:
if (data == None) or (len(data) == 0):
data=list()
@@ -265,14 +265,14 @@ def genIFRwDataCode(dev, addr, isWrite = False, data_len=0, data = None):
code = code + '''txBuf[%d]=8'h%02x;\n'''%(idx, item & 0xff)
idx = idx + 1
code = code + '''spi_trans( (16'h%04x), (`SPI_WRITE), (%d), (`IF_IDX(%d)) );\n'''%(addr, data_len, dev)
code = code + '''%s( (16'h%04x), (`SPI_WRITE), (%d), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", addr, data_len, dev)
return code
else:
code = ''
code = code + '''spi_trans( (16'h%04x), (`SPI_READ), (%d), (`IF_IDX(%d)) );\n'''%(addr, data_len, dev)
code = code + '''%s( (16'h%04x), (`SPI_READ), (%d), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", addr, data_len, dev)
return code
def genSlvSMWriteData(dev, sm, data_len, data = None):
def genSlvSMWriteData(dev, sm, data_len, data = None, wlog=True):
smaddr = list()
for i in range(8):
smaddr.append(0x300 + i * 4 + 2)
@@ -292,15 +292,15 @@ def genSlvSMWriteData(dev, sm, data_len, data = None):
code = '''txBuf[3] = 8'h%02x;\n'''%(data_len & 0xff, )\
+ '''txBuf[4] = 8'h%02x;\n'''%(int(data_len/256) & 0xff,)\
+ '''spi_trans((16'h0%04x), (`SPI_WRITE), (2), (`IF_IDX(%d)) );\n'''%(smaddr[sm], dev)
+ '''%s((16'h0%04x), (`SPI_WRITE), (2), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", smaddr[sm], dev)
for i in range(data_len):
code = code + '''txBuf[%d + 3] = 8'h%02x;\n'''%(i, data[i])
code = code + '''spi_trans( (16'h%04x), (`SPI_WRITE), (%d), (`IF_IDX(%d)) );\n'''%(0x800 + sm * 2048, data_len, dev)
code = code + '''%s( (16'h%04x), (`SPI_WRITE), (%d), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", 0x800 + sm * 2048, data_len, dev)
return code
def genSlvSMReadData(dev, sm, data_len):
def genSlvSMReadData(dev, sm, data_len, wlog=True):
if not ((sm == 0) or (sm == 2) or (sm == 4) or (sm == 6)):
#写入数据lvds读这个空间是lvds写mcu读
return ''
@@ -308,7 +308,7 @@ def genSlvSMReadData(dev, sm, data_len):
return ''
code = ""
code = code + '''spi_trans( (16'h%04x), (`SPI_READ), (%d), (`IF_IDX(%d)) );\n'''%(0x800 + sm * 2048, data_len, dev)
code = code + '''%s( (16'h%04x), (`SPI_READ), (%d), (`IF_IDX(%d)) );\n'''%("`SPI_TRANS" if wlog else "spi_trans", 0x800 + sm * 2048, data_len, dev)
return code
@@ -329,6 +329,20 @@ if __name__ == '__main__':
+genReadAckPktCode(gen_file_def, sm_idx))
genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1)
#-------------------------------------------------------------------------
#>>>>>>嗅探数据包2
genPkt.clean()
genPkt.setPktType(1)
gen_file_def = "detect_pkt2"
sm_idx = 0
genPkt.addAfterExc(genWriteTransLenCode(gen_file_def, sm_idx)
+genWriteTransPktCode(gen_file_def, sm_idx)
+genTrgTransPktCode(gen_file_def, sm_idx)
+genReadAckPktCode(gen_file_def, sm_idx))
genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1)
#-------------------------------------------------------------------------
#>>>>>>错误的嗅探数据包
genPkt.clean()

View File

@@ -0,0 +1,13 @@
16'h00c0 8'h01 16'h0004 8'h00 8'h00 8'h00 8'h00
16'h00c0 8'h01 16'h0004 8'h00 8'h00 8'h00 8'h00
16'h00c0 8'h01 16'h0004 8'h00 8'h00 8'h00 8'h00
16'h00c0 8'h01 16'h0004 8'h00 8'h00 8'h00 8'h00
16'h0302 8'h00 16'h0002 8'h04 8'h00
16'h0306 8'h00 16'h0002 8'h04 8'h00
16'h1000 8'h00 16'h0004 8'h00 8'h01 8'h3f 8'hff
16'h0020 8'h00 16'h0001 8'h01
16'h0800 8'h01 16'h0004 8'h00 8'h01 8'h00 8'h00
16'h00c0 8'h01 16'h0004 8'h28 8'h00 8'h00 8'h00
16'h00c0 8'h01 16'h0004 8'h28 8'h00 8'h00 8'h00
16'h00c0 8'h01 16'h0004 8'h28 8'h00 8'h00 8'h00
16'h00c0 8'h01 16'h0004 8'h00 8'h00 8'h00 8'h00

View File

@@ -0,0 +1,13 @@
16'h00c0 8'h01 16'h0004 8'h28 8'h00 8'h02 8'h00
16'h00c0 8'h01 16'h0004 8'h28 8'h00 8'h03 8'h00
16'h00c0 8'h01 16'h0004 8'h28 8'h00 8'h04 8'h00
16'h00c0 8'h01 16'h0004 8'h00 8'h00 8'h00 8'h00
16'h0302 8'h00 16'h0002 8'h04 8'h00
16'h0306 8'h00 16'h0002 8'h04 8'h00
16'h1000 8'h00 16'h0004 8'h00 8'h01 8'h3f 8'hff
16'h0020 8'h00 16'h0001 8'h01
16'h0800 8'h01 16'h0004 8'h00 8'h01 8'h00 8'h01
16'h00c0 8'h01 16'h0004 8'h08 8'h00 8'h02 8'h00
16'h00c0 8'h01 16'h0004 8'h08 8'h00 8'h03 8'h00
16'h00c0 8'h01 16'h0004 8'h08 8'h00 8'h04 8'h00
16'h00c0 8'h01 16'h0004 8'h00 8'h00 8'h00 8'h00

View File

@@ -0,0 +1,5 @@
16'h0000 8'h01 16'h0040 8'h00 8'hf0 8'haa 8'haa 8'haa 8'haa 8'haa 8'haa 8'h55 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00
16'h0000 8'h01 16'h0040 8'h00 8'hf0 8'haa 8'haa 8'haa 8'haa 8'haa 8'haa 8'h55 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00
16'h0000 8'h01 16'h0040 8'h00 8'hf0 8'haa 8'haa 8'haa 8'haa 8'haa 8'haa 8'h55 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00
16'h0000 8'h01 16'h0040 8'h00 8'hf0 8'haa 8'haa 8'haa 8'haa 8'haa 8'haa 8'h55 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00
16'h0000 8'h01 16'h0040 8'h00 8'hf0 8'haa 8'haa 8'haa 8'haa 8'haa 8'haa 8'h55 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00

View File

@@ -0,0 +1,18 @@
16'h0000 8'h01 16'h0010 8'h02 8'hf0 8'haa 8'haa 8'haa 8'haa 8'haa 8'haa 8'h55 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00
16'h0000 8'h01 16'h0010 8'h02 8'hf0 8'haa 8'haa 8'haa 8'haa 8'haa 8'haa 8'h55 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00
16'h0000 8'h01 16'h0010 8'h02 8'hf0 8'haa 8'haa 8'haa 8'haa 8'haa 8'haa 8'h55 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00
16'h0000 8'h01 16'h0010 8'h02 8'hf0 8'haa 8'haa 8'haa 8'haa 8'haa 8'haa 8'h55 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00 8'h00
16'h0302 8'h00 16'h0002 8'h0e 8'h00
16'h0306 8'h00 16'h0002 8'h0e 8'h00
16'h1000 8'h00 16'h000e 8'h00 8'ha0 8'h00 8'h00 8'h00 8'h00 8'hxx 8'hxx 8'hb0 8'h02 8'h3f 8'hff 8'h00 8'h00
16'h0020 8'h00 16'h0001 8'h01
16'h0800 8'h01 16'h000e 8'h00 8'ha0 8'h00 8'h00 8'h00 8'h00 8'hxx 8'hxx 8'hb0 8'h02 8'h3f 8'hff 8'h00 8'h04
16'h00c0 8'h01 16'h0006 8'h28 8'h00 8'h04 8'h00 8'h00 8'h00
16'h000a 8'h01 16'h0002 8'h01 8'h00
16'h000a 8'h01 16'h0002 8'h02 8'h00
16'h000a 8'h01 16'h0002 8'h03 8'h00
16'h000a 8'h01 16'h0002 8'h04 8'h00
16'h0000 8'h01 16'h0010 8'h02 8'hf0 8'haa 8'haa 8'haa 8'haa 8'haa 8'haa 8'h55 8'h00 8'h01 8'h00 8'h00 8'h00 8'h00 8'h00
16'h0000 8'h01 16'h0010 8'h02 8'hf0 8'haa 8'haa 8'haa 8'haa 8'haa 8'haa 8'h55 8'h00 8'h02 8'h00 8'h00 8'h00 8'h00 8'h00
16'h0000 8'h01 16'h0010 8'h02 8'hf0 8'haa 8'haa 8'haa 8'haa 8'haa 8'haa 8'h55 8'h00 8'h03 8'h00 8'h00 8'h00 8'h00 8'h00
16'h0000 8'h01 16'h0010 8'h02 8'hf0 8'haa 8'haa 8'haa 8'haa 8'haa 8'haa 8'h55 8'h00 8'h04 8'h00 8'h00 8'h00 8'h00 8'h00