Q. 可以使用FVP(Fixed Virtual Platform)测试代码的效率吗? 比如运行某些benchmark程序 Answer: 快速模型是程序员视角(Programmer's View)模型。PV模型在确保功能准确的基础上提供高速的硬件模拟。然而这样高度的抽象模型方法意味着在大多数情况下快速模型并不适用于测试代码效率。
Q. 在一个平台模型(Platform Model)里可以有多余一个的可视化(Visualization)组件吗?Answer: 不可以。现在可视化组件所使用的SDL库只允许每个仿真进程拥有一个可视化窗口。但是这一个窗口可以根据不同的目的动态的改变大小和分区。
Q. 在SystemC环境里可以初始化多个EVS(Exported Virtual Subsystems)吗?Answer: 从快速模型 7.1开始支持在一个SystemC仿真环境里初始化多个EVS。版本7.1之前是不支持这项特性的。
Q. 可以监视/跟踪PVBus的连接吗?Answer: 快速模型8.0以及之后版本 PVBusLogger组件可以用来跟踪PVBus 主(master)和从(slave)之间的传输并通过MTI(Model Trace Interface)显示这些信息。 以下是如何追踪传输的步骤: - 在PVBus主从端口之间加入PVBusLogger。这个组件可在sgcanvas的组件列表里找到(源文件位于${PVLIB_HOME}\LISA\PVBusLogger.lisa)
示例LISA+代码:
pvbuslogger : PVBusLogger();
master0.pvbus_m0_ => pvbuslogger.pvbus_s;
pvbuslogger0.pvbus_m => slave0.pvbus; - 使用MTI插件显示PVBusLogger产生的事件
MTIPDK里提供的GenericTrace示例插件可以显示这些事件:
isim_system --plugin $PVLIB_HOME/examples/MTI/GenericTrace/source/GenericTrace.so -C TRACE.GenericTrace.trace-sources=<component_path>.pvbuslogger.*
使用ListTraceSources插件可以列出模型里支持的跟踪源和相关描述,你可以从中选出你所感兴趣的跟踪源进行跟踪。仿真过程中注册的跟踪源越少,仿真速度越快。
为了方便使用,Cortex-A系列的模型默认在PVBus主端口(ext_bus)上包含一个内部的PVBusLogger。这样不需要重新编译模型就可以跟踪Cortex-A系列总线上的读写。
快速模型7.1以及之前版本 跟踪/监视PVBus连接可以使用一个监视组件。在“Fast Models Portfolio”里提供了一个实例监视组件。源文件位于 ${PVLIB_HOME}\LISA\PVBusMonitor.lisa 需要注意的是这个监视组件并不传播ACE(AXI Coherency Extensions)交通,所以不应该应用于ACE连接。
对性能的影响 PVBusLogger(启用跟踪状态)和PVBusMonitor切断了DMI(Direct Memory Interface)访问,这会严重影响仿真性能,所以应该只应用于调试。
Q. FLEXnet/FLEXlm 在安装模型以太网支持之后Windows点锁定许可(Node-locked license)检查失败Answer: 症状 当使用点锁定(绑定主机)的FlexLM许可,在为模型设置桥接网络(bridged netowrk)之后,运行模型的时候会报告主机ID和许可证不匹配的错误: ERROR: License check failed! No licences 'MaxCore_SystemGenerator' available. Hostid doesn't match license.
License files searched: ... Error Code : -9 这个问题也会出现在其他使用点锁定FlexLM许可认证机制的软件产品上。
原因 这是一个已知问题:在Windows下创建以太网桥接网络的会造成FlexLM报告主机ID改变。例如,在为模型创建以太网桥接网络之前,FlexLM的'hostid'应用会报告如下内容:
C:/> lmutil.exe hostid lmutil - Copyright (c) 1989-2008 Acresso Software Inc. All Rights Reserved. The FLEXnet host ID of this machine is "000c29600725"
在创建Windows以太网桥接之后'hostid'报告:
C:/> lmutil.exe hostid lmutil - Copyright (c) 1989-2008 Acresso Software Inc. All Rights Reserved. The FLEXnet host ID of this machine is "020c29600725"
注意开始的两个数字从'00'变成了’02‘ - 在某些情况下整个主机ID都可能不同。
FlexLM的主机ID是基于主机上的以太网MAC地址的,创建桥接网络会隐藏原来主机的MAC地址并产生新的MAC地址。
解决方法 有两种方案可以解决这个问题: 停用模型网络 方法是停用模型和物理网络之间的以太网MAC桥接。这会阻止模型和外界的网络连接。
移除以太网桥接: - 确保没有模型正在运行
- 用开始菜单(Start Menu)选择'控制面板'(Control Panel) -> ’网络连接‘(Network Connections)
- 在桥接网络里的每一个连接图标上点击右键,从弹出菜单上选择“移除桥接”(Remove from Bridge)
- 在ModelNetworking目录里运行'remove_all_adapters_32'来删除ARM TAP设备。
- 注意:在删除网络桥接的过程中网络连接可能会暂时被中断。之后当网络连接重新建立之后,主机IP地址可能会改变。
现在FlexLM的主机ID应该变回桥接之前的值,快速模型应该可以正常启动。
使用基于NAT的模型网络 这个方案使用基于NAT的模型网络以替代桥接网络。在这种配置下模型和主机共享一个外部IP。具体步骤请参考问题 “如何在Windows上配置快速模型和外部网络之间基于NAT的网络方案?”
Q. 如何在Windows上配置快速模型和外部网络之间基于NAT的网络方案?Answer: 使用”网络连接共享“(Internet Connection Sharing ICS)配置NAT 首先配置Windows环境: - 打开“控制面板” -> “网络连接”
- 选中连接外部网络的网络适配器。右击选择“属性”
- 选择“高级”,启用“允许其他网络用户通过此计算机连接来连接”(Allow other network users to connect through this computer's internet connection),选择模型的虚拟适配器(这个例子里使用ARM0)作为“家庭网络连接”(Home networking connection):
现在在模型内部配置网络。具体的配置依赖于在模型内运行的操作系统和软件环境,然而对于支持DHCP的系统应该可以自动获取到IP地址。
Q. 如何在LISA+组件里请求加载一个文件?Answer: 为了在LISA+组件里请求加载一个文件,需要在LISA+描述里添加如下内容: 1)属性 (Properties) 组件里需要定义如下两个属性: executes_software = true;
loadfile_extension = ".txt"; 2)行为 (Behaviours) 文件加载是通过"loadApplicationFile"行为完成的。 behaviour loadApplicationFile(const string& filename) 这个行为接受用户在调试器里选择的文件路径和文件名。LISA+语言并不指定这个行为应该包含的功能,其功能的实现根据模型的不同而不同。 3)资源(Resources)(可选) 步骤1和2已经可以完成在仿真的开始加载一个文件。然而,模型调试器(Model Debugger)不会弹出“加载文件窗口”除非有寄存器被指定为PC(Program Counter)。寄存器是在模型里的“资源”部分定义的,如下的代码可以用来指定一个寄存器为PC: REGISTER{type(int), bitwidth(32), is_program_counter(true)} PC; 在file_open.lisa文件里给出了请求加载文件的实例。"loadApplicationFile"打开指定的文件并把内容加载进内存。 关于LISA+语言的更多信息可以参考"LISA+ Language for Fast Models Reference Manual"
Q. 如何使用PVBusMapper组件?Answer: 简介 PVBusMapper组件是用来基于总线事务属性重新映射总线事务的。当一个总线事务发生在4KB大小的内存块里,PVBusMapper会创建一个快速通道(如果通道不存在),然后将之后所有的属于这4KB内存块并且有相同事务属性的总线事务通过这个通道发送出去。
如果还没有为一个到来的总线事务创建一个通道,remap行为会被调用。这个行为会分析到来的总线事务并决定如何映射。例如,你可以映射一个总线事务的地址或者属性或者两者都映射。
如下的例子展示了通道的创建,销毁和地址映射。
示例系统
这里提供的示例系统包含如下组件: - 系统时钟
- Cortex-A15x1 (可以替换成不同的CPU)
- 叫做"Remapper"的示例组件,它包含一个"PVBusMapper"组件
- 存储应用程序代码的ROM,Secure RAM和Non-Secure RAM
Remapper 组件 这个组件在我们的系统里是用来根据总线事务属性来映射总线事务的。本质上它像一个极其简化的外部MMU组件,只有一些基本的功能。这个组件可以在内部基于属性将总线事务映射到不同的端口。作为示例,如下是这个组件里所实现的"remap"行为:
// The callback behavious is passed a RemapRequest object containing all the // information about the transaction. Look at RemapRequest.h for more details // on the available API slave behavior remap( pv::RemapRequest& req_ ) : unsigned { printf("\nRemapper : Inside Remap Callback\n"); printf("\t : Obtaining transaction information....\n"); // Get the transaction attributes (RemapRequest member function) attributes = req_.getModifiableTransactionAttributes(); // Check if it is secure or non-secure bool non_secure = attributes->isNormalWorld(); address = req_.getOriginalTransactionAddress(); printf("\t : Address = 0x%08x\n",address); printf("\t : Security = %s\n",non_secure?"Non-Secure":"Secure"); if( non_secure ) { // if non-secure transaction translate address, PA = VA + Offset and output transaction on pvbus_m[0] port // Get the 4kb aligned base address for this transaction using // getPageBase() function and add offset to it. new_base_address = (req_.getPageBase() + Offset); // This function creates a channel and mapping // Only called once for a 4KB block. // NOTE: The base address passed as arguement must be 4kb aligned! req_.setRemapPageBase(new_base_address); printf("\t : Translating Non-Secure transaction....\n"); printf("\t : Incoming VA = 0x%08x\n",address); printf("\t : 4k block base address = 0x%08x\n",req_.getPageBase()); printf("\t : Offset = 0x%08x\n",Offset); printf("\t : New base address = 0x%08x\n",new_base_address); // Use pvbus_m[0] for this transaction printf("\t : Remapped to NSRAM (pvbus_m[1]) at physical address 0x%8x\n\n", new_base_address); return 0; } else { // if secure transaction no translation. Only output transaction on pvbus_m[1] port
// Use pvbus_m[1] for secure transactions // This is connected to SRAM. printf("\t : Remapped to SRAM (pvbus_m[1]), not address translation\n\n"); return 1; } } 对于Non-Secure总线事务: - 任何输入事务的地址被重新映射为事务的虚拟地址加上地址位移(位移值储存在位移寄存器里)。
- 然后基于第一个输入的事务为4KB内存块创建到特定地址的通道。
- 总线事务被路由到组件的pvbus_m[0]端口,这个端口最终连接到NSRAM(non-secure RAM)组件。
- 在通道创建之后,所有拥有相同属性的指向那个4KB内存块的总线事务就会通过这个通道被发送到NSRAM。
- 位移量可以通过写映射在内存地址0x40000000的寄存器被动态重置。由于位移量被改变,这个操作会销毁之前创建的任何映射或通道。
- 在下一个事务到来的时候通道会被重新创建,但是使用新的位移量来重新映射地址。
对于Secure总线事务: - 没有位移量被加到输入的虚拟地址。
- 所有Secure总线事务被路由到这个组件的pvbus_m[1]端口。
- 这个端口连接到SRAM(Secure RAM)组件。
Remapper组件包含了一个内存映射的读写寄存器来记录在NS访问中用到的位移量。当这个寄存器被修改,组件必须撤销目前所有创建的通道,这样才能创建采用新位移量的通道。 control.allBusMapChanging(); 撤销通道可以通过调用PVBusMapper控制端口上的"allBusMapChanging"行为来完成。这会撤销目前创建的所有通道。
应用程序
这个应用程序在Secure World(Supervisor mode监管模式)下启动并向地址0x10000004写入数值"0xCAFE"。remapper创建一个通道并路由这个值到SRAM。然后程序写另一个值(0xDEAD)到相同的地址。这次我们不会看到remap回调(callback)被调用因为安全总线事务访问内存范围(4KB)的通道已经被创建。
这之后程序转换到Non-Secure world并向相同的地址写入数据。因为属性已经改变,为之前事务创建的通道已经不再匹配,所以需要创建新的通道,"remap"行为被调用。
最后,CPU向位移寄存器写值改变位移量。这会触发所有的通道被移除,因此当产生到同一个地址的另一个总线事务的时候remap就会被调用,并且这次使用新的位移量来翻译。
运行示例 例子可以从这里下载 - 通过sgcanvas编译示例系统。
- 加载应用程序并运行模型
model_shell -m <PATH/TO/MODEL>.dll -a <PATH/TO/APP/CODE>.axf
Q. Fast Models Tools和Fast Models Portfolio都使用那些环境变量?Answer: Fast Models Tools和Fast Models Portfolio使用5个环境变量: - MAXCORE_HOME - 指向Fast Models Tools(System Generator)的安装目录
- MAXVIEW_HOME - 指向Fast Models Tools或者Model Debugger的安装目录
- PVLIB_HOME -指向Fast Models Portfolio(PV Model Library)的安装目录
- SYSTEMC_HOME - 指向Fast Models Tools中提供的SystemC的安装目录
- TLM_HOME - 指向Fast Models Tools中提供的SystemC TLM2.0的安装目录
这些环境变量通过以下方式设置: - 在Windows下安装程序会设置这些环境变量。
- 在Linux下,这些变量通过提供的安装脚本来设置。脚本程序位于:
<installation_directory>/etc/setup_all.sh for Bourne shells
<installation_directory>/etc/setup_all.csh for C shells
Q. 从哪里可以获得ARMv8-A的处理器模型?Answer: ARMv8-A处理器模型是快速模型库的一部分,请联系ARM以获取详细信息。 或者,ARM提供免费的基础模型(Foundation model)以供下载。 转自 :https://community.arm.com/docs/DOC-2543
|