原创
收集一些自己对PCIe仿真Test Bench的理解
1. board.RP.tx_usrapp.TSK_SIMULATION_TIMEOUT( XXX ) .
这个函数在仿真的时候被调用, XXX 指定了仿真完成的时间,所以这个时间要设置的足够长,否则仿真结果还没出来,仿真就结束了。 Xilinx官网也有人推荐修改rx_usrapp 模块(注释掉几行)来忽略掉这个仿真时间的限制问题:
always @(trn_clk or trn_rsof_n or trn_rsrc_rdy_n) begin /* //Modification if (next_trn_rx_timeout == 0) begin if(!`EXPECT_FINISH_CHECK) $display("[%t] : TEST FAILED --- Haven't Received All Expected TLPs", $realtime); $finish(2); end */ if ((trn_rsof_n == 1'b0) && (trn_rsrc_rdy_n == 1'b0)) begin next_trn_rx_timeout = sim_timeout; end else begin if (trn_lnk_up_n == 1'b0) next_trn_rx_timeout = next_trn_rx_timeout - 1'b1; end end
2. MPS,逛论坛对这个缩写疑惑了半天(新手啊 ),应该是maximum payload size吧。
3. xapp1052给的例子的Testbench里,所有操作应该都是RP发起的。所以如果想要从BMD获得一个MRD,并想要返回一个带数据的Completion的话,就必须修改例子里的测试文件。若要强制RP返回数据,用户必须自己写一个测试任务(task),该任务用于发送一个带返回数据的Completion,数据是在pci_exp_usrapp_tx.v中可以找到的(注意,通常在仿真中实现的RP都没有实现BRAM),当然前提是你发送之前必须对变量“DATA”进行赋值。但是,如果用户想要RP自动返回带数据的Completion(CPLD),想必用户还需要修改Rx,让其发送数据,并发送激励,同时在Tx里用户还需要创建一个新的模块,该模块仅在收到Rx发来的激励时运行。
4. 我们知道payload size取决于RP,我们在例化EP的时候,可能设置的payload长度是1024个字节,然后给出的RP仿真模型里可能只有128个字节,所以此时最大仿真的payload长度是128。若要修改,必须记住,不只是修改EP和RP的DEV_CAP_MAX_PAYLOAD,还要修改CFGDEVCONTROLMAXPAYLOAD[2:0],device control register里的值是由RP来设置的。根据以下步骤修改RP模型里的devcie control register:
1)在系统初始化之后添加下列代码:
board.RP.cfg_usrapp.TSK_READ_CFG_DW(32'h32); board.RP.cfg_usrapp.TSK_WRITE_CFG_DW(32'h32, 32'h7f, 4'h1); board.RP.cfg_usrapp.TSK_READ_CFG_DW(32'h32);
2)然后RP可以使用TSK_TX_TYPE0_CONFIGURATION_WRITE任务来写EP,下面给出也给示例
// increase MPS of the EP
board.RP.tx_usrapp.TSK_TX_TYPE0_CONFIGURATION_WRITE(board.RP.tx_usrapp.DEFAULT_TAG, 32'h32, 32'h7f, 4'h1);
作者: coyoo, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-1010859.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
文章评论(0条评论)
登录后参与讨论