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.

[参考译文] CCS/TMS320C6678:SRIO:连续发送 DIO 数据包

Guru**** 2540020 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/831080/ccs-tms320c6678-srio-send-dio-packets-continuously

器件型号:TMS320C6678

工具/软件:Code Composer Studio

您好!

我希望在 DSP (C6678)和 Xilinx FPGA 之间以1.25、2.5、3.125和5Gbps 的速率发送和接收直接 I/O 数据包。

问题1:  

我研究 了 SRIO 的 SRIO_Loopback _evmc6678_C66BiosTestProject 示例项目。  

在此示例中, 通过 test_dioSockets ()函数按如下方式发送 NWRITE_R 数据包的10次迭代。  

/*发送 DIO 信息。 //
if (SRIO_sockSend (srioSocket、srcDataBuffer、SIZE_DIO_packet、(SRIO_SockAddrInfo*)&to)< 0)
{
System_printf ("Debug (Core %d):DIO 套接字测试失败\n"、coreNum);
返回-1;
}

/*循环直到传输完成。 */ while
(1)
{/*
获取完成代码。 //
if (SRIO_getSockOpt (srioSocket、SRIO_Opt_DIO_SOCK_COMP_code、&compCode、sizeof (uint8_t))<0)
{
System_printf ("错误:无法获取完成代码\n");
return -1;
}

/*传输是否完成? //
if (compCode!= 0xFF)
break;
} 

如该代码所示、     当先前 NWRITE_R 数据包的完成代码 等于0时、发送下一个 NWRITE_R 数据包。 这意味 着之前的 NWRITE_R 数据包的发送 已完成。

在这种情况下、我认为当之前的 NWRITE_R 数据包的完成代码等于0时、这意味  着接收到与 NWRITE_R 相关的响应数据包。

我的第一个问题是:

在上面的示例中,由于下一个 NWRITE_R 数据包一直等到上一个 NWRITE_R 数据包(接收与上一 个 NWRITE_R 相关的响应数据包)完成,因此不可能发送新 的 NWRITE_R 数据包。 因此、无法实现最大吞吐量。 是否有任何方法 可以连续发送 DIO 数据包(如 NWRITE_R)以实现最大吞吐量?

问题2:  

正如我说过的、我 希望在 DSP (C6678)和 Xilinx FPGA 之间以1.25、2.5、3.125和5Gbps 的速率发送和接收直接 I/O 数据包。

我研究 了 SRIO 的 SRIO_TputBenchmarking_evmc6678_C66TestProject 示例项目。

此外、我还学习 了《C66x KeyStone 器件吞吐量性能指南 》以及 KeyStone 架构 串行快速 IO (SRIO)文档。

在 KeyStone 架构串行快速 IO (SRIO)文档中、编写内容为:

在示例项目中、 有效载荷大小也被视为8  到8192字节。

我的第二个问题是:

FPGA 端的最大有效载荷大小为256字节。 但在 DSP 方面、可以考虑超过256字节(由于数据包分段)。  

在这种情况下、当我  从 DSP 端发送一个有效载荷大小为512字节的 NWRITE_R 数据包时、我将在  FPGA 上接收两个不同的有效载荷大小为256字节的 NWRITE_R 数据包? 我应该制作 并发送两个独立的 NWRITE_R 响应数据包从 FPGA 端到 DSP 端?

此致、

Mohammad

 

 

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

    您好!

    对于 Q1、您可以移除 while (1)循环、检查 SRIO_getSockOpt ()。 在应用程序中, 可以连续调用 SRIO_sockSend()。 与 SRIO 驱动程序代码中一样, SRIO_sockSend ()调用 SRIO_sockSend_DIO (), SRIO_sockSend_DIO ()具有 CSL 代码检查传输是否在下一个传输请求之前完成,如果使用阻塞套接字。  

    对于 Q2、响应数据包由 SRIO IP 生成、不由我们的软件处理。 当您对 FPGA 进行编程以模拟 SRIO IP 时、需要确定是否需要1或2个响应数据包。 您可以查看 SRIO 标准来了解这一点、我的理解是每个接收到的数据包都需要一个响应数据包。

    此致、Eric

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

    尊敬的 Eric:

    感谢您的回答。 您的回答对我帮助很大。

    对于 Q1、有8个 LSU 用于发送 dio 数据包、每个 LSU 都有一些影子寄存器。 如果我们连续调用 SRIO_sockSend(),并且在经过一些良好的传输后,我们看到 SRIO_sockSend ()<0,我们是否可以说它是所有 LSU 及其 影子寄存器被使用的原因,我们应该等到一个影子寄存器被释放?

    此致、

    Mohammad

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

    您好!

    最好在 代码中跟踪 SRIO_sockSend ()< 0的原因,正如您在 SRIO_sockSend_DIO ()中看到的那样,可以检查是否有可用的影子寄存器:

    /*确保影子寄存器中有空间写入*/
    while (1)

    if (CSL_SRIO_IsLSUFull (gSRIODriverMCB.SRIO_GLOBAL_Handle、PTR_srioSocket ->mapIndex)=0)
    中断;

    您的错误是否从以下行返回:

    /*返回错误完成代码。 *
    返回-(PTR_srioSocket ->DioCommpleCode);

    此致、Eric

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

    尊敬的 Eric:

    我将在测试该程序后立即在此处查看并报告结果。

    谢谢、

    Mohammad