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.

[参考译文] TMDS243EVM:PCIE:RC 读取 EP 条形图信息卡滞。 243EVM+Intel FPGA

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1398510/tmds243evm-pcie-rc-read-ep-bar-info-stuck-243evm-intel-fpga

器件型号:TMDS243EVM
主题中讨论的其他器件:SysConfig

工具与软件:

尊敬的 TI 专家:

      (FPGA 套件): https://www.arrow.com/en/products/dk-dev-10cx220-a/intel?q=DK-DEV-10CX220-A

       我尝试使用此 FPGA 套件作为 EP、使用234EVM 作为 RC。

       EP 具有两个 bar、即 bar0和 bar1。

       我可以从 EP 读取 status_cmd、但无法为 EP 配置 bar。 下面是我的代码。

       它总是停留在: type0BarIdx.idx 读在 PCIe_cfgBar()中

       我的 SDK 版本:mcu_plus_sdk_am243x_09_00_00_35

      请帮我解决这个问题!

谢谢  

Chunyang  

int32_t PCIe_FPGA_EP_TEST (Pcie_Handle 句柄)

int32_t status = SystemP_Success;
Pcie_Registers getRegs;
Pcie_Status CmdReg 状态命令;

memset (&getRegs、0、sizeof (getRegs));
getRegs.statusCmd =&statusCmd;

status = PCIe_readRegs (handle、PCIe_location_remote、&getRegs);

if (SYSTEMP_SUCCESS!= STATUS)

DebugP_LOG ("FPGA 状态读取测试失败\r\n");
}
设计

DebugP_LOG ("FPGA 状态读取测试完成\r\n");
}

返回状态;
}

int32_t PCIe_fpga_ep_bar1_cfg (Pcie_Handle 句柄)

int32_t status = SystemP_Success;
Pcie_Bar 配置 barCfg;

barCfg.location = PCIe_location_remote;
barCfg.mode = PCIe_EP_MODE;
barCfg.base = 0x70000000;
barCfg.prefetch = PCIe_bar_non_pref;
barCfg.type = PCIe_bar_TYPE32;
barCfg.memSpace = PCIe_bar_MEM_MEM;
barCfg.idx = 0;//1;

status = PCIe_cfgBar (handle、&barCfg);

//DebugP_assert (SystemP_SUCCESS == status);

if (SYSTEMP_SUCCESS!= STATUS)

DebugP_log ("FPGA bar1 configure fail\r\n");
}
设计

DebugP_LOG ("FPGA bar1 configure done\r\n");
}

