基于Tcl的交互式测试平台增强硬件验证
交互式测试平台是指在测试平台运行时由操作员向被测器件(DUT)提供输入的仿真器设置。通常意味着在仿真器控制台输入命令为DUT提供激励。
虽然应始终创建自检测试平台,但交互式测试平台可以作为很好的补充。手头有交互式测试平台时,临时测试比修改自检测试平台代码更容易。
常在实验室发现问题后,想在测试平台中复现。有了交互式测试平台,只需在仿真器中输入观察到的输入序列,即可复现不良行为。
Tcl与VHDL交互
大多数VHDL仿真器使用Tcl作为控制台语言。仿真器有一堆厂商特定命令,好消息是它们可像其他Tcl命令一样对待。可用Tcl创建复杂、可移植的脚本管理和支持VHDL测试平台。
从Tcl修改VHDL信号
要与VHDL交互,需找到修改信号值的命令。ModelSim中是“force”命令。命令参考文档中其语法概要为:
force {<object_name> <value> [[@]<time_info>][, <value> [@]<time_info>]... [-deposit | -drive | -freeze] [-cancel [@]<time_info>] [-repeat [@]<time_info>]
要用的开关是“-deposit”标志。这瞬间改变VHDL信号值,但允许其他VHDL或Tcl驱动器稍后改为其他值。
忽略不用的选项,简化语法如下:
force -deposit <signal_name> <value>
VHDL触发器
既知如何从Tcl控制VHDL信号,需在VHDL测试平台创建接收进程。下面代码展示最小示例:
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity interactive is end interactive; architecture sim of interactive is -- Controlled by Tcl signal trigger : std_logic := '0'; begin process is begin wait until trigger = '1'; report "Triggered!"; end process; end architecture;
当trigger信号从某值变为'1'时,进程唤醒。此时向控制台打印“Triggered!”,验证从Tcl控制VHDL进程的概念。
我在ModelSim控制台测试。发出的命令及输出可见下方记录:
VSIM 1> run 10 ns; VSIM 2> force -deposit /trigger '1' VSIM 3> run 0 ns; # ** Note: Triggered! # Time: 10 ns Iteration: 0 Instance: /interactive VSIM 4> force -deposit /trigger '0' VSIM 5> run 10 ns;
启动仿真后运行10纳秒。
然后强制trigger信号为'1'。下一行等待0纳秒,目的是创建一个delta周期。希望进程被触发但不让仿真时间推进。
最后在继续测试平台前将trigger强制回'0'。
可见VHDL进程在“run 0 ns”行后唤醒,向控制台打印“Triggered!”。
在Tcl中读取VHDL信号值
ModelSim中可用“examine”命令读取信号值。例如在ModelSim控制台用此命令读取trigger信号:
VSIM 6> examine /trigger # 0
在脚本中用“examine”时,想将值赋给Tcl变量。在ModelSim控制台尝试:
VSIM 7> set triggerVal [examine /trigger] # 0
然后用“puts” Tcl命令打印变量:
VSIM 8> puts "triggerVal: $triggerVal" # triggerVal: 0
每次测试后停止仿真器
让测试运行足够长以便DUT反应的最简单方法,是运行仿真器固定时间值。例如DUT应在两个时钟周期后反应,时钟周期10纳秒,Tcl脚本用“run 20 ns”。
若DUT无固定反应时间,可用VHDL断言停止仿真并移交控制权给Tcl回调函数。ModelSim中指从Tcl脚本用“when”命令设置断点:
when [[-fast] [-id <id#>] [-label <label>] {<when_condition_expression>} {<command>}]
还需在Tcl中定义“onBreak”回调函数,断点命中时运行。“onBreak”函数在ModelSim命令参考中指定。
Tcl驱动测试的缺点
严重依赖Tcl脚本的测试平台有缺点。最明显是速度和可移植性问题。
Tcl驱动测试平台通过多次启停仿真器与VHDL代码交互。启停仿真运行中间的Tcl函数比连续运行VHDL测试平台更耗时。Tcl是解释型语言,VHDL在仿真器中编译运行快得多。
虽Tcl可移植到其他仿真器,但必须使用的仿真器特定命令不可移植。即使在另一仿真器找到等效命令,工作方式也可能不同。仿真器厂商自定命令规则。因此Tcl驱动测试平台应视为比纯VHDL测试平台可移植性差。
新VHDL和FPGA课程
* 我正在创建新的VHDL和FPGA课程,将深入讲解测试平台。你将学习从零创建FPGA设计。完成课程后,你将知道如何创建自检测试平台,并复用代码创建交互式测试平台。
* 2020年10月12日更新: 课程已完成。点击下方图片了解更多。
我们将创建的产品是点阵LED控制器模块。使用49美元的Lattice iCEstick开发板。最终在面包板上实现设计。你能在电脑键盘输入,字符将显示在FPGA控制的点阵LED屏上。

点击了解点阵VHDL和FPGA课程详情!
开放时间:
待定。
VHDL