数字部分 3.1 PC Ie Vip环境搭建
PCIe SerDes 全流程实战
数字部分——PCIE_VIP环境项目搭建
以下项目结构为快速验证,并非最佳实践,建议查阅VIP相关文档。
1.1创建PCIE VIP example
export DESIGNWARE_HOME='/home/jjt/pcie_gen6_cxl_proj/designware_home'
dw_vip_setup -path pcie_dev -e pcie_svt/tb_pcie_svt_uvm_unified_vip_sys
1.2 pcie_dev目录下创建my_test_project用于项目测试
my_test_project/
├── rtl/ ── DUT 源码总目录
│ ├── pcie_rtl.f ── 顶层文件表,供编译器一次性引用
│ ├── examples/ ── 官方ep参考
│ ├── scratch/
│ └── src/ ── 正式模块化 RTL
│ ├── Adm/ Amba/ Axi/ ┐
│ ├── Bridge/ │ 按功能域分仓;子目录名称即功能边界
│ ├── Cdm/ common/ │ (协议栈层、AMBA/AXI 桥、Power Mgt 等)
│ ├── Edma/ Edmapf/ │
│ ├── include/ ── 全局 *.svh 头文件与常量包
│ ├── Layer1/2/3/ ── 协议分层实现
│ ├── Phy/ ── 物理层与 PIPE 适配
│ ├── power_management/│
│ ├── products/ timers/┘
├── tb/ ── SystemVerilog + UVM 验证环境
│ ├── interface/ ── 时钟复位、电源上电、SerDes 等接口
│ ├── dut_instance/ ── DUT 封装,集中管理端口绑定
│ ├── pcie_vip/ ── 环境级 env/agent/sequencer 骨架
│ ├── seq_lib/ ── 可复用事务序列
│ ├── vip_instance/ ── 具体 VIP 实例及参数化宏
│ └── tb_top.sv ── 驱动一切的顶层 testbench
├── tc/ ── 独立 testcase,按功能点命名
│ └── pcie_*.sv ── 例如 link_up / cfg_pkg / mem_pkg 等
├── sim/ ── 仿真输出与脚本
│ ├── Makefile ── 单点入口,隐藏编译/执行细节
│ ├── *.log / *.fsdb / *.vcd│── 波形与日志产物
│ ├── verdiLog/ waveutilsLog/│─ GUI 及波形工具日志
│ └── csrc/ simv.daidir/ ── VCS 自动生成目录
└── 顶层辅助文件
└── Makefile ── 快速编译脚本
1.3 项目目录设计思路
-
rtl/
src/
从PCIe IP生成的src目录复制过来examples/
从PCIe IP生成的examples目录复制过来,主要处理时钟,复位,extra RAMs等等。scratch/
从PCIe IP复制过来。- pcie_ep.sv pcie top module
-
tb/
- 采用 UVM 分层:接口 → VIP 组件 → 序列 (sequences) → 环境 (env) → 顶层 (tb_top)。
vip_instance/
集中所有 VIP 参数化与宏,方便在不同平台重用。
-
tc/
- 每个文件对应一类 testcase,命名即用途;脚本中统一
import tc::*
即可批量跑回归。
- 每个文件对应一类 testcase,命名即用途;脚本中统一
-
sim/
- 仿真全部落在此处,源码区保持干净;Makefile 或 simv 二进制也放这里,避免污染 git diff。
-
根目录脚本
pcie_rtl.f
做文件列表;- 统一使用顶层 Makefile 包装,隐藏工具链差异,实现“一键编译仿真”。
(以下设计为快速验证,非最佳实践)
1.4 复位设计
- 顶层只暴露一个
reset_n
,在pcie_ep
内部被直接连到power_up_rst_n / button_rst_n / perst_n / slv_aresetn
,等价于把板级 PERST#、按键复位和 IP 电源上电复位统一起来,方便测试环境只用一个信号驱动。 - 在
clk_reset_module
里,reset_n
先保持高,再拉低 50 ns,然后重新拉高。 - 复位释放后,
power_up_module
通过app_hold_phy_rst
再“兜一层保险”:它在系统时钟跑了 ≈50 个周期后才把该信号拉低,确保 SerDes/PMA 完全稳定才允许 PCIe IP 拉起物理层。 - 等
app_hold_phy_rst
解除后,app_ltssm_enable
再被置 1,LTSSM 真正进入检测并训练链路;这样把“硬复位->PHY稳态->LTSSM启动”三步拆开,测试时更容易定位问题。 - PCIE IP内部复位使用example的复位流程。
1.5 时钟规划
- DUT 只接受差分
refclk_p/n
;clk_reset_module
用 10 ns 周期(100 MHz)翻转这两个线,模拟板上晶振,既驱动 PCIe IP,也供 VIP 里的 PHY 模型使用,保证训练过程同步。 - PCIe IP 内部用
refclk
分频/倍频生成 PIPE 时钟, 目前统一使用PHY CLK=125M, 同后续FPGA PHY的时钟规划。 - 整体时钟树简单:外部唯一高精度时钟
refclk
→ PHY clk → AXI/SerDes 等全部挂同源,既减少跨域 CDC,又能在仿真里用同一个周期观测所有关键节点, 方便调试。
1.6 VIP枚举设备设计
enumeration_device_sequence
扮演的是“简化版 RC(Root Complex)固件”,在仿真一启动、链路进入 L0 后立即对 DUT 进行 PCIe 枚举;它统一由 VIP 发起 Type-0 配置事务,确保后续所有测试都在“已分配资源、已打开 Memory/IO 的合法系统”里进行。- 序列把枚举流程拆成高层任务(探测 BAR 大小、写回 BAR 地址、确认 Capability、设置 MPS/MRRS 等),并通过 cfg/mem 事务接口调用 VIP driver。
1.7 矩阵加法模块设计
- 为验证 MEM Read/Write TLP 以及后续 FPGA 实机和驱动,设计并实现了一个矩阵加法模块。
- 模块基于 Vivado 提供的 AXI 模板开发,当前实现支持最多 16 个 8-bit 无符号整数的列表/矩阵加法。受 FPGA 资源限制, 规模很小。
- 图方便,逻辑直接编写在
pcie_ep.sv
文件中,并通过 AXI4-Full 总线与 PCIe IP 互连。 - 接口包含
start
与busy
两个标志位,分别用于启动计算与监控模块运行状态。