Synopsys PCIe VIP(2) Shadow Memory、后门读写和调试方法
Synopsys PCIe VIP 包含 Existing 和 Unified 例化结构,后者通过参数化配置和interface接口显著提升了灵活性与可复用性。本文继续说明 Global Shadow Memory(TLP 记录与数据比对)、后门读写(HDL 层与 UVM 层访问)以及调试方法(覆盖TL/DL/PL三层),旨在为PCIe验证工程师提供实际配置与调试的直接参考。
例化结构
Synopsys 的 PCIe agent VIP 由 sv 类和 hdl module 两部分组成,hdl 模型又可以分为 Existing 模型和 Unified 模型,从 verdi 打开可以看到差别。简单地说,Existing 模型通过全局 define 配置,而 Unified 模型通过 parameter 配置还多了 interface,所以 Unified 模型更加灵活。VIP 配置类中也将 Existing 模型称为 single instance model。

看似 Unified 中没有 target、requester、driver 和 port 的 hdl module,但实际都在 m_ser 中(serdes 模式下 generate if 例化名),所以实现差别不大。
Existing VIP
Existing VIP 中的 HDL module 通过全局 define 配置,因为没有 interface,和 DUT 只能以信号形式连接,同时不同接口和速率实例化的模型也不一样(如下列举)。所以缺点是会在一些多样配置或多 link 场景使用受限。Existing VIP 的示例在 VIP 2018 版本还有,后续版本就被删掉了。
svt_pcie_device_agent_serdes_x16_8g_hdl.sv
svt_pcie_device_agent_serdes_x16_hdl.sv
svt_pcie_device_agent_serdes_x32_8g_hdl.sv
svt_pcie_device_agent_serdes_x32_hdl.sv
svt_pcie_device_agent_pma_x16_8g_hdl.sv
svt_pcie_device_agent_mpipe_x16_8g_hdl.sv
svt_pcie_device_agent_spipe_x16_8g_hdl.sv
Unified VIP
(1)Unified VIP 特点
• Unified VIP 使用单一的 module 模型(svt_pcie_single_port_device_agent_hdl),模型通过 parameter 配置,不需要全局define。
• Unified VIP 使用单一的接口(svt_pcie_if)。
(2)Unified VIP参数
简单列举部分参数,参数即 svt_pcie_single_port_device_agent_hdl 的 parameter。
| parameter | 描述 |
|---|---|
| SVT_PCIE_UI_PCIE_SPEC_VER | 协议版本 |
| SVT_PCIE_UI_PIPE_SPEC_VER | PIPE协议版本 |
| SVT_PCIE_UI_NUM_PHYSICAL_LANES | 最大支持lane数量 |
| SVT_PCIE_UI_DISPLAY_NAME | HDL module例化名,symbol log用 |
| SVT_PCIE_UI_ENABLE_SHADOW_M EMORY_CHECKING | 使能check |
| SVT_PCIE_UI_MON_PHY_INTERFACE_TYPE | 接口类型,支持serdes、PMA、PIPE |
| SVT_PCIE_UI_DEVICE_IS_ROOT | 1:RC 0:EP |
Global Shadow Memory
自动检查
示例环境中可以看到和 RC、EP 同级还包含 Global Shadow Memory,可以理解为 PCIE 总线空间的存储模型,会记录 memory write 和 configuration write 类型的写 TLP 包,然后对 TLP 读数据进行自动检查。 Shadow Memory 和 Agent VIP 相似同样包含 uvm 和 HDL 两部分,例化 HDL 的同时要通过宏定义指定 hierarchy 路径。
`define EXPERTIO_PCIESVC_GLOBAL_SHADOW_PATH test_top.global_shadow0
pciesvc_global_shadow #( .DISPLAY_NAME( "global_shadow0." ) ) global_shadow0();
后门读写
除了 Global Shadow Memory 存储模型,实际上 RC、EP Agent 也有自己的 target memory 存储模型,所以总共是3个存储模型,这3个模型都可以后门读写。例如 RC 发起1次 memory write,那可以通过对 Shadow Memory 做后门读,也可以通过对 EP 的 target memory 做后门读,然后进行比对。
后门读写可以通过 VIP HDL 部分的 task 实现,下为 RC、EP 和 Shadow Memory 读写示例。
bit [31:0] addr = 32'h2000_0000;
bit [31:0] wdata = 32'h1234_5678;
bit [31:0] byte_enable = 4'hf;
bit [31:0] rdata;
bit [31:0] status;
test_top.endpoint0.mem_target0.Write(addr, byte_enable, wdata, status);
test_top.endpoint0.mem_target0.Read(addr, byte_enable, rdata, status);
test_top.global_shadow0.MemWrite(addr, byte_enable, wdata, status);
test_top.global_shadow0.MemRead(addr, byte_enable, rdata, status);
后门读写也可以通过 VIP 的 uvm 部分的 sequence 实现,相关 sequence 可以参考 svt_pcie_mem_target_service_sequence_collection.svp
调试方法
log文件
默认配置下环境会打印 dl 层传输 log 和 symbol log,下图为传输 log 示例,可以看到上电后首先进行了流量控制 FC 包传输,然后进行了 Mwr32 类型的TLP包传输。
下图为示例 symbol log ,可以看到 TS 序列的每一个symbol。
波形信号
VIP module 模型中包含 ascii 格式的信号用于调试,路径在 test_top.root0.port0.tl0/dl0/pl0.ascii*,下面是 Existing 模型示例,Unified 模型 port0 中间路径有差别,但也能从 port0 找到相同信号。
(1)TL层
TL层可以看到TLP包的类型。
| 信号名 | 描述 |
|---|---|
| ascii_rx_tlp_fc_type | 接收TLP flow control类型,例如P、NP、CPL |
| ascii_rx_tlp_type | 接收TLP类型 ,对应字段fmt+type |
| ascii_rx_tlp_vc | 接收TLP虚拟通道号 |
| ascii_rx_tlp_xld | 接收TLP transaction ID,对应字段Requester ID(16bit)+Tag(10bit) |
| ascii_tx_tlp_fc_type | 发送TLP flow control类型 |
| ascii_tx_tlp_type | 发送TLP类型 |
| ascii_tx_tlp_vc | 发送TLP虚拟通道号 |
| ascii_tx_tlp_xld | 发送TLP transaction ID |

(2)DL层
列举部分 DL 层调试信号,可以看到流量控制初始化的 DLLP 包,和传递的 TLP 包。
| 信号名 | 描述 |
|---|---|
| ascii_tx_tlp_type | 发送 TLP包, 类型 |
| ascii_tx_tlp_seq_num | 发送 TLP包, DL层加的序号 |
| ascii_tx_tlp_ei_code | 发送 TLP包,有错误注入 |
| ascii_tx_dllp_type | 发送 DLLP包, 类型 |
| ascii_tx_dllp_seq_num | 发送 DLLP包, 序号 |
| ascii_tx_dllp_credit_vc | 发送 DLLP包, 虚拟通道号 |
| ascii_tx_dllp_credit_data_value | 发送 DLLP包, 流量控制,数据缓存数值 |
| ascii_tx_dllp_credit_hdr_value | 发送 DLLP包 ,流量控制,包头缓存数值 |
| ascii_dlcmsm_state | DL层状态机 |
| ascii_aspm_state | 低功耗状态机 |
| ascii_pm_state | 电源状态机 |

(3)PL层
列举部分 PL 层调试信号,数据以 symbol 形式表示。可以看到 poll.cfg 阶段下发送 COM+PAD+…+D5.2 symbol(即1个 TS2 序列)。
| 信号名 | 描述 |
|---|---|
| ascii_ltssm_tx_state | 发送LTSSM状态机(这个信号在`include文件里,要全文件搜索) |
| ascii_ltssm_rx_state | 接收LTSSM状态机 |
| ascii_lanen_tx_data | 发送数据,n为0~31 |
| ascii_lanen_rx_data | 接收数据,n为0~31 |

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)