文档

SIL和PIL模拟

什么是SIL和PIL模拟?

使用嵌入式编码器®,您可以运行您的模型的软件在环(SIL)和处理器在环(PIL)模拟。这些模拟为顶层模型或模型的一部分生成源代码。SIL模拟在您的开发计算机上编译并运行生成的代码。PIL模拟在您的开发计算机上交叉编译源代码,然后下载并在目标处理器或等效指令集模拟器上运行目标代码。

与SIL和PIL模拟,您可以:

  • 测试您的模型和生成的代码在数值上是否等价。

  • 观察代码覆盖率。

  • 执行代码执行分析。

为什么使用SIL和PIL

通过SIL和PIL,可以尽早测试和修复缺陷。例如,您可以在普通模式下对系统组件建模和测试。然后,您可以在运行编译生成代码的SIL或PIL模拟中重用您的测试套件。为了检查数值等效性,您比较正常和SIL或PIL模拟结果。你不需要离开Simulink金宝app®环境来测试在单独的基础设施上生成的代码。

这个表描述了你可以使用SIL和PIL的情况。

情况 使用
通过重用为常规模式模拟开发的测试向量来验证生成(或遗留)代码的数值输出,测试模型和生成代码之间的数值等价性。看到SIL/PIL经理验证工作流程测试两个等效模拟(金宝app仿真软件测试) 银和公益诉讼

收集生成代码的度量:

银和公益诉讼
达到IEC 61508, IEC 62304, ISO 26262,或DO-178认证。看到IEC认证套件参考工作流程概述(IEC认证套件)和集成过程输出的测试(做资格工具包)。 银和公益诉讼
没有目标硬件,找一个方便的PIL替代方案。

对于目标硬件,例如评估板或指令集模拟器:

  • 验证特定于目标的代码的行为,例如,代码替换优化和遗留代码。看到什么是代码替换?什么是代码替换定制?

  • 优化代码的执行速度和内存占用。在该表中,请参阅有关收集执行分析和堆栈分析指标的信息。

  • 研究编译器设置和优化的影响,例如偏离ANSI®C溢出的行为。

正常的模拟技术不考虑硬件施加的限制和需求,例如有限的内存资源或特定于目标的优化代码的行为。


有关在特定目标上运行PIL模拟的信息,请参阅示例自定义目标(金宝app仿真软件编码器)。

公益诉讼

请注意

SIL和PIL模拟模式不是为减少模型模拟时间而设计的。如果您想加速模型的模拟,请使用快速加速模式。有关更多信息,请参见加速度是什么?(金宝app模型)。

SIL和PIL模拟如何工作

在SIL或PIL模拟中,会为顶级模型或模型的一部分生成代码。使用SIL,可以为开发计算机编译这些代码并在其上执行。使用PIL,代码可以针对目标硬件进行交叉编译,并在目标处理器上运行。

通过一个通信通道,Simulink将刺激信号发送到您计算机上的代码金宝app或目标处理器上的每个模拟样本间隔。

  • 对于顶级模型,Simulink使用金宝app来自基础或模型工作空间的刺激信号。

  • 如果您只指定了模型的一部分以SIL或PIL模式进行模拟,那么模型的一部分将保留在Simulink中,并且不会为模型的这一部分生成代码。金宝app通常,您可以配置模型的这一部分,为在硬件上执行的软件提供测试向量。模型的这一部分可以表示算法的其他部分或算法运行的环境。

当您的计算机或目标处理器接收到来自Simulink的信号时,处理器执行一个示例步骤的SIL或PIL算法。金宝appSIL或PIL算法通过通信通道将此步骤中计算的输出信号返回给Simulink。金宝app仿真的一个样本周期完成后,Simulink继续进行下一个样本周期。金宝app这个过程不断重复,模拟过程不断进行。SIL和PIL模拟不会实时运行。在每个样本周期,Simulink和目标代码交换金宝appI/O数据。

SIL和PIL模拟的比较

SIL或PIL模拟的类型 在SIL模拟中发生了什么 PIL模拟发生了什么

指定通过:

  • 顶级模特模拟模式

  • 模型模拟模式参数

  • 在开发计算机上测试生成的源代码的行为。仿真不会测试针对目标硬件编译的代码,因为代码是针对开发计算机编译的(与目标不同的编译器和处理器体系结构)。

  • 生成的产品代码作为独立的过程在开发计算机上编译和执行,独立于MATLAB®的过程。

  • 执行是主机/主机和非实时。

  • 测试您打算在实际目标硬件或指令集模拟器上部署到生产环境中的目标代码。

  • 在开发计算机上,为目标生成交叉编译的产品代码。目标代码下载并在目标处理器或指令集模拟器上执行。

  • 执行是主机/目标和非实时的。

使用从子系统创建的SIL或PIL块。
  • 仿真通过s函数运行编译后的目标代码。函数与在开发计算机上作为独立应用程序执行的目标代码进行通信。SIL块的执行独立于MATLAB程序。

  • 执行是主机/主机和非实时。

  • 在开发计算机上通过s函数运行交叉编译的目标代码。函数与在目标处理器或指令集模拟器上作为独立应用程序执行的目标代码进行通信。

  • 执行是主机/目标和非实时的。

