SOC验证环境详解.md

SoC V1.1 — SOC 验证环境详解

适用范围:服务器只读母本 /project/SOC_V1.1/To_Customer,主仿真工程在 soc/
配套文档IP验证环境资料.md(ISP / QSPI / PINMUX 五段式详解)。


1. 文档想回答什么

主题 本文覆盖
SoC 架构 soc_top、Ibex、总线矩阵主从、SRAM/APB/DMA/ISP
片内 IP soc/ip/filelist/*.f
验证环境 Makefiletop.ftest/test.v、UVM
Test sw/ 软件场景、run_*、内存镜像
调试 地址映射、pad 表、波形走读路径

2. 交付树总览

To_Customer/
├── soc/          ★ 整片:Ibex + 矩阵 + 外设 + sw/ 场景
├── ISP/          IP 台:UVM + isp_demosaic
├── QSPI/         IP 台:UVM + RAL
└── PINMUX/       FPV:SVA
  • 1 套 SoC 集成仿真:soc/filelist/top.fmake compsimv
  • 2 套 IP 动态仿真:ISP/simQSPI/sim
  • 1 套 PINMUX 形式验证:PINMUX/FPV

3. SoC 架构(soc/top/top.v

3.1 顶层边界

  • 模块:soc_top
  • 端口:inout [24:1] pad —— 经 ip/padpin_mux、IO pad 与片外/ TB 相连。

3.2 处理器与总线转换

flowchart TB
  Ibex["ibex_top\n(RISC-V)"]
  C2I["core2ahb\n指令口"]
  C2D["core2ahb\n数据口"]
  M["busmatrix\ninst_busmatrix"]
  Ibex --> C2I --> M
  Ibex --> C2D --> M
  M --> SRAM["SRAM\nhselm0"]
  M --> APB["APB 桥\nhselm1"]
  M --> DMAm["DMA 主口\nhselm2/3"]
  M --> ISPw["ISP WDMA\nslave s3"]
  M --> ISPr["ISP RDMA\nslave s4"]

矩阵端口(与 RTL 实例名一致)

矩阵 Slave 口 连接主设备 说明
s0 指令 core2ahb 取指
s1 数据 core2ahb Load/Store
s2 DMA 引擎 独立 AHB 主
s3 ISP 写 DMA 侧 isp_wdma_*
s4 ISP 读 DMA 侧 isp_rdma_*
矩阵 Master 口 从设备 说明
m0 SRAM cmsdk_ahb_to_sram
m1 APB 子系统 UART / I2C / QSPI
m2、m3 DMA 目标/源 soc_dma_test* 相关

3.3 APB 子系统(apb_filelist.f

AHB2APB 挂接:

  • UARTuart_apb 及 fifo/transmitter/receiver)
  • I2C master(bit/byte/top)
  • SPI masterapb_spi_master + fifo/tx/rx/clkgen)—— 与 QSPI IP 包 RTL 同源

3.4 ISP 子系统(filelist/isp.f

SoC 内比 IP 台子 多出

  • isp_dma.vrdma2isp.visp2wdma.v
  • 与矩阵 s3/s4 相连,支持 DMA 搬图 而不只靠 CPU 喂像素

3.5 软件可见地址(示例,以 sw/*.c 为准)

基址(示例) 用途 出现场景
0x20000000 QSPI 寄存器空间 uart_test.csoc_dma_test.c
0x20010000 UART uart_test.c
0x30000000 区域 DMA 控制寄存器 soc_dma_test.cwrite(0x30000000,...) 等)

注意:链接脚本 sw/common/link.ld 决定代码/数据在 SRAM 中的装载地址;仿真 mem.data 来自各场景编译的 .vmem


4. 片内 IP 目录(soc/ip/

目录 filelist 功能
apb_subsystem/ apb_filelist.f AHB2APB + UART + I2C + QSPI
dma/ dma.f 多通道 DMA
isp/ isp.f 图像处理 + DMA 接口
busmatrix/ busmatrix_filelist.f 5 slave × 4 master 矩阵
pad/ 含于 top pad、pin_mux
include/ 头文件 AMBA/APB 宏

5. 验证环境架构

5.1 编译与运行总流程

sequenceDiagram
  participant MK as Makefile
  participant FL as filelist/top.f
  participant VCS as VCS comp
  participant SW as sw/场景
  participant SIM as simv

  MK->>FL: comp 拷贝到 comp/
  FL->>VCS: 编译全片+UVM
  VCS-->>MK: simv
  MK->>SW: run_xxx 拷贝场景+common
  SW->>SW: make 生成 xxx.vmem
  SW->>SIM: mem.data + SIMV

5.2 filelist/top.f 组成

顺序 内容
incdir UVM、Ibex、prim、i2c/uart/busmatrix/pad
-f ibex_core_other.fibex_core.f
-f dma.fisp.fapb_filelist.fbusmatrix_filelist.fmodel.f
顶层 top/monitior.vcore2ahb.vcmsdk_ahb_to_sram.vtop.v
TB test/test.v
模型 top/qspi_device.sv(片外 SPI 从机,与 QSPI 包同类)

5.3 soc/Makefile 详解

关键变量

变量 默认 说明
TEST spi1 用于 run_all / CO 路径($(TEST)_test 目录)
UVM_VERBOSITY UVM_MEDIUM 日志级别
SIMV ./simv +UVM_TESTNAME=$(TEST) ... 运行时指定 UVM test

目标

目标 行为
comp rm -rf comp → 拷贝 filelist/*sed 路径 → vcs -f top.f → 得到 comp/simv
run_<场景> 删除并创建与场景同名的目录 → 拷贝 comp/* → 拷贝 sw/<场景>/*sw/common/*sed 替换 CTEST_NAME本地 make 生成 <场景>.vmem → 重命名为 mem.data → 执行 $(SIMV)
debug_<场景> run_<场景>,保留目录便于调试
CO 仅在 sw/$(TEST)_test/ 编译,链接 mem.data 到工程根
run_all CO + comp + run(一条龙)
run 直接跑 $(SIMV)(需已有 mem.datasimv
clean 清理仿真产物与 mem.data

read_me 示例

cd /project/SOC_V1.1/To_Customer/soc
make comp
make run_all TEST=spi    # 会找 sw/spi_test/(若存在)或需与目录名一致
# 推荐直接用场景名:
make run_uart_test
make run_soc_dma_test

5.4 test/test.v(片级 Verilog TB)

功能 实现要点
时钟 clk_cpu 周期 10ns(#5 翻转);pclkclk_cpu 分频
复位 上电约 1µs 后释放 prest_n,再 1µs 释放 rst_n_cpu
pad 时钟/复位 force pad[21]=clk_cpupad[22]=rst_n_cpupad[23/24]
SPI0 环回 pad[1] clk,pad[2] csn0,pad[3,6,9,12] sdi,pad[4,7,10,13] sdo
DUT soc_top inst_soc_top(.pad(pad))
`define I2C 等(影响编译包含)

与 UVM 分工test.v 不提供 run_test();UVM 由 Ibex 验证库在 +UVM_TESTNAME 下启动。片级主要是 时钟/管脚/ SPI 线网

5.5 软件编译链(sw/common/Makefile

工具链 riscv32-unknown-elf-gcc(lowrisc,路径见 Makefile)
架构 -march=rv32imc
输出 $(PROGRAM).elf.bin.vmemsrec_cat
链接 link.ld + crt0.S + common.c

各场景目录仅含 xxx.c,通过 run_* 时拷贝 common 的 Makefile 并把 CTEST_NAME 替换为场景名。


6. Test 内容(soc/sw/

6.1 场景目录一览

目录 make 目标 验证侧重(结合 C 源码归纳)
uart_test run_uart_test 访问 0x20010000 UART 寄存器,多字节写 FIFO/控制寄存器
spi_test run_spi_test QSPI 0x20000000 基址寄存器操作
isp_test run_isp_test ISP 与存储/总线协同(整片)
mem_test run_mem_test SRAM 读写与对齐
led run_led 简单 GPIO/LED(写 stack 区域低位等)
soc_dma_test run_soc_dma_test DMA:target/src/xfer 寄存器 0x30000000 起,等待完成
soc_dma_test1 run_soc_dma_test1 DMA 变体场景 1
soc_dma_test2 run_soc_dma_test2 DMA 变体场景 2
simple_system run_simple_system 最小系统启动(子目录较多)
benchmarks 基准程序(非单一 run 名时需看讲义)
common 公共 Makefile、link.ldcrt0.Scommon.c

6.2 soc_dma_test 示例流程(读 C 即知测什么)

  1. 可选:先写 UART/QSPI 做 debug 打印。
  2. write(0x30000000, target)write(0x30000004, src)write(0x3000000c, xfer_start+size)
  3. 轮询或等待 DMA done,再比对内存。

波形建议:DMA 的 AHB 主口 m2/m3 + SRAM m0 同时拉。

6.3 UVM(+UVM_TESTNAME

  • 编译包含 Ibex DVibex/dv/uvm/...)及 google_riscv-dv 库。
  • 默认 TEST=spi1 等需与 实际存在的 uvm_test 类名一致(见 ibex 与课程讲义)。
  • sw/ 关系mem.data 让 CPU 跑真实程序;UVM 可并行做 指令流/随机 检查——二者在 log 中分别体现。

6.4 推荐波形走读步骤

  1. 确认 make run_<场景> 完整命令与目录内 vcs.log
  2. Ibex PC 是否进入 main,是否访问 0x2000xxxx / 0x3000xxxx
  3. APBAHB 解码 波形上对齐 hsel/haddr/hwrite
  4. 外设场景:对照 IP验证环境资料.md 中寄存器说明。
  5. DMA/ISP:对照矩阵 s2~s4m0~m3 事务。

7. 并列 IP 包(摘要)

详见 IP验证环境资料.md(含 Spec / Testplan / 环境 / Test / Makefile)。

要点
ISP/ UVM + isp_demosaic 金模型;无 DMA
QSPI/ 8 个 qspi_*_test + RAL
PINMUX/ batch.tcl + pinmux.sva

8. 两级验证策略(教学建议)

flowchart TD
  A["IP 台:ISP/QSPI\n快速闭环"] --> B["SoC:sw 场景\n总线+软件"]
  B --> C["可选:PINMUX FPV\n管脚约束"]
  1. IP 级:先 pass ISP/simQSPI/sim,理解 scoreboard/RAL。
  2. SoC 级make comp + run_uart_test / run_soc_dma_test,理解地址与矩阵。
  3. 对照:同一 QSPI 寄存器,在 IP 台用 RAL 写,在 SoC 用 C 写,波形应一致(时钟域除外)。

9. 常见问题

现象 处理
comp 找不到 Ibex 路径 检查 ibex/build/... 是否在母本完整同步
run_* 无 vmem 进入场景目录看 make 报错;确认 riscv gcc 在 PATH
UVM test 不存在 +UVM_TESTNAMETEST= 为讲义指定类名
SPI 无响应 test.v pad 与 qspi_device 是否例化、环回是否连通
与 IP 台结果不一致 检查 SoC 是否多了 DMA/时钟分频、地址映射不同

10. 小结

维度 结论
集成平台 soc/top.f + test.v + sw/
IP 平台 动态(ISP、QSPI)+ FPV(PINMUX)
场景数 sw/9+run_* 目录(含 dma 三件套)
文档 本文 = 整片;IP验证环境资料.md = 分 IP 深度

文档位置SOC_V1.1/SOC验证环境详解.md;官网 SoC V1.1 资料 页列出后可在线阅读。