在 Simulink 中生成 SystemC TLM 虚拟原型

文摘   2024-11-07 07:00   上海  

示例重点介绍了使用 Simulink® Coder™ 或 Embedded Coder® 的 tlmgenerator 目标从 Simulink® 模型生成 SystemC™/TLM 组件时“定时”定时模式的使用。


在 Simulink® 模型中,数据在源和接收器之间的移动由信号采样率和集中式定时求解器控制。 在 SystemC/TLM 模型中,数据接收器和源之间的交互由 SystemC 仿真内核控制,时间通过 SC_THREADs 推进,通过等待调用协同将控制权移交给另一个线程。


对于定时 SystemC/TLM 仿真,模型遵循注释的通信接口和处理延迟。 对于松散定时的仿真,模型不允许线程在时间上“提前运行”,因此不存在与其他线程的时间感不同的“本地时间”的概念。相反,发起者会立即同步 TLM 事务返回的延迟,并且通常执行非零定时等待,以便执行轮询循环和按需同步。模拟时间将在松散定时模型中推进,以反映系统中的通信、处理和轮询延迟。除了像无定时系统一样正确同步数据移动之外,该模型的目标是进行功能正确的模拟,并具有快速的挂钟执行时间。这种速度允许在 SystemC/TLM 架构模型上进行近乎实时的软件开发。


对于此示例,我们使用 FIR 滤波器的 Simulink 模型作为 SystemC/TLM 生成的基础。运行此演示所需的产品:SystemC 2.3.1(包括 TLM 库)

对于代码验证,请在 Linux® 上的路径中安装兼容的 GNU 编译器 gcc,或在 Windows® 上的路径中安装 Visual Studio® 编译器

注意:示例包括代码生成构建过程。Simulink 不允许您在 MATLAB 安装区域中构建程序。如有必要,请在开始任何构建之前更改为不在 MATLAB 安装区域中的工作目录。
此示例使用:
  • HDL 验证器
  • 用于 HDL 验证器的 ASIC 测试台
  • Simulink Coder
  • Simulink

此示例显示如何配置 Simulink® 模型以使用 Simulink Coder™ 或 Embedded Coder® 的 tlmgenerator 目标生成 SystemC™/TLM 组件。
1. 打开预配置模型
要打开 FIR 滤波器模型,请单击“打开模型”按钮。


2. 将 Simulink Coder 目标设置为 TLM Generator
a. 在模型窗口中选择“仿真”>“模型配置参数”,打开“配置参数”对话框。
b. 在“配置参数”对话框中,选择左侧窗格中的“代码生成”视图。
c. 在“系统目标文件”下,单击“浏览”以选择 TLM Generator 目标。您可以选择 tlmgenerator_grt.tlc 以使用 Simulink Coder,或选择 tlmgenerator_ert.tlc 以使用 Embedded Coder 进行 HDL 代码生成。对于此示例,选择 tlmgenerator_grt.tlc。


3. 打开 TLM Generator 视图
在“配置参数”对话框中,选择左侧窗格中的 TLM Generator 视图。

TLM Generator 视图有五个选项卡:
  • TLM 映射
  • TLM 处理
  • TLM 时序
  • TLM 测试台
  • TLM 编译

您需要在每个窗格中设置不同的生成器选项。

4. 选择 TLM 映射选项
在 TLM 映射选项卡中,套接字映射允许您选择用于输入数据、输出数据和控制的套接字数量。选择选项,用于输入数据、输出数据和控制的三个独立 TLM 套接字。

TLM 套接字选项允许您为生成的 TLM 组件定义三个不同的内存映射。


对于此示例,请为输入和输出数据套接字选择以下内容:
  • 自动生成的输入和输出数据套接字内存映射
  • 每个数据套接字的单独输入和输出地址偏移量。此选项生成一个 TLM 组件,每个模型输出都有一个读取寄存器,每个模型输入都有一个写入寄存器,并带有单独的地址。每个 Simulink 模型输入都绑定到其相应的写入寄存器,每个输出都绑定到其相应的读取寄存器。

您可能考虑的其他内存映射选项包括:
  • 无内存映射:此选项生成一个只有一个读取寄存器和一个写入寄存器的 TLM 组件,没有任何地址。Simulink 模型输入绑定到写入寄存器,输出绑定到读取寄存器。
  • [自动生成的内存映射] 单个输入和输出地址偏移:此选项生成一个 TLM 组件,该组件只有一个读取寄存器和一个写入寄存器,每个寄存器都有一个地址。Simulink 模型输入绑定到写入寄存器,输出绑定到读取寄存器。

