1. 概念讲解
1.1 总体思路
你可以在模型或测试框架中放入Test Assessment 模块,并在其中编写verify语句,从而评估模型仿真。verify语句对整体仿真和每个时间步都返回 pass、fail 或 untested 结果;结果出现在测试管理器中。Test Assessment 模块默认包含一个When 分解序列,它帮助你清晰地定义"每条verify语句在什么仿真条件下被激活"。
激活verify语句有两种范式:
如果你的模型使用 Test Sequence 模块作为信号源,考虑用 Test Sequence 模块的活动步骤来激活每条
verify;如果你的模型不用 Test Sequence 模块做信号源,或者测试序列步骤与待验证条件不对应,就用信号条件(signal condition)来激活每条
verify。
1.2 用 Test Sequence 活动步骤激活 verify
把 Test Sequence 与 Test Assessment 模块用 Test Sequence 模块的活动步骤信号连接起来,每条verify由对应的活动步骤激活。下图是一个示例测试框架:Test Sequence 与 Test Assessment 模块之间通过Active_Step信号连接;Test Assessment 内含一个 When 分解序列,四个子步骤各含一条verify,分别由不同的 Test Sequence 步骤激活。其中Else步骤没有动作,用来处理不匹配任何前面 when 条件的仿真工况——它的名字可以叫Else或任意名字,但不能包含 when 条件。
具体操作分四步:
为 Test Sequence 模块创建活动步骤数据输出:选中 Test Sequence 模块,在Property Inspector中勾选Create data to monitor the active step,把Data Type设为Enum,并在Enum name中填入枚举名(如
Test_Sequence_Active_Step_Enum)。
为 Test Assessment 模块创建数据输入:打开 Test Assessment 模块,在 Symbols 窗格中悬停到 Input 旁,单击Add data,命名该输入。
在框图中把 Test Sequence 模块输出连到 Test Assessment 模块输入。
在 Test Assessment 中创建 When 分解序列(默认即为 When 分解;要在标准序列与 When 分解之间切换,右键父步骤选择When decomposition)。对每个 When 子步骤,用活动步骤枚举数据定义激活条件,例如:
VerifyBoth when TSActiveStepIN == ... Test_Sequence_Active_Step_Enum.PressBothButtons verify(RedButtonOUT == false && GreenButtonOUT == false)下图左为 Test Sequence 编辑器(四个标准步骤PressNeitherButton/PressBothButtons/PressRedButton/PressGreenButton,输出枚举TSActiveStepOUT),右为 Test Assessment 的 When 分解(VerifyNeither/VerifyBoth/VerifyRed/VerifyGreen分别用枚举值激活)。
1.3 用信号条件激活 verify
如果模型不用 Test Sequence 做信号源(例如用 Signal Editor 模块输入),或测试序列步骤与待验证条件不对应,就用唯一的信号条件激活每条verify:把verify放在 When 分解序列中,并在 when 条件里写条件语句。下图左侧是 Signal Editor 生成的RedButtonIN、GreenButtonIN阶跃输入;右侧 Test Assessment 的 When 分解用RedButtonIN == false && GreenButtonIN == false这样的唯一条件激活各子步骤。
1.4 编写 verify 语句
verify语句对逻辑表达式求值。你可以用可选参数给结果在测试管理器中打标签。整体仿真结果的判定规则:
任一时刻步 fail,则整体 fail;
没有 fail 的时刻步时,任一时刻步 pass,则整体 pass;
否则整体为 untested。
结果出现在测试结果的Verify Statements分区。示例:父步骤用两条verify评估仿真中的两个局部变量x、y——verify(x >= y)因整个序列都为真而整体 pass;verify(x == y)与verify(x ~= y)分别在step_1_2、step_1_1中失败。测试管理器的显示如下:左侧 Verify Statements 树列出三条语句的状态(红叉/绿勾),右侧按时间步绘制 Fail/Pass/Untested 三段。
1.5 一次验证多个条件(Verify Multiple Conditions at a Time)
要在同一个时间步验证多个条件,把verify语句放进if语句,并在同一个测试步骤中放多个if。指南以一个双按钮异或(XOR)工具函数为例:同一时间步可能同时满足多个输入条件,期望输出如下表(节选):
输入条件 | 期望输出 |
|---|---|
RedButtonIN == false && GreenButtonIN == false | RedButtonOUT == false && GreenButtonOUT == false |
GreenButtonIN == false | GreenButtonOUT ~= true |
RedButtonIN == false | RedButtonOUT ~= true |
RedButtonIN == true && GreenButtonIN == true | RedButtonOUT == false && GreenButtonOUT == false |
RedButtonIN == true && GreenButtonIN == false | RedButtonOUT == true && GreenButtonOUT == false |
RedButtonIN == false && GreenButtonIN == true | RedButtonOUT == false && GreenButtonOUT == true |
对应地,Test Assessment 第一个测试步骤内放六条verify,分别包在六个if ... end中;该步骤在仿真中持续激活,每个时间步对这些if求值。
1.6 用 When 分解评估模型(Assess a Model by Using When Decomposition)
指南给出完整示例:模型实现一个简单信号跟踪器 SimpleTracker,工作在三种模式——0(Off)、1(Slow)、2(Quick)。模型结构如下图:Sine 与阶跃(mode)信号接入 SimpleTracker,输出u,y与err接 Scope 与测试框架。
SimpleTracker 子系统已建好测试框架 SimpleTrackerHarness,内含 Test Assessment 模块。测试框架结构如下图:Test Sequence 生成u与mode激励,Test Assessment 按mode值决定运行哪些verify。
Test Assessment 用 When 分解评估 SimpleTracker 行为。父步骤CheckError含三个子步骤:
OffModewhenmode == uint8(0):verify(elapsed < 0.5 || y == 0, 'After 0.5 sec in Off, y must remain 0');SlowModewhenmode == uint8(1):verify(elapsed < 0.5 || err < 2, 'After 0.5 sec in Slow, err must remain < 2');QuickMode:不写 when 条件(兜底),verify(elapsed < 0.5 || err < 1, 'After 0.5 sec in Quick, err must remain < 1');
运行评估:仿真测试框架,打开 Simulation Data Inspector 查看结果。三条verify在各自 mode 区间内显示绿色 Pass,在不对应 mode 的区间显示灰色 Untested。
2. 操作步骤 / 工作流
用活动步骤激活 verify 的标准流程:
选中 Test Sequence 模块,在 Property Inspector 勾选Create data to monitor the active step,Data Type 设为 Enum,填 Enum name。
打开 Test Assessment 模块,在 Symbols 窗格给 Input 加数据并命名。
在框图中连接 Test Sequence 输出与 Test Assessment 输入。
在 Test Assessment 中写 When 分解:每个子步骤名后跟
when <活动步骤枚举输入> == <枚举值>,再写verify(...);最后一个子步骤不写 when。运行仿真,在测试管理器(有测试用例时)或 Simulation Data Inspector(无测试用例时)查看结果。
用信号条件激活 verify:上述第 1~3 步改为用 Signal Editor 等信号源;第 4 步把 when 条件写成对具体信号值的判断(如RedButtonIN == true && GreenButtonIN == false)。
3. 示例
% 带可选消息的 verify(消息在结果中显示) verify(elapsed < 0.5 || y == 0, 'After 0.5 sec in Off, y must remain 0'); % 同一时间步用多个 if 验证并行条件 if RedButtonIN == false && GreenButtonIN == false verify(RedButtonOUT == false && GreenButtonOUT == false) end if RedButtonIN == true && GreenButtonIN == false verify(RedButtonOUT == true && GreenButtonOUT == false) end % 用活动步骤枚举激活 VerifyBoth when TSActiveStepIN == Test_Sequence_Active_Step_Enum.PressBothButtons verify(RedButtonOUT == false && GreenButtonOUT == false)4. 要点与注意事项
Test Assessment 模块默认就是 When 分解序列;要改成标准序列需右键父步骤切换。
两种激活范式二选一:有 Test Sequence 源且步骤与工况对应时用活动步骤枚举;否则用信号条件。
兜底子步骤(Else/QuickMode 等)不能写 when 条件,且通常不写动作。
整体结果判定:任一时步 fail → 整体 fail;无 fail 时任一时步 pass → 整体 pass;否则 untested。
同一时步多条件并行时,用多个
if ... verify ... end,而不是拆成多个 When 子步骤。elapsed是步骤内已激活时间;elapsed < 0.5 || ...这种写法的含义是"刚切换到该模式的前 0.5 秒内不评判,0.5 秒后必须满足稳态条件"。For Each 子系统内不要用 Model Verification 块,用 Test Sequence 的
verify(见第 10 讲)。