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 |
| 验证环境 | Makefile、top.f、test/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.f→make comp→simv。 - 2 套 IP 动态仿真:
ISP/sim、QSPI/sim。 - 1 套 PINMUX 形式验证:
PINMUX/FPV。
3. SoC 架构(soc/top/top.v)
3.1 顶层边界
- 模块:
soc_top - 端口:
inout [24:1] pad—— 经ip/pad中 pin_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 挂接:
- UART(
uart_apb及 fifo/transmitter/receiver) - I2C master(bit/byte/top)
- SPI master(
apb_spi_master+ fifo/tx/rx/clkgen)—— 与 QSPI IP 包 RTL 同源
3.4 ISP 子系统(filelist/isp.f)
SoC 内比 IP 台子 多出:
isp_dma.v、rdma2isp.v、isp2wdma.v- 与矩阵 s3/s4 相连,支持 DMA 搬图 而不只靠 CPU 喂像素
3.5 软件可见地址(示例,以 sw/*.c 为准)
| 基址(示例) | 用途 | 出现场景 |
|---|---|---|
0x20000000 |
QSPI 寄存器空间 | uart_test.c、soc_dma_test.c |
0x20010000 |
UART | uart_test.c |
0x30000000 区域 |
DMA 控制寄存器 | soc_dma_test.c(write(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.f、ibex_core.f |
-f |
dma.f、isp.f、apb_filelist.f、busmatrix_filelist.f、model.f |
| 顶层 | top/monitior.v、core2ahb.v、cmsdk_ahb_to_sram.v、top.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.data 与 simv) |
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 翻转);pclk 由 clk_cpu 分频 |
| 复位 | 上电约 1µs 后释放 prest_n,再 1µs 释放 rst_n_cpu |
| pad 时钟/复位 | force pad[21]=clk_cpu,pad[22]=rst_n_cpu,pad[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 → .vmem(srec_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.ld、crt0.S、common.c |
6.2 soc_dma_test 示例流程(读 C 即知测什么)
- 可选:先写 UART/QSPI 做 debug 打印。
write(0x30000000, target)、write(0x30000004, src)、write(0x3000000c, xfer_start+size)。- 轮询或等待 DMA done,再比对内存。
波形建议:DMA 的 AHB 主口 m2/m3 + SRAM m0 同时拉。
6.3 UVM(+UVM_TESTNAME)
- 编译包含 Ibex DV(
ibex/dv/uvm/...)及 google_riscv-dv 库。 - 默认
TEST=spi1等需与 实际存在的uvm_test类名一致(见ibex与课程讲义)。 - 与
sw/关系:mem.data让 CPU 跑真实程序;UVM 可并行做 指令流/随机 检查——二者在 log 中分别体现。
6.4 推荐波形走读步骤
- 确认
make run_<场景>完整命令与目录内vcs.log。 - 看 Ibex PC 是否进入
main,是否访问 0x2000xxxx / 0x3000xxxx。 - 在 APB 或 AHB 解码 波形上对齐 hsel/haddr/hwrite。
- 外设场景:对照 IP验证环境资料.md 中寄存器说明。
- DMA/ISP:对照矩阵 s2~s4 与 m0~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管脚约束"]
- IP 级:先 pass
ISP/sim、QSPI/sim,理解 scoreboard/RAL。 - SoC 级:
make comp+run_uart_test/run_soc_dma_test,理解地址与矩阵。 - 对照:同一 QSPI 寄存器,在 IP 台用 RAL 写,在 SoC 用 C 写,波形应一致(时钟域除外)。
9. 常见问题
| 现象 | 处理 |
|---|---|
comp 找不到 Ibex 路径 |
检查 ibex/build/... 是否在母本完整同步 |
run_* 无 vmem |
进入场景目录看 make 报错;确认 riscv gcc 在 PATH |
| UVM test 不存在 | 改 +UVM_TESTNAME 或 TEST= 为讲义指定类名 |
| SPI 无响应 | 查 test.v pad 与 qspi_device 是否例化、环回是否连通 |
| 与 IP 台结果不一致 | 检查 SoC 是否多了 DMA/时钟分频、地址映射不同 |
10. 小结
| 维度 | 结论 |
|---|---|
| 集成平台 | 1× soc/(top.f + test.v + sw/) |
| IP 平台 | 2× 动态(ISP、QSPI)+ 1× FPV(PINMUX) |
| 场景数 | sw/ 下 9+ 可 run_* 目录(含 dma 三件套) |
| 文档 | 本文 = 整片;IP验证环境资料.md = 分 IP 深度 |
文档位置:SOC_V1.1/SOC验证环境详解.md;官网 SoC V1.1 资料 页列出后可在线阅读。