在CoCoSim中,提到将Simulink模型转换为Lustre模型。除了这种方式外,Simulink模型还能转换为其他模型检测工具的输入模型,比如DIVINE。下面将介绍2012年的一份相关工作。
在面对复杂的系统行为和时序属性验证时,单纯依靠Simulink自身的功能难以实现全面深入的验证。DIVINE是一款用于离散分布式系统的显式状态LTL线性时序逻辑模型检查和可达性分析工具。相较于符号模型检查工具,显式状态模型检查在分布式内存环境中具有更好的可扩展性。
参考
详细内容,可参考Barnat, Jiri & Beran, Jan & Brim, Luboš & Kratochvíla, Tomas & Ročkai, Petr. (2012). Tool Chain to Support Automated Formal Verification of Avionics Simulink Designs. 10.1007/978-3-642-32469-7_6.
。
Simulink 模型转换为 DIVINE 模型的方法
将Simulink模型转换为DIVINE模型主要包括中间语言转换、生成符合CESMI接口的代码以及与DIVINE工具集成等步骤:
中间语言转换
为了实现Simulink模型到DIVINE模型的转换,首先需要将Simulink模型转换为一种特定的中间语言。这种中间语言是一种适用于描述同步数据电路的EDS嵌入式领域特定编程语言,基于C++实现。
在转换过程中,会由专门的编译器处理Simulink设计,生成中间语言的代码。该中间语言支持创建块和块之间的连接,其中块分为原子块和复合块。原子块的实现需要用C++代码编写基本操作。
复合块则对应实际的数据流程序或子程序,并且复合块可以作为构建更复杂复合块的基础,从而轻松实现模块化设计。在Simulink模型转换中,复合块自然对应 Simulink中的子系统以及整个系统设计,很好地保留了Simulink模型的层级结构和功能模块划分。
生成符合CESMI接口的代码
生成中间语言代码后,下一步是将其编译为符合 CESMI(Common Explicit-State Model Interface,通用显式状态模型接口)规范的共享对象。这一步骤通过标准的C++编译器完成。CESMI接口对于DIVINE工具来说,它定义了模型检查工具与待验证模型之间的交互方式。
CESMI接口要求在二进制文件中定义一系列必要的函数,以支持DIVINE对模型的解读和验证。这些函数包括:
- 初始状态函数:一个无参函数,用于提供模型的初始状态,是DIVINE进行状态搜索的起点。
- 后继状态函数:一个从状态到状态集合的函数,能够根据当前状态计算出所有可能的后续状态,为DIVINE遍历系统状态空间提供支持。
- 接受状态和目标状态判断函数:两个一元布尔函数,分别用于判断一个状态是否为接受状态和目标状态,这服务于LTL模型检查中确定系统是否满足特定属性。
此外,如果要在LTL验证中让DIVINE内部计算属性自动机,还需要扩展基本的 CESMI接口,增加用于评估LTL公式中使用的原子命题在各个系统状态下有效性的函数。通过生成符合CESMI接口的代码,确保了转换后的模型能够被DIVINE工具正确识别和处理,为后续的验证工作提供基础。
与DIVINE工具集成
在获得符合CESMI接口的共享对象后,就可以将其与DIVINE工具进行集成,开展模型验证工作。