PINMUX_Spec与Testplan.md

PINMUX — 功能 Spec 与验证 Testplan(详细版)

工程路径/project/SOC_V1.1/To_Customer/PINMUX/
验证形态:形式验证(VC Formal)+ SystemVerilog Assertions
关联IP验证环境资料.md


第一部分:功能 Spec

1. 概述

1.1 功能定义

PINMUX 子系统完成两类功能:

  1. IO 复用(pin_mux:根据每路 pad 的 3bit 复用配置,将片内 SPI0/SPI1、UART、I2C0/I2C1 等信号映射到 pad[20:1](及专用时钟/复位 pad)。
  2. 复用寄存器(pin_mux_rf + pin_mux_rf_top:通过 APB 类接口 配置 r_io_reuse_pad1 ~ r_io_reuse_pad20

另含 IO Pad 单元gnrl_io_pad.vTPPADLRCMCUDB.v)处理电气特性。

1.2 模块层次

pin_mux_rf_top
└── pin_mux_rf              # 配置寄存器
pin_mux                     # 组合复用逻辑(大 case)
gnrl_io_pad / TPPADLRCMCUDB  # PAD 原语
sva_checker (FPV)           # 断言模块 pinmux.sva

FPV 顶层read_file -top pin_mux(见 FPV/solution/batch.tcl)。


2. 端口 Spec — pin_mux

2.1 片内侧信号(输入到 mux 的“功能信号”)

信号(节选) 方向(相对 mux)
SPI0 spi0_clk, spi0_csn0~3, spi0_sdo0~3, spi0_oe0~3, spi0_sdi0~3 主机侧
SPI1 spi1_* 同上
UART ua_txd(出), ua_rxd(入) 串口
I2C0/1 i2c*_scl/sda_pad_o, *_padoen_o(出), *_pad_i(入) 开漏 IO
时钟/复位 cpu_clk, cpu_reset_n, apb_clk, apb_reset_n 输出到专用 pad
配置 r_io_reuse_pad1 ~ r_io_reuse_pad20 每路 3bit

2.2 片外侧 — pad[20:1]

  • inout 双向 pad 总线。
  • SoC 集成时 soc_toppad[24:1],与验证包 20 路 子集或扩展映射以 RTL 为准。

2.3 专用时钟/复位输出

输出 来源
clk_cpu cpu_clk
rst_n_cpu cpu_reset_n
pclk apb_clk
prest_n apb_reset_n

3. 复用编码 Spec(全局)

每个 r_io_reuse_padN[2:0] 选择该 物理 pad N 上承载的功能:

编码 reuse[2:0] 功能组 说明
3'b000 SPI0 该 pad 用作 SPI0 的某一信号(clk/csn/sdo/sdi 等,依 pad 编号而定)
3'b001 SPI1 SPI1 对应信号
3'b010 I2C0 I2C0 SCL/SDA(开漏,含 padoen)
3'b011 I2C1 I2C1
3'b100 UART TX 或 RX(依 pad)
其它 保留/高阻 default 多为输出 0、oe=0

重要:同一编码在不同 pad 上对应 不同的具体信号(由 pin_mux.v 内 per-pad case 决定),不能理解为“全局一根线”。


4. 典型 Pad 复用表(摘自 RTL 行为)

以下为实现级摘要,便于对照波形与 SVA(非全部 pad):

4.1 SPI0 相关(reuse==3'b000

Pad 复用为 SPI0 方向
1 spi0_clk 输出
2 spi0_csn0 输出
3 spi0_sdo0 输出(oe 随 spi0_oe0
4 spi0_sdi0 输入
7 spi0_sdo1 / sdi1 等 依 case
更多 SDO/SDI pin_mux.v

输入汇聚(当某 pad 配置为 SPI0 的 SDI 角色时):

  • spi0_sdi0 = (r_io_reuse_pad4==0) ? pad4 : (r_io_reuse_pad17==0) ? pad17 : 0
  • 同一 SDI 功能可映射到 pad4 或 pad17(二选一)。

4.2 SPI1 相关(reuse==3'b001

Pad 示例功能
2 spi1_clk
3 spi1_csn0
5 spi1_sdi0(与 pad17 可选)

4.3 I2C0(reuse==3'b010

Pad 信号
3 i2c0_sda
4 i2c0_scl

环境假设(FPV assume_i2c_signal):若 pad3 为 I2C0,则 pad4 也为 I2C0。

4.4 I2C1(reuse==3'b011

Pad 信号
5 i2c1_sda
6 i2c1_scl

4.5 UART(reuse==3'b100

Pad 信号
3 ua_txd 输出
4 ua_rxd 输入

输入ua_rxd = (pad4==UART) ? pad4 : (pad20==UART) ? pad20 : 0

4.6 pad1 / pad2 示例(理解 case 结构)

pad1r_io_reuse_pad1):

reuse pad1 输出
000 spi0_clk
001~100 高阻/0

pad2r_io_reuse_pad2):

reuse pad2 输出
000 spi0_csn0
001 spi1_clk

5. 配置寄存器 Spec — pin_mux_rf

5.1 接口

pin_mux_rf_top 转 APB:

APB 信号 宽度 说明
paddr[15:0] 16 字节地址
pwdata[7:0] 8 写数据
prdata[7:0] 8 读数据
pwrite/psel/penable 标准 APB 相位

内部转为 sft_adr_i / sft_dat_i / sft_wr_i / sft_rd_i

5.2 寄存器地址映射(字地址 sft_adr_i

每地址 8bit 写数据 打包 两个 pad 的 3bit 复用域:

地址 (hex) 写入位域 控制的 pad
0x00 [6:4] → pad2;[2:0] → pad1 pad1, pad2
0x01 [6:4] → pad4;[2:0] → pad3 pad3, pad4
0x02 pad6, pad5
0x03 pad8, pad7
0x04 pad10, pad9
0x05 pad12, pad11
0x06 pad14, pad13
0x07 pad16, pad15
0x08 pad18, pad17
0x09 pad20, pad19

复位值:各 reg_io_reuse_pad* 复位为 3'h0(默认 SPI0 组)。

5.3 读回

读操作时 sft_dat_o 返回对应地址的 8bit 寄存器镜像(实现见 pin_mux_rf.v 读多路选择)。


6. FPV / SVA Spec — pinmux.sva

模块 sva_checker 端口与 pin_mux 侧信号对齐(SPI0/1、I2C、UART、reuse、pad、时钟复位)。

6.1 断言(Assert)

名称 语义(自然语言)
assert_spi0_csn0_pad_2_15 spi0_csn0 有效且 r_io_reuse_pad15==0 时,应有 pad[15] 参与(与 pad2 映射场景相关,需结合 RTL)
assert_spi0_csn0_cannot_map_to_pad_3 spi0_csn0 有效且 pad15 为 SPI0 时,不应错误出现在 pad[3]

说明:交付包内断言为 示例/子集;完整 pinmux 需按项目补全“每个功能信号仅出现在合法 pad 集合”类属性。

6.2 假设(Assume)— 约束输入空间

名称 语义
assume_i2c_signal r_io_reuse_pad3==2r_io_reuse_pad4==2(I2C0 成对)
assume_qspi0_signal r_io_reuse_pad3==1 → pad4/5/6 均为 SPI1 组(编码 1)

6.3 覆盖(Cover)

名称 意图
cov_spi0_csn0_pad2 SPI0 CSn 出现在 pad2 配置
cov_spi0_csn0_pad15 SPI0 CSn 出现在 pad15 配置

7. 与 SoC test.v 的关系

SoC 片级仿真 固定 部分 pad(不通过软件改 reuse):

pad SoC test.v 连接
21 clk_cpu
22 rst_n_cpu
1~13 SPI0 四线等

FPV 验证的是 pin_mux 逻辑;集成时若 force pad,需在 review 时区分 “静态 testbench 约束”“软件可配 reuse”


第二部分:验证 Testplan(形式验证)

8. 验证目标

# 目标
1 证明关键 SPI0 片选信号 仅映射到合法 pad
2 在合理 assume 下 无断言失败
3 cover 点可达(证明环境非过约束)
4 为 SoC 管脚约束提供形式化依据

9. 验证策略

选择
工具 Synopsys VC Formal(vcf
顶层 pin_mux
读入 rtl/filelist + bind SVA
时钟 cpu_clkapb_clk period=100
复位 cpu_reset_napb_reset_n 高有效
引擎 check_fv -block

非目标:动态仿真、APB 总线 UVM、电气特性(ESD/驱动能力)。


10. 形式验证用例(“形式 test”)

Case ID 类型 对象 步骤 通过准则
PM-F01 assert assert_spi0_csn0_* vcf -f batch.tcl 无 counterexample
PM-F02 assume I2C/QSPI 组假设 同上 证明完成且 assumptions 合理
PM-F03 cover cov_spi0_csn0_pad2/15 查看 cover 报告 非 vacuous
PM-F04 复位 sim_save_reset batch.tcl reset 状态下无违例

11. 详细执行步骤(PM-F01 主流程)

操作 检查点
1 cd PINMUX/FPV/solution 路径正确
2 确认 ../../rtl/filelist 可读 RTL+SVA 齐全
3 vcf -verdi -f batch.tcl 或批处理 vcf -f batch.tcl license OK
4 等待 check_fv -block 完成 无 FAIL assert
5 打开 results.txt 列表全 PASS 或 expected
6 若有 FAIL Verdi 看 counterexample 波形,区分 RTL bug / 过弱 assume / 错误属性

12. 属性评审清单(扩展用)

建议在后续版本补充的形式属性(当前交付未全部实现):

ID 属性描述 优先级
PM-A01 任一时刻每个 SPI0 功能信号最多驱动一个 pad P0
PM-A02 UART TX 仅在 reuse=100 的 pad 上驱动 P1
PM-A03 I2C pad 必须成对出现(已有 assume 子集) P0
PM-A04 非法 reuse 编码不导致 X 传播到 pad P1
PM-A05 复位后 reuse 寄存器为 0 P2

13. 覆盖率(形式)

类型 说明
cover property 已定义 pad2/pad15 CSn 场景
证明 depth sim_run -stable 与工具默认决定
出口 所有 assert proven;cover 非空

14. 出口准则

# 准则
1 batch.tcl 跑通无 assert failure
2 results.txt 归档
3 assume 已评审(不过强导致 vacuous proof)
4 与 SoC pad 表、数据手册 pinout 交叉核对

15. 与动态仿真的分工

验证层 PINMUX FPV SoC soc/test.v
方法 全状态空间属性 固定 pad + CPU 跑程序
优点 穷举连接关系 真实系统场景
缺点 依赖 assume 不覆盖所有 reuse 组合

建议:FPV PASS + SoC 至少 1 个 SPI/UART 场景 PASS,再签核 pinmux 相关风险。