SIL和PIL的代码接口

例如,当您为单个可部署组件执行顶层模型或右键单击子系统构建时,您将生成独立的代码。您可以将独立的代码编译并链接到独立的可执行文件中,或者将其与其他代码集成。有关独立代码接口的更多信息,请参见配置模型入口点函数的代码生成(金宝app仿真软件编码器)。

当您为引用的模型层次结构生成代码时,软件会为顶层模型和名为a的库模块生成独立的可执行代码模型参考目标对于每个引用的模型。当代码执行时,独立的可执行文件调用适用的模型引用目标来计算引用的模型输出。有关更多信息,请参见建立模型参考目标(金宝app仿真软件编码器)。

要将生成的代码与遗留代码集成,请使用独立代码,因为独立代码接口是有文档记录的。

请注意

SIL和PIL模拟不提供对自定义代码接口的直接支持。金宝app你可以将这些接口作为s函数合并到Simulink中,例如,使用遗留代码工具,金宝apps函数生成器,或手写代码。然后,您可以验证自定义代码使用SIL和PIL模拟。

该表提供SIL和PIL模拟生成的接口。

银/公益诉讼模拟 代码接口
顶级模特

SIL/PIL模拟生成独立的代码接口。如果代码存在,模拟调用模型的独立代码。如果代码不存在,模拟将生成独立的代码。

模型

