第3章 前置条件与验证环境准备:硬件模拟器配置、固件编译工具链、调试接口设置
适用场景
- 项目启动阶段:为新的 SoC 项目搭建标准化的固件-硬件协同验证环境。
- 环境重构期:现有验证环境缺乏统一的模拟器配置、编译流程或调试接入规范。
- 版本切换时:RTL 版本升级或地址映射变更后,需要同步更新验证前置条件。
前置条件
| 类别 | 具体要求 | 责任人 |
|---|---|---|
| 交付件 | RTL 代码冻结(至少功能冻结),SoC 地址映射 CSV 已签署,验证规范已归档 | DV 负责人 |
| 基础设施 | 64 位 Linux 工作站(内核 ≥ 4.18),具备 sudo 权限,磁盘余量 ≥ 200 GB | IT 运维 |
| EDA 工具 | VCS / QuestaSim(版本 ≥ 2020.3),已获得对应 license 并完成环境变量配置 | DV 工程师 |
| 工具链 | 目标架构交叉编译器(如 riscv64-unknown-elf-gcc / arm-none-eabi-gcc) | 固件工程师 |
| 文档 | SoC 程序员模型、中断号分配表、外设寄存器描述文件 | 架构师 |
操作步骤
- 硬件模拟器配置
- 创建模拟快照目录
snapshots/<tag_name>。 - 链接目标 GCC 运行时库(
libgcc.a)至模拟器 lib 目录。 - 应用平台特定修复补丁(如
patches/sim_fix_v3.patch)。
# 构建模拟器可执行文件 make -f sim.makefile build_sim TARGET_SOC=chip_v2 # 运行初始化快照 ./simv -snapshot ch3_init -l sim_init.log - 创建模拟快照目录
- 固件编译工具链
- 安装交叉编译器并验证版本:
riscv64-unknown-elf-gcc -v。 - 创建项目级 CMake 工具链文件
toolchain.cmake。 - 编写链接脚本
soc.lds,严格对齐地址映射 CSV。
# CMake 工具链文件关键内容 set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_C_COMPILER riscv64-unknown-elf-gcc) set(CMAKE_CXX_COMPILER riscv64-unknown-elf-g++) set(CMAKE_ASM_COMPILER riscv64-unknown-elf-as) set(LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/lds/soc.lds") - 安装交叉编译器并验证版本:
- 调试接口设置
- 配置 JTAG/SWD TAP 控制器(选择
jtag_v2或swd_fast拓扑)。 - 设置 GDB 服务器监听端口(默认
:3333)。 - 编写
.gdbinit自动加载符号并复位目标。
# GDB 服务器启动命令 openocd -f interface/ftdi.cfg -f target/soc_chip.cfg -c "bindto 0.0.0.0" # GDB 客户端连接初始化 target remote localhost:3333 monitor reset halt load firmware.elf monitor reg pc - 配置 JTAG/SWD TAP 控制器(选择
- 集成验证
- 使用
make -j4编译固件,确认二进制大小符合预期。 - 将固件加载至模拟器内存模型,运行
run 1000条指令。 - 通过 GDB 读取 SoC 控制状态寄存器,验证内存映射读回正确。
- 使用
⚙️ 关键输入 / 输出物清单
| 方向 | 名称 | 格式 | 说明 |
|---|---|---|---|
| 输入 | RTL 代码库 | git tag | 功能冻结标签 v2.3-rc1 |
| 输入 | 地址映射表 | CSV | 包含基址、大小、权限域 |
| 输出 | 模拟器初始化脚本 | .tcl / .do | 用于加载快照及固件 |
| 输出 | CMake 工具链文件 | .cmake | 指定交叉编译器及链接参数 |
| 输出 | GDB 初始化脚本 | .gdb / .gdbinit | 自动连接、复位、加载符号 |
责任边界
| 角色 | 职责范围 | 交付物 |
|---|---|---|
| DV 工程师 | 模拟器版本维护、快照制作、JTAG TAP 实例化 | simv 可执行程序、初始化脚本 |
| 固件工程师 | 交叉编译器安装、链接脚本编写、启动代码提供 | toolchain.cmake、soc.lds、startup.S |
| 系统验证师 | 调试通路联调、内存映射回归、环境验收签字 | 验证报告、环境标签 |
记录材料
sim_init.log:模拟器启动日志,确认无致命 UVM 错误。compile_test.log:工具链编译测试日志,确认firmware.elf内存布局正确。gdb_connect.log:调试接口连接日志,记录monitor reset halt返回状态。
⚠️ 异常处理预案
- 模拟器 core dump: 立即确认 RTL 快照版本是否与当前分支匹配,检查
patches/目录是否遗漏关键修复。 - 链接失败(L0102): 核对
soc.lds中的REGION_ALIAS是否与地址映射 CSV 完全对齐。 - GDB 连接超时: 在模拟器窗口中执行
print_taps,确认 JTAG TAP 控制器已进入 Run-Test/Idle 状态。 - 寄存器读回全 0 / 全 F: 检查调试接口的数据宽度适配,以及目标 SoC 的电源域是否被模拟器默认关闭。
验收标准
- 环境可复现: 按步骤新建空目录,可从零完整复现模拟器启动、固件编译、调试连接全流程。
- 功能正确性:
- 启动模拟器后,固件
firmware.elf可加载至地址映射起始点。 - GDB
target remote :3333在 5 秒内建立连接。 monitor reg pc返回值等于复位向量0x80000000(依据具体 SoC 设计)。
- 启动模拟器后,固件
- 文档闭环: 上述输入输出物、记录材料均归档至项目共享目录
//server/proj/ch3_env_prep/,并附带 README.md。
💡 专家建议
建议在首次配置完成后,使用
建议在首次配置完成后,使用
diff 命令将生成的 .elf 与参考二进制对比,确保工具链版本和环境变量未引入非预期差异。该对比结果应作为环境验收的强制检查项写入 CI 流水线。