亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> VHDL

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 101:自动化VHDL验证实战指南

下载示例项目

解压ZIP至C:\vunit_tutorial并运行内置脚本。

VUnit简介

VUnit通过以下简化HDL验证:

VHDL侧含六个库;本教程聚焦logging与check库。

VUnit 101:自动化VHDL验证实战指南

待测设计 (DUT)

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

VUnit 101:自动化VHDL验证实战指南

启动流程三步:

  1. 加载配置(红灯)
  2. 校准(黄灯)
  3. 旋转(绿灯)

启动序列

测试平台开发

  1. 配置Python run.py脚本。
  2. 构建VUnit骨架。
  3. 实例化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

  1. 优化Cat®机械:My.Cat.com终极指南
  2. TJBot 入门指南:构建、配置与语音控制您的 AI 机器人
  3. 树莓派 3 部署 RAK 831 LoRa 网关分步指南
  4. 基于 RAK831 模块与树莓派 3 构建 LoRa 网关:分步指南
  5. Arduino入门教程01:开始你的第一个项目
  6. 陶瓷3D打印实操指南:技术、材料与设计技巧
  7. 保险业 AI 落地实战指南:从认知到规模化应用
  8. 在 PLCnext 上用 Docker 部署 Node-RED:分步实战指南
  9. 在 PLCnext 上构建首个 Go 应用:新手入门指南
  10. Code-Ready Containers实战指南:基于Red Hat OpenShift的云原生流程自动化
  11. 边缘时代的物联网:增长、数据、安全与合作伙伴策略
  12. 碱性染料认知全景:用途、安全红线与跨行业应用