peeeanuts

ほぼほぼ忘備録

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()

これでテストレポートもまとめて吐いてくれるし、テストが増えても上位階層は変更せずにすみます。