安全机制的插入和验证

发布于 2023-3-31 16:10
浏览
0收藏

简介

随着功能安全在当今的工业和汽车设计中变得越来越重要,许多原有的设计必须 “升级” 以满足系统的安全目标。一种有效的方法是使用安全综合和形式化验证将安全架构纳入到设计中。


FMEDA(失效模式影响和诊断分析)利用一系列安全机制来评估安全架构,并计算系统的安全性能。ISO 262621 规范第 5 部分规定,硬件架构需要根据故障处理要求进行评估。它要求通过一套客观的指标对随机硬件失效的概率进行严格的分析和量化。如果有任何架构指标未能满足为产品定义的汽车安全完整性等级 (ASIL) 标准,设计团队将被强制要求重新评估组件的安全概念,改进现有的安全机制,并在必要时引入新的安全机制。


为了改善诊断覆盖率,一种实用的方法是在设计中纳入一系列安全机制,以便能够增加检测到的故障数量和类型。最好在寄存器传输级进行此操作,因为在此级别可以高效地执行功能验证。该流程可由以下主要步骤构成:


1. 探索设计中需要改善故障检测的部分


2. 引入安全机制,针对 RTL 结构进行适当的权衡


3. 使用时序逻辑等价性检查 (SLEC) 验证设计变化


4. 使用基于形式化的方法执行注错,以测量诊断覆盖率

安全探索

 安全探索的目标是确定理想的安全架构和安全机制。安全机制有各种各样的风格,每一种在检测随机硬件故障方面都有自己的有效性等级。在安全探索的过程中,将会执行一系列 “假设分析” 场景,以了解不同安全机制对设计的影响,尤其是在功耗、面积、性能、安全指标和诊断覆盖率方面的影响。这种探索是在不修改设计的情况下进行的,因此可以快速、高效地进行同步分析。如果执行得当,安全探索将会帮助设计团队在完成安全插入和安全验证后成功满足安全目标。

安全机制的插入

修改原有的设计以引入安全机制可能是个容易出错的过程。如果最初的安全机制不能满足安全目标,必须使用另一种机制,则情况就会变得更糟糕。安全综合提供了一种增强设计结构以提高容错能力的新方法。为了创建原有设计的安全架构,安全综合会自动引入两种类型的安全机制。一种用于寄存器级,另一种用于模块级。


寄存器级插入更有针对性/精准,在触发器级别插入安全机制,如寄存器复制和奇偶校验。这种方法通常用于保护控制和状态机结构。部分寄存器级安全机制包括:


1. 针对关键控制元件的奇偶校验生成与检查。


2. 针对选定寄存器列表的双重模块化冗余。


3. 针对选定寄存器列表的三重模块化冗余。


4. 针对寄存器组的纠错以及带双重差错检测的单一纠错。


5. 协议检查确保有限状态机的有效状态转换。


安全综合可以为模块中的所有寄存器或特殊寄存器列表添加奇偶校验,如图 1 所示。纠错码 (ECC)、带双重差错检测的单一纠错 (SECDED) 也可用于寄存器组。在此模式下,安全综合按名称对寄存器进行分组,并通过创建典型表现添加纠错码 ECC。随后,使用该表现确定是否存在差错并从中恢复。对于有限状态机,安全综合将会详述有效状态空间和状态转移矩阵,以建立协议检查安全机制。

安全机制的插入和验证-汽车开发者社区

图 1. 针对控制寄存器的奇偶校验生成与检查。


模块级插入在实例级别创建基于冗余的安全机制。部分模块级安全机制包括:


1. 双重模块化冗余及锁步检查器。

2. 三重模块化冗余及锁步检查器和多数同意。

3. 针对接口信号组的输入和输出奇偶校验检查。

4. 内存奇偶校验生成与检查。


在图 2 中,安全综合创建了该模块的第二个实例,并为第一个和第二个实例之间的所有输出和输入建立了适当的连接以及锁步检查器。

安全机制的插入和验证-汽车开发者社区

图 2. 双重模块化冗余及锁步检查器。


