IP验证环境资料.md

SoC V1.1 — IP 级验证环境资料(ISP / QSPI / PINMUX)

工程母本/project/SOC_V1.1/To_Customer/
文档结构:每个 IP 按 ① Spec ② Testplan ③ 验证环境 ④ Test ⑤ Makefile/脚本 展开。
Spec / Testplan 详细版(推荐阅读):
- ISP_Spec与Testplan.md — 算法、时序、需求跟踪、用例步骤、SB 规则、出口准则
- QSPI_Spec与Testplan.md — 寄存器位域、控制器 FSM、8 个用例逐步、SB 检查点
- PINMUX_Spec与Testplan.md — 复用编码、寄存器映射、SVA、形式验证用例
声明:寄存器位宽/访问属性以 ral_qspi.sv、RTL 为准;工具链路径以服务器 Makefile 为准。


0. 三个 IP 包在课程中的位置

flowchart LR
  subgraph SoC["soc/ 整片仿真"]
    Ibex --> Matrix
    Matrix --> APB["APB: UART/I2C/QSPI"]
    Matrix --> ISP_DMA["ISP+DMA 链"]
    Matrix --> SRAM
  end
  subgraph IP["To_Customer 并列 IP 包"]
    ISP["ISP/ UVM+cmodel"]
    QSPI["QSPI/ UVM+RAL"]
    PM["PINMUX/ FPV"]
  end
  ISP -.->|RTL 同源| ISP_DMA
  QSPI -.->|RTL 同源| APB
  PM -.->|pad 复用| SoC
IP 目录 验证手段 与 SoC 关系
ISP ISP/ UVM + C 参考模型产金 SoC 内 ip/isp/DMA 扩展;IP 台子 dut.f 不含 isp_dma
QSPI QSPI/ UVM + RAL + qspi_device soc/ip/apb_subsystem/rtl/qspi 同源 SPI master
PINMUX PINMUX/ VC Formal + SVA soc/ip/padpin_mux 同类逻辑;SoC 用 test.v 固定部分 pad 映射

一、ISP 验证环境

0.1 目录结构

ISP/
├── rtl/                 # DUT:isp_top、dgain、demosaic_lite、utils
│   ├── isp_top.v
│   ├── isp_dgain.v
│   ├── isp_demosaic_lite.v
│   └── rtl.f
├── cmodel/              # 参考模型源码(编译得到 isp_demosaic)
│   ├── isp.cpp
│   ├── common.h
│   └── isp_demosaic     # 已编译可执行文件(run_* 时需 cp 到运行目录)
├── tb/
│   ├── env/             # UVM:if/agent/env/monitor/scoreboard/tb_top
│   └── tests/           # isp_test.sv、isp_basic_sequence.sv
└── sim/
    ├── Makefile
    ├── dut.f            # 仅 lite 图像链 RTL
    └── tb.f

1. IP Spec 描述

完整 Spec(模块层次、算法、寄存器、时序、边界):见 ISP_Spec与Testplan.md 第一部分

1.1 功能与数据通路

isp_toppclk 域处理 Bayer RAW 视频流,可选两级处理(由宏 USE_DGAIN / USE_DEMOSIC 与端口使能共同决定):

flowchart LR
  IN["in_href/vsync/raw"] --> DG{"dgain_en?"}
  DG -->|1| DGain["isp_dgain"]
  DG -->|0| MUX1["vid_mux 旁路"]
  DGain --> MUX1
  MUX1 --> DM{"demosic_en?"}
  DM -->|1| Dem["isp_demosaic"]
  DM -->|0| MUX2["vid_mux 旁路"]
  Dem --> MUX2
  MUX2 --> OUT["dm_href/vsync + R/G/B"]
参数 默认值(TB 实例) 含义
BITS 8 像素位宽
WIDTH 256 行内最大像素数(参数化上限)
HEIGHT 10 帧行数参数(TB 中 sequence 可更大)
BAYER 0 0:RGGB,1:GRBG,2:GBRG,3:BGGR

1.2 端口清单

