PCIe学习笔记系列:
- PCIe基础知识及Xilinx相关IP核介绍
概念了解:简单学习PCIe的数据链路与拓扑结构,另外看看有什么相关的IP核。 - 【PG054】7 Series Integrated Block for PCI Express IP核的学习
基础学习:关于Pcie IP核的数据手册,学习PCIe相关的IP核的配置参数及其对应的含义。 - Xilinx PCIe IP核示例工程代码分析与仿真
基础学习:关于PCIe IP核的仿真,学习PCIe的配置流程以及应用过程。 - Xilinx XDMA 例程代码分析与仿真结果
应用学习:关于Xilinx PCIe DMA IP核的仿真,学习 PCIe DMA 的配置过程以及具体的数据传输流程。 - XDMA linux平台调试过程记录
应用学习:关于XDMA的实际调试过程,可在此基础上定制自己的需求。
【PG054】7 Series Integrated Block for PCI Express IP核的学习中学习了7 Series Integrated Block for PCI Express IP核的一些基础知识,下面通过仿真进一步理解。
1 工程建立
只进行仿真设计,随便配置成Endpoint器件就行。
1 page1:Basic

2 page2: IDs

3 page3: BARs

4 page4: Core Capabilities

5 page5: Interrupts

设置好IP核之后,右击IP核打开示例工程:

示例工程的文件结构:
xilinx_pcie_2_1_ep_7x
|
|--pcie_7x_0_support
| |--pcie_7x_0_pipe_clock
| |--pcie_7x_0 (Core Top level module Generated by Vivado in synth directory)
| |--pcie_7x_v3_3_4_top (Static Top level file)
| |--pcie_7x_v3_3_4_core_top
| |
| |--pcie_7x_0_pcie_top
| | |
| | |--pcie_7x_0_axi_basic_top
| | | |
| | | |--pcie_7x_0_axi_basic_rx
| | | | |
| | | | |--pcie_7x_0_axi_basic_rx_pipeline
| | | | |--pcie_7x_0_axi_basic_rx_null_gen
| | | |
| | | |--pcie_7x_0_axi_basic_tx
| | | |
| | | |--pcie_7x_0_axi_basic_tx_pipeline
| | | |--pcie_7x_0_axi_basic_tx_thrtl_ctl
| | |
| | |--pcie_7x_0_pcie_7x
| | | |
| | | |--pcie_7x_0_pcie_bram_top_7x
| | | | |
| | | | |--pcie_7x_0_pcie_brams_7x (an instance each for Rx & Tx)
| | | | |
| | | | |--pcie_7x_0_pcie_bram_7x
| | | |
| | | |--PCIE_2_1 (Integrated Block Instance)
| | |
| | |--pcie_7x_0_pcie_pipe_pipeline
| | |
| | |--pcie_7x_0_pcie_pipe_misc
| | |--pcie_7x_0_pcie_pipe_lane (per lane)
| |
| |--pcie_7x_0_gt_top
| |
| |--pcie_7x_0_gt_rx_valid_filter
| |
| |--pcie_7x_0_pipe_wrapper
| | |
| | |--pcie_7x_0_pipe_reset
| | |--pcie_7x_0_qpll_reset
| | |--pcie_7x_0_pipe_user
| | |--pcie_7x_0_pipe_rate
| | |--pcie_7x_0_pipe_sync
| | |--pcie_7x_0_pipe_drp
| | |--pcie_7x_0_pipe_eq
| | | |--pcie_7x_0_rxeq_scan
| | | |
| | |--pcie_7x_0_gt_common
| | | |--pcie_7x_0_qpll_drp
| | | |--pcie_7x_0_qpll_wrapper
| | |
| | |--pcie_7x_0_gt_wrapper
|
|--pcie_app_7x (PIO design, in example_design directory)
|
|--PIO
|
|--PIO_EP
| |
| |--PIO_EP_MEM_ACCESS
| | |
| | |--EP_MEM
| | |
| | |--RAMB36
| |
| |--PIO_RX_ENGINE
| |--PIO_TX_ENGINE
|
|--PIO_TO_CTRL
2 工程仿真
2.1 代码分析
再回顾一下示例程序的结构:

首先打开testbench中的文件pci_exp_usrapp_tx.v, 层次路径为:board/RP/tx_usrapp, 重点关注一个initial块:

- 308行:这里指定了测试任务的名称为
pio_writeReadBack_test0。 - 324行:这里通过调用
TSK_USR_DATA_SETUP_SEQ任务对DATA_STORE进行初始化。 - 332行:这里通过文件包含命令``include "tests.vh"
添加了有关测试任务的具体内容。注意verilog的文件包含与c有区别,verilog是直接把tests.vh中的内容直接搬过来,打开tests.vh可以看到只有一句代码:\include “sample_tests1.vh”,sample_tests1.vh中的就是具体的每个测试任务的内容了:

其中,名为pio_writeReadBack_test0的测试任务的具体内容为:
else if(testname == "pio_writeReadBack_test0")
begin
// This test performs a 32 bit write to a 32 bit Memory space and performs a read back
board.RP.tx_usrapp.TSK_SIMULATION_TIMEOUT(10050);
board.RP.tx_usrapp.TSK_SYSTEM_INITIALIZATION;
board.RP.tx_usrapp.TSK_BAR_INIT;
//--------------------------------------------------------------------------
// Event : Testing BARs
//--------------------------------------------------------------------------
for (board.RP.tx_usrapp.ii = 0; board.RP.tx_usrapp.ii <= 6; board.RP.tx_usrapp.ii =
board.RP.tx_usrapp.ii + 1) begin
if (board.RP.tx_usrapp.BAR_INIT_P_BAR_ENABLED[board.RP.tx_usrapp.ii] > 2'b00) // bar is enabled
case(board.RP.tx_usrapp.BAR_INIT_P_BAR_ENABLED[board.RP.tx_usrapp.ii])
2'b01 : // IO SPACE
begin
$display("[%t] : Transmitting TLPs to IO Space BAR %x", $realtime, board.RP.tx_usrapp.ii);
//--------------------------------------------------------------------------
// Event : IO Write bit TLP
//--------------------------------------------------------------------------
board.RP.tx_usrapp.TSK_TX_IO_WRITE(board.RP.tx_usrapp.DEFAULT_TAG,

该博客详细介绍了PCIe的基础知识和Xilinx相关IP核的使用,包括PCIe数据链路与拓扑结构、PCIe IP核配置、工程仿真以及测试案例。通过分析PCIe IP核的配置参数和工程仿真过程,展示了如何进行PCIe BAR的读写测试,同时提供了PCIe配置空间的解析和相关任务的功能说明。通过仿真,验证了PCIe链路速度、宽度的检查以及BAR空间的正确映射和读写操作。
最低0.47元/天 解锁文章
1296