对于每种安全机制,都需要进行效率、故障检测延迟和面积开销方面的权衡。图 3 显示了安全机制在安全关键设计中的应用位置。


高层架构如图 3 所示。针对设计接口,可以执行奇偶校验,以确保接口模块与设计内部的接口控制器之间保持精确的数据传输。当数据进入设计后,就可以通过总线上的数据奇偶校验和存储器件中的纠错码 (ECC) 加以保护。片上总线处理情况可以由专用总线监视器进行观察。FSM 和仲裁逻辑等关键控制组件将通过三重模块化冗余和多数同意获得出色的保护。中央处理器和嵌入式处理器可通过双重模块化冗余以及锁步检查器获得保护。

安全机制的插入和验证-汽车开发者社区

图 3. 安全关键设计的安全机制示例。

时序逻辑等价性检查 (SLEC)

时序逻辑等价性检查 (SLEC) 使用形式化验证技术,从形式上验证两个设计在功能上是否等价,如图 4 所示。只要输出始终相同,两个设计的实现可以不同。当 SLEC 证明两个信号(每个设计各一个)的等价,表示这两个信号在所有时间对所有输入而言都是等价的。如果有任何信号对不等价,SLEC 将自动生成错误追溯,使用波形显示问题的因果关系。当两个设计的所有输出都被证明等价时,我们就可以确信两个设计在功能上是等价的。


因此,SLEC 可用于验证:


•安全机制的插入,确保原始设计的功能不会因增加安全机制 (SM) 而发生改变


•安全机制的运行

安全机制的插入和验证-汽车开发者社区

图 4. 时序逻辑等价性检查

安全机制插入验证

在插入安全机制后,确保插入前后的设计在功能上是等价的,这一点很重要。与使用仿真回归对配备安全机制的设计进行功能验证相比,时序逻辑等价性检查 (SLEC) 是一种更直接、更全面的方法。


在图 5 中,三重模块化冗余 (TMR) 被用作保护设计的安全机制。通过比较设计 A(不含安全机制)和设计 B(包含 TMR),SLEC 可以从数学上证明 TMR 已正确插入到设计中。这种方法给了我们更大的信心,因为功能仿真仅能对有限数量的输入序列进行了仿真,来验证 TMR 的运行。

安全机制的插入和验证-汽车开发者社区

图 5. 使用 SLEC 的安全机制插入验证

安全机制运行验证

安全机制起作用了吗?在正确引入安全机制后,可以使用基于形式化的方法执行注错。4, 5 失效模式和影响分析 (FMEA) 可以确定安全机制是否充分。形式化方法的建立是为了将固定故障和瞬时注错到设计中,通过设计的状态空间记录故障时刻,并查看故障是否被传播、掩蔽或被安全机制检测到。


如图 6 所示,可使用黄金(无故障)模型和已注错的模型执行动态注错和结果分析。通过使用自身的副本实例化设计,自动为 SLEC 指定所有合法输入值,就像仿真中的黄金参考模型预测任何输入激励的所有预期输出一样。通过将已注错的设计与自身没有故障的副本进行比较,形式化工具检查是否存在任何可能的方法能让故障逃逸到输出或者未被安全机制检测到。

安全机制的插入和验证-汽车开发者社区

图 6. 使用基于形式化注错的安全机制运行验证


使用 SLECFS 进行注错的步骤可概括为:

1. 指定原始设计的两个副本以用于 SLEC。输入端口将被限制在一起,并自动检查输出比较。

2. 运行 SLEC 来识别任何可能导致输出差异的设计元素, 例如内存黑盒、未连接的导线、不可复位的内存,等等。添加约束使其同步。

3. 使用故障列表在即将注错的设计中自动指定可能的注入点。通常,我们关注单点故障;即,注入一个故障以检查等价性。

4. SLEC 基于故障列表和比较点,自动识别并移除任何冗余的模块和逻辑。

5. 在多台服务器上并发运行 SLEC。多核方法具有显著的性能优势,因为可以在多个内核上并行检查多个输出。

