虚拟原型设计:从建模到应用的全面解析
1. 虚拟原型的软件镜像加载
在虚拟原型设计中,将软件的二进制镜像加载到芯片的内存里是很重要的。通常,MPSoC架构有着复杂的内存层次结构,包含ROM、SRAM、DRAM、FLASH等不同类型的内存。编译和链接后得到的二进制镜像分为只读(RO)和读写(RW)两个部分。RO部分包含仅用于读操作的代码和数据,通常加载到ROM中;RW部分包含可读写的数据,在执行前存储在ROM中,之后从ROM初始化到RAM里。
二进制镜像的结构由区域和输出段的数量、加载和执行时这些区域和段在内存中的位置来定义。每个输出段包含一个或多个输入段,输入段是编译后目标文件中的代码和数据信息。
镜像区域在加载时会被放置在系统内存映射中。在镜像执行前,一些区域会被移动到执行地址,部分内存会被清零,形成ZI(零初始化)段。因此,内存映射有加载视图和执行视图两种不同的视图。加载视图定义了镜像执行前各段在加载时的内存地址,执行视图描述了镜像执行时各段的地址。
镜像的内存映射在链接阶段指定。对于加载和执行段较少的软件镜像,可以使用命令行选项进行链接;对于更复杂的情况,则使用分散加载描述文件。分散加载描述文件是一个文本文件,它指定了段到区域的分组信息以及区域在内存映射中的放置地址,还能将数据放置在内存映射的精确地址,以访问内存映射的I/O和外设,同时也用于定义堆栈和堆的地址。
例如,对于ARM处理器,有如下的分散加载描述文件示例,它定义了一个加载区域(ROM_LOAD)和两个执行区域(ROM_EXEC和RAM):
- 整个程序(包括代码和数据)在ROM_LOAD处被放置在ROM中。
- RO代码将从ROM_EXEC执行,其执行地