Python脚本在数字IC验证中的使用

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运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值