Answer:
快速模型是程序员视角(Programmer's View)模型。PV模型在确保功能准确的基础上提供高速的硬件模拟。然而这样高度的抽象模型方法意味着在大多数情况下快速模型并不适用于测试代码效率。
不可以。现在可视化组件所使用的SDL库只允许每个仿真进程拥有一个可视化窗口。但是这一个窗口可以根据不同的目的动态的改变大小和分区。
从快速模型 7.1开始支持在一个SystemC仿真环境里初始化多个EVS。版本7.1之前是不支持这项特性的。
快速模型8.0以及之后版本
PVBusLogger组件可以用来跟踪PVBus 主(master)和从(slave)之间的传输并通过MTI(Model Trace Interface)显示这些信息。
以下是如何追踪传输的步骤:
为了方便使用,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)访问,这会严重影响仿真性能,所以应该只应用于调试。
症状
当使用点锁定(绑定主机)的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'报告:
The FLEXnet host ID of this machine is "020c29600725"
注意开始的两个数字从'00'变成了’02‘ - 在某些情况下整个主机ID都可能不同。
FlexLM的主机ID是基于主机上的以太网MAC地址的,创建桥接网络会隐藏原来主机的MAC地址并产生新的MAC地址。
解决方法
有两种方案可以解决这个问题:
停用模型网络
方法是停用模型和物理网络之间的以太网MAC桥接。这会阻止模型和外界的网络连接。
移除以太网桥接:
现在FlexLM的主机ID应该变回桥接之前的值,快速模型应该可以正常启动。
使用基于NAT的模型网络
这个方案使用基于NAT的模型网络以替代桥接网络。在这种配置下模型和主机共享一个外部IP。具体步骤请参考问题 “如何在Windows上配置快速模型和外部网络之间基于NAT的网络方案?”
使用”网络连接共享“(Internet Connection Sharing ICS)配置NAT
首先配置Windows环境:
现在在模型内部配置网络。具体的配置依赖于在模型内运行的操作系统和软件环境,然而对于支持DHCP的系统应该可以自动获取到IP地址。
为了在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"
简介
PVBusMapper组件是用来基于总线事务属性重新映射总线事务的。当一个总线事务发生在4KB大小的内存块里,PVBusMapper会创建一个快速通道(如果通道不存在),然后将之后所有的属于这4KB内存块并且有相同事务属性的总线事务通过这个通道发送出去。
如果还没有为一个到来的总线事务创建一个通道,remap行为会被调用。这个行为会分析到来的总线事务并决定如何映射。例如,你可以映射一个总线事务的地址或者属性或者两者都映射。
如下的例子展示了通道的创建,销毁和地址映射。
示例系统
这里提供的示例系统包含如下组件:
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总线事务:
对于Secure总线事务:
Remapper组件包含了一个内存映射的读写寄存器来记录在NS访问中用到的位移量。当这个寄存器被修改,组件必须撤销目前所有创建的通道,这样才能创建采用新位移量的通道。
control.allBusMapChanging();
撤销通道可以通过调用PVBusMapper控制端口上的"allBusMapChanging"行为来完成。这会撤销目前创建的所有通道。
应用程序
这个应用程序在Secure World(Supervisor mode监管模式)下启动并向地址0x10000004写入数值"0xCAFE"。remapper创建一个通道并路由这个值到SRAM。然后程序写另一个值(0xDEAD)到相同的地址。这次我们不会看到remap回调(callback)被调用因为安全总线事务访问内存范围(4KB)的通道已经被创建。
这之后程序转换到Non-Secure world并向相同的地址写入数据。因为属性已经改变,为之前事务创建的通道已经不再匹配,所以需要创建新的通道,"remap"行为被调用。
最后,CPU向位移寄存器写值改变位移量。这会触发所有的通道被移除,因此当产生到同一个地址的另一个总线事务的时候remap就会被调用,并且这次使用新的位移量来翻译。
运行示例
例子可以从这里下载
Fast Models Tools和Fast Models Portfolio使用5个环境变量:
这些环境变量通过以下方式设置:
ARMv8-A处理器模型是快速模型库的一部分,请联系ARM以获取详细信息。
或者,ARM提供免费的基础模型(Foundation model)以供下载。