返回状态;
}

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

    嗨、 

    感谢您的提问。

    我会检查一下、然后回复给您。

    此致

    Ashwani

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

    您好、

    该 API 不适合访问"通用"API EP、因为它通常假设 AM24x/AM64x 连接到另一个 AM24x/AM64x。

    cfgBar 实际上不是用于配置的 基址 、但要配置 Attributes (大小和类型、例如 I/O、MEM、32/64位、可预取)条形图。 当您调用 PCIe_LOCATION_REMOTE 时、驱动程序会假定另一端有另一个 AM64x、并尝试读取/写入用于确定 AM64x 的条形图外观的寄存器。

    您可以尝试使用 PCIe_read/writeRegs 来读取/写入 type0Bar32bitIdx。 这应该会让您获得 EP 条形寄存器的实际内容。

    由于 PCIe_Read/writeRegs 很可能不支持您要读取/写入的所有配置空间寄存器、因此您最好直接访问配置空间映射并自己实现访问器函数。 我将会看看我是否能在今天晚些时候给您举个例子。

    此致、

    Dominic

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

    您好、Dominic:

    感谢您的支持。

    现在、我的 EP Bar-Cfg 函数如以下代码所示。

    我不知道它是否起作用。

    int32_t PCIe_fpga_ep_bar1_cfg2 (Pcie_Handle 句柄)

    int32_t status = SystemP_Success;
    Pcie_Registers setRegs;
    Pcie_Type 0Bar32bitIdx type0Bar32bitIdx;

    memset (&setRegs、0、sizeof (setRegs));
    type0Bar32bitIdx.reg.reg32 = 0x70000000;
    type0Bar32bitIdx.idx = 1;
    setRegs.type0Bar32bitIdx =&type0Bar32bitIdx;

    状态= PCIe_writeRegs (handle、PCIe_location_remote、&setRegs);


    if (SYSTEMP_SUCCESS!= STATUS)

    DebugP_log ("FPGA bar1 configure fail\r\n");
    }
    设计

    DebugP_LOG ("FPGA bar1 configure done\r\n");
    }

    返回状态;
    }

    我的 RC 出站如下所示。

    我尝试使用以下代码连接 EP bar1、但它不起作用。

    void * transBufAddr =(void *)(CONFIG_PCIE0_OB_REGION0_LOWER);

    memcpy (transBufAddr、src_buf、BUF_size * sizeof (uint32_t));

    CacheP_wbInv (transBufAddr、sizeof (uint32_t)* BUF_SIZE、CacheP_TYPE_ALL);

    }

    期待您的进一步帮助!

    谢谢

    Chunyang  

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

    Chunyang、您好!

    您是否通过设置命令寄存器中的相应位来启用 EP 以响应存储器请求? 默认情况下、应禁用它。

    通过读回寄存器来验证是否成功写入 BAR 寄存器也很好。

    此致、

    Dominic

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

    尊敬的 Rath:

      您是指这个 statusCmd 寄存器吗?

      我已经 完成了如下 statusCmd 的设置、我可以按照我编写的代码读出这些值。

      

    但是、我 只读出 type0Bar32bitIdx 的内容0、 但我已将0x70000000写入 type0Bar32bitIdx.reg.reg32 = 0x70000000。

    以下是写入和读取函数。

    int32_t PCIe_fpga_ep_bar1_cfg2 (Pcie_Handle 句柄)

    int32_t status = SystemP_Success;
    Pcie_Registers setRegs;
    Pcie_Type 0Bar32bitIdx type0Bar32bitIdx;

    memset (&setRegs、0、sizeof (setRegs));
    type0Bar32bitIdx.reg.reg32 = 0x70000000;
    type0Bar32bitIdx.idx = 1;
    setRegs.type0Bar32bitIdx =&type0Bar32bitIdx;

    状态= PCIe_writeRegs (handle、PCIe_location_remote、&setRegs);


    if (SYSTEMP_SUCCESS!= STATUS)

    DebugP_log ("FPGA bar1 configure fail\r\n");
    }
    设计

    DebugP_LOG ("FPGA bar1 configure done\r\n");
    }

    返回状态;
    }

    ---------------

    int32_t PCIe_fpga_ep_bar1_cfg2_read (Pcie_Handle 句柄)

    int32_t status = SystemP_Success;
    Pcie_Registers getRegs;
    Pcie_Type 0Bar32bitIdx type0Bar32bitIdx;

    memset (&getRegs、0、sizeof (getRegs));
    memset (&type0Bar32bitIdx、0、sizeof (type0Bar32bitIdx));

    getRegs.type0Bar32bitIdx =&type0Bar32bitIdx;
    Status = PCIe_readRegs (handle、PCIe_location_remote、&getRegs);


    if (SYSTEMP_SUCCESS!= STATUS)

    DebugP_LOG ("FPGA bar1 configure 读取失败\r\n");
    }
    设计

    DebugP_LOG ("FPGA bar1 configure read done\r\n");
    }

    返回状态;
    }

    您能告诉我、为什么我无法写入或读取寄存器: type0Bar32bitIdx 吗?

    谢谢  

    Chunyang  

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

    Chunyang、您好!

    [报价 userid="578304" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1398510/tmds243evm-pcie-rc-read-ep-bar-info-stuck-243evm-intel-fpga/5359018 #5359018"]

    ID 您是指这个 statusCmd 寄存器?

      我已经 完成了如下 statusCmd 的设置、我可以按照我编写的代码读出这些值。

    [报价]

    似乎想要包括一个屏幕截图、但没有显示。

    需要设置位1"存储空间"以启用 EP 响应条形码存储器访问。

    [报价 userid="578304" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1398510/tmds243evm-pcie-rc-read-ep-bar-info-stuck-243evm-intel-fpga/5359018 #5359018"]但是、我读出 type0Bar32bitIdx 的内容只是0、 但是我把0x70000000写入 type0Bar32bitIdx.reg.reg32 = 0x70000000。

    我认为您的代码中错误地读回 bar1寄存器。 您没有将 type0Bar32bitIdx->idx 设置为"1"、因此您会读回为 Bar0配置的任何内容。 读取时、您仍需要告诉驱动器 计算公式 您要通过->idx 字段读取的栏。 由于您以前将该结构归零、您告诉它读取 Bar0。

    此致、

    Dominic

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

    您好、Dominic

      1 我上一篇文章的屏幕截图是以下代码、我想说已启用总线和存储器访问。

    memset (&setRegs、0、sizeof (setRegs));
    statusCmd.memSp = 1;
    statusCmd.busms = 1;
    statusCmd.resp = 1;
    statusCmd.serrEn =1;
    setRegs.statusCmd =&statusCmd;

    状态= PCIe_writeRegs (handle、PCIe_location_remote、&setRegs);

    2按照你的 指南,现在我可以读出来  type0Bar32bitIdx.reg.reg32 = 0x70000000。

    3我的出站设置就像下面的图片,我不知道它是否可以被你看到. 这是 //PCIe_buf_transfer_RC 的原始设置  

     

      设置后为4  状态命令 和  Type0Bar32bitIdx ,我试图写 bar1的 EP ,通过下面的代码,但它似乎不起作用。

    void * transBufAddr =(void *)(CONFIG_PCIE0_OB_REGION0_LOWER);

    memcpy (transBufAddr、src_buf、BUF_size * sizeof (uint32_t));

    CacheP_wbInv (transBufAddr、sizeof (uint32_t)* BUF_SIZE、CacheP_TYPE_ALL);

    }

    出什么问题了吗? 请帮我解决。

    谢谢

    Chunyang  

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

    你好、 Dominic

      供您参考。

       而在我之前的文章中,我使用了以下函数来写入 EP 的 bar1 ,然后是另一个例子。

       写入时、pcieBase 为0x68000000  向该地址写入0xFFFFFFFF、调试崩溃。

    int32_t PCIe_FPGA_GET_memSpace (Pcie_Handle 句柄)

    void *pcieBase;

    if (PCIe_getMemSpaceRange (handle、&pcieBase、NULL)!= SystemP_SUCCESS)

    DebugP_log ("Get men Space base fail\r\n");
    }

    *((volatile uint32_t *) pcieBase)= 0xFFFFFFFF;
    *(volatile uint32_t *) pcieBase + 1)= 0xFFFFFFFF;
    *(volatile uint32_t *) pcieBase + 2)= 0xFFFFFFFF;
    *(volatile uint32_t *) pcieBase + 3)= 0xFFFFFFFF;
    *(volatile uint32_t *) pcieBase + 4)= 0xFFFFFFFF;
    *(volatile uint32_t *) pcieBase + 5)= 0xFFFFFFFF;

    返回0;
    }

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

    Chunyang、您好!

    在上一篇文章中、您发现基地址为0x68000000 + 0x01000000、即0x69000000。 如果 pcieBase 仅为0x68000000、则我不希望它起作用。

    您说:

    [报价 userid="578304" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1398510/tmds243evm-pcie-rc-read-ep-bar-info-stuck-243evm-intel-fpga/5361122 #5361122"]  4 (设置后)  状态命令 和  Type0Bar32bitIdx ,我试图写 bar1的 EP ,通过下面的代码,但它似乎不起作用.[/报价]

    您如何确定"不工作"? 示例(例如 PCIe_msi_IRQ_RC)使用类似的代码、并且它们可以正常工作(尽管 CacheP_wbInv 不是必需的、因为0x68... 范围映射为严格排序存储器、因此不进行缓存)。

    ->究竟什么"不工作"? 它是否会像第二篇文章中的 pcieBase 那样崩溃? 或别的什么东西吗?
    ->您在 Bar1后面的 FPGA 中实现了什么样的功能?

    此致、

    Dominic

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

    您好、 Dominic:

     来回答您的问题。    

    ->到底是什么"不工作"? 它是否会像第二篇文章中的 pcieBase 那样崩溃? 或其他什么?
    Unknown 说:
    ->您在位于 bar1后面的 FPGA 中实现了哪种功能?

    我的意思是 EP——FPGA 没有按预期响应,这里没有崩溃。 FPGA 同性恋使得 bar1的第一个字节打开一个 LED。

    已通过将 FPGA 卡安装到 PC 进行验证。 LED 可通过 PC 的 windows 应用程序写入 bar1的第一个字节来打开。

    --------------------------------------------------------

    我想咨询以下方面。

    1我的 OB 设置为:  基址= 0x68000000 + 0x01000000、 我从得到了 pcieBase  PCIe_FPGA_GET_memSpace ()  为 0x68000000。 是不是错了?

    2访问 EP 数据存储器 bar1的正确方式是什么? memcpy()或   *(volatile uint32_t *) pcieBase)= 0xFFFFFFFF?

    3为什么我的调试在使用时崩溃  *((volatile uint32_t *) pcieBase)= 0xFFFFFFFF 路  要写入 0x68000000或 0x68000000 + 1或 0x68000000 + 0x01000000?

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

    Chunyang、您好!

    [报价 userid="578304" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1398510/tmds243evm-pcie-rc-read-ep-bar-info-stuck-243evm-intel-fpga/5362659 #5362659"]

    我的意思是 EP——FPGA 没有按预期响应,这里没有崩溃。 FPGA 同性恋使得 bar1的第一个字节打开一个 LED。

    已通过将 FPGA 卡安装到 PC 进行验证。 LED 可通过 PC 的 windows 应用程序写入 bar1的第一个字节来打开。

    [报价]

    好的、明白。

    1我的产科设置为:  基址= 0x68000000 + 0x01000000、 我从得到了 pcieBase  PCIe_FPGA_GET_memSpace ()  为 0x68000000。 是不是错了?

    我不确定用于 RC 的 PCIe 驱动程序 API、例如、应将哪个函数用于什么用途... 我会使用 CONFIG_PCIE0_OB_REGION 从 SysConfig 为出站映射生成了_LOWER。

    2访问 EP 数据存储器 bar1的正确方法是什么? memcpy()或   *(volatile uint32_t *) pcieBase)= 0xFFFFFFFF? [报价]

    两者都应该起作用。 使用 memcpy()时、编译器可能会进行仅对"正常内存"有效的优化(即可缓存、无强顺序)。 这是否可行取决于您在 MPU 中配置0x68000000区域的方式、也取决于 memcpy ()实现方式。 对于这些条后面的"寄存器"、我要确保 MPU 按严格顺序映射存储器(如果您知道您正在执行的操作、可能是器件)并使用*(volatile uint32_t*)。

    3使用时调试崩溃的原因  *((volatile uint32_t *) pcieBase)= 0xFFFFFFFF 路  要写入 0x68000000或 0x68000000 + 1或 0x68000000 + 0x01000000?

    这些地址是否都有可能崩溃?

    我可以了解当地址范围没有通过出站存储器区域映射、而是 CONFIG_PCIE0_OB_REGION 时、它为什么会崩溃 1. _LOWER 应起作用。

    当然:

    CONFIG_PCIE0_OB_REGION 1. _lower 是0x69000000、它也是 不会崩溃 使用 memcpy、但是 它会崩溃 使用易失性 uint32_t*?

    此致、

    Dominic

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

    Chunyang、您好!

    还有一个想法:

    您的 FPGA 是使用32位还是64位条形图?

    此致、

    Dominic

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

    您好、 Dominic:

      在您的帮助下、我现在可以读写 EP 的内存。  

      以下代码可能起作用。

      uint32_t * test =(uint32_t *)(0x69000000U + 0x4000);// 0x4000是 FPGA 侧的偏移量

     uint32_t data_buff[64];//用于读取测试

     for (I = 0;I < 64;I++)
     {
        *test++= i ;    //写入64个地址,输入0、1、2、3...63
      }

      memcpy (data_buff、test-63、64 * sizeof (uint32_t));//回读0、1、2...63。 一切都好

    -------------------------------------------------------- —————————————————————————————————————————————

    但以下代码无法正常工作。

    uint32_t * test =(uint32_t *)(0x69000000U + 0X00004000);

    uint32_t data_buff[64];
    uint32_t data_buff2[64];

    for (I = 0;I < 64;I++)

    DATA_buff[i]= i;
    }

    memcpy (test、data_buff、64 * sizeof (uint32_t)); //写入 EP
    memcpy (data_buff2、test、64 * sizeof (uint32_t));//回读、全部为"0"!

    我将 CacheP_wbInv (test、 sizeof (uint32_t)* 64、CacheP_TYPE_ALL)插入 这两个 memcpy ()之间、我还将一些 print ()插入、用于延迟目的。  

    但是、读回 data_buff2始终全为"0"。

    我的问题是如何使用 memcpy()来正确写入 EP 内存?

    或者我应该使用"*TEST++= I"的方式来写吗?

    谢谢  

    Chunyang  

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

    Chunyang、您好!

    很高兴您可以读/写基本正常工作。

    您是在运行调试构建还是发布构建? 随着发布、您可能会遇到编译器优化代码方面的问题。 我不认为这是你目前的问题,但我想确保你知道这种可能性。 在您的测试代码中、优化器可以对任何对 FPGA 的访问进行优化。

    似乎使用 memcpy 从 FPGA 读回效果不错、只需对 FPGA 进行写入就好了。 如果您可以使用相同的代码来验证它,只需用 for (...)*ptr =*dst 循环替换写入 FPGA 的 memcpy()即可,并保留其他所有内容不变。

    如果这实际上是 memcpy、则 FPGA 可能是 memcpy 触发的 PCIe 事务与32位指针访问存在问题。 memcpy 可能会触发更大的突发、可能这是 FPGA 无法处理的情况?

    要验证这一点、您可以尝试使用 uint64_t 指针写入 FPGA。 memcpy 当然可以使用更长的突发,但更难可靠地触发。 如果使用 uint64_t 写入无效、则必须查看您的 FPGA 实现。

    关于 CacheP 的使用:您需要检查如何配置 MPU。 通常、我希望将0x68000000范围配置为严格排序。 在这种情况下、您不需要 CacheP_wbInv。

    此致、

    Dominic

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

    您好、Dominic:

      我现在将运行调试构建。 使用版本时、我会禁用优化功能。
      按照您的指导,我使用了相同的代码,将 memcpy()替换为*ptr =*dst。
      我通过使用 memcpy ()来写入 EP 的 FPGA 内存,得到了以下结果。

    使用 memcpy ()写入 FPGA 读回检查  
    8×32位、全部为0xaffff5 都是0xaffffff5
    16×32位、全部为0xaffff5 都是0xaffffff5
    17×32位、均为0xaffffff 5 全部为0xaf000000
    32×32位、全部为0xaffff5 全部为0xaf000000
    64×32位、全部为0xaffffff 5 全部是0x00000000

     当我使用 memcpy 尝试向 FPGA 写入8或16 32位数据时、回读就是我编写的。 当数据数量(32位)大于16时出现错误。

      您对此问题有何评论?

      FPGA 端的最大有效载荷大小(MPS)为128字节。

      对于 MPS 或最大读取请求大小(MRRS)有什么问题吗?

      如果是、如何配置243EVM RC 的 MPS 和 MRRS?  

    谢谢

    Chunyang  

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

    这是 我的 RC 的器件状态和控制寄存器供您参考。

    最大有效载荷= 0;

    最大读请求大小--maxSz =2

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

    Chunyang、您好!

    您可以通过位于0x0d0000c8的 PCIE0_RC_I_RC_PCIe_BASE_I_PCIe_DEV_CTRL_STATUS 寄存器配置 MPS 和 MRRS。

    根据 TRM、MPS 应已默认为128字节、但 MRRS 为512。 毕竟我知道应该没问题、并且 FPGA 应该会显示多次完成信息。 您可以尝试减小上述寄存器中的 MRRS、看看这样是否修复了问题。

    此致、

    Dominic

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

    您好、Dominic:

       按照之前的指南、我将 RC 的 MRRS 修改为0。

       下表是我的 RC 的 RCB、MPS 和 MRRS 的电流设置值。

    非常重要

    默认值

    RCB--读取完成边界

    1 (默认值):128B (已验证)

    MPS:(最大有效负载大小)、

    0 (默认值):128b (已验证)

    MRRS(最大读取请求大小)

    0:128b (已更改)默认值为2 (512)

        这些值对于 Sitara AM243x RC 是否正确?

        通过上述设置、我仍然得到相同的结果。 我的意思是 ,只有少于16*32位的数据可以通过 memcpy()操作进行精确的写入和读取,否则回读错误。

        FPGA 用户已经开始检查自己的设计。 我可以做些什么来确保  Sitara MCU RC 侧一切正常吗?

    谢谢

    Chunyang

        

        

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    FPGA 家伙已经开始检查他的设计

    让我们看看他们是否发现一些重要的事情。

    我能做些什么来确保  Sitara MCU RC 端一切正常吗?

    我们将在内部审查反馈并回复给您。

    此致

    Ashwani

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

    您好、Dominic:

     您能告诉我您为什么在这里说0x68... 范围严格排序?

     我检查 syscfg、在 TI SDK 的示例 CONFIG_MPU_REGION4 (从0x60…… 256MB、缓存)  

    由于0x68... 范围映射为严格排序的内存、因此不进行缓存)。

      我是否应该更改 syscfg 以将此 REGION4修改为严格排序?

      严格排序和缓存哪一个更适合 访问多个32位数据 PCIe?

    谢谢  

    Chunyang  

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

    嗨、Chunyang、

    您能告诉我您为什么在这里说0x68... 范围是严格排序的?[/QUOT]

    关于使用 CacheP:您需要检查如何配置 MPU。 通常、我希望将0x68000000范围配置为严格排序。 在这种情况下、您不需要 CacheP_wbInv。[/QUOT]

    我想 Dominic 是 根据"PCIe_msi_irq_RC "引用 REGION6示例:

    来替换时钟  

    此致

    Ashwani

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

    明白了、完美!

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

    您好、Dominic:

        关于 memcpy()、

        现在、我将使用 memcpy ()读取和写入 EP (FPGA)、

        我发现,写入16*32位使用2us ,读取16*32位使用10us。

        但读取32*32位使用 240us !  

        读取32*32位的时间比读取16*32位的时间要长多少?

        对于32*32位的读取,我应该只读取16*32位两次,对于48*32位的读取,应该只读取三次...为了获得最佳的读取速度?

        提示,我没有 解决超过16*32位的写入问题,这将导致数据损坏。

    谢谢  

    Chunyang   

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

    尊敬的 TI 专家:

          我正在 使用 Intel FPGA EP 调试 am243x EVM RC。 RC 的 OB0与 EP 的 bar1匹配。

          我的问题是,如果我用 memcpy ()写入超过64个字节,我无法获得正确的结果。

          但是,使用 memcpy ()读取和直接写入地址 可以很好地工作。  

          以下是 FPGA 调试中的图片。

          第一张图片是我在 EP 中写入16* 0xf7a5ff5a。 没有问题。  

          后者是我正在  向 EP 写入17* 0xf7a5ff5a。 而是17次写,它是17 * 4次写。 和 0xf7a5ff5a 拆分为0xF7、0xA5、0xFF 和0x5A 进行写入。 这是我们面临的问题。

          我的团队不知道接下来会采取什么行动、请帮助我们解决该问题。

    谢谢  

    Chunyang  

         

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

    嗨 、Chunyang、

    我将在内部讨论这一点、然后回复给您。

    [报价 userid="578304" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1398510/tmds243evm-pcie-rc-read-ep-bar-info-stuck-243evm-intel-fpga "] (FPGA 套件): https://www.arrow.com/en/products/dk-dev-10cx220-a/intel?q=DK-DEV-10CX220-A

    无法打开此页面。

    此致

    Ashwani

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

    尊敬的 Ashwani:

      该链接指向 FPGA 套件、您可能会在下面的链接中找到来自英特尔网站的信息。

    https://www.intel.com/content/www/us/en/products/details/fpga/development-kits/cyclone/10-gx.html

    感谢您和您的团队的大力帮助、期待您的最新动态。

    BR

    Chunyang  

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

    Chunyang、您好!

    如果我正确理解这一点、那么您也会看到 memcpy 情况下的所有数据、只需拆分成各个字节写入、而不是字写入。 您能确认吗?

    各个字节(F7、A5、FF、5A)是全部位于 Avalon _mm_writedata[7:0]上、还是全部位于[7:0]、[15:8]、[23:16]、[31:24]上? 这在您的第二张图片中不清楚。 我希望这些字节出现在不同的位上、但我也期望数据带有字节使能信号。

    虽然可能不是解决方案、但 Avalon 接口应支持使用字节使能信号进行单个字节写入。 如果这解决了"丢失"数据的问题、由于性能的原因、您可能仍会遇到问题。

    如果是、那么下一个问题是数据是否已经像这样通过 PCIe 链路传输(单独的字节写入)、或者 FPGA 中的 PCIe 内核是否会像这样转换 PCIe 事务。 此时、我相信 FPGA 内的某个位置更有可能存在问题、但我不能排除 AM64x 如何发送 PCIe 事务的问题。

    您的 FPGA 同事是否有可能通过 FPGA 调试工具获得有关 PCIe 事务的更多详细信息?

    如果您可以将 memcpy 代码汇编到处理器实际将字节存储到0x69000000地址的位置、则也会引起关注。 这将告诉我们处理器发送到 AM64x PCIe 内核的突发类型、然后我们可以尝试了解 PCIe 事务的外观。

    此致、

    Dominic

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

    您好、Dominic:

    如果我正确理解这一点、您也可以看到 memcpy 情况下的所有数据、只需将数据拆分为各个字节写入、而不是字写入。 您能否确认?

    以下函数是我在上一次测试中使用的代码。  

    如果  length = 16、则一切正常、结果为第一张图片。

    如果 长度= 17、则错误、结果为第二张图片。

    int32_t PCIe_FPGA_ACCESS_TEST3 (Pcie_Handle 汉

    DLE)

    uint32_t * test =(uint32_t *)(0x68000000U + 0x01000000U + 0x4000U);//0x68000000U + 0x01000000U 是 OB 基地址、0x4000U 是 FPGA 中的偏移量
    const uint8_t length = 16;
    uint32_t data_buff[length];//要写入的数据
    uint32_t data_buff2[length];//读缓冲区
    uint8_t i;

    for (i = 0;i < length;i++)

    DATA_buff[i]= 0x5affa5f7;
    }
    memcpy (test、data_buff、length * sizeof (uint32_t));
    memcpy (data_buff2、test、length * sizeof (uint32_t));

    返回0;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////

    [报价 userid="387520" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1398510/tmds243evm-pcie-rc-read-ep-bar-info-stuck-243evm-intel-fpga/5420159 #5420159"]如果您能够将 memcpy 代码单步执行到处理器实际将字节存储到0x69000000地址的位置、也会很有意思。[/QUOT]

    下面是 memcpy()的反汇编窗口内容

    508 memcpy (test、data_buff、length * sizeof (uint32_t));
    70094898:982A LDR r0、[R13、#0xa8]
    7009489a:A914加上 R1、R13、#0x50
    7009489c:E8B1501C LDM.w R1!、{R2、R3、R4、R12、 R14}创建的
    700948a0:E8A0501C STM.w r0!、{R2、R3、R4、R12、 R14}创建的
    700948a4:E8B1501C LDM.w R1!、{R2、R3、R4、R12、 R14}创建的
    700948a8:E8A0501C STM.w r0!、{R2、R3、R4、R12、 R14}创建的
    700948ac:E891503C LDM.w R1、{R2、R3、R4、R5、 r12、r14}
    700948b0:E880503C STM.w r0、{R2、R3、R4、R5、 r12、r14}
    509 time_reg = ClockP_getTimeUsec ()- time_reg;

    但我不知道如何获得有关该进程如何实际存储字节的更多详细信息、您能告诉我如何操作吗?

    有关 FPGA 的所有问题都在测试和调试中、我们稍后会给您回复。

    谢谢  

    Chunyang  

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

    Chunyang、您好!

    [报价 userid="578304" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1398510/tmds243evm-pcie-rc-read-ep-bar-info-stuck-243evm-intel-fpga/5420435 #5420435"]

    以下函数是我在上一次测试中使用的代码。  

    如果  length = 16、则一切正常、结果为第一张图片。

    如果 长度= 17、则错误、结果为第二张图片。

    [报价]

    当您读回数据时、我得到长度= 17是错误的、但问题是在 FPGA 调试中、您是否可以看到/all/字节、一个接一个地逐个字节、而不是一次四个字节。

    以下是 memcpy ()
    的反汇编窗口内容

    真有意思。 似乎编译器内联了 memcpy。 您可以看到两个5个字的副本、后跟1个6个字的副本。 我假设这来自长度= 16的"良好"情况? 您能向我展示长度= 17的反汇编吗?

    此致、

    Dominic

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

    您好、Dominic:

    我稍后会回答的第一个问题。

    我将"length"修改为17、反汇编窗口像这样。

    508 memcpy (test、data_buff、length * sizeof (uint32_t));
    70096648:982C LDR r0、[R13、#0xb0]
    7009664a:A915加上 R1、R13、#0x54
    7009664c:2244 MOVs R2、#0x44
    7009664e:9201 str R2、[R13、#4]
    70096650:F7ECEDEC blx __aeabi_memcpy
    509 time_reg = ClockP_getTimeUsec ()- time_reg;

    Chunyang  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 USERID="387520" URL="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1398510/tmds243evm-pcie-rc-read-ep-bar-info-stuck-243evm-intel-fpga/5420159 #5420159"]是各个字节(F7、A5、FF、5A)、全部位于 Avalon _mm_writeData[7:0]上、还是它们位于[7:0]、[15:8]、[23:16]、[31:24]?

    我已与同事确认、 各个字节(F7、A5、FF、5A)都位于 Avalon _mm_writedata[7:0]上。

    所以、最后、我们得到的32位数据是"5A"

    供参考

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

    尊敬的 Cunyang:

    您必须进入_aeabi_memcpy ( )以查看其实施情况。

    然后您可以进行单步执行、直至出现某种 str、stm 或某种操作码、该操作码使用寄存器作为以0x69004000为目标的基址。 memcpy 通常包含多个优化、以处理未对齐的起始/结束、并且通常使用浮点或 SIMD 操作码来触发更大的突发。

    关于 FPGA 设计:

    是 Intel/Altera 提供的现成 PCIe IP 内核、还是定制设计? 该 IP 核心的文档是否为公共文档?

    此致、

    Dominic

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

    您好、Dominic:

       按照您的指导,我尝试了解16*32位和17*32位写入之间的区别。

       我注意到、如果写入16*32位、 汇编代码使用 R2、R3... 移动"0x5affa5f7"、如下图第一所示。 在写入17*32位时、汇编代码将调用_aeabi_memcpy、它 按字节移动"0x5affa5f7"、如第2和第3张图片所示。  

       这是什么意思? 我只应该让 umcpy()写入小于16*32位?  

     

       

     有关 Intel FPGA PCIe 内核、请访问此链接 https://www.intel.com/content/www/us/en/docs/programmable/683724/18-0/datasheet.html

    谢谢您、BR

    Chunyang  

     

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

    Chunyang、您好!

    好的、现在它开始变得有意义了。 出于某种原因(不确定原因)、memcpy 实现使用单字节副本。 根据论坛上此处的一些帖子、这可能与-O0与-O3相关。

    带有针对0x68的严格排序存储器。。。 您应该获得针对每个字节的独立 PCIe 事务。 PCIe 事务将始终寻址一个32位字、但四个字节中的每个字节都有字节使能、并且每个事务中应设置不同的字节使能。

    Intel PCIe 内核应能够正确输出这些单字节写入。 Avalon 接口包含字节使能信号。 这可能需要 FPGA 同事进行研究。 我怀疑 PCIe 内核与上图中所示的信号之间存在一些关系(例如文档中说 rxm 接口为64位或128位宽、并包括 BYTE_ENABLE)。 我认为这超出了本论坛的范围。

    另一个问题是使用"memcpy"是否是一个好主意。 一段时间以前我写了这个:

    使用 memcpy()时、编译器可能会进行仅对"正常存储器"有效的优化(即可缓存、无强排序)。 这是否可行取决于您在 MPU 中配置0x68000000区域的方式,也取决于 memcpy ()实现。

    事实证明、编译器/ C 库没有"优化"、而是使用了非常简单的按字节复制。 问题仍然存在:你不知道 memcpy 是如何访问内存的、因此 memcpy 实际上只适用于"正常"内存。

    如果您想要传输"较大"的数据量、则应尝试生成较大的突发。 如果您的应用有可能、您可以将 PCIE0_DAT0窗口的该区域(例如0x69000000)标记为可缓存正常存储器、然后使用 CacheP 函数使缓存内容被写回/失效。 这将会很复杂。

    替代方案是坚持使用严格排序或器件存储器、并手动对复制循环进行编码以生成更大的脉冲。 我会尝试 volatile uint64_t*、并在反汇编中验证数据的复制方式。 对于写入 FPGA、器件存储器的速度会快很多。 读数总是会很慢。

    此致、

    Dominic