在嵌入式系统和芯片设计领域,虚拟原型技术已经成为加速产品开发周期的关键工具。Arm Fast Models与SystemC的结合,为开发者提供了一套完整的处理器和外围设备建模解决方案。这种技术组合允许我们在RTL设计完成前数月就开始软件开发和系统验证,显著缩短了产品上市时间。
SystemC作为IEEE 1666标准定义的硬件建模语言,其核心价值在于事务级建模(TLM)方法。与传统的RTL仿真相比,TLM通过抽象通信细节(如信号边沿和时钟周期),将仿真速度提升了数个数量级。典型的TLM-2.0模型可以达到每秒数百万次事务的处理能力,而同等设计的RTL仿真可能只有每秒几十个时钟周期。
Fast Models是Arm提供的一套可配置、可扩展的处理器模型库,支持从Cortex-M系列微控制器到Cortex-A系列应用处理器的全系列Arm架构。这些模型使用LISA+语言(一种专门为处理器建模设计的领域特定语言)描述,可以通过SystemC Export功能导出为标准SystemC模块。
提示:LISA+语言允许在不了解处理器微架构细节的情况下,通过行为描述快速构建准确的周期近似模型。一个典型的LISA+模型包含指令集定义、流水线行为和存储器接口描述三大部分。
开始Fast Models开发前,需要准备以下环境:
安装完成后,需要设置关键环境变量:
bash复制export PVLIB_HOME=/opt/arm/fastmodels_11.31
export SYSTEMC_HOME=/opt/systemc-2.3.4
export LD_LIBRARY_PATH=$SYSTEMC_HOME/lib-linux64:$LD_LIBRARY_PATH
export PATH=$PVLIB_HOME/bin:$PATH
Fast Models支持两种授权方式:
验证许可证是否生效:
bash复制fm_system_check -v
正常输出应显示检测到的所有可用模型和组件。
EVS(Exported Virtual Subsystem)是将LISA+描述的完整平台导出为单一SystemC对象的技术。典型的EVS平台包含以下组件:
以Dhrystone测试平台为例,其拓扑结构为:
code复制[CPU Core] → [L2 Cache] → [AMBA AXI Bus] → [TZC-400] → [DDR Controller]
进入示例目录并执行构建:
bash复制cd $PVLIB_HOME/examples/SystemCExport/EVS_Platforms/EVS_Dhrystone/Build_Cortex-A75x1
make rel_gcc93_64
构建过程分为三个阶段:
注意:如果遇到"undefined reference to sc_main"错误,检查SystemC库路径是否正确。Windows平台需使用VS2019的x64 Native Tools Command Prompt。
启动Dhrystone基准测试:
bash复制./EVS_Dhrystone_Cortex-A75x1.x -a $PVLIB_HOME/images/dhrystone_v8.axf \
-C Base.bp.secure_memory=false \
--statistics-print-level=1
关键参数说明:
-a:指定加载的AXF映像文件-C:配置组件参数(此处禁用TZC-400安全检查)--statistics-print-level:控制性能统计输出详细程度常见问题处理:
-C Base.bp.secure_memory=falseSVP(SystemC Virtual Platform)采用模块化设计,每个组件独立导出为SystemC模块。与EVS相比,SVP具有以下优势:
以Cortex-A57示例平台为基础进行扩展:
bash复制cd $PVLIB_HOME/examples/SystemCExport/SVP_Platforms/SVP_Base/Build_Cortex-A57x1
make rel_gcc93_64
添加自定义外设的步骤:
cpp复制sc_core::sc_set_time_resolution(100, SC_PS); // 设置仿真时间精度
bash复制./SVP_Base_Cortex-A57x1.x -C Base.memory.ram_latency=4
bash复制./SVP_Base_Cortex-A57x1.x -C Base.cpu0.semihosting-enable=false \
-C Base.cpu1.semihosting-enable=true
Fast Models提供多种调试接口:
bash复制./platform.x -C cluster0.cpu0.cadi=on -C cluster0.cpu0.port=7000
bash复制arm-none-eabi-gdb
target remote :7000
bash复制-C cluster0.cpu0.trace=0x80000000-0x8000FFFF
bash复制./platform.x --statistics-period=1000000 --statistics-file=stats.log
cpp复制#include "mtl/mtl.h"
MTI_INIT();
MTI_TRACE_EVENT("CPU0", "BranchTaken");
某Tier1供应商使用Fast Models搭建的ADAS平台:
智能家居SoC开发中的典型应用:
bash复制-C Base.cpu0.power_model=on -C Base.cpu0.power_scale=0.75
cpp复制sc_core::sc_clock clk("clk", 10, SC_NS, 0.5, 1, SC_NS, true);
bash复制--profile=perf.data --profile-samples=1000000
将Fast Models集成到Jenkins流水线:
groovy复制pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'make -C $WORKSPACE/platform clean all'
}
}
stage('Run Test') {
steps {
sh '''#!/bin/bash
cd $WORKSPACE/platform
./platform.x -a $TEST_IMAGE.axf > test.log
grep "Test PASSED" test.log || exit 1
'''
}
}
}
}
关键考量:
通过LISA+添加自定义指令:
code复制OPERATION custom_op {
DECLARE {
GROUP entry = { cond_t cond };
}
BEHAVIOR {
if(cond == 0xF) {
SET_REG(0, GPR[1] + GPR[2]);
}
}
SYNTAX {
"custop" cond;
}
}
集成Verilator RTL模型的步骤:
cpp复制tlm::tlm_quantumkeeper qk;
qk.set_global_quantum(sc_time(10, SC_NS));
cpp复制socket->set_b_transport_cb([&](tlm_generic_payload& trans, sc_time& delay) {
if(trans.get_command() == TLM_READ_COMMAND) {
batch_read(trans, delay); // 合并多个读请求
}
});
bash复制-C Base.cpu0.timing_approximation=loose
检查CPU使用率:
分析瓶颈工具:
bash复制perf stat -e cycles,instructions,cache-references ./platform.x
典型I2C控制器集成问题排查:
cpp复制sc_signal<bool> scl, sda;
i2c_controller.scl(scl);
i2c_device.scl(scl);
bash复制-C Base.i2c0.timing_mode=strict
bash复制-C Base.i2c0.protocol_trace=on
Windows特有问题的解决方案:
路径问题:
DLL依赖:
控制台编码:
cpp复制_setmode(_fileno(stdout), _O_U16TEXT);