赞
踩
目录
在阅读本文之前,建议刚接触PCIE的读者,请按顺序逐一阅读下面几个内容:
六、Xilinx PCIE DMA--Sparten6/Kintex-7 BMD
本文在上一篇博客 “六、Xilinx PCIE DMA--Sparten6/Kintex-7 BMD 搭建” 的基础上,讲解如何使用modelsim对建好的BMD工程,搭建仿真环境。
本文搭建了BMD的仿真环境, 通过PIO仿真验证搭建BMD工程的完整性。
通过xapp1052 DMA仿真,举例分析DMA的数据流。
软件环境: ISE14.4/ISE14.7。xapp1052是在vivado环境下运行。
在 “Xilinx PCIE DMA--Sparten6/Kintex-7 BMD 搭建” 基础上,
进行下面步骤:
(1)首先,example_design文件夹下的文件全部删除;
(2)章节3里所有代码层次的.V文件,都复制到example_design文件夹里;
(3)修改\ipcore_dir\dma_core\simulation\functional文件夹里的board.f文件,
将以前PIO的相关内容,替换为下图中红色框框内容。
注意,第五行BMD_PCIE_20.v必须放在最前面编译。
修改后的board.f文件如下图所示。
(4)运行do simulate_mti.do文件后,
可能会报告xilinx_pcie_2_1_ep_7x.v文件里一些管脚未连接的错误信息,注释掉这些行即可。
(注释的过程中,可能会不小心将有用的信号线也给屏蔽掉了。因此,注释的过程中,需要格外小心!)
修改后的board.f文件如下图所示:
- ../../example_design/xilinx_pcie_2_1_ep_7x.v
- ../../example_design/pcie_app_7x_BMD.v
- ../../example_design/BMD.v
- ../../example_design/BMD_GEN2.v
- ../../example_design/BMD_EP.v
- ../../example_design/BMD_EP_MEM_ACCESS.v
- ../../example_design/BMD_EP_MEM.v
- ../../example_design/BMD_64_RX_ENGINE.v
- ../../example_design/BMD_64_TX_ENGINE.v
- ../../example_design/BMD_TO_CTRL.v
- ../../example_design/BMD_CFG_CTRL.v
- ../../example_design/BMD_INTR_CTRL.v
- ../../example_design/BMD_RD_THROTTLE.v
- ../../example_design/BMD_INTR_CTRL_DELAY.v
- ../../example_design/axi_trn_rx.v
- ../../example_design/axi_trn_top.v
- ../../example_design/axi_trn_tx.v
接下来可以进行对该BMD工程的仿真。运行do simulate_mti.do以后,可以看到仿真的层次结构如下图所示。
(1)若运行do simulate_mti.do后,modelsim报下面的错误,
打开该文件,可以看到下面的指令,将下面红色圈的部分替换为ISE安装目录下glbl文件的路径即可。
(2)在对Sparten6 pcie仿真时,还modelsim还可能出现下面的错误。
解决方法,将ipcore_dir\pcie_test\simulation\dsport\gtx_wrapper_v6.v文件里的POWER_SAVE[4]设置为1即可解决。
(3)问题:如果在对K7 的pcie进行modelsim仿真时,Wave界面没有自动添加显示观察的波形。
解决方法:找到ipcore_dir\dma_core\simulation\functional文件夹路径下的simulate_mti.do文件,
在其中添加(注意将该语句中的路径替换为自己电脑工程的实际路径): do E:/k7_dma_test_SIM/dma_test/ipcore_dir/dma_core/simulation/functional/wave.do
(4)问题:在仿真中可能遇到modelsim报错,比如未定义某某函数一类的问题,该问题可能是由于仿真库没有添加到modelsim里。
这个问题,也仅出现在K7 FPGA芯片 DMA64工程里,在SPARTEN6的工程里就没有出现该问题。
解决方法:ipcore_dir\dma_core\simulation\functional文件夹路径下的simulate_mti.do,使用IP核自动产生的该文件,不可以删除该文件里的语句。
下面附上simulate_mti.do文件的内容:
- vlib work
- vmap work
-
- vlog -work work +incdir+../.+../../example_design +define+SIMULATION +incdir+.+../dsport+../tests D:/ISE/14.4/ISE_DS/ISE/verilog/src/glbl.v -f board.f
-
- vsim -voptargs="+acc" +notimingchecks +TESTNAME=BMD_wr_test -L work -L secureip -L unisims_ver -L unimacro_ver work.board glbl +dump_all
-
- do E:/k7_dma_test_SIM/dma_test/ipcore_dir/dma_core/simulation/functional/wave.do
-
-
- #add log -r /*
- run -all
(5)问题:该工程若是直接生成FPGA 烧录文件(bit)的话,可能在综合的时候显示:ERROR:HDLCompier:1654.Line 276:Instantiating<dma_core_inst>from unkown modle<dma_core>。
这个问题,也仅出现在K7 FPGA芯片 DMA64工程里,在SPARTEN6的工程里就没有出现该问题。
解决方法:
在工程中不直接添加PCIE IP的.XCO文件,而是添加ipcore_dir\dma_core\source路径下的全部文件,替代PCIE IP的.XCO文件。
(6)问题:该工作直接生成FPGA 烧录文件(bit)的话,在最后generate bit文件环节,可能因为管脚约束问题,导致不能产生bit文件。
这个问题,也仅出现在K7 FPGA芯片 DMA64工程里,在SPARTEN6的工程里就没有出现该问题。
解决方法:
(7)在WIN10系统下仿真,可能会遇到下面的问题。这个问题,也仅出现在K7 FPGA芯片 DMA64工程里,在SPARTEN6的工程里就没有出现该问题。
解决方法:
这个问题是有Xilinx仿真库存在问题导致的。我将WIN7系统下编译的仿真库拷贝到WIN10系统ISE的安装目录,再次仿真。没有遇到问题。
但不确定具体问题原因。
board:是testbench的顶层;
EP :是章节3里搭建的BMD工程,是Endpoint;
RP :是模拟PC的相关测试环境,如下面有图搭建的测试环境。
dma_core_inst:是例化的PCIE DMA IP Core;
app_BMD :是例化的BMD操作工程。
按照上面的步骤,是可以正确搭建DMA仿真平台的;可以通过PIO仿真验证该平台代码工程的完整性。
但,如果想进行DMA仿真的话,可能还会遇到一些问题,比如:工程搭建的过程中,误将有用的信号线给注释掉了;DMA testcase的配置步骤;如何使能cfg_bus_mstr_enable。
下面会以下xapp1052 DMA仿真进行举例说明。
首先,由于xapp1052是在vivado平台下开发的,其testname的引入方式与ISE平台是有区别的。
在vivado的工程里,testname的引入,则不是在simulate_mti.do文件里,其是在pci_exp_usrapp_tx.v文件里引用的。
如下图所示
其次,testcase的设计,按照xapp1052中PDF给的配置过程即可。
下面再附上xapp1052给的读写配置步骤吧。
本文提供一种testcase示例。
在本testcase中,配置的是MWR存储器写访问事物,TLP size 是32(十进制),TLP count是20(十进制),TLP pattern是32'haa55_aa55。也即在启动DMA传输的时候,FPGA将会给RP端发送20个TLP数据包,每个TLP数据包含有32个DW,每个DM=32'haa55_aa55。
下载链接: https://download.csdn.net/download/qq_22168673/11607712
将上面链接里的testcase粘贴复制到sample_tests1.vh文件里即可。
这里需要注意:
make sure you set the Bus master enable bit on both RP and Endpoint.
在准备好testcase之后,需要修改pci_exp_usrapp_tx.v文件里的有个参数。
将下图中TSK_BAR_PROGRAM任务中的的value修改为32'h0000_0007即可,该数值是配置cfg_command寄存器使用的。
但,下图的修改,仅是使能EP 端的cfg_bus_mstr_enable。
RP端的Bus master enable 需要在testcase里进行配置。
该仿真,配置步骤参考xapp1052的PDF中配置步骤,RP端模拟PC的相关操作,给EP寄存器进行配置,然后FPGA作为master发起WMR存储器写访问事物,将数据以DMA数据流的方式发送给RP端。
下图中reg_address的值应该参考xapp1052的配置步骤设置,下图后期再修改。
通过下图,可以看到TX连续发送了20个TLP数据包,每个TLP数据包含有32个DW,每个DM=32'haa55_aa55。
然后,再观察第二个TLP头包,可以分析存储器写地址的变化情况。
参考xapp1052里的步骤,写testcase,配置 DMA RD的寄存器。
将FPGA配置称为master,之后启动DMA;然后,FPGA会连续发送多个(TLP COUNT)MRd读请求事务;RP端接收到FPGA 发送的MRd事务后,会返回CPLD 数据包。
首先是以PIO的方式,配置寄存器信息。如下图所示。
当FPGA接收到RP以PIO方式配置的启动DMA标志后,会连续发送多个(TLP count)MRd存储器读请求事务。该testcase中,是配置20个存储器读请求,即TLP count=20(十进制)。
当RP接收到FPGA发起的存储器读请求之后,会返回CPLD事务。
但是,这里可能会遇到RP_rx端口接收到EP端FPGA发来的读请求之后,RP并没有给FPGA返回CPLD的情况。
应该是,RP端没有发送CPLD DMA数据流的相关task,这部分需要自己设计task、实现RP 返回DMA 的CPLD事务TLP包。
这个问题,论坛里也有相关讨论,大家可以看看
另外一个仿真中大家可能会遇到的问题是,RP端可能接收不到EP发送的DMA MWr写访问事务TLP。这个问题的话,可以看看本文最后的参考文献3,将其中的3行配置信息写到init初始化配置task里试试。
最后,本文提供一种DMA 读访问的testcase示例,
下载链接: https://download.csdn.net/download/qq_22168673/11609362
补充说明:
board:顶层文件+系统复位
RP:Root complex的部分。其中rport就是PCIE端口部分;cfg_usrapp是配置部分,配置读写使能,错误控制等,还有一些常用的任务方便其他模块调用;com_usrapp是加载RX/TX文件,把RX/TX的数据以dat文件形式保存,需要时加载/覆盖。pl_usrapp物理层控制和状态部分。
调用TASK方法:
eg: board.RP.com_usrapp.TSK_READ_DATA(0, `RX_LOG, trn_rd, trn_rrem_n);——是指调用board-RP-com_usrapp里面的 TSK_READ_DATA任务,其中括号里面的是传递变量,按照usrapp里面TSK_READ_DATA定义里面的input顺序来传递变量。
$value$plusargs:将运行命令(run-options)中的参数值传递给指定的信号或者字符,用法:
if ($value$plusargs("TESTNAME=%s", testname))
$display("Running test {%0s}......", testname);
则,当使用的运行命令为:<run-options>+TESTNAME=tst_name时,运行结果为:Running test {tst_name}......
如果想把DMA功能用起来,自行调用pci_exp_usrapp_tx.v中的函数,往DMA控制寄存器中写入地址、长度等数据,然后启动DMA读或者写。
参考文献:
作者 | 博客 |
1、Buyi_Shizi | xapp1052之dma_test.v |
2、Jack-Xu | 一步一步开始FPGA逻辑设计 - 高速接口之PCIe |
3、shiyinjita | 关于xilinx的pcie仿真说明!!!!pcie仿真建议看一下 |
4、yf869778412 | 如何使用xilinx pcie的源代码 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。