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_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();
后门读写
实际上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_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)