VUnit 101:自动化VHDL验证实战指南
VUnit是领先的开源VHDL验证框架,融合Python测试套件运行器与专用VHDL库,自动化测试平台编译、执行、结果报告,助力工程师践行测试驱动开发。
本教程由VHDLwhiz作者Ahmadmunthar Zaklouta执笔,带你走完VUnit全流程——安装配置、创建测试平台、编写测试用例、ModelSim运行。含即拿即用的示例项目下载。
概览
侧边栏或移动端导航键可跳转章节。教程含截图供视觉参考。
前置条件
假设具备基础VHDL与ModelSim能力。
安装VUnit
克隆含子模块的仓库:
git clone --recurse-submodules https://github.com/VUnit/vunit.git
或下载ZIP解压至C:\vunit,再执行:
cd C:\vunit python setup.py install
配置环境变量:
VUNIT_MODELSIM_PATH— ModelSim可执行文件路径。VUNIT_SIMULATOR— 设为Modelsim。
示例截图:

下载示例项目
解压ZIP至C:\vunit_tutorial并运行内置脚本。
VUnit简介
VUnit通过以下简化HDL验证:
- Python库:测试自动化、配置、管理。
- VHDL库:可复用验证组件。
VHDL侧含六个库;本教程聚焦logging与check库。

待测设计 (DUT)
示例DUT motor_start 驱动三色LED(红/黄/绿)表征电机启动序列。接口采用记录类型封装输入输出。

启动流程三步:
- 加载配置(红灯)
- 校准(黄灯)
- 旋转(绿灯)
启动序列
- 红灯 — 闪烁五次后常亮。
- 黄灯 — 开关2触发后亮十周期,随红灯熄灭。
- 绿灯 — 开关3激活期间常亮。
测试平台开发
- 配置Python
run.py脚本。 - 构建VUnit骨架。
- 实例化DUT并驱动信号。
Python运行脚本
run.py定义路径、创建VUnit实例、添加设计与测试平台库:
# ROOT directory ROOT = Path(__file__).resolve().parent # Source paths DUT_PATH = ROOT / "design" TEST_PATH = ROOT / "testbench" # VUnit instance VU = VUnit.from_argv() VU.enable_location_preprocessing() # Libraries design_lib = VU.add_library("design_lib") design_lib.add_source_files([DUT_PATH / "*.vhdl"]) tb_lib = VU.add_library("tb_lib") tb_lib.add_source_files([TEST_PATH / "*.vhdl"])
VUnit骨架
测试平台实体添加VUnit上下文与强制泛型:
LIBRARY VUNIT_LIB; CONTEXT VUNIT_LIB.VUNIT_CONTEXT; ENTITY motor_start_tb IS GENERIC(runner_cfg : string := runner_cfg_default); END ENTITY motor_start_tb;
架构体承载测试运行器进程:
ARCHITECTURE tb OF motor_start_tb IS test_runner : PROCESS BEGIN test_runner_setup(runner, runner_cfg); WHILE test_suite LOOP -- test cases END LOOP; test_runner_cleanup(runner); END PROCESS; END ARCHITECTURE;
单测试用例用IF run("case_name") THEN块定义。
信号声明与DUT实例化
定义时钟、复位、接口记录:
CONSTANT C_CLK_PERIOD : time := 10 ns; SIGNAL clk, reset : STD_LOGIC := '0'; SIGNAL motor_start_in : MOTOR_START_IN_RECORD_TYPE := (switch_1 => '0', switch_2 => '0', switch_3 => '0'); SIGNAL motor_start_out : MOTOR_START_OUT_RECORD_TYPE;
实例化DUT:
motor_start_tb_inst : ENTITY DESIGN_LIB.motor_start(rtl) PORT MAP( clk => clk, reset => reset, motor_start_in => motor_start_in, motor_start_out => motor_start_out );
驱动时钟与复位:
clk <= NOT clk after C_CLK_PERIOD / 2; reset <= '0' after 5 * (C_CLK_PERIOD / 2);
测试用例开发
探索三种验证风格:内联驱动检查、受控检查器、自检查器。
内联驱动与检查
简单用例驱动switch_1并用VUnitcheck族检查LED状态:
IF run("switch_1_on_output_check") THEN WAIT UNTIL reset = '0'; WAIT UNTIL falling_edge(clk); motor_start_in.switch_1 <= '1'; FOR i IN 0 TO 4 LOOP WAIT UNTIL rising_edge(clk); check(motor_start_out.red_led = '1', "Red LED should be on"); check_false(motor_start_out.yellow_led, "Yellow LED should be off"); check_equal(motor_start_out.green_led, '0', "Green LED should be off"); END LOOP; END IF;
受控检查器
驱动留在用例,检查器在独立进程由启动/结束事件控制。例:验证switch_2使能后黄灯行为:
check_stable(clock => clk, en => enable, start_event => yellow_low_start_event, end_event => yellow_low_end_event, expr => motor_start_out.yellow_led, msg => "YELLOW LED low before switch_2");
自检查器
将验证逻辑封装进专用进程,内部用check或check_stable。驱动过程简化激励:
PROCEDURE switch_driver( SIGNAL switches : OUT MOTOR_START_IN_RECORD_TYPE; CONSTANT clk_period : IN TIME; CONSTANT sw1_delay : IN INTEGER; CONSTANT sw2_delay : IN INTEGER; CONSTANT sw3_delay : IN INTEGER) IS BEGIN IF sw1_delay >= 0 THEN WAIT FOR clk_period * sw1_delay; switches.switch_1 <= '1'; END IF; IF sw2_delay >= 0 THEN WAIT FOR clk_period * sw2_delay; switches.switch_2 <= '1'; END IF; IF sw3_delay >= 0 THEN WAIT FOR clk_period * sw3_delay; switches.switch_3 <= '1'; END IF; END PROCEDURE;
运行测试
终端执行:
python .\run.py *switch_1_on_output_check
VUnit编译设计、发现测试平台、执行指定用例。输出日志至C:\vunit_tutorial\vunit_out\test_output。
用-v详细日志,-l列出所有用例,--clean清理旧结果,-g启动ModelSim波形窗口(需wave.do文件)。
总结
VUnit提供健壮轻量框架,加速设计与验证团队。Python驱动测试桩、丰富VHDL库、灵活检查器API,成任何HDL工作流宝贵补充。
后续步骤
通过下方表单下载完整示例项目。
VHDL
- 优化Cat®机械:My.Cat.com终极指南
- TJBot 入门指南:构建、配置与语音控制您的 AI 机器人
- 树莓派 3 部署 RAK 831 LoRa 网关分步指南
- 基于 RAK831 模块与树莓派 3 构建 LoRa 网关:分步指南
- Arduino入门教程01:开始你的第一个项目
- 陶瓷3D打印实操指南:技术、材料与设计技巧
- 保险业 AI 落地实战指南:从认知到规模化应用
- 在 PLCnext 上用 Docker 部署 Node-RED:分步实战指南
- 在 PLCnext 上构建首个 Go 应用:新手入门指南
- Code-Ready Containers实战指南:基于Red Hat OpenShift的云原生流程自动化
- 边缘时代的物联网:增长、数据、安全与合作伙伴策略
- 碱性染料认知全景:用途、安全红线与跨行业应用