首页 理论教育 模拟仿真中的故障注入方法

模拟仿真中的故障注入方法

时间:2023-06-25 理论教育 版权反馈
【摘要】:模拟仿真故障注入不同于以上两种故障注入方法,不再需要目标系统的物理原型,而必须建立一个硬件仿真模型。由于硬件描述语言VHDL/Verilog HDL具有良好的建模与抽象功能,结合仿真工具,仿真故障注入方法可以实现在不同抽象级别上进行仿真故障注入,并精确控制故障注入的时间和位置,方便监控故障行为。基于以上原因,仿真故障注入方法成为目前最为常用的故障注入方法。串行破坏技术是一种有效的故障注入方法。

模拟仿真中的故障注入方法

模拟仿真故障注入不同于以上两种故障注入方法,不再需要目标系统的物理原型,而必须建立一个硬件仿真模型。通常仿真模型是利用硬件描述语言(VHDL或Verilog)开发的。把故障注入仿真模型中,可观察性和可控制性在几种故障注入方法中是最佳的。由于硬件描述语言VHDL/Verilog HDL具有良好的建模与抽象功能,结合仿真工具,仿真故障注入方法可以实现在不同抽象级别上进行仿真故障注入,并精确控制故障注入的时间和位置,方便监控故障行为。

模拟仿真注入方法可以实现从门级、RTL级以及到行为级的各个级别的故障注入,结合仿真工具,能够精确地控制注入时间和注入位置,并实时监控系统运行行为,所以这种方法具有较强覆盖性与随机性以及良好的可观测性与可操控性;另外,由于RTL级的设计已十分接近实际的电路,它还具有很强的真实性,可以取代实际的器件芯片进行故障注入与分析,因而降低了设计成本,加快了设计流程。基于以上原因,仿真故障注入方法成为目前最为常用的故障注入方法。

当今主流的基于VHDL故障注入技术总体上分为两类,分别为仿真命令技术和VHDL代码修改技术。

(一)仿真命令技术

仿真命令技术是指通过硬件模拟器内建的仿真命令来修改目标系统模型中的信号变量的逻辑值,从而实现故障的注入。仿真命令通过修改模型的VHDL代码中定义信号值可以注入瞬态故障、间歇性故障和永久故障。目前较为常见的硬件模拟器是Mentor公司发布的Modelsim仿真工具。Modelsim仿真命令集中包含了可以强制改变signal类型逻辑值的Force命令和可以改变variable类型逻辑值的Change命令。这些命令不会被综合到目标系统的VHDL逻辑电路中,只是被模拟器所识别,从而作用于仿真过程中。其中Change命令没有对故障持续时间设置的参数,意味着随着内部逻辑电路的工作运行,此变量当被驱动接收新的值时会覆盖之前注入的故障值,即不能实现永久故障的注入,只可模拟瞬时故障。而对于Force命令则具有多种参数,不仅能够模拟瞬时故障还能够模拟永久故障。

仿真命令容易实施,并且它的时间代价(完成仿真)到目前为止是最低的。然而,与代码修改技术相比,所能注入的故障模型较少。代码修改技术则需要更复杂的模块设计、更多的仿真时间和更多的逻辑空间,但是能够注入更多的故障模式。

(二)VHDL代码修改技术

VHDL代码修改技术需要修改目标对象的仿真模型,包含“破坏”技术、“突变”技术和其他技术。“破坏”就是在原对象的模块中相关联的驱动信号和被驱动信号之间加入“破坏”模块,改变这两者之间原有的信号关系;“突变”则是设计与模型中原有功能模块具有相同接口的“突变”模块,在需要注入故障时激活“突变”模块,用其替换掉原始模块从而注入故障。其他技术则是通过扩展VHDL语言如增加新的数据类型和信号或修改VHDL的决断函数来实现。新定义的数据类型和信号包含了故障的行为描述。然而,这些技术需要引进Ad Hoc编译器和控制算法来管理语言的扩展,实现过程复杂。

1.基于“破坏”的故障注入技术

“破坏”是加入目标模型中的一个特殊的VHDL组件模块。它的任务是在故障注入时改变目标模型中各个功能模块之间连接信号的值或时序特征;在不注入故障时,这些模块不起作用。“破坏”分为串行破坏技术和并行破坏技术。串行破坏又分为简单串行破坏和复杂串行破坏两种,前者是在单一对应的驱动信号和被驱动信号之间加入一个破坏模块来改变原先两个信号之间的关系;后者则是改变一系列驱动信号与被驱动信号之间的关系,这样可以注入更多的故障。并行破坏就是在原来的驱动信号源上再加上一个由破坏模块产生的驱动信号,而被驱动信号最终由哪个驱动信号来驱动,则由一个决断函数来裁定。

“破坏”模型如图5-21所示。(www.xing528.com)

并行破坏相对于串行破坏来说有两个很大的缺陷:①实现非常复杂,因为需要转换所要影响的信号的数据类型为决策函数支持的类型,这样才能用决策函数来进行决策;②能注入的故障类型更少,因此,其应用价值不大。串行破坏技术是一种有效的故障注入方法。

图5-21 “破坏”模型

(a)简单串行破坏;(b)复杂串行破坏;(c)并行破坏

2.基于“突变”的故障注入技术

“突变”技术就是设计与模型中原始的功能模块具有相同接口的“突变”模块,在需要注入故障时激活“突变”模块,用其直接替换掉原始模块从而注入故障。“突变”的实现方式有3种:VHDL的配置机制、守护模块和case语句。

早期的“突变”技术一般都是通过VHDL的配置机制来实现。在这种情况下,构造体和组件的绑定是静态的。也就是说,一个特定的配置编译后,在仿真期间,构造体和组件的关系是不能改变的。因此,这种方法只能注入永久故障。

守护模块(Guarded Blocks)的方法是仿真过程中在需要注入故障时暂停仿真,把当前的仿真信息(仿真时间、所有信号和变量的值)保存到特定文件中,然后使用故障配置代替原来的状态,继续仿真。同样可以使用这种方法来结束故障注入,恢复无故障仿真。这样可以注入永久、暂态和间歇故障。但是这种方法存在一个很大的缺陷:两次仿真时间的时间开销(保存和恢复仿真状态)很大。

用case语句来设计“突变”模块,通过改变目标对象中各功能模块的设计结构,将模块正常的功能和进行故障注入的功能集中于一个组件中实现。具体方法是:“突变”模块实体对应的结构体使用if和case结构来设计,每个功能(包括目标模型自身正常的功能和能注入一定故障的功能)各自对应一个case部分。出于这种目的,在实体的接口中,要加入一个新的输入端口(selection),用于选择激活哪一个case对应的功能。另一个需要进行相应改动的地方,是在更高层次的模型上声明一个故障选择信号(fault-selection),这个信号将被映射到“突变”组件的selection端口。进行仿真时,通过仿真命令,可以改变fault-selection的值,从而控制“突变”模块的行为。这种方法可以像使用仿真命令一样注入相同时间特征的故障:瞬态故障、永久故障和间歇故障。

国外具有典型代表性的模拟故障注入工具有基于VHDL建立的MEFISTO、VERIFY等,前者是最早开发的模拟故障注入工具,不支持故障模型,后者通过引入新的故障描述方法,对故障模型的支持很好。国内在模拟故障注入方面的典型代表是中科院,为“龙芯一号”处理器建立RTL级模型,可以实现连续快速的故障注入。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