信号 方向 说明
pclk, rst_n in 像素时钟、低有效复位
in_href, in_vsync, in_raw[7:0] in 输入行有效、帧同步、RAW 数据
dm_href_o, dm_vsync_o out 输出行/帧同步
dm_r_o, dm_g_o, dm_b_o out 去马赛克后 RGB(8bit)
dgain_en, demosic_en in 数字增益 / 去马赛克使能
dgain_gain[7:0], dgain_offset[7:0] in 增益系数与偏移

1.3 与 SoC 内 ISP 的差异(集成验证必读)

对比项 ISP/sim/dut.f soc/filelist/isp.f
图像处理核 isp_demosaic_lite + isp_dgain + isp_top 同上 + isp_dma.v
总线侧 rdma2isp.visp2wdma.v(AHB 主从)
验证目标 算法像素正确性 CPU/DMA 搬数 + 片上通路

2. IP Testplan

完整 Testplan(需求跟踪、用例矩阵、逐步操作、覆盖率、出口准则):见 ISP_Spec与Testplan.md 第二部分

ID 类别 验证目标 通过准则 关联组件
TP-ISP-01 复位 rst_n 释放后无 X,控制默认 仿真无 UVM_FATAL isp_tb_top
TP-ISP-02 时序 in_vsync 脉冲、in_href 行内有效、isp_dummy_cycle 行间隔 driver 与 DUT 握手一致 isp_driver
TP-ISP-03 功能 demosic_en=1 时 Demosaic scoreboard 比对通过 isp_scoreboard
TP-ISP-04 约束随机 isp_width/height ∈ [10,512],dgain_gain ∈ [1,100] randomize 无冲突 isp_txn constraints
TP-ISP-05 参考模型 C model 与 RTL 输出一致 R/G/B 逐像素 ±2(边界除外) isp_demosaic + result_*.txt
TP-ISP-06 覆盖率 行/条件/翻转 VCS -cm line+cond+tgl Makefile comp

边界屏蔽规则(scoreboard):仅当 line_cnt>3pixl_cnt>3pixl_cnt<253、且金/实测均非 0 时,才比较;容差 ±2 灰度级。


3. 验证环境介绍

3.1 UVM 组件关系

flowchart TB
  T["isp_test"] --> SEQ["isp_basic_sequence"]
  SEQ --> VSQR["isp_virtual_sequencer"]
  VSQR --> SQR["isp_agent.sequencer"]
  SQR --> DRV["isp_driver → isp_if → DUT"]
  DUT --> MON["isp_monitor"]
  MON --> SB["isp_scoreboard"]
  SEQ -->|"写 isp_input.txt"| CM["./isp_demosaic"]
  CM -->|"result_r/g/b.txt"| SB
文件 类/模块 职责
isp_if.sv interface 绑定 DUT 全部端口;driver 还驱动 isp_width/height 供 monitor 使用
isp_txn.sv sequence_item 二维 pixl_data[][]data_fmt[][](Bayer 格式枚举)、使能与尺寸
isp_driver.sv driver 见下节「驱动时序」
isp_monitor.sv monitor dm_vsync_o 帧起始后,按 dm_href_o 采样整行 R/G/B,打成 isp_line 送 SB
isp_scoreboard.sv scoreboard 帧起始打开 result_r/g/b.txt,每行 16 个十六进制像素与 monitor 比对
isp_env.sv env isp_agt + isp_mon + isp_sb + my_sqr
isp_tb_top.sv top 10ns 周期时钟;#100000ns 超时;FSDB dump

3.2 Driver 驱动时序(与波形对照)

  1. 拉低各控制,等待 posedge pclk
  2. in_vsync=1 保持 10 个 pclk,再拉低(帧同步脉冲)。
  3. j=0..isp_height-1
  4. i=0..isp_width-1in_href=1in_raw=pixl_data[j][i],每像素 1 拍。
  5. 再跑 isp_dummy_cycle 拍:in_href=0in_raw=0(行消隐)。

3.3 参考模型与金文件格式

