tinyriscv/sim/compliance_test/compliance_test.py

148 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import filecmp
import subprocess
import sys
import os
# iverilog程序
iverilog_cmd = ['iverilog']
# 顶层模块
#iverilog_cmd += ['-s', r'tinyriscv_soc_tb']
# 编译生成文件
iverilog_cmd += ['-o', r'out.vvp']
# 头文件(defines.v)路径
iverilog_cmd += ['-I', r'..\..\rtl\core']
# 宏定义,仿真输出文件
iverilog_cmd += ['-D', r'OUTPUT="signature.output"']
# testbench文件
iverilog_cmd.append(r'..\..\tb\compliance_test\tinyriscv_soc_tb.v')
# ..\rtl\core
iverilog_cmd.append(r'..\..\rtl\core\defines.v')
iverilog_cmd.append(r'..\..\rtl\core\ex.v')
iverilog_cmd.append(r'..\..\rtl\core\id.v')
iverilog_cmd.append(r'..\..\rtl\core\tinyriscv.v')
iverilog_cmd.append(r'..\..\rtl\core\pc_reg.v')
iverilog_cmd.append(r'..\..\rtl\core\id_ex.v')
iverilog_cmd.append(r'..\..\rtl\core\ctrl.v')
iverilog_cmd.append(r'..\..\rtl\core\regs.v')
iverilog_cmd.append(r'..\..\rtl\core\if_id.v')
iverilog_cmd.append(r'..\..\rtl\core\div.v')
iverilog_cmd.append(r'..\..\rtl\core\rib.v')
iverilog_cmd.append(r'..\..\rtl\core\clint.v')
iverilog_cmd.append(r'..\..\rtl\core\csr_reg.v')
# ..\rtl\perips
iverilog_cmd.append(r'..\..\rtl\perips\ram.v')
iverilog_cmd.append(r'..\..\rtl\perips\rom.v')
iverilog_cmd.append(r'..\..\rtl\perips\spi.v')
iverilog_cmd.append(r'..\..\rtl\perips\timer.v')
iverilog_cmd.append(r'..\..\rtl\perips\uart.v')
iverilog_cmd.append(r'..\..\rtl\perips\gpio.v')
# ..\rtl\debug
iverilog_cmd.append(r'..\..\rtl\debug\jtag_dm.v')
iverilog_cmd.append(r'..\..\rtl\debug\jtag_driver.v')
iverilog_cmd.append(r'..\..\rtl\debug\jtag_top.v')
iverilog_cmd.append(r'..\..\rtl\debug\uart_debug.v')
# ..rtl\utils
iverilog_cmd.append(r'..\..\rtl\utils\full_handshake_rx.v')
iverilog_cmd.append(r'..\..\rtl\utils\full_handshake_tx.v')
iverilog_cmd.append(r'..\..\rtl\utils\gen_buf.v')
iverilog_cmd.append(r'..\..\rtl\utils\gen_dff.v')
# ..\rtl\soc
iverilog_cmd.append(r'..\..\rtl\soc\tinyriscv_soc_top.v')
# 找出path目录下的所有reference_output文件
def list_ref_files(path):
files = []
list_dir = os.walk(path)
for maindir, subdir, all_file in list_dir:
for filename in all_file:
apath = os.path.join(maindir, filename)
if apath.endswith('.reference_output'):
files.append(apath)
return files
# 根据bin文件找到对应的reference_output文件
def get_reference_file(bin_file):
file_path, file_name = os.path.split(bin_file)
tmp = file_name.split('.')
# 得到bin文件的前缀部分
prefix = tmp[0]
#print('bin prefix: %s' % prefix)
files = []
if (bin_file.find('rv32im') != -1):
files = list_ref_files(r'..\..\tests\riscv-compliance\riscv-test-suite\rv32im\references')
elif (bin_file.find('rv32i') != -1):
files = list_ref_files(r'..\..\tests\riscv-compliance\riscv-test-suite\rv32i\references')
elif (bin_file.find('rv32Zicsr') != -1):
files = list_ref_files(r'..\..\tests\riscv-compliance\riscv-test-suite\rv32Zicsr\references')
elif (bin_file.find('rv32Zifencei') != -1):
files = list_ref_files(r'..\..\tests\riscv-compliance\riscv-test-suite\rv32Zifencei\references')
else:
return None
# 根据bin文件前缀找到对应的reference_output文件
for file in files:
if (file.find(prefix) != -1):
return file
return None
# 主函数
def main():
#print(sys.argv[0] + ' ' + sys.argv[1] + ' ' + sys.argv[2])
# 1.将bin文件转成mem文件
bin_to_mem_cmd = [r'..\..\tools\BinToMem_CLI.exe']
bin_to_mem_cmd.append(sys.argv[1])
bin_to_mem_cmd.append(sys.argv[2])
process = subprocess.Popen(bin_to_mem_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process.wait(timeout=5)
# 2.编译rtl文件
logfile = open('complie.log', 'w')
process = subprocess.Popen(iverilog_cmd, stdout=logfile, stderr=logfile)
process.wait(timeout=5)
logfile.close()
# 3.运行
logfile = open('run.log', 'w')
vvp_cmd = [r'vvp']
vvp_cmd.append(r'out.vvp')
process = subprocess.Popen(vvp_cmd, stdout=logfile, stderr=logfile)
process.wait(timeout=5)
logfile.close()
# 4.比较结果
ref_file = get_reference_file(sys.argv[1])
if (ref_file != None):
# 如果文件大小不一致直接报fail
if (os.path.getsize('signature.output') != os.path.getsize(ref_file)):
print('!!! FAIL !!!')
return
f1 = open('signature.output')
f2 = open(ref_file)
f1_lines = f1.readlines()
i = 0
# 逐行比较
for line in f2.readlines():
# 只要有一行内容不一样就报fail
if (f1_lines[i] != line):
print('!!! FAIL !!!')
f1.close()
f2.close()
return
i = i + 1
f1.close()
f2.close()
print('### PASS ###')
else:
print('No ref file found, please check result by yourself.')
if __name__ == '__main__':
sys.exit(main())