This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320C6670:具有 EDMA 的 PCIe 出站有效载荷大小

Guru**** 2551110 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/601108/tms320c6670-pcie-outbound-payload-size-with-edma

器件型号:TMS320C6670

您好!

一段时间前 、C6678中的 PCIe 出站大小有类似的主题。 虽然该线程被标记为已解决、但我看不到它到底有多大帮助。 现在轮到我提出完全相同的问题了。

我有 C6670。 我将通过 EMDACC0设置 EDMA 传输、其两个传输控制器的 DBS 均为128B。 我将传输大小设置为2K。 我正在监控 EP 上的 PCIe 事务接口、即 FPGA。 我看到 TLP 的有效载荷大小为16 DWORD、即64B。 我还看到32次传输、因此每次传输2048B/32=64B。 此外、在 TLP 头中、我看到目标地址为0x0000、0x0040、0x0080、它们以64B 的倍数递增。

另一方面、我确信我的 FPGA 将 DEV_CAP_MAX_PAYLOAD_SUPPORTED 参数广播为128B。

因此、我要再次询问、如何通过 PCIe 使用 EDMA 实施128B 出站传输。

提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已通知工厂团队。 他们的反馈将在此处发布。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您的观察结果是、OB 有效载荷大小实际上为64字节。 我没有用于检查 TLP 有效载荷的范围。 过去、我们对具有64字节或128字节 DBS 的不同 EDMA 传输控制器的 PCIe 吞吐量进行了测试、并对我们获得的数据与理论吞吐量进行了匹配、因此我们认为 OB 有效载荷大小是正确的。 测试是在 TI EVM 之间进行的、我们在 PCIe 寄存器中没有做任何特殊的事情来强制使用128字节。 OB 限制来自 EDMA DBS 大小。 在 IB 方向上、PCIe 支持256字节有效载荷。

    C6670 EDMA cC0具有两个128字节 DBS 的控制器。 在这种情况下、您的 ACNT 和 BCNT 设置是什么、并且您使用了 A-SYNC 或 A-B 同步?

    什么是 TI 6670 Side DEV_CAP 设置、0x2180_1074位2-0? DEV_STAT_CTRL、0X2180_1078位7-5? 0表示128字节、1表示256字节。

    此致、Eric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    感谢您的关注。 配置后、我的设置为:

    DEVICE_CAP 0x21801074 00008001 => 1用于256B

    DEV_STAT_CTRL 0x21801078 0000281F => 1表示256B

    我想知道、这可能有什么影响、因为根据规格允许广播的最小尺寸为128B。

    我在 EP 侧、FPGA 中都有 DMA 引擎的相关经验。 我能够发出从 FPGA 到 DSP 的128B 写入和读取请求、它们按预期工作。 特别是、在第 x1代配置中、在大传输时、我可能具有超过200MBps 的电流量。

    这是我对传输的配置

    dma->rght.prm.cfg.option = CSL_EDMA3_OPT_make
    (
    CSL_EDMA3_ITCCH_DIS、 // itcchEn、
    CSL_EDMA3_TCCH_DIS、 // tcchEn、
    CSL_EDMA3_ITCINT_DIS、 // itcintEn、
    CSL_EDMA3_TCINT_EN、 // tcintEn、
    FPGA_EDMA_TX1_R、 // TCC、
    CSL_EDMA3_TCC_NORMAL、 // tccMode、
    CSL_EDMA3_FIFOWIDTH_NONE、// fwid、
    CSL_EDMA3_STATIC_DIS、 // stat,
    CSL_EDMA3_SYNC_A、 // syncdm,
    CSL_EDMA3_ADDRMODE_INCR、// DAM、
    CSL_EDMA3_ADDRMODE_INCR // Sam
    );
    dma->rt.prm.cfg.srcAddr =(uint32) PCIe_L2_buf.buf;//PCIe_buf;
    dma->rght.prm.cfg.aCntbCnt = CSL_EDMA3_CNT_make (2×1024、1);
    dma->rt.prm.cfg.dstAddr =(uint32) 0x60000000;
    dma->rg.prm.cfg.srcDstBIDx = CSL_EDMA3_BIDX_make (1、1);
    dma->rt.prm.cfg.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_make (CSL_EDMA3_LINK_DEFAULT、0);
    dma->rg.prm.cfg.srcDstCidx = CSL_EDMA3_CIDX_make (0、1);
    dma->rt.prm.cfg.cnt = 1;
    

    我愿意对此问题进行调查。 感谢你的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    这两个寄存器我只想仔细检查编程的内容、因为我不知道您使用的软件是什么。 我想知道它是否是 maxium 有效负载大小的合理值。

    我查看了您的 DMA 配置,CSL_EDMA3_CNT_make (2*1024,1)看起来是正确的;它将2048输入 ACNT,1输入 BCNT。 EDMA TC 将使用 DBS 拆分2048个字节。

    您可以尝试以下操作:
    1) 1)将 CSL_EDMA3_SYNC_A 更改为 CSL_EDMA3_SYNC_AB
    2)传输更大的块、比如说128KB 的 dma->rgm.prm.cfg.aCntbCnt = CSL_EDMA3_CNT_make (128、1024);

    此外、您能否再次检查这是否真的是 EDMA cC0?

    此致、Eric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好!

    再次感谢您关注我的困难。 我将粘贴相关的代码片段、因为它似乎存在多个问题。

    这是常见的初始化代码、打开 EDMA 实例0

    #define FPGA_EDMA_CC_INST CSL_EDMA3CC_0
    
    EDMA_str * EDMA_init (void)
    {
    CSL_Status 状态;
    
    edma_str * dma =(edma_str *) malloc (sizeof (edma_str));
    如果(NULL == DMA)返回 NULL;
    
    //模块初始化
    CSL_edma3Init( NULL );//始终返回 CSL_Sok
    
    //模块级打开
    //只有 EMDMACC0可以具有128B 的数据突发大小(DBS),这是我们想要的
    //具有 PCIe 传输。
    dma->hModule = CSL_edma3Open (&dma->moduleObj、FPGA_EDMA_CC_INST、NULL、&STATUS);
    如果(CSL_SOK!= status)返回 EDMA_CLOSE (DMA);
    
    如果(NULL ==(dma->fpga =fpga_dma_init (dma->hModule))))返回 EDMA_CLOSE (dma);
    
    返回 DMA;
    } 

    接下来、我要进行特定的通道设置:

    FPGA_DMA_str * FPGA_DMA_init (CSL_Edma3Handle hModule)
    {
    CSL_Status 状态;
    CSL_Edma3ChannelAttr chAttr;
    
    fpga_dma_str * dma =(fpga_dma_str *) malloc (sizeof (fpga_dma_str));
    如果(NULL == DMA)返回 NULL;
    
    //
    /*开放 EDMA 通道*/
    chAttr.regionNum = CSL_EDMA3_REGION;
    chAttr.chaNum = FPGA_EDMA_TX1_R;
    dma->tx1.rght.cha.hdl = CSL_edma3ChannelOpen (&dma->tx1.rght.cha.obj、FPGA_EDMA_CC_INST、&chAttr、&status);
    if ((NULL =DMA->tx1.rght.cha.hdl)||(CSL_SOK!= STATUS))
    返回 FPGA_DMA_CLOSE ( DMA );
    
    if (CSL_Sok!= CSL_edma3 HwChannelSetupQue (dma->tx1.rght.cha.hdl、FPGA_EDMA_QUE))
    返回 FPGA_DMA_CLOSE ( DMA );
    
    /*将 DMA 通道映射到参数块。 *
    CSL_edma3MapDMAChannelToParamBlock (hModule、FPGA_EDMA_TX1_R、8 * FPGA_EDMA_TX1_R);
    
    dma->tx1.rth.prm.hdl = CSL_edma3GetParameterHandle( dma->tx1.rght.cha.hdl,8 * FPGA_EDMA_TX1_R,&STATUS );
    if ((NULL =dma->tx1.rh.prm.hdl)||(CSL_Sok!= status))
    返回 FPGA_DMA_CLOSE ( DMA );
    
    返回 DMA;
    } 

    一个示例

    #define FPGA_EDMA_TX1_R 6. 

    然后、在每次传输前、我应用配置:

    void FPGA_TX_EDMA_mk (
    
    u_int8 TX 的* src、/* src 地址。 如果为 NULL *、则忽略通道
    u_int8 TX 的* dst、/* dst 地址。 如果为 NULL *、则忽略通道
    用于 TX 传输的 TX_DMA_str * DMA /* EDMA 资源 */
    )
    {
    
    if ((NULL!= src)&&(NULL!= dst))
    {
    /*设置参数条目参数*/
    dma->rght.prm.cfg.option = CSL_EDMA3_OPT_make
    (
    CSL_EDMA3_ITCCH_DIS、 // itcchEn、
    CSL_EDMA3_TCCH_DIS、 // tcchEn、
    CSL_EDMA3_ITCINT_DIS、 // itcintEn、
    CSL_EDMA3_TCINT_EN、 // tcintEn、
    FPGA_EDMA_TX1_R、 // TCC、
    CSL_EDMA3_TCC_NORMAL、 // tccMode、
    CSL_EDMA3_FIFOWIDTH_NONE、// fwid、
    CSL_EDMA3_STATIC_DIS、 // stat,
    CSL_EDMA3_SYNC_AB、 // syncdm,
    CSL_EDMA3_ADDRMODE_INCR、// DAM、
    CSL_EDMA3_ADDRMODE_INCR // Sam
    );
    dma->rt.prm.cfg.srcAddr =(uint32) src;//pcie_buf;
    dma->rgm.prm.cfg.aCntbCnt = CSL_EDMA3_CNT_make (256、2);
    dma->rt.prm.cfg.dstAddr =(uint32) dst;
    dma->rg.prm.cfg.srcDstBidx = CSL_EDMA3_BIDX_make (256、256);
    dma->rt.prm.cfg.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_make (CSL_EDMA3_LINK_DEFAULT、0);
    dma->rg.prm.cfg.srcDstCidx = CSL_EDMA3_CIDX_make (0、0);
    dma->rt.prm.cfg.cnt = 1;
    
    /*放置设置*/
    CSL_edma3参数设置(dma->rght.prm.hdl、&dma->rgm.prm.cfg);
    }
    }
    

    最后、我手动触发传输、如所示

    void FPGA_TX_EDMA_Submit (TX_DMA_str * DMA)
    {
    if (NULL!= DMA)
    {
    if (NULL!= dma->rght.cha.hdl)
    {
    EDMA_START = TSCL;
    CSL_edma3参数设置(dma->rght.prm.hdl、&dma->rgm.prm.cfg);
    CSL_edma3HwChannelControl (DMA->rght.cha.hdl、CSL_EDMA3_CMD_CHANNEL、NULL);
    }
    }
    
    

    因此、在整个代码中、我只看到提到了 EMDMACC0。 此外、作为使用正确控制器的间接指示、我可以看到以下配置发生了完成中断:

    EventCombiner.eventGroupHwiNum[0]= 7;
    EventCombiner.eventGroupHwiNum[1]= 8;
    EventCombiner.eventGroupHwiNum[2]= 9;
    EventCombiner.eventGroupHwiNum[3]= 10;
    
    CpIntc.sysIntts[36].fxn ='&EDMA_ISR';
    CpIntc.sysInts[36].arg = 36;
    CpIntc.sysInts[36].hostInt = 2;
    CpIntc.sysInts[36].enable = true;
    
    var EventID = CpIntc.getEventIdMeta (2);
    params =新 Hwi.Params;
    params.arg = 2;
    params.instance.name ='EDMA';
    params.EventID = EventID;
    params.enableInt = 1;
    Program.global.hwi11 = Hwi.create (6、CpIntc.Dispatch、params);
    

    我相信我已经使用系统事件36来设置完成中断、即在全局区域中的 EMDMACC0完成。 到目前为止还可以。

    糟糕的是、我接收到的数据是错误的。 实际上、在 FPGA 中、所有有效载荷代码都为零、我只看到 TLP 头的3个 DWORDS、它们看起来不错、但整个有效载荷只是零。 为了确保、我创建了一个静态数组、其中填充了字节计数并刷新了缓存:

    u_int8 EDMA_buf[128*64];
    
    int i;
    
    对于(i = 0;i < 1024;i++) EDMA_buf[i]= i;
    cache_wbInv((XDC_PTR)(EDMA_buf),sizeof (EDMA_buf),cache_Type_L2,true );
    FPGA_TX_EDMA_mk_cfg (EDMA_buf、(u_INT8*) 0x60000000、FFTN_2048、&LTTE->DMA->FPGA->tx1);
    edma_intr enable( lt->dma->hModule );
    FPGA_TX_EDMA_Submit (&LTE->DMA->FPGA->tx1); 

    关于您对不同传输配置的建议、我应该报告以下内容:

    1) 1)如果我使用 A-SYNC 生成任何较大的块、我只会看到以64B 为单位传输的维度 A、例如、对于以下配置

    dma->rght.prm.cfg.option = CSL_EDMA3_OPT_make
    (
    CSL_EDMA3_ITCCH_DIS、 // itcchEn、
    CSL_EDMA3_TCCH_DIS、 // tcchEn、
    CSL_EDMA3_ITCINT_DIS、 // itcintEn、
    CSL_EDMA3_TCINT_EN、 // tcintEn、
    FPGA_EDMA_TX1_R、 // TCC、
    CSL_EDMA3_TCC_NORMAL、 // tccMode、
    CSL_EDMA3_FIFOWIDTH_NONE、// fwid、
    CSL_EDMA3_STATIC_DIS、 // stat,
    CSL_EDMA3_SYNC_A、 // syncdm,
    CSL_EDMA3_ADDRMODE_INCR、// DAM、
    CSL_EDMA3_ADDRMODE_INCR // Sam
    );
    dma->rt.prm.cfg.srcAddr =(uint32) src;//pcie_buf;
    dma->rgm.prm.cfg.aCntbCnt = CSL_EDMA3_CNT_make (256、16);
    dma->rt.prm.cfg.dstAddr =(uint32) dst;
    dma->rg.prm.cfg.srcDstBidx = CSL_EDMA3_BIDX_make (256、256);
    dma->rt.prm.cfg.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_make (CSL_EDMA3_LINK_DEFAULT、0);
    dma->rg.prm.cfg.srcDstCidx = CSL_EDMA3_CIDX_make (0、0);
    dma->rt.prm.cfg.cnt = 1; 

    我看到64B 的4次传输、是的、负载为零。

    如果我使用 AB-SYNC 进行此传输、那么整个块将以64B 的块进行传输。

    请协助调试。

    提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    看起来您有两个问题:1) 64字节传输、与 DBS 无关2) TLP 有效载荷为零

    1) 1) C6657和 FPGA 之间是否有替代 PCIe 链路?

    2) 2)代码看上去正确使用 EDMA cC0和通道6。 在手动触发传输之前、您是否能够从寄存器0x27040A0到0x27040C0 (这适用于 cC0、通道6、每个通道使用0x20)下载 ParamSet。 如果它们看起来正确或不正确、您可以解码。 然后查看 SRC 地址、它是您的 EDMA 数据源缓冲器。 您在 CCS 存储器窗口中看到的内容是什么、其中已针对此源缓冲器、零或您的模式检查和取消缓存? 您的 EDMA DST 是什么? 是0x60000000吗?

    然后、传输结束后、您在0x60000000中看到了什么? 零或您的数据模式? 如果为零、您可以手动将0x60000000写入 CCS 存储器窗口中的某个内容吗? 或者、您能否使用*(unsigned int*) 0x60000000 =图案写入代码? 我想了解0x60000000区是否可写?

    此致、Eric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    对于调零点有效载荷的第二个问题、我想我知道原因:在告知 EDMA 源地址时、我忘记了将缓冲地址(我确信是核心本地地址)转换为全局地址。 虽然对此有信心、但会在硬件上进行确认并进行报告。

    我不知道、上述故障是否与64B 碎片的问题1有任何关系。 将修复并再次检查。

    至于到 FPGA 的 PCIe 链路、这是经过验证的操作设计。 目前、FPGA 中有 DMA 引擎、它执行批量读取和写入以及 PIO 传输。 使用该机器、我们能够在两个方向上将 TLPS 与128B 有效载荷进行交换、吞吐量超过200MBps、在 x1 Gen1链路上使用更大的块。 当然、有适用于 PCIe 数据窗口的转换代码、但经过多年验证。

    感谢您提供有关 PEEP 和解码 ParamSet 存储器位置的提示。 并进行报告。

    看起来我们住在地球的另一边,我已经离开办公室过周末了,但将在星期一进行检查和报告。

    非常感谢您的指导、这对我来说是真正的价值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Eric、

    我刚刚确认了我的怀疑:零有效载荷是由于我没有向 EDMA 引擎提交缓冲器的全局地址。 请参见 FPGA 事务 接口处的捕捉

    TLP 接头的3个 DWORDS 之后、有我预期的有效载荷。 多边环境协定。

    但是、TLP 有效载荷大小的问题仍然存在。 在上图中、看到"dw_length"信号、显示16DW=64B。 在一定的较大范围内:

    请注意、MEM_addr 信号增量为0x40、这也是64B。

    为了确保这一点、我在 FPGA 中使用 DMA 引擎触发了 DSP 到 FPGA 的传输:

    请注意、在传输设置后、数据传入的数据包中的有效载荷为32DW = 128B。 数据包类型不同、因为 FPGA 正在请求读取、而 DSP 使用 Completer TLPS 进行响应。 本实验的重要结论是 PCIe 子系统能够形成和传输128B 有效载荷。 但是、当 EDMA 请求 PCIe 传输时、不会发生这种情况。

    至于传输速度、我进行了粗略实验、发现与 FPGA 引擎的200+Mbps 相比、传输速率约为180MBps。

    我们可以估计链路利用率为(64B 有效载荷)/(64B 有效载荷+ 12B 接头)= 84%、而(128B 有效载荷)/(128B 有效载荷+ 12B 接头)= 91%。 不重要、但可见。

    我在本例中看到"ParamSet"的句柄为0x02704600。 我在该地址看到合理的参数着陆。 也许这需要更多的注意,但无论如何,真正的问题是 EDMA 启动的传输中的有效载荷大小。

    请帮助进行调试。

    提前感谢。

    维克多

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    选择参数条目时、我放置

    CSL_edma3MapDMAChannelToParamBlock (hModule、FPGA_EDMA_TX1_R、8 * FPGA_EDMA_TX1_R); 

    这是条目#48、因此48*0x20=0x600、我得到的句柄0x02704600是正确的。 我确保从我的配置结构和参数位置的所有配置值完全相同。 恐怕、我缺少一些重要的东西、A-SYNC 传输不像我预期的那样工作、但至少 AB-SYNC 传输运行良好、对于它们、我肯定会看到 TLP 有效载荷为64B、这低于预期的 DBS 碎片。 让我们集中讨论这个问题。

    维克多

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我怀疑、A-SYNC 传输的错误行为也是我的故障。 A-SYNC 传输表示启用了中间链。 当我修正它时、A-SYNC 和 AB-SYNC 传输都会移动整个预期块。

    但是、在这两种情况下、我都看到 TLP 有效载荷大小为64B。 我想挖掘它。 将在我的硬件上运行您的参考示例。

    谢谢。

    维克多

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    从表7-33中、EMDACC0只有16个通道。 但是、您使用了通道48? 您是否可以仅使用通道0? 检查0x2704000处的 ParamSet 并检查 TLP 有效载荷是64字节还是128字节?

    此致、Eric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Eric、

    感谢您的帮助。 我认为我使用的是法律组合:

    #define FPGA_EDMA_TX1_R 6
    
    chAttr.chaNum = FPGA_EDMA_TX1_R;
    ...
    CSL_edma3ChannelOpen (&DMA->tx1.rght.cha.obj、FPGA_EDMA_CC_INST、&chAttr、&status);
    ...
    CSL_edma3MapDMAChannelToParamBlock (hModule、FPGA_EDMA_TX1_R、8 * FPGA_EDMA_TX1_R);
    ...
    CSL_edma3GetParamHandle( DMA->tx1.rght.cha.hdl,8 * FPGA_EDMA_TX1_R,&STATUS );
    

    通道是#6、但参数集是#48。 EDMA3CC0应具有16个通道、但参数条目为128。

    尽管如此、我已经尝试使用通道#0、参数集#0。 到达存储器的参数为:

    在我的代码中、我有:

    dma->rght.prm.cfg.option = CSL_EDMA3_OPT_make
    (
    CSL_EDMA3_ITCCH_DIS、 // itcchEn、
    CSL_EDMA3_TCCH_DIS、 // tcchEn、
    CSL_EDMA3_ITCINT_DIS、 // itcintEn、
    CSL_EDMA3_TCINT_EN、 // tcintEn、
    FPGA_EDMA_TX1_R、 // TCC、
    CSL_EDMA3_TCC_NORMAL、 // tccMode、
    CSL_EDMA3_FIFOWIDTH_NONE、// fwid、
    CSL_EDMA3_STATIC_DIS、 // stat,
    CSL_EDMA3_SYNC_AB、 // syncdm,
    CSL_EDMA3_ADDRMODE_INCR、// DAM、
    CSL_EDMA3_ADDRMODE_INCR // Sam
    );
    dma->rt.prm.cfg.srcAddr =(uint32) src;//pcie_buf;
    dma->rght.prm.cfg.aCntbCnt = CSL_EDMA3_CNT_make (128、4);
    dma->rt.prm.cfg.dstAddr =(uint32) dst;
    dma->rg.prm.cfg.srcDstBidx = CSL_EDMA3_BIDX_make (128、128);
    dma->rt.prm.cfg.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_make (CSL_EDMA3_LINK_DEFAULT、0);
    dma->rg.prm.cfg.srcDstCidx = CSL_EDMA3_CIDX_make (0、0);
    dma->rt.prm.cfg.cnt = 1; 

    我们看到了 OPT 场

    • PRIV=1 -不知道;
    • TCINTEN = 1 -刚刚好;
    • SYNCDIM=1 -与 CSL_EDMA3_SYNC_AB 匹配。

    src、dst 地址以及计数看起来也是正确的。 但是、即使在本例中、我仍然看到64B 的有效载荷大小。 对于 AB 同步传输、A 同步传输、观察到这种行为。 我尝试了大小为128*1024的块。

    让我们看看还有什么要检查。 提前感谢。

    维克多

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    PRIV = 1是主管级特权、这是预期的。 我在代码中没有看到任何错误、我没有用于捕获 PCIe TLP 以确定有效载荷大小的示波器设置。 因此、我们通常使用不同的 CC/TC 组合运行 PCIe 吞吐量测试、通过查看吞吐量差异来显示 TC 中的 DBS。

    在 www.ti.com/.../sprabk8.pdf上、即2.4测得的吞吐量、您可以查看一下。 C6678和 C6670应该相同。 在示例5中、有 EDMA 配置示例代码。 您可以进行双重检查。

    此致、Eric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的评论和参考。 当我找到 PCIe 的方法时、该文档非常有帮助。

    您提到过、吞吐量是在 CC/TC 组合上测量的、因此我将 EDMA3CC0更改为 EDMA3CC1。 结果完全相同:出站数据包的有效载荷为64B,吞吐量相同,约为180Mbps,其中1 MB 为10**20字节。

    我还尝试将传输通道映射到 que_1以使用其他 TC。 这不会产生明显的效果。 当然、我也尝试过 EDMA3CC2。 TLPS 仍然 具有64B 有效载荷。

    报告中的数字看起来有点可疑。 如果我们谈论绝对值、那么我的设置在某种意义上是 x1 Vx1、因此我的吞吐量应该降低4倍。 对于128B 有效载荷、我们看到读取时为806.25Mbps、写入时为738.75Mbps。 除以4可分别得到201.56和184.69。 您认为这些写的184与我的181非常接近吗?  

    在我的案例中、我是从 FPGA 方面工作的、因此 DSP 虽然是 RC、但却作为事务接收器工作。 在发布的流程中、这与写入测试相匹配、我有200-212Mbps、缓冲区为8KB、最高为1MB。 在未布置的流程中、即读取请求后跟完成器、我有184-203 Mbps。 奇怪的区别是 TI 报告的阅读速度更快、我无法解释。 监控 TRN 接口我最初看到、在发出读取请求时、需要很少的 TRN 延迟时钟才能首次完成、但完成后的时钟间隔为3-5个时钟。 对于过载流、TLPS 显示在 TRN 接口上、没有间隙、因此我看到写入性能稍微好一些。 这种情况我可以用观察结果来解释、但无法解释为什么 DSP 到 DSP 显示更好的读取性能。 请参阅带有简单图表的附件。

    我用这么多的措辞来描述我的怀疑、在 TI 报告中、我们看到了这样的情况、即 x2 Gen 2上的806.25Mbps 与201.56与 x1 Gen 1匹配、我还观察到这种情况、即128B 有效负载。 此外、738.75与~180匹配、我观察到它具有64B 有效载荷。 结合我之前的观察、DSP 的 PCIeSS 在读取请求时确实使用128B TLPS 进行响应、我怀疑:

    • 由于 PCIeSS 在读取请求时以128B TLPS 响应、因此读取性能更好。
    • 写入性能更差、因为 EDMA3启动的传输会导致64B TLPS。

    至于示例5中的 EDMA3设置、我的非常接近:AB 同步、传输完成中断、A 维度上的128B。

    现在我不知道还有什么要检查的。

    维克多

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    感谢您的分析! 您的可疑行为似乎合理。 我没有用于检查 TLP 有效载荷大小的示波器设置。 我可以做的一件事是复制 sprabk8中的结果、然后使用不同的 CC/TC 来查看 PCIe 写入/读取速度是否相同。 这需要一些代码自适应和 EVM 设置、我可能无法很快完成。

    此致、Eric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    我与实验室的人员交谈过、我们只有1GHz 的范围、因此我也无法通过范围快速证明我的发现。

    但是、我发现了另一个我想得到的确认。 虽然我的 FPGA 固件中的响应器件尚未就绪、但我仍然可以监控传入请求。 因此、在 EDMA 配置中、我交换了源和目的、从而使传输有效地发出读取请求、从 FPGA 传输到 DSP。 猜猜会怎么样? 宾戈! 当 EDMA3发起读传输时、即发送读请求并等待完成、此时请求的数据量为0x20=32DWORDS! 在后续请求地址中、也会跳转0x80。

    这就是我猜到的:EDMA 进行64B 写入、但进行128B 读取。 介绍了 SPRABK8 PCIe 用例报告中的性能值。

    为了确保我尝试通过 EMDMACC1发出读取请求、并且请求的数据量减少到16DW = 64B。

    因此、我的观察结果是、至少在我的设置中、x1 Gen1 EDMACC0可以使 DBS=128B 大读取、但只能写入64B。 当然、可能会有一些细微的遗漏、错误等、但它看起来很像、因为实施功能没有正确记录。

    我非常认真地对待这个问题。 吞吐量是一个小问题、因为10%以下的降级应该被设计裕度覆盖。 但是、在有人认为 EDMA3CC0的性能会更好的印象下、用户可能会超额订阅该控制器、该控制器也是存储器传输、TCP 和 FFTC 服务的选择、而其他 EDMA 实例具有更多的通道和参数条目。

    虽然我的同事建议借用更高的带宽范围并测试物理导线、但我希望 TI 在他们的实验中回顾这个问题、以便让他们有自己的观点。 不过,如果需要,我愿意在我的一方进行一切可能的试验。

    谢谢。

    维克多