SIL 和 PIL 仿真
什么是 SIL 和 PIL 仿真?
通过 Embedded Coder®,您可以运行模型的软件在环 (SIL) 和处理器在环 (PIL) 仿真。这些仿真为顶层模型或模型的一部分生成源代码。SIL 仿真在开发计算机上编译并运行生成的代码。PIL 仿真在您的开发计算机上交叉编译源代码,然后在目标处理器或等效的指令集仿真器上下载并运行目标代码。
通过 SIL 和 PIL 仿真,您可以:
测试您的模型和生成的代码在数值上是否相等。
观察代码覆盖率。
运行代码执行探查。
为什么使用 SIL 和 PIL
通过 SIL 和 PIL,您可以尽早测试和修复缺陷。例如,您可以在普通模式下对系统组件进行建模和测试。然后,您可以在运行编译的生成代码的 SIL 或 PIL 仿真中重用您的测试套件。要检查数值等效性,您可以比较普通仿真结果和 SIL 或 PIL 仿真结果。您不必离开 Simulink® 环境到另外一个基础架构上测试生成的代码。
下表说明了 SIL 和 PIL 的适用情形。
情形 | 使用 |
---|---|
通过重用为普通模式仿真开发的测试向量来验证生成(或现有)代码的数值输出,从而测试模型和生成代码之间的数值等效性。请参阅 SIL/PIL Manager Verification Workflow和Test Two Simulations for Equivalence (Simulink Test) | SIL 和 PIL |
为生成的代码收集指标:
| SIL 和 PIL |
(需要 IEC Certification Kit 许可证。) 根据 ISO 26262-6、IEC 61508-3、IEC 62304、EN 50128 和 EN 50657 功能安全标准定义的整个软件安全生命周期的要求,对生成的 C/C++ 代码执行验证和确认活动。有关 IEC Certification Kit 基于模型的设计工作流中 SIL 和 PIL 验证活动的详细信息,请参阅工件资源管理器 (IEC Certification Kit)中的嵌入式 C/C++ 应用程序的参考工作流 ( | SIL 和 PIL |
(需要 DO Qualification Kit 许可证。) 测试集成过程的输出,以满足 DO-178C 和 DO-333 安全标准中的相关目标。有关详细信息,请参阅集成过程输出的测试。在工件资源管理器中的 Model-Based Design Workflow for DO-178C ( | SIL 和 PIL |
在没有目标硬件的情况下,获得一个方便的 PIL 替代方案。 | SIL |
在具有目标硬件(例如评估板或指令集仿真器)的情况下,请执行以下操作:
普通仿真方法不考虑硬件的限制和要求,例如有限的内存资源或针对特定目标优化后的代码的行为。 有关在特定目标上运行 PIL 仿真的信息,请参阅 Simulink Coder™ 文档中的。 | PIL |
注意
SIL 和 PIL 仿真模式不是为了减少模型仿真时间而设计的。如果您要加快模型的仿真速度,请使用快速加速模式。有关详细信息,请参阅 What Is Acceleration?。
SIL 和 PIL 仿真的工作原理
在 SIL 或 PIL 仿真中,代码是为顶层模型或模型的一部分生成的。对于 SIL,此代码针对您的开发计算机编译并在其上执行。对于 PIL,代码针对目标硬件进行交叉编译,并在目标处理器上运行。
通过通信信道,Simulink 在仿真的每个采样间隔内向您的计算机或目标处理器上的代码发送激励信号。
对于顶层模型,Simulink 使用来自基础工作区或模型工作区的激励信号。
如果您指定仅模型的一部分在 SIL 或 PIL 模式下进行仿真,则模型的一部分将保留在 Simulink 中,并且不会为模型的此保留部分生成代码。通常,您需要配置模型的此部分来为在硬件上执行的软件提供测试向量。模型的此部分可以表示算法的其他部分或算法运行的环境。
当您的计算机或目标处理器接收到来自 Simulink 的信号时,处理器执行 SIL 或 PIL 算法,执行时间为一个采样步长。SIL 或 PIL 算法通过通信信道将在此步长内计算的输出信号返回到 Simulink。仿真的一个采样周期完成后,Simulink 进入下一个采样间隔。此过程不断重复,仿真持续进行。SIL 和 PIL 仿真不以实时方式运行。在每个采样周期内,Simulink 和目标代码会交换 I/O 数据。
SIL 和 PIL 仿真的比较
SIL 或 PIL 仿真的类型 | SIL 仿真中会发生什么 | PIL 仿真中会发生什么 |
---|---|---|
指定方式:
|
|
|
使用从子系统创建的 SIL 或 PIL 模块。 |
|
|
SIL 和 PIL 的代码接口
在您执行编译时(例如,为单个可部署组件执行顶层模型编译或右键点击子系统编译),生成独立代码。您可以编译独立代码并将其链接到独立可执行文件中,或将其与其他代码集成。有关独立代码接口的详细信息,请参阅为模型入口函数配置生成的 C 函数接口。
当您为引用模型层次结构生成代码时,软件会为顶层模型生成独立可执行代码,并为每个引用模型生成名为模型引用目标的库模块。当代码执行时,独立可执行文件调用适用的模型引用目标来计算引用模型输出。有关详细信息,请参阅 Build Model Reference Targets。
要将生成的代码与现有代码集成,请使用独立代码,因为独立代码接口是公开的。
注意
SIL 和 PIL 仿真不直接支持自定义代码接口。您可以将这些接口作为一个 S-Function 合并到 Simulink 中,例如,通过使用代码继承工具、S-Function Builder 或人工代码。然后,您可以使用 SIL 和 PIL 仿真来验证自定义代码。
下表提供了 SIL 和 PIL 仿真生成的接口。
SIL/PIL 仿真 | 代码接口 |
---|---|
顶层模型 | SIL/PIL 仿真生成独立代码接口。如果代码存在,仿真将调用模型的独立代码。如果代码不存在,仿真将生成独立代码。 |
Model 模块 | 如果将 Code interface 模块参数设置为 Top model,SIL/PIL 仿真将生成独立代码接口。仿真将调用模型的独立代码(如果存在)。否则,仿真将使用 如果将 Code interface 模块参数设置为 Model reference,SIL/PIL 仿真将生成模型引用代码接口。仿真调用 Model 模块的模型引用目标(如果存在)。否则,仿真将使用 |
SIL 或 PIL 模块 | 模块使用独立代码接口。 |
调度注意事项
项目 | Information |
---|---|
代数环 | 在 SIL 和 PIL 仿真中可能存在代数环,但在普通模式仿真中不存在:
有关详细信息,请参阅:
|
反馈回路中的导出函数 | 如果您的模型具有函数调用子系统,并且您导出了采用上下文相关输入(例如,反馈信号)的子系统,则使用生成的代码进行 SIL/PIL 仿真的结果和您的模型的普通模式仿真的结果可能有所不同。要使 SIL/PIL 仿真和普通模式仿真产生相同的结果,一种方法是在您的模型中使用 Function-Call Feedback Latch 模块。您可以使上下文相关输入变为与上下文无关。 如果您将 Context-dependent inputs 配置参数设置为 warning,Embedded Coder 会产生一条警告,指出导出函数调用子系统的上下文相关输入。 有关详细信息,请参阅:
|
导入的数据和其他的生成代码
SIL 或 PIL 仿真不会修改从模型生成的代码。如果使用导入的数据,SIL 或 PIL 仿真会生成支持 SIL 或 PIL 目标应用程序编译和链接所需的其他代码。生成的其他代码对应于您在模型中指定的接口。
本节介绍:
对于导入的数据,SIL 或 PIL 仿真什么时候定义存储,以及您什么时候必须定义存储。
SIL 或 PIL 仿真要为其生成其他代码的接口
SIL 或 PIL 仿真中的导入数据
在 SIL 和 PIL 仿真中,您可以使用信号、参数和数据存储,它们使用导入的数据定义来指定存储类。仿真会为与以下各项相关联的导入数据定义存储:
位于组件根级的信号(在 I/O 边界上)。
基础工作区或数据字典中的参数。对于模型工作区中的参数:
顶层模型的 SIL/PIL 和 SIL/PIL 模块仿真定义存储。
Model 模块 SIL/PIL 仿真不定义存储。您必须定义存储并指定与 MATLAB 值匹配的初始值。
全局数据存储。
SIL 和 PIL 仿真不会为其他导入的数据定义存储。例如,仿真不会为与以下项目相关联的导入的数据定义存储:
内部信号(不在 I/O 边界上)。请注意,如果内部信号的数据位于通过使用指针导入的结构体中,则仿真会定义存储。
本地数据存储。
在这些情况下,通过待测组件包含的自定义代码或通过 PIL rtw.pil.RtIOStreamApplicationFramework
API 来定义存储。
生成其他生成代码的接口
下表说明 SIL 或 PIL 仿真为接口生成其他代码的场景。
情况 | 详细信息 |
---|---|
GetSet 自定义存储类 | SIL 和 PIL 仿真支持 |
类型为 Other 的自定义存储类 | 要为 Type 设置为 classdef CSCOtherAttributes < Simulink.CustomStorageClassAttributes properties(PropertyType = 'logical scalar') SupportSILPIL = true; end end 有关自定义属性的详细信息,请参阅Further Customize Generated Code by Writing TLC Code和Finely Control Data Representation by Writing TLC Code for a Storage Class。 为了编译 SIL 或 PIL 应用程序接口,代码生成器调用相关联的自定义 TLC 文件中的 对于未分组的自定义存储类:
对于分组的自定义存储类:
为了确定 SIL 或 PIL 应用程序是否可以通过地址访问代码中的变量,代码生成器使用
代码生成器假设对于 您可以构造与 ... %case "contents" %if !LibIsAccessingCustomDataForSILPIL(record) %matlab functionWithSideEffects() %endif %return LibDefaultCustomStorageContents(record, idx, reim) ... 另请参阅其他自定义存储类限制。 |
AUTOSAR 运行时环境 | 您可以使用顶层模型和 Model 模块 SIL/PIL 和 SIL/PIL 模块仿真来执行 AUTOSAR 软件组件的基于模型的测试。该软件将为 AUTOSAR 软件组件生成的代码与特定于基本组件的 AUTOSAR 运行时环境 (RTE) 链接起来,以创建测试应用程序。此应用程序测试由 AUTOSAR 软件组件进行的 AUTOSAR API 调用。 对于包含引用模型的顶层 AUTOSAR 软件组件,您可以运行顶层模型或 Model 模块(Code interface 设置为 Top model)的 SIL 或 PIL 仿真。在仿真中,软件会执行以下操作:
您也可以对顶层 AUTOSAR SWC 内的引用模型运行 Model 模块(Code interface 设置为 Model reference)的 SIL 或 PIL 仿真。在这种情况下,在您运行仿真之前,必须编译父组件来生成 RTE 头文件。如果不编译父组件,SIL 或 PIL 仿真将失败。 |