回归测试脚本
回归shell脚本
#!/bin/bash
FSDB=off
UVM_VERBOSITY=UVM_NONE
run_times=()
regress_list=(
"TS=tc_uart_tx cfg=default ,runtimes=10"
"TS=tc_uart_rx cfg=default ,runtimes=10"
)
max_threads=10
for ((i=0; i<${#regress_list[@]}; i++)); do
tmp=(${regress_list[i]//=/ }) # 将字符串以等号进行拆分
run_times+=("${tmp[-1]}")
done
cmd="make nrun SYS=mmu "
#val=$(rm -rf ./rgr_log_dir/*.log)
#val=$(make cmp cov=on mode=regress)
for ((i=0; i<${#regress_list[@]}; i++)); do
num = ${run_times[i]}
for ((k=0; k<${run_times[i]}; k++)); do
while true; do
runing_threads=$(ps -ef | grep "make ncrun SYS=mmu" | grep -v grep | wc -l)
if[ $runing_threads -lt $max_threads ];then
tmp_seed=""
for ((j=0; j<8; j++)); do
tmp_seed+=$(( RANDOM % 10 )) # 生成随机数字并拼接到 tmp_seed 字符串
done
seed=$((10#$tmp_seed)) # 将字符串转换为十进制数
echo "${cmd} ${regress_list[i]} num=${num} SEED=${seed}"
val=$(eval "$cmd ${regress_list[i]} SEED=$seed DUMP=$FSDB UVM_VERBOSITY=$UVM_VERBOSITY cov=on &")& # &可实现并行
num=$((num -1))
break
else
sleep 2
fi
done
done
done
wait
echo "over"
val=$(grep 'Simulation Result' -R ./rgr_log_dir/*.log > regress.log)
echo "$val"
while true;do
fail_name=$(grep -l "cpu_affinity/auto_affinity failed" SYS_mmu/log/*)
fail_num=$(grep -R "cpu_affinity/auto_affinity failed" SYS_mmu/log/* | wc -l)
echo "fail num is $fail_num"
if [ $fail_num -eq 0 ]; then
break
else
for fail_file in $fail_name; do
file_name=$(basename "$fail_file")
TS=$(echo "$file_name" | awk -F '_CFG' '{print $1}' | awk -F 'TS_' '{print $2}')
CFG=$(echo "file_name" | awk -F 'CFG_' '{print $2}' | awk -F '_SEED' '{print $1}')
SEED=$(echo "file_name" | awk -F 'SEED_' '{print $2}' | awk -F '.log' '{print $1}')
while true; do
running_threads=$(ps -ef | grep "make ncrun SYS=mmu" | grep -v grep | wc -l )
if [ $running_threads -lt $max_threads ] ;then
echo "make ncrun TS=$TS CFG=$CFG SEED=$SEED"
val=$(eval "make ncrun SYS=mmu TOOL=vcs TS=$TS CFG=$CFG SEED=$SEED DUMP=$FSDB UVM_VERBOSITY=$UVM_VERBOSITY &") &
break
else
sleep 100
fi
done
done
fi
done
wait
echo "over_all"
#grep -l 用于显示包含匹配内容的文件名,而 grep -L 用于显示不包含匹配内容的文件名
#grep "make ncrun SYS=mmu TOOL=vcs *TS=page_fault_test_seq"
#grep "make ncrun SYS=mmu.*sfence*."
回归python脚本
import os
import re
import sys
import random
run_times =[]
regress_list =[
"tc=tc_uart_tx cfg=default ,runtimes=10"
"tc=tc_uart_rx cfg=default ,runtimes=10"
]
for i in range (len(run_times));
tmp = regrss_list[i].split("=")
run_times[i] = int(tmp[-1])
cmd = "make nrun"
val = os.system("rm -rf ./rgr_log_dir/*.log")
val = os.system("make cmp cov=on mode=regress")
for i in range(len(regress_list)):
for k in range(run_times[i]):
tmp_seed = ""
for j in range(8):
tmp_seed = (tmp_seed + str(random.randint(0,9)))
seed =int(tmp_seed)
val = os.system("{} {} seed={} cov =on wave=off mode=regress".format(cmd,regress_list[i],seed))
val = os.system("grep 'Simulation Result' -R ./rgr_log_dir/*.log > regress.log")
print(val)
Check Log并重新仿真脚本
直接chcklog后进行仿真
max_threads=6
files=$(grep -L "PASS" SYS_MMU/log*) #指定log路径
for file in $files;do
filename=$(basename "$file") #key1
TS=$(echo "$filename" | awk -F '_CFG' '{print $1}' | awk -F 'TS_' '{print $2}')
CFG=$(echo "$filename" | awk -F 'CFG_' '{print $2}' | awk -F '_SEED' '{print $1}')
SEED=$(echo "$filename" | awk -F 'SEED_' '{print_$2}' | awk -F '.log' '{print $1}')
while true; do
running_threads=$(ps- ef | grep "make ncrun SYS=mmu" | grep -v grep | wc-l)
if [$running_threads -lt $max_threads ] ;then
echo "make ncrun TS=$TS CFG=$CFG SEED=$SEED"
val=$(eval "make ncrun TS=$TS CFG=$CFG SEED=$SEED &")&
break
else
sleep 2
fi
done
done
wait
echo "over"
key1:
Shell脚本中,basename 是一个用于获取文件路径的基本名称的命令或函数。它可以从给定的文件路径中剥离出文件名部分,并返回该文件名。
使用 basename 命令的语法如下:
basename FILENAME [SUFFIX]
其中,FILENAME 是要获取基本名称的文件路径,而 SUFFIX 是可选参数,如果提供了该参数,basename 会去除文件名中以 SUFFIX 结尾的部分。
下面是一些示例,说明 basename 的使用:
获取文件路径的基本名称:
shell
$ basename /path/to/file.txt
file.txt
去除文件名中的扩展名:
shell
$ basename /path/to/file.txt .txt
file
获取相对路径的基本名称:
shell
$ basename ../path/to/file.txt
file.txt
请注意,basename 命令只返回文件路径中的最后一个部分作为基本名称。如果需要获取文件名的目录部分,可以使用 dirname 命令。
通过check_regress.log进行错误用例重新仿真
max_threads=6
files=$(grep -o "TS_[^[:space:]]*" ./run.log) #指定log路径
for file in $files;do
filename=$(basename "$file") #key1
TS=$(echo "filename" | awk -F '_CFG' '{print $1}' | awk -F 'TS_' '{print $2}')
CFG=$(echo "filename" | awk -F 'CFG_' '{print $2}' | awk -F '_SEED' '{print $1}')
SEED=$(echo "$filename" | awk -F 'SEED_' '{print_$2}' | awk -F '.log' '{print $1}')
while true; do
running_threads=$(ps- ef | grep "make ncrun SYS=mmu" | grep -v grep | wc-l)
if [$running_threads -lt $max_threads ] ;then
echo "make ncrun TS=$TS CFG=$CFG SEED=$SEED"
val=$(eval "make ncrun TS=$TS CFG=$CFG SEED=$SEED"&")&
break
else
sleep 2
fi
done
done
wait
echo "over"
#grep -o 是 grep 命令的一个选项,它用于只显示匹配的文本
#^:表示匹配行的开头。
#[:space:]:代表空白字符类别。[:space:] 包括空格、制表符、换行符等空白字符。
#[^...]:表示除了指定范围内的字符之外的任意字符。在这里,[^[:space:]] 表示非空白字符,即匹配任何#不是空格、制表符等空白字符的字符。
#*:表示匹配前面的字符零次或多次,即可以匹配任意长度的非空白字符序列。
#因此,[^[:space:]]* 可以理解为匹配任意长度的不包含空白字符的字符串。
统计log
grep -R 'Quit count:' ./SYS_mmu/log/* | grep -v "0 of 35" > run.log
输入指定log快速仿真测试
read -p "请输入log" log_file
if [ "$log_file" != " " ]; then
key="${log_file%.*}"
key1="$(echo "$key" | awk -F '_CFG' '{print $1}' | awk -F 'TS_' '{print $2}')"
key2="$(echo "$key" | awk -F 'CFG_' '{print $2}' | awk -F '_SEED' '{print $1}')"
key3="$(echo "$key" | awk -F 'SEED_' '{print $2}')"
echo "make ncrun SYS=mmu TS=$key1 CFG=$key2 SEED=$key3"
make ncrun SYS=mmu TOOL=vcs TS=$key1 CFG=$key2 SEED=$key3
else
echo fault
fi
echo over
快速测试用例添加脚本
strl=""
read -p "请输入文件名:" filename
if [ -f "$filename" ]; then
keyword1="${filename%.*}"
keyword="${keyword1//_seq/}"
read -p "请输入CFG=:" CFG_NAME
read -p "请输入CFG1=: " CFG_NAME1
read -p "请输入make num=: " NUM
echo \#${filename} >> ../../../work_mmu/case.mk
echo -e "${NUM}:" >> ../../../work_mmu/case.mk
if ["$CFG_NAME1" = "$strl"]; then
echo -e "make ncrun SYS=mmu TS=${keyword1} TOOL=vcs CFG=${CFG_NAME%.*}" >> ../../../work_mmu/case.mk
echo -e "TS=${keyword1} runtimes=0" >> ../../../work_mmu/regress.sh
else
echo -e "make ncrun SYS=mmu TS=${keyword1} TOOL=vcs CFG=${CFG_NAME%.*} CFG1=${CFG_NAME%1.*} " >> ../../../work_mmu/case.mk
fi
echo "内容写入"
else
echo "失败"
fi