数字部分 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 项目目录设计思路

  1. rtl/

    • src/ 从PCIe IP生成的src目录复制过来
    • examples/ 从PCIe IP生成的examples目录复制过来,主要处理时钟,复位,extra RAMs等等。
    • scratch/ 从PCIe IP复制过来。
    • pcie_ep.sv pcie top module
  2. tb/

    • 采用 UVM 分层:接口 → VIP 组件 → 序列 (sequences) → 环境 (env) → 顶层 (tb_top)。
    • vip_instance/ 集中所有 VIP 参数化与宏,方便在不同平台重用。
  3. tc/

    • 每个文件对应一类 testcase,命名即用途;脚本中统一 import tc::* 即可批量跑回归。
  4. sim/

    • 仿真全部落在此处,源码区保持干净;Makefilesimv 二进制也放这里,避免污染 git diff。
  5. 根目录脚本

    • 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/nclk_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 互连。
  • 接口包含 startbusy 两个标志位,分别用于启动计算与监控模块运行状态。