import csv
import os
import glob
import re
import copy
import subprocess
inputFile = 'test.cvs'
rtlScript = 'rtl-regression.sh'
log_dir = './regression_log'
def generateTestCases(input_file, rtl_script):
txrx = 'txrx_'
with open(rtl_script, 'a') as rtlsh:
rtlsh.write("\n make comp_reg\n")
with open(input_file, 'r') as csvfile:
reader = csv.reader(csvfile)
header = next(reader)
caseNumber = len(header)
mf = []
mfind = 0
with open(rtl_script, 'a') as rtlsh:
for tc in range(1, caseNumber):
testcaseNumber = 'tc%d' %(tc)
logfilenames = txrx + testcaseNumber
mf.append([logfilenames])
mfind += 1
with open(input_file, 'r') as csvfile:
reader = csv.reader(csvfile)
header = next(reader)
for row in reader:
if tc == row.__len__():
print("wrong csv file")
exit()
row[0] = row[0].replace(' ','')
row[tc] = row[tc].replace(' ','')
row[tc] = row[tc].replace('\'','')
if re.search(r'[0-9]+', row[tc]):
tmp[]
for n in mf[mfind - 1]:
append(n + '-' + row[0] + '%s'%(row[tc]))
mf[mfind - 1] = []
mf[mfind - 1] = copy.deepcopy(tmp)
xruncommand = "xrun -R -64 +UVM_TESTNAME=XXXXXXTest +UVM_VERBOSITY+UVM_NONE -sv_lib ./c_model/libdpi"
for n in range(0, len(mf[mfind - 1])):
rtlsh.write(xruncommand)
mf[mfind - 1][n] += '-test.log'
print(mf[mfind - 1][n])
with open(input_file, 'r') as csvfile2:
reader = csv.reader(csvfile2)
next(reader)
for row in reader:
row[0] = row[0].replace(' ','')
row[tc] = row[tc].replace(' ','')
row[tc] = row[tc].replace('\'','')
rtlsh.write(' +' + row[0] + '=' + row[tc])
rtlsh.write('-l regression_log/' + mf[mfind - 1][n] + '\n')
def delete_all_files(folder_path)
files = glob.glob(os.path.join(folder_path, "*"))
for file in files:
try:
if os.path.isfile(file):
os.remove(file)
except Exception as e:
print(f"Error deleting file {file}:{e}")
def main()
log_folder_path = "regression_log"
if os.path.isdir(log_folder_path):
start = input("The script will clean up the regression log folder. Do you want to continue? Y/N")
if(start == 'Y' or start == 'y'):
delete_all_files(log_folder_path)
print("Cleaned log folder")
pass
else:
return
else:
try:
os.makedirs(log_folder_path, exist_ok=True)
print(f"xxxx")
except Exception as e:
print(f"xxx")
with open(rtlScript, 'w') as rtlsh:
rtlsh.write("make clean\nsource xxxx")
generateTestCases(inputFile, rtlScript)
subprocess.run('bash', rtlScript)
main()
RTL & TESTBENCH ready后,若需要通过在命令行加参数形式来运行不同的case时,可以通过创建一个csv文件,将不同的参数输入进去,通过以上脚本实现了简单的回归功能,以下是对其部分解读:
通过generateTestCases将csv文件读取进来,并将多条command_line写入另一个文件,以便后面写入shell运行;
1.写入compile命令
2.通过csv阅读器获取第一行的len
3.遍历每一列,再遍历每一行,将每一行的值写入mf数组中,数组的第一维为每一个case,第二维为每一个参数名和参数值,遍历mf的第一维,遍历input_file的每一行(各个参数),将各参数名和各参数值写入rtlsh文件中;
在main函数中调用generateTestCases,并通过subprocess.run写入shell运行