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.

[参考译文] AM2434:AM2434 GPMC 存储器配置

Guru**** 2897200 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1630474/am2434-am2434-gpmc-memory-configuration

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

您好:

我们使用 GPMC 与 FPGA 进行通信。 根据 SDK 中的示例、我们将存储器配置为 “严格排序“、我们进行了一些测量并注意到、如果我们将存储器配置为 “非缓存“ 、则从 GPMC 写入/读取的时间要快得多。

对于 FPGA 通信、是否可以切换到“非缓存“模式?  

切换到“非缓存“模式会产生什么后果/处罚?  

image.png

谢谢、

Sergei Pilipenko

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

    您好 Sergei Pilipenko、

    我今天不在办公室.

    我将 在一两天内提供答复。

    此致、

    Anil

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

    您好:

    有新消息吗?

    谢谢、

    Sergei Pilipenko

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

    您好 Sergei Pilipenko、

    请查看下面的答案。

    强烈订购:

    -每家商店都按程序顺序到达总线,不需要通过存储缓冲区重新排序。
    -每个负载都是非推测性的—CPU 不会预取或预测对严格排序区域的读取。
    -没有写入合并—每个存储作为单独的总线事务发出。
    -在所有其它内存访问之前和之后保持完全排序。

    这些保证与 FPGA 接口的要求完全匹配。


    切换到“非缓存正常“时引入的问题:

    如果将 MPU 属性更改为“非缓存正常“、则会失去上述保证:

    1.通过存储缓冲区写入重新排序
    允许 Cortex-R5F 存储缓冲区相对于彼此重新排序正常存储器写入、并且相对于读取。

    两次连续的 FPGA 寄存器写入可能会按照与代码不同的顺序到达 GPMC 总线
    印发了这些报告。 对于寄存器写入序列很重要(例如,地址,数据,命令,然后触发)的 FPGA 协议、这将间歇性地导致 FPGA 行为不正确、极难调试。


    2.推测性读数
    CPU 可能会向正常存储器区域发出推测(预取)读取。 对具有读取副作用(FIFO 砰砰声,状态清除,中断确认)的 FPGA 寄存器进行推测读取时、即使您的代码从未执行该读取路径、也会破坏您的 FPGA 状态。 这是一个无声的数据损坏,没有任何原因的迹象。


    3.写后读的危险
    如果没有订购保证、则可以在写入到达 FPGA 之前执行写入之后发出的读取操作。 即使不涉及缓存、读回寄存器以验证写入也会返回过时的值。


    性能:

    GPMC 上严格排序和非缓存正常之间的性能差异在实践中并不显著。 GPMC 是一种慢速外部总线(典型的访问延迟,数十个 CPU 周期或更长时间,具体取决于等待状态)。
    非缓存启用的存储缓冲区优化与快速内部存储器相关。 对于 GPMC 连接的外设、总线延迟占主导地位、并且严格排序的订购开销会增加可忽略不计的额外成本。

    这是任何存储器映射 I/O 外设(包括 FPGA 接口)的正确安全配置。 因此、MCU+ SDK GPMC 示例 (GPMC_FLASH_IO) 使用此配置。 因此,我们建议与 严格订购配合使用。

    如果您看到 GPMC 吞吐量存在特定的性能问题,请共享测量的吞吐量和访问模式 — 可能存在 GPMC 时序参数调优(CS 时序、ADV/OE/WE 保持/设置计数)、可以在不影响正确性的情况下提高性能。

    此致、

    Anil.

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

    尊敬的 Anil:

    我做了一个小 banchmark 测试:

    非缓存:

    读取 1000 X 16 位:环路所需的时间:200617 个周期、平均值:200 个周期
    读取 1000 X 32 位:循环所用的时间:289599 个周期、平均值:289 个周期
    写入 1000 X 16 位:循环所需的时间:11217 个周期、平均值: 11 个周期
    写入 1000 X 32 位:循环所需的时间:11611 个周期、平均: 11 个周期

    统一排序:

    读取 1000 X 16 位:循环所需的时间:204627 个周期、平均值:204 个周期
    读取 1000 X 32 位:循环所用的时间:295306 个周期、平均:295 个周期
    写入 1000 X 16 位:循环所需的时间:144266 个周期、平均值: 144 个周期
    写入 1000 X 32 位:循环所用的时间:211408 个周期、平均值: 211 个周期

    您可以看到、严格排序命令的速度是写入命令的 10 倍。

    GPMC 配置:

      // GPMC 配置
      *(uint32_t *) 0x3B000060 = 0x8001202;
      *(uint32_t *) 0x3B000064 = 0xC0E00;
      *(uint32_t *) 0x3B000068 = 0x30900;
      *(uint32_t *) 0x3B00006C = 0xC036E19;
      *(uint32_t *) 0x3B000070 = 0x10E0C0E;
      *(uint32_t *) 0x3B000074 = 0x8F030000;

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

    Banchmark 代码:

    //读取 16 位
    uint32_t start = CycleCounterP_getCount32 ();

    对于 (int i = 0;i < 1000;i++)

    G_val +=*(uint16_t*) 0x50000000;
    }

    uint32_t end = CycleCounterP_getCount32 ();
    OSAL_PRINT_F(“读取 1000 X 16 位:循环所需的时间:%u 个周期、平均值:%u 个周期“ CRLF_MACRO、END - START、(END - START)/ 1000);

    //读取 32 位
    start = CycleCounterP_getCount32 ();

    对于 (int i = 0;i < 1000;i++)

    G_val +=*(uint32_t *) 0x50000000;
    }

    end = CycleCounterP_getCount32 ();
    OSAL_PRINT_F(“读取 1000 X 32 位:循环所用的时间:%u 个周期、平均值:%u 个周期“ CRLF_MACRO、END - START、(END - START)/ 1000);

    //写入 16 位
    start = CycleCounterP_getCount32 ();
    对于 (int i = 0;i < 1000;i++)

    *(uint16_t*) 0x50000000 =(uint16_t) g_val;
    }

    end = CycleCounterP_getCount32 ();
    OSAL_PRINT_F(“写入 1000 X 16 位:循环所需的时间:%u 个周期、平均值:%u 个周期“ CRLF_MACRO、END - START、(END - START)/ 1000);

    //写入 32 位
    start = CycleCounterP_getCount32 ();
    对于 (int i = 0;i < 1000;i++){
    *(uint32_t *) 0x50000000 =(uint32_t) g_val;
    }

    end = CycleCounterP_getCount32 ();
    OSAL_PRINT_F(“写入 1000 X 32 位:循环所用的时间:%u 个周期、平均值:%u 个周期“ CRLF_MACRO、END - START、(END - START)/ 1000);

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

    SysConfig:

    e2e.ti.com/.../2432.txt

    谢谢、

    Sergei

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

    您好 Sergei、

    我建议不要使用非缓存存储器、而是尝试对 GPMC 存储器使用缓存的 MPU 设置并查看结果。

    我希望阅读效果也会有所改善。

    请告诉我结果

    此致、

    Anil.

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

    您好 Anil、

    使用缓存 内存时、我对从两端访问内存时的缓存一致性和数据一致性有一些顾虑。 特别是、我希望确保不存在过时读取或写入可见性的问题。

    我们如何确保该设置中的数据一致性?

    您能否澄清一下、此方法是否已经在类似的用例中进行了测试、以及是否存在任何已知限制?

    此致、
    Sergei

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

    您好 Sergei、

    将内存保持在非缓存模式意味着 CPU 始终直接从内存读取数据、而不是从缓存读取数据。

    与缓存访问相比、这需要更多的周期、并导致性能下降。

    但是、将存储器保持为缓存肯定不是缓存一致性的问题、因为您只在单个内核中控制 GPMC、而不是在其他内核中控制 GPMC。 这样、数据就可以正常看到。

    当我们使用直写策略将内存配置为缓存时、每个缓存的写入会立即传播到内存:
    -所有写入将立即传播到 NOR 存储器
    -读取受益于 L1 数据缓存加速
    -单核 L1 高速缓存管理非常简单
    -数据一致性得到保证

    几乎所有存储器都配置为缓存、以实现更好的性能。

    我认为缓存配置没有任何问题。

    此致、

    Anil.