4. 一致性验证的度量与判定准则
在完成模型与代码的比对工具链搭建之后,真正决定验证结论的并不是"跑没跑通",而是"用什么标准判定通过"。如果判据定义模糊,同一组差异在不同人手里可能得出相反结论:有人把浮点末位差异视为失败,有人把采样时刻偏移一拍的输出当作等价。因此本节的核心任务是把"一致性"拆解为可定义、可度量、可判定的四类等价,并为每一类给出明确的通过/失败阈值。
四类等价的定义与适用边界
功能等价关注的是输入到输出的映射关系是否一致,而不关心内部实现路径。判定功能等价时,我们关心的是:对同一组激励,模型输出与代码输出是否落在允许误差带内,且关键行为(如饱和、限幅、模式切换)是否在相同条件下触发。功能等价是最宽松也最常用的判据,适用于大多数控制算法验证场景。
数值等价比功能等价更严格,要求逐采样点的数值偏差不超过给定容差。它通常用于定点实现或对精度敏感的场合。数值等价必须区分绝对误差与相对误差:当信号幅值接近零时,相对误差会失真,此时应以绝对误差为主判据。
结构等价考察的是模型与代码在计算结构上是否对应,包括运算顺序、状态变量数量、积分器/延时环节的位置、查表断点等。结构等价不要求数值完全一致,但要求"该有的环节都在、顺序不乱"。它常用于代码审查阶段,是发现遗漏或多余逻辑的第一道防线。
时序等价关注时间维度:采样周期、任务执行顺序、状态更新时刻、输出刷新时刻是否一致。时序不等价往往表现为输出波形形状相似但整体平移若干采样点,或稳态正确而暂态错位。对于多速率系统和带使能/复位逻辑的子系统,时序等价是必须单独验证的维度。
可量化判据的建立方法
把上述定义转化为可执行的判据,需要为每一类等价选定度量指标和阈值。以下给出一组可直接参考的判据示例,适用于以浮点实现为主的嵌入式控制代码验证场景。
| 等价类型 | 度量指标 | 通过阈值(示例) | 失败处理方向 |
|---|---|---|---|
| 功能等价 | 行为覆盖率、关键事件触发一致性 | 覆盖率 ≥ 95%,关键事件 100% 一致 | 补充激励用例,检查分支条件 |
| 数值等价 | 最大绝对误差 e_abs、最大相对误差 e_rel | e_abs ≤ 1e-6 或 e_rel ≤ 1e-4 | 检查数据类型、运算顺序、舍入方式 |
| 结构等价 | 模块映射率、状态变量数量差 | 映射率 = 100%,状态变量数量一致 | 逐模块核对,补充遗漏或删除多余逻辑 |
| 时序等价 | 采样点偏移量、任务执行顺序 | 偏移量 = 0,任务顺序完全一致 | 检查采样周期配置、任务调度优先级 |
需要强调的是,阈值不是拍脑袋定的。e_abs ≤ 1e-6 适用于 double 精度且信号量级在 1 附近的场景;如果信号量级达到 1e6,绝对误差阈值应相应放大,否则会把正常的浮点舍入差异误判为失败。更稳妥的做法是同时设定绝对和相对两个阈值,取"或"关系:只要其中一个满足即认为数值等价通过。这样既避免了零附近相对误差爆炸,也避免了大量级信号绝对误差过严。
判定流程与差异定位
实际验证时,建议按"结构→时序→功能→数值"的顺序逐层判定。先做结构等价,因为结构不对,后面的数值比对没有意义;再做时序等价,确认时间轴对齐;然后做功能等价,看行为是否覆盖;最后做数值等价,量化精度。这个顺序的本质是从粗到细、从定性到定量,能在早期用低成本手段拦截大部分问题。
当某一层判定失败时,差异定位应回到该层对应的度量指标。例如数值等价失败且 e_abs 在暂态段超标、稳态段正常,通常指向积分器初始化或状态更新顺序问题;若 e_rel 在信号过零附近超标而 e_abs 正常,则多半是相对误差判据本身在零附近的固有缺陷,应改用绝对误差判据或加一个死区。时序等价失败且偏移量恒为 1 个采样点,常见原因是代码中输出刷新比模型晚一拍,需要检查输出赋值语句的位置。
判据的工程化落地
把判据落地为可执行的检查,通常需要三样东西:一份激励用例集、一套自动比对脚本、一份判定报告模板。激励用例集应覆盖正常工况、边界工况和模式切换工况;自动比对脚本按上述四类等价分别计算指标并输出通过/失败;判定报告则记录每个用例的指标值、阈值和结论,便于回溯。
判定报告字段示例(单用例):
用例编号:TC-003
激励描述:阶跃给定 0→1,持续 2s,采样周期 1ms
结构等价:映射率 100%,状态变量数 模型=4 / 代码=4 → 通过
时序等价:采样点偏移 0,任务顺序一致 → 通过
功能等价:行为覆盖率 97.2%,关键事件全部触发 → 通过
数值等价:e_abs_max = 3.2e-7,e_rel_max = 8.1e-5 → 通过
综合结论:通过
这份报告的价值在于:当后续代码修改导致回归失败时,可以直接对比指标变化,快速判断是哪一类等价被破坏、破坏程度如何。没有量化判据,回归验证就只能靠"看起来差不多",这在工程上是不可接受的。
最后需要提醒的是,四类等价并非在所有项目中都必须全部使用。对于纯浮点、单速率、结构简单的算法,功能等价加数值等价往往已经足够;而对于多速率、带定点量化、含复杂状态机的系统,四类等价缺一不可。判据的选择应服务于验证目标,而不是为了凑齐四类而增加无谓的工作量。