isp_basic_sequence 流程

  1. randomize 事务(默认约束:demosic_en==1dgain_en==0isp_width==256isp_height==20 等)。
  2. RGGB 棋盘 规则填充 data_fmt / pixl_data(偶行/奇行 R、B 像素加偏移 +0x40)。
  3. isp_input.txt:每行 16 个 0x.. 十六进制像素。
  4. 执行 $system("./isp_demosaic") → 生成 result_r.txtresult_g.txtresult_b.txt(格式同输入)。
  5. start_item 驱动 DUT;monitor/scoreboard 在输出侧比对。

运行前准备make run_isp_test 会把 ../isp_demosaic 拷入用例目录;若报找不到可执行文件,在 ISP/sim 下确认 cmodel/isp_demosaic 存在且可执行。


4. Test 介绍

UVM Test Sequence 步骤摘要
isp_test isp_basic_sequence 产输入 → 跑 C model → 驱动一帧 RAW → SB 比对 RGB

当前母本 仅 1 个 uvm_test;扩展用例可复制 isp_test.sv 并改写 sequence 约束(如打开 dgain_en)。


5. Makefile 介绍(ISP/sim/Makefile

5.1 变量

变量 典型值 说明
UVM_HOME Synopsys 安装路径 UVM 1.2 源码
UVM_VERBOSITY UVM_HIGH 日志级别
TEST qspi_test(笔误) 勿直接 make run;用 run_isp_test
VCS -ntb_opts uvm-1.2-cm line+cond+tgl、Verdi PLI 编译选项
SIMV ./simv +UVM_TESTNAME=$(TEST) ... 运行选项

5.2 目标详解

目标 步骤
comp 删除并创建 comp/ → 拷贝 dut.ftb.fsed../ 改为 ../../ → VCS 编译生成 simv
run comp/ 外执行 $(SIMV)(依赖 TEST
run_<名> 新建目录 → 拷贝 comp/*cp ../isp_demosaic ./+UVM_TESTNAME=<名>
debug_<名> run_<名>,保留目录便于 Verdi 后仿真
clean 删除 simv、覆盖率库、csrc

5.3 推荐操作与排错

cd /project/SOC_V1.1/To_Customer/ISP/sim
make comp
make run_isp_test
# 波形:用例目录下 tb.fsdb(若开启 dump)
现象 可能原因
UVM_FATAL 找不到 test 用了 make runTEST=qspi_test
SB 大量 R/G/B mismatch 未拷贝 isp_demosaicresult_*.txt 未生成
仿真超时 isp_tb_top 100µs 限制;检查 driver 是否死循环

二、QSPI(APB SPI Master)验证环境

0.1 目录结构

QSPI/
├── rtl/qspi/            # apb_spi_master + fifo/tx/rx/clkgen/controller
├── tb/
│   ├── env/             # apb_agent, ral, qspi_device, scoreboard, tb_top
│   ├── tests/           # *_test.sv + *_sequence.sv
│   └── ral_gen/         # 与 env/ral_qspi.sv 同族
├── sim/
│   ├── Makefile
│   ├── dut.f
│   └── tb.f
└── read_me              # cd sim; make comp; make run_{test_name}

1. IP Spec 描述

完整 Spec:见 QSPI_Spec与Testplan.md 第一部分(模块层次、全寄存器位域、控制器 FSM、STATUS 拼装、典型事务序列)。

1.1 接口

  • APB 从设备HCLK/HRESETn + 标准 PADDR/PWDATA/PWRITE/PSEL/PENABLE/PRDATA/PREADY/PSLVERR(TB 里信号名 PCLK/PRST 等)。
  • SPI 主机spi_clkspi_csn0~3spi_sdo0~3spi_sdi0~3spi_oe0~3
  • 中断events_oqspi_vif.interrupt

1.2 寄存器映射(RAL ral_block_qspi

APB 字对齐,小端 uvm_reg_map,基址偏移如下:

偏移 寄存器 主要字段 访问
0x00 SPI_CTRL [0]RD [1]WR [2]QRD [3]QWR [4]SRST [11:8]CS 控制位多为 WO
0x04 SPI_STATUS [6:0]STATUS [20:16]RXELEMS [28:24]TXELEMS RO 为主
0x08 SPI_CLKDIV [7:0]CLKDIV RW
0x0C SPI_CMD [31:0]CMD RW
0x10 SPI_ADR [31:0]ADR RW
0x14 SPI_LEN [5:0]CMDLEN [13:8]ADDRLEN [31:16]DATALEN RW
0x18 SPI_DUM [15:0]DUMMYRD [31:16]DUMMYWR RW
0x1C SPI_TXFIFO [31:0]TX 写 FIFO
0x20 SPI_RXFIFO [31:0]RX 读 FIFO
0x24 SPI_INTCFG [4:0]TXTH [12:8]RXTH [31]EN RW
0x28 SPI_INTSTA [0]TXINT [1]RXINT RO

SPI_CTRL 典型用法(sequence 中常见写值):

  • 0xF08:置位 QWR 等,发起四线写类传输。
  • 0xF04:置位 QRD,发起读。
  • 0x? + SRST:软复位 FIFO/状态(见 qspi_soft_reset_sequence)。

1.3 行为从机 qspi_device(Spec 摘要)

文件头注释定义与 scoreboard 一致的 命令字

命令值 含义
0x6 Write Enable
0x4 Write Disable
0x3 Read Data
0x2 Page Programming

参数:command_width=16addr_width=16data_width=32(可通过 interface 配置)。内部 FSMIDLE → COMMAND → ADDR → WDATA/RDATA_DUMMY → RDATA 等。

TB 连接:DUT 的 SDO 接 Device 的 SDI,实现环回;qspi_tb_top 中交叉连线。


2. IP Testplan

完整 Testplan:见 QSPI_Spec与Testplan.md 第二部分(QSPI-T01~T08 逐步、回归列表、出口准则)。

ID 目标 Test 激励要点 检查
TP-QSPI-01 寄存器读写 qspi_reg_rw_test RAL get_registers 遍历 write/read set_check_on_read(STATUS/FIFO 除外)
TP-QSPI-02 Page 写 + 读回 qspi_read_test CMD/ADR/TXFIFO/LEN/DUM/CTRL,轮询 STATUS,再读 RXFIFO SB + 从机 device_data
TP-QSPI-03 分频 qspi_clk_test CLKDIV SPI 时钟周期
TP-QSPI-04 长度域 qspi_data_length_test CMDLEN/ADDRLEN/DATALEN 传输拍数
TP-QSPI-05 Dummy qspi_dummy_test SPI_DUM 波形 dummy 段
TP-QSPI-06 中断 qspi_interrupt_test INTCFG 阈值 + 多笔 TX qspi_vif.interruptUVM_ERROR
TP-QSPI-07 软复位 qspi_soft_reset_test SPI_CTRL.SRST FIFO 清空、SB qspi_tx_fifo
TP-QSPI-08 异常长度 qspi_abnormal_length_test 非对齐/超大 DATALEN 错误上报或超时
TP-QSPI-09 协议一致性 全部 APB 写寄存器触发 SPI qspi_scoreboard 维护 qspi_reg[]device_data[]

3. 验证环境介绍

3.1 架构

flowchart TB
  T["qspi_*_test"] --> SEQ["*_sequence"]
  SEQ --> VSQR["qspi_virtual_sequencer"]
  VSQR --> APB["apb_agent → DUT APB"]
  VSQR --> RAL["ral_block_qspi + reg_adapter"]
  DUT["apb_spi_master"] <-->|SPI 4线| DEV["qspi_device"]
  APB --> SB["qspi_scoreboard"]
  MON["qspi_monitor"] --> SB
组件 说明
apb_agent apb_driver/monitor/sequencer;monitor 事务 → SB apb_fifo
reg_adapter RAL 总线适配到 APB sequencer
qspi_rgm build() + lock_model()set_auto_predict(1)
qspi_scoreboard 跟踪 0x00 CTRL 启动写、0x1c TXFIFO 入队、0x10 地址与 device_data[addr] 一致性
qspi_monitor 观测 SPI 线事务 → qspi_txn

3.2 Scoreboard 核心逻辑(读波形前先看)

  • APB paddr==0 且 CTRL 中 PAGE_PROGRAMMINGqspi_reg['hc][31:16]==2)且 QWR 置位:按 SPI_ADRSPI_LEN.DATALENqspi_tx_fifo 弹出数据写入 device_data[]
  • SRST 且 busy:清空 FIFO,并按长度清零 device_data 区间。
  • 0x1c TXFIFO:push 到 qspi_tx_fifo(或 pending 写路径)。
  • SPI monitor 侧与 device_data 读回比对(详见 qspi_scoreboard.sv 后半部分)。

4. Test 介绍(逐步)

4.1 qspi_reg_rw_test

  • Sequenceqspi_reg_rw_sequence
  • 步骤qspi_rgm.get_registers(regs) → 对每个寄存器 write 随机数 → read 回读;SPI_STATUS/SPI_TXFIFO/SPI_RXFIFO 关闭 read check。

4.2 qspi_read_test

  • Sequenceqspi_read_sequence
  • 写阶段SPI_CMD=0x00020000,随机 SPI_ADRTXFIFO=0x12345678LEN=0x00201010DUM=0x00080008CTRL=0xF08轮询 SPI_STATUS 直到 [5:0]==1
  • 读阶段CMD=0x00030000CTRL=0xF04,再轮询 STATUS,读 RXFIFO

4.3 qspi_interrupt_test

  • 随机 TXTH∈[1:6]RXTH∈[1:4],写 INTCFGEN=1)。
  • 连续写多笔 TXFIFO,根据阈值 期望是否拉中断;不符合则 `uvm_error

4.4 其它用例

Test Sequence 侧重
qspi_clk_test qspi_clk_sequence CLKDIV 与 SCK 周期
qspi_data_length_test qspi_data_length_sequence SPI_LEN 各域
qspi_dummy_test qspi_dummy_sequence SPI_DUM
qspi_soft_reset_test qspi_soft_reset_sequence SRST(类在 qspi_soft_reset.sv
qspi_abnormal_length_test qspi_abnormal_length_sequence 边界/异常 DATALEN

运行make run_qspi_reg_rw_test+UVM_TESTNAME 与目录名、类名一致,去掉 _test 后缀的是错误理解——母本规则是 目录名 = 类名 = qspi_reg_rw_test)。


5. Makefile 介绍(QSPI/sim/Makefile

与 ISP 同模板comp / run_% / debug_%),区别:不需要 isp_demosaic

cd /project/SOC_V1.1/To_Customer/QSPI/sim
make comp
make run_qspi_read_test
make run_qspi_interrupt_test
注意点 说明
缺省 TEST=qspi_test 不存在 该 uvm_test,必须 run_<完整类名>
覆盖率 -cm line+cond+tgl,与 ISP 相同
Verdi comp/ 内拷贝 run_verdi(若存在)

三、PINMUX 验证环境(FPV)

0.1 目录结构

PINMUX/
├── rtl/
│   ├── pin_mux.v          # 复用逻辑核心
│   ├── pin_mux_rf.v       # 复用寄存器
│   ├── pin_mux_rf_top.v   # APB 配置口
│   ├── gnrl_io_pad.v
│   ├── TPPADLRCMCUDB.v
│   └── filelist           # RTL + SVA
└── FPV/
    ├── assertion/
    │   ├── pinmux.sva           # 属性模块 sva_checker
    │   └── pinmux_vlog_bind.sva # bind 到 DUT
    └── solution/
        ├── batch.tcl
        ├── readme             # vcf -verdi -f batch.tcl
        └── results.txt        # 证明结果(运行后生成)

1. IP Spec 描述

完整 Spec:见 PINMUX_Spec与Testplan.md 第一部分(复用编码 000~100、典型 pad 表、APB 寄存器映射、SVA 逐条)。

1.1 功能

  • pin_mux_rf_top:APB 配置 r_io_reuse_pad1 ~ r_io_reuse_pad20,每位 [2:0] 选择 pad 功能(SPI/UART/I2C/GPIO 等,编码见 RTL)。
  • pin_mux:把内部 spi0/spi1、uart、i2c0/i2c1 等信号按复用寄存器接到 pad[24:1]
  • PAD 单元:驱动强度、输入缓冲等(工艺相关)。

1.2 与 SoC test.v 的 pad 映射(集成仿真参考)

SoC 片级 TB 对部分 pad 固定连接(便于 SPI 环回),例如:

pad 方向/连接
21 clk_cpu(force)
22 rst_n_cpu(force)
23/24 时钟/复位相关
1 spi0_clk
2 spi0_csn0
3,6,9,12 spi0_sdi*
4,7,10,13 spi0_sdo*(DUT 输出驱动 pad)

FPV 中 sva_checker 监视的是 逻辑复用关系,不要求与 test.v 的固定映射相同,但 属性应与生成的 pin_mux 网表一致


2. IP Testplan(形式验证)

完整 Testplan:见 PINMUX_Spec与Testplan.md 第二部分(PM-F01~F04、batch.tcl 步骤、属性评审清单、出口准则)。

ID 类型 属性/覆盖 意图
TP-PM-01 assert assert_spi0_csn0_pad_2_15 spi0_csn0 有效且 pad15 复用为 0 时,应体现在 pad[15]
TP-PM-02 assert assert_spi0_csn0_cannot_map_to_pad_3 CSn 不应错误出现在 pad3(与 pad15 条件配合,见 SVA 全文)
TP-PM-03 assume assume_i2c_signal pad3 为 I2C(2) 时 pad4 也为 I2C
TP-PM-04 assume assume_qspi0_signal pad3 为 QSPI(1) 时 pad4/5/6 同为 QSPI
TP-PM-05 cover cov_spi0_csn0_pad2 / pad15 功能覆盖:CSn 映射到 pad2 或 pad15

注意:交付 SVA 仅示例少量属性;完整 pinmux 规格需结合 RTL 与课程讲义扩展 assert。


3. 验证环境介绍

3.1 batch.tcl 逐步说明

步骤 Tcl 命令 含义
1 set_app_var fml_mode_on true 形式验证模式
2 read_file -top pin_mux -f ../../rtl/filelist 读入 RTL + bind SVA
3 create_clock cpu_clk/apb_clk -period 100 两路时钟约束
4 create_reset cpu_reset_n/apb_reset_n -high 高有效复位
5 sim_run -stable / sim_save_reset 稳态与复位场景
6 check_fv -block 分块证明
7 report_fv -list > results.txt 输出结果列表

3.2 filelist 内容

../../rtl/TPPADLRCMCUDB.v
../../rtl/pin_mux_rf.v
../../rtl/gnrl_io_pad.v
../../rtl/pin_mux.v
-sverilog
../../FPV/assertion/pinmux.sva
../../FPV/assertion/pinmux_vlog_bind.sva
+define+INLINE_SVA

4. Test 介绍(FPV)

无动态 testbench;验证用例 = 属性集合

产出 位置 用法
证明通过/失败 FPV/solution/results.txt report_fv 列表
反例波形 Verdi + vcf -verdi -f batch.tcl 调试 assume 过强或 RTL 错

5. Makefile / 运行入口

无 Makefile。标准流程:

cd /project/SOC_V1.1/To_Customer/PINMUX/FPV/solution
vcf -verdi -f batch.tcl    # 需 VC Formal + license
# 或批处理: vcf -f batch.tcl

四、IP 包 ↔ SoC 集成对照表

验证项 IP 台子 SoC soc/
ISP 像素算法 ISP/sim + cmodel sw/isp_test + CPU/DMA
QSPI 寄存器/协议 QSPI/sim + RAL sw/spi_test + test.v pad SPI0
Pinmux 静态连接 PINMUX/FPV 整片 soc_top + test.v pad 映射
UART/I2C 无独立包 仅 SoC:apb_subsystem + sw/uart_test

更完整的 整片架构、Makefile、sw/ 场景SOC验证环境详解.md


维护:母本增删 test 或改 ral_qspi.sv 偏移后,请同步更新本文寄存器表与 make run_* 列表。