当您生成具有内存映射的组件时,您可以添加命令和状态寄存器、测试和设置寄存器以及可调参数寄存器。
对于此示例,为控制 TLM 套接字选择以下内容:
  • 在内存映射中包含命令和状态寄存器。命令和状态寄存器允许您在 SystemC 仿真期间写入命令和读取状态;例如,手动缓冲或缓冲状态。
  • 在内存映射中包含可调参数寄存器。可调参数寄存器允许您读取或写入可调参数值。

虽然在本示例中未使用,但当多个启动器在 SystemC 仿真期间访问组件时,测试和设置寄存器可用作互斥锁。

5. 选择 TLM 处理选项
在 TLM 生成窗格中,选择 TLM 处理选项卡。算法处理和接口处理选项允许您为生成的 TLM 组件定义不同的缓冲和处理行为。


算法执行选项包括:
  • SystemC 线程:阶跃函数算法在其自己的独立 SystemC 线程中执行。
  • 回调函数:阶跃函数算法在从接口调用的回调函数中执行。
  • 周期性 SystemC 线程:阶跃函数算法在其自己的时间周期性独立 SystemC 线程中执行。

阶跃函数计时由算法阶跃函数计时 (ns) 字段中的值确定。算法计时通过线程中的 wait() 进行计数。
对于此示例,选择 SystemC 线程并在算法阶跃函数计时字段中输入 100。
接口处理选项:
  • 在生成的 TLM 组件上创建中断请求端口:此选项创建一个 bool 类型的中断端口,每次处理一组输入时都会触发该端口。

对于此示例,选择或输入以下选项:
  • 选择在生成的 TLM 组件上创建中断请求端口。

6. 选择 TLM 时序选项
选择 TLM 时序选项卡。接口时序部分允许您定义组件输入/输出接口和处理线程的时序。

对于此示例,输入和输出延迟通过接口中的 wait() 进行计数。为输入数据接口时序、输出数据接口时序和控制接口时序的每个事务设置 5ns 的时间值。

7. 选择 TLM 测试台视图
选择 TLM 测试台选项卡。TLM 生成器目标可以与 TLM 组件一起生成独立的 SystemC/TLM 测试台,以在 TLM 发起程序/目标对的上下文中验证生成的算法。TLM 测试台视图为生成和执行测试台代码时提供运行时选项。
使用 TLM 测试台选项,您可以:

  • 选择在 SystemC/TLM 执行期间查看回显到命令窗口的详细消息,包括 TLM 事务和同步消息。
  • 指示测试台应在带或不带时序注释的情况下执行。
  • 指示启动器是否控制在寄存器和缓冲区之间移动输入和输出数据集,或者组件是否自动执行移动。

对于此示例,选择生成测试台,运行时计时模式选择带时序,输入缓冲区触发模式和输出缓冲区触发模式选择自动。
成功为组件和测试台生成代码后,验证 TLM 组件按钮将启用。验证 TLM 组件执行以下操作:
  • 使用 make 和生成的 makefile 构建生成的代码。
  • 运行 Simulink 以捕获输入刺激和预期结果。
  • 将 Simulink 数据转换为 TLM 向量。
  • 运行独立的 SystemC/TLM 测试台可执行文件。
  • 将 TLM 结果转换回 Simulink 数据。
  • 执行数据比较。
  • 为任何数据比较错误的信号生成图形窗口。

生成的文件的编译假定在 Linux® 上的路径中存在 make 和兼容的 GNU 编译器 gcc,或在 Windows® 上的路径中存在 Visual Studio® 编译器。

8. 选择 TLM 编译视图
选择 TLM 编译选项卡。此窗格提供选项来控制用于编译生成代码的 makefile 的生成。


编译器选项:
SystemC 和 TLM 包含库路径选项允许您指定 makefile 可以在哪里找到 SystemC 和 TLM 安装。默认值允许您使用环境变量,以便对 SystemC 或 TLM 安装的更新不需要更新 Simulink 模型。您可以在调用 MATLAB 之前设置环境,或使用 MATLAB setenv 命令。
对于此示例,这些是使用位于 /tools 中的标准 OSCI 安装测试的环境变量值:
  • SYSTEMC_INC_PATH=/tools/systemc-2.3.0/include
  • SYSTEMC_LIB_PATH=/tools/systemc-2.3.0/lib-linux64
  • SYSTEMC_LIB_NAME=libsystemc.a (Linux) 或 systemc.lib (Windows)
  • TLM_INC_PATH=/tools/systemc-2.3.0/include

