VUnitのテストを上位階層で一気に流す
ユニットテストをやりつつ、リリース前に全てのテストが通らないとリリース出来ないようにしたいなと思い、VUnitのスクリプトを弄りました。
最上位のrun_all_tests.pyを流すと、新たにワーキングディレクトリを作り、下位ディレクトリのrun.pyを探してまとめて流してくれます。
Systemverilogで流すときに、
from vunit.verilog import Vunit
としなければならない所を忘れていて盛大にハマりました。。。
まずは通常のrun.pyを修正します。スクリプトとして外部から呼び出した場合と、メインで呼び出した場合で処理を分けます。
from os.path import join, dirname from vunit.verilog import VUnit def create_test_suite(prj): root = dirname(__file__) src_path = join(dirname(__file__), "path_your_files") tb_work_lib = prj.add_library("unique_lib_name") tb_work_lib.add_source_files(join(src_path, "*.sv")) tb_work_lib.add_source_files(join(root, "*.sv")) tb_work_lib.set_sim_option("modelsim.vsim_flags",["-novopt"]) if __name__ == '__main__': prj = VUnit.from_argv() create_test_suite(prj) prj.main()
次に、上の階層のスクリプトを書きます。下の階層のrun.pyを探して実行します。
from os.path import join, dirname # from vunit import VUnit # VHDL from vunit.verilog import VUnit # Verilog from glob import glob import imp def create_test_suites(prj): root = dirname(__file__) run_scripts = glob(join(root, "*", "run.py")) for run_script in run_scripts: file_handle, path_name, description = imp.find_module("run", [dirname(run_script)]) run = imp.load_module("run", file_handle, path_name, description) run.create_test_suite(prj) file_handle.close() prj = VUnit.from_argv() create_test_suites(prj) prj.main()
これでテストレポートもまとめて吐いてくれるし、テストが増えても上位階層は変更せずにすみます。