第3章 前置条件与验证环境准备:硬件模拟器配置、固件编译工具链、调试接口设置

协同验证环境准备流程图 协同验证环境准备与依赖关系 RTL 冻结 & 地址映射就绪 硬件模拟器配置 固件编译工具链 调试接口设置 协同验证环境就绪 📌 前提:以上三项配置必须基于同一版本的 RTL 冻结标签进行

适用场景

  • 项目启动阶段:为新的 SoC 项目搭建标准化的固件-硬件协同验证环境。
  • 环境重构期:现有验证环境缺乏统一的模拟器配置、编译流程或调试接入规范。
  • 版本切换时:RTL 版本升级或地址映射变更后,需要同步更新验证前置条件。

前置条件

类别具体要求责任人
交付件RTL 代码冻结(至少功能冻结),SoC 地址映射 CSV 已签署,验证规范已归档DV 负责人
基础设施64 位 Linux 工作站(内核 ≥ 4.18),具备 sudo 权限,磁盘余量 ≥ 200 GBIT 运维
EDA 工具VCS / QuestaSim(版本 ≥ 2020.3),已获得对应 license 并完成环境变量配置DV 工程师
工具链目标架构交叉编译器(如 riscv64-unknown-elf-gcc / arm-none-eabi-gcc)固件工程师
文档SoC 程序员模型、中断号分配表、外设寄存器描述文件架构师

操作步骤

  1. 硬件模拟器配置
    • 创建模拟快照目录 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
  2. 固件编译工具链
    • 安装交叉编译器并验证版本: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")
  3. 调试接口设置
    • 配置 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
  4. 集成验证
    • 使用 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 的电源域是否被模拟器默认关闭。

验收标准

  1. 环境可复现: 按步骤新建空目录,可从零完整复现模拟器启动、固件编译、调试连接全流程。
  2. 功能正确性:
    • 启动模拟器后,固件 firmware.elf 可加载至地址映射起始点。
    • GDB target remote :3333 在 5 秒内建立连接。
    • monitor reg pc 返回值等于复位向量 0x80000000(依据具体 SoC 设计)。
  3. 文档闭环: 上述输入输出物、记录材料均归档至项目共享目录 //server/proj/ch3_env_prep/,并附带 README.md。
💡 专家建议
建议在首次配置完成后,使用 diff 命令将生成的 .elf 与参考二进制对比,确保工具链版本和环境变量未引入非预期差异。该对比结果应作为环境验收的强制检查项写入 CI 流水线。