工具链:
在 Windows 上,当同一台计算机上安装了多个版本的 Microsoft Visual Studio 时,此选项允许您选择编译器工具链。在 Linux 上,此选项固定在 gcc 上。
组件命名:
此选项允许您将自己的标签添加到生成的组件的名称中。生成的组件名称根据以下情况构建:
  • 如果指定了用户标签:modelname_usertag_tlm
  • 如果用户标签字段为空:modelname_tlm

对于此示例,请输入 intro 作为用户标签。

9. 选择报告
在左侧窗格中选择报告。对于此示例,选择创建代码生成报告和自动打开报告。这些选项在组件生成期间生成 html 报告。代码生成报告详细说明了每个生成文件的内容。

10. 保存 TLM 生成器选项
单击确定以应用这些设置并退出配置参数对话框。
11. 构建模型
在模型窗口中,右键单击 DualFilter 块,然后在上下文菜单中选择 C/C++ 代码 > 为该子系统生成代码以开始 TLM 组件生成。

或者,您可以在 MATLAB 命令窗口中执行以下命令:
>> slbuild('tlmgdemo_intro/DualFilter');
在执行过程中,系统将提示您选择可调参数。每个系数的下拉列表允许您选择变量的存储类。存储类选项包括:
  • Inlined - 内联参数不可调。
  • SimulinkGlobal - SimulinkGlobal 变量可调。

TLM 生成模型不支持 ExportedGlobal、ImportedExtern 和 ImportedExternPointer。

此示例已选择 Simulink Global 选项。单击 Build。当您看到 MATLAB 命令窗口中出现以下消息时,TLM 生成已完成:
### Starting Simulink Coder build procedure for model: DualFilter### Successful completion of Simulink Coder build procedure for model: DualFilter
Build Summary
Top model targets:
Model Build Reason Status Build Duration================================================================================================DualFilter Information cache folder or artifacts were missing. Code generated. 0h 0m 20.371s
1 of 1 models built (0 models already up to date)Build duration: 0h 0m 24.096s
12. 打开生成的文件
通过单击生成的报告或 MATLAB 编辑器中的链接,在 MATLAB Web 浏览器中打开生成的文件(生成的文件和报告位于您当前的工作目录中):
  • DualFilter_VP/DualFilter_intro_tlm_doc/html/DualFilter_codegen_rpt.html
  • DualFilter_VP/DualFilter_intro_tlm/DualFilter_intro_tlm.xml
  • DualFilter_VP/DualFilter_intro_tlm/include/DualFilter_intro_tlm_def.h
  • DualFilter_VP/DualFilter_intro_tlm/include/DualFilter_intro_tlm.h
  • DualFilter_VP/DualFilter_intro_tlm/src/DualFilter_intro_tlm.cpp
  • DualFilter_VP/DualFilter_intro_tlm_tb/src/DualFilter_intro_tlm_tb.h
  • DualFilter_VP/DualFilter_intro_tlm_tb/src/DualFilter_intro_tlm_tb.cpp
  • DualFilter_VP/DualFilter_intro_tlm_tb/src/DualFilter_intro_tlm_tb_main.cpp

13. 验证生成的代码
a. 在模型窗口中选择“仿真”>“配置参数”,打开“模型配置参数”对话框。
b. 在“配置参数”对话框中,选择“TLM 生成器”视图,然后选择“TLM 测试台”选项卡。
c. 在“TLM 测试台”窗格中,单击“验证 TLM 组件”,以运行生成的测试台。

或者,您可以在 MATLAB 命令窗口中执行以下命令:
verifyTlmgDemoModel('intro')
此验证步骤执行以下操作:
  • 构建生成的代码。
  • 运行 Simulink 以捕获输入刺激和预期结果。
  • 将 Simulink 数据转换为 TLM 向量。
  • 运行独立的 SystemC/TLM 测试台可执行文件。
  • 将 TLM 结果转换回 Simulink 数据。
  • 执行数据比较。
  • 为任何数据比较错误的信号生成图形窗口。

14. 查看执行日志
生成测试台的选项允许您查看测试台启动器线程如何与目标交互和同步。在日志末尾查找比较结果并验证数据比较是否成功。
这就是 TLM Generator 入门示例的全部内容。
### Comparing expected vs. actual results.Data successfully compared for signal tlmg_out1.Data successfully compared for signal tlmg_out2.### Component verification completed

软硬件协同设计 HW-SW Co-Design
欢迎后台留言,AI 客服全天在线。脱离物理硬件,开发测试和调试软件。基于虚拟原型的软硬件协同设计,提前一年实现产品上市创收,降低一半开发时间。
 最新文章