如果你设置代码接口块参数顶级模特, SIL/PIL模拟生成独立的代码接口。仿真调用模型的独立代码(如果模型存在的话)。否则,仿真通过使用生成独立代码slbuild ('模型”)命令。

如果你设置代码接口块参数模型参考, SIL/PIL仿真生成模型参考代码接口。的仿真调用模型参考目标模型如果存在则阻塞。否则,仿真通过使用生成模型参考目标slbuild ('模型”、“ModelReferenceCoderTargetOnly”)命令。

SIL或PIL块 块使用独立的代码接口。

调度的考虑

信息
代数循环

在SIL和PIL模拟中有代数循环,但在正常模式模拟中没有:

  • 单输出/更新功能在代码生成中,优化可以引入代数循环,因为该选项通过组合输出和更新函数引入了直接馈通。

    单输出/更新功能与…不相容最小化代数循环的发生(在“子系统参数”对话框中配置参数>模型参考窗格)。最小化代数循环的发生允许代码生成通过在输出和更新函数之间划分生成的代码来消除代数循环,以避免直接馈通。

  • 如果您为虚拟子系统生成代码,则代码生成将子系统视为原子的,并相应地生成代码。结果代码可以改变模型的执行行为,例如,通过应用代数循环,并引入不一致的模拟行为。

    要为您的模型启用一致的模拟和执行行为,请将虚拟子系统声明为原子子系统。

有关更多信息,请参见:

在反馈循环中导出函数

如果您的模型有函数调用子系统,并且您导出了一个具有上下文相关输入(例如,反馈信号)的子系统,那么使用生成的代码进行SIL/PIL模拟的结果和模型的正常模式模拟的结果可能会不同。一种方法使SIL/PIL和正常模式模拟产生相同的结果是使用函数调用反馈锁块在您的模型中。您可以使上下文相关的输入变得上下文无关。

如果设置函数调用子系统的上下文相关输入,嵌入式编码器将生成警告上下文相关的输入配置参数为以下之一:

  • 启用所有为警告

  • 使用本地设置

  • 禁用所有

有关更多信息,请参见:

导入数据和函数定义

进口数据

在SIL和PIL模拟中,您可以使用信号、参数和数据存储来指定具有导入数据定义的存储类。模拟定义与以下相关的导入数据的存储:

  • 组件的根级别(在I/O边界上)的信号。

  • 基本工作空间或数据字典中的参数。对于模型工作区中的参数:

    • 顶级模型SIL/PIL和SIL/PIL块模拟定义存储。

    • 模型块SIL/PIL模拟没有定义存储。您必须定义存储并指定与MATLAB值匹配的初始值。

  • 全球数据存储。

SIL和PIL模拟不定义其他导入数据的存储。例如,模拟没有定义与以下相关的导入数据的存储:

  • 内部信号(不在I/O边界上)

  • 本地数据存储

在这些情况下,通过被测试组件包含的定制代码或通过PIL定义存储rtw.pil.RtIOStreamApplicationFrameworkAPI。

另请参阅可调参数和SIL/PIL

GetSet定制的存储类

SIL和PIL模拟支持金宝appGetSet自定义存储类。SIL/PIL测试线束提供C定义得到在模拟期间使用的函数。有关更多信息,请参见通过使用存储类GetSet的函数访问数据

类型的自定义存储类其他

为自定义存储类启用SIL和PIL支持金宝app类型被设置为其他,为自定义存储类创建自定义属性类,并将自定义属性类与布尔属性关联,金宝appSupportSILPIL,设置为真正的

< Simulink. classdef CSCOtherA金宝appttributesCustomStorageClassAttributes properties(PropertyType = 'logical scalar') SupportSILPIL = true; end end

有关自定义属性的详细信息,请参见通过编写TLC代码进一步定制生成的代码通过为存储类编写TLC代码精细控制数据表示

要构建SIL或PIL应用程序接口,代码生成器调用DataAccessClassAccess函数来获取所需的信息。代码生成器将提取的信息存储在构建文件夹中的构建构件中。

对于未分组的自定义存储类:

  • 代码生成器调用DataAccess请求参数的值为定义声明布局内容地址,或

  • 代码生成器使用返回的字符串DataAccess(记录,“定义”,“”,“”)在SIL或PIL应用程序中定义变量,如果其中一个为真:

    • 信号或参数具有进口数据范围。

    • 模型使用模型引用代码接口。

    • 模型使用顶级模型代码接口,EnableDataOwnership,老板属性不为空且不等于当前模型的名称

  • 代码生成器使用返回的字符串DataAccess(record, "declare", "", "")如果以下情况属实,可以在SIL或PIL申请中声明变量:

    • 模型使用顶级模型代码接口。

    • 信号或参数使用出口存储类。

    • EnableDataOwnership,或EnableDataOwnership老板属性为空或等于模型名称。

    • 将代码打包配置为不声明变量模型.h或包含的头文件模型.h

对于分组的自定义存储类:

  • 代码生成器调用DataAccess请求取值的论证布局地址,或

  • 代码生成器调用ClassAccess请求参数的值groupTypeDeclDefn

  • 必须提供分组类型(结构体)定义及走读生如果其中一个为真,则声明分组变量:

    • 信号或参数具有进口数据范围。

    • 模型使用模型引用代码接口。

    • 模型使用顶级模型代码接口,EnableDataOwnership,老板属性不为空且不等于当前模型的名称

    属性在与自定义存储类关联的头文件中提供定义和声明HeaderFile属性或自定义代码,通过模型.h文件。要在SIL或PIL应用程序中定义变量,代码生成器使用返回的字符串ClassAccess(记录,“groupTypeDeclDefn”)

  • 静态初始化的顺序可以是结构体如果数据范围为,则与生成的顺序不同的元素出口.当代码生成器查询时ClassAccess(记录,“groupTypeDeclDefn”),它临时用该值覆盖自定义存储类的数据初始化属性没有一个

为了确定SIL或PIL应用程序是否可以通过地址访问代码中的变量,代码生成器使用DataAccess(记录,"布局","","").为了在应用程序中创建在开发计算机和目标硬件之间传输输入或输出端口、可调参数或全局数据存储内存值的功能,代码生成器使用以下输出:

  • 数据访问(记录,"address", idx, reim)如果第一个返回的元素是标量向量row-mat,或col-mat

  • datataccess (record, "contents", idx, reim)(或数据访问(记录,"set", idx, reim)),如果第一个返回的元素是其他

代码生成器假设forrow-matcol-mat,矩阵分别以行主格式存储。该假设独立于模型其余部分的数组布局。代码生成器假设,如果由自定义存储类实现的存储的数组布局不同于模型的其余部分,那么与自定义存储文件关联的TLC文件将执行所需的转换。

您可以构造与自定义存储类类型相关联的自定义TLC文件其他执行其他函数(除了返回请求的代码片段)。例如,直接写入自定义文件或调用改变基本工作空间状态的MATLAB函数。如果您不总是想执行这些函数时DataAccessClassAccess都叫,用LibIsAccessingCustomDataForSILPIL(记录)TLC函数用于区分目标代码生成和构建SIL或PIL应用程序所需的代码片段请求。例如:

...LibIsAccessingCustomDataForSILPIL(record) %matlab functionWithSideEffects() %endif %return LibDefaultCustomStorageContents(record, idx, reim)…

另请参阅其他自定义存储类限制

AUTOSAR运行时环境

你可以使用顶级模型和模型块SIL/PIL和SIL/PIL块模拟,对AUTOSAR软件组件进行基于模型的测试。该软件将为AUTOSAR软件组件生成的代码与特定于基本组件的AUTOSAR运行时环境(RTE)进行链接,以创建测试应用程序。此应用程序测试由AUTOSAR软件组件进行的AUTOSAR API调用。

对于包含引用模型的顶级AUTOSAR软件组件,您可以运行top-model或模型块(代码接口设置为顶级模特SIL或PIL模拟。在模拟中,软件:

  • 在编译引用模型之前,生成AUTOSAR RTE头文件。

  • 为引用的模型编译提供RTE包含路径。

你也可以跑步模型块(代码接口设置为模型参考) SIL或PIL模拟的一个参考模型在顶级AUTOSAR SWC。在这种情况下,在运行模拟之前,必须构建父组件来生成RTE头文件。如果不构建父组件,则SIL或PIL模拟将失败。

相关的话题