Synopsys PCIe VIP(2) Shadow Memory、后门读写和调试方法

📅 2026/7/17 0:15:20 👁️ 阅读次数 📝 编程学习
Synopsys PCIe VIP(2) Shadow Memory、后门读写和调试方法

Unified VIP

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_VERPIPE协议版本
SVT_PCIE_UI_NUM_PHYSICAL_LANES最大支持lane数量
SVT_PCIE_UI_DISPLAY_NAMEHDL 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_ROOT1: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();

后门读写

实际上RC、EP Agent VIP也有自己的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

调试方法

波形信号

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_stateDL层状态机
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