6. 如果注入的故障导致在比较点出现失效,则可以生成捕捉注错和传播序列的反例波形,以用于调试。

结果

该方法被用于在一项基于 AMBA 的设计的内存子系统中纳入安全架构。在进行安全探索后,使用安全综合向内存子系统中插入安全机制:双重模块化冗余。SLEC 用于验证原始设计和 “安全” 设计之间的等价性,确保 “安全” 设计的功能没有发生改变。


工具 Austemper Annealer通过复制部分设计用于双重模块化冗余的方式执行安全综合。图 7 显示了 “安全” 设计以及使用 SLEC 验证双重模块化冗余安全机制的设置。我们不仅比较了原始设计和 “安全” 设计的输出,还比较了原始设计的输出和 “安全” 设计中的两个实例的输出, 以确保两个实例的行为均与原始设计相同。

安全机制的插入和验证-汽车开发者社区

图 7. 使用 SLEC 验证双重模块化冗余的流程。


工具 Questa SLEC被用于 SLEC 验证。运行 Questa SLEC, 使用双重模块化冗余机制验证安全设计的脚本如图 8 所示。我们从脚本中可以看到,运行 Questa SLEC 非常简单:首先编译两个设计,然后将原始设计配置为 “规范”, 将安全设计配置为 “实现”。Questa 自动将两个设计的输入映射为假设,并驱动相同的输入;它还自动将两个设计的输出映射为形式化引擎的目标,以验证它们的等价性。为了验证原始设计与安全设计中的两个实例之间的等价性,我们需要在脚本中添加两条 “slec map” 命令, 将原始设计的输出和实例 1 或实例 2 的输出分别映射为目标。

安全机制的插入和验证-汽车开发者社区

图 8. 运行 SLEC 以验证安全设计的脚本


表 1 总结了使用不同安全机制 “升级” 后的许多设计模块。对于基于 AMBA 且采用复制插入的设计模块 A 和模块 B, 我们已经验证了原始模块和修改后的模块(原始 + 安全机制)之间的输出等价性。对于采用 ECC 插入的模块 C, 我们已经验证了原始设计和修改后的采用 ECC 插入的设计之间的输出等价性。


表 1. 不同设计的安全机制验证结果

安全机制的插入和验证-汽车开发者社区

我们还将该方法应用于 OpenRISC 1200 设计的一个子系统和 ethmac 设计中。例如,第一次比较原始 Ethmac 设计和注入安全机制后的更新版本时发现了 23 次激发,包括输出不等价和实例复制不等价。来自 Questa SLEC 的结果如下图 9 所示。

安全机制的插入和验证-汽车开发者社区

图 9. Ethmac 设计中 SLEC 输出存在不等价违规。


由于激发标有警告信息,我们检查了设计原理图并在更新后的设计中发现了浮动信号(empty、cnt等),如图 10 所示。我们调试了源代码,并在模块实例化中找到了错误。在修复错误后,使用新注入的安全机制重新运行 SLEC,这时所有等价性目标都得到了验证。

安全机制的插入和验证-汽车开发者社区

图 10. Ethmac 设计中的安全机制包含浮动信号


在验证安全机制已正确插入后,注入故障以测试安全机制的运行。我们关注的是单点故障,即一次注入一个故障。Questa SLEC 将根据故障列表和输出比较点,推导出它们的依赖关系。然后,它将针对每个输出比较点, 确定任何故障的引入是否有可能导致不同的输出。


在图 11 中,“spec” 为原始设计,“impl” 则是包含安全机制的 “升级” 设计。我们可以看到,即使在设计中注入了一个故障,设计的输出仍然是正确的(impl dout 与 spec dout 相同)。ECC 安全机制从故障中正确地恢复了数据。错误检测信号 error_detected 被设为断言,以提醒用户这一情况。另一方面,如果注入的故障导致比较点出现失效,则会生成捕捉注错和传播序列的反例波形,以用于调试。

安全机制的插入和验证-汽车开发者社区

图 11. 导致设计错误的注错


文章转载自公众号:智车Robot

分类
收藏
回复
举报
回复
相关推荐