您好!
我正在使用 PMU 在指令级执行一些测量、以验证 EMIF 访问外部 FPGA 的预期结果。
我还扩展了这些测试以测量负载并写入不同类型的存储器:L2_Flash、L2_RAM、EMIF、系统模块寄存器。
根据系统的不同时钟、我尝试根据 Cortex-R5文档(附录 B)了解单个负载或单个存储指令的时序、但在将测量值与预期时序进行比较时、我不理解任何内容。
执行测量时、系统处于以下状态:
- PMU 周期计数器配置为对每个周期进行计数
- GCLK = 300MHz (cortex-R5时钟)
- HCLK=150MHz (2级存储器时钟)
- VCLK = 75MHz (PCR1下系统模块的时钟)
- VCLK3 = 50MHz (EMIF 时钟)
- 闪存等待状态根据 TMS570LC4357数据表进行配置(即3)
- 用于访问 FPGA 的 EMIF 配置:16位数据总线、读取设置/选通/保持周期组合= 8个 EMIF 时钟周期;写入设置/选通/保持周期组合= 5个 EMIF 时钟周期
- 缓存已禁用
- MPU 被启用:EMIF 和系统外设存储器是严格排序的存储器、RAM 和闪存是正常的可高速缓冲存储器
- 下面给出的所有周期数都是针对 PMU 周期计数寄存器访问的(6个周期:根据 Cortex-R5文档、这个测量是准确的)
- 测量仅涵盖一条指令(LDR 或 str)
- 用于加载和存储的所有地址在64位上对齐
- 所有 cortex-R5性能特性(例如:双问题)被保持在它们的复位状态(被启用)
测试期间使用的地址:
- L2RAM:0x08000000
- L2FLASH: 0x00044000
- 系统模块: 0xFFFFFF00
- EMIF:0x60000000
以下是测量结果:
- L2RAM:加载16位>> 14个周期
- L2RAM:加载32位>> 14个周期
- L2RAM:加载64位>> 14个周期
- L2RAM:存储16位>> 1个周期
- L2RAM:存储32位>> 1个周期
- L2RAM:存储64位>> 1个周期
- L2FLASH:加载16位>> 24个周期
- L2FLASH:加载32位>> 24个周期
- L2FLASH:加载64位>> 24个周期
- SYS:加载16位>> 31个周期
- SYS:加载32位>> 31个周期
- SYS:写入16位>> 27个周期
- SYS:写入32位>> 27个周期
- EMIF:加载16位>> 129个周期
- EMIF:加载32位>> 177个周期
- EMIF:加载64位>> 275个周期
- EMIF:存储16位>> 50个周期
- EMIF:存储32位>> 48个周期
- EMIF:存储64位>> 88个周期
我可以从这些测量中看到的一些信息:
- 对于 EMIF 访问、一个读取的16位传输应该需要48个内核周期(50 MHz 时为8个周期>300 MHz 时为48个周期)、并且一个负载16位和一个负载32位之间大约有48个周期。 加载32位和加载64位之间还有2*48个周期的差异。
- 在 Cortex-R5 TRM 的第 B.11章中、存储在内部 RAM 中需要一个周期、这就是测量值
但我无法回答以下问题、即使在搜索此论坛、ARM 社区论坛和 ARM 应用手册之后也是如此。 我不明白我做了什么错!
- L2 RAM 有0个等待状态、其时钟(HCLK)是内核时钟(GCLK)的一半:负载应该持续2或3个周期、对吧?
- L2闪存有3个等待状态、 其时钟(HCLK)是内核时钟(GCLK)的一半:负载应该持续6或7个周期、对吧?
- EMIF:单个 EMIF 16位读取传输应该花费48个周期:为什么有81个周期(129 - 48)的开销?
- EMIF:为什么存储16位和存储32位具有相同的持续时间(应该是5个 EMIF 周期>> 30个内核周期)? 我认为所有对严格排序存储器的访问都应该在内核继续执行之前完成?
- EMIF:为什么64位存储不会持续4 * 30个周期、而是更少(88)?
- 系统模块寄存器:为什么是这些数字?
我们非常感谢您在这方面提供的任何帮助!
谢谢、
盖尔