从 ARM 购买 IP 的半导体制造商是否应该满足参考手册中描述的指令的时钟周期?
Should a semiconductor manufacturer buying IPs from ARM meet the clock cycles for an instruction described in the reference manual?
针对德州仪器的CC3220S,我用C语言开发了一个使用inline Assembly等待1秒的函数(不包括循环前和循环外的指令)。
根据 ARMv7-M reference manual,以 PC 为目标的 MOV 指令需要 1 + P 个指令周期,其中 P 在 1 和 3 之间,具体取决于流水线的重新填充。
最坏情况这意味着循环在 6 个时钟周期内执行。
CC3220S 其时钟速度为 80 MHz。然而,执行循环 1000 万次会产生所需的 1 秒延迟(已使用逻辑分析仪验证)。
这意味着循环使用 8 个时钟周期。
我怀疑指令使用的时钟周期数。
因此我的问题是,从 ARM 购买 IP 的半导体制造商是否应该满足参考手册中描述的指令的时钟周期?
void delay_1sec(void)
{
__asm(" PUSH {r4-r5,lr}");
__asm(" LDR r4, [pc, #12]");
__asm(" MOV r5, pc");
__asm(" NOP");
__asm(" SUBS r4, #1"); /* 1 instruction cycle */
__asm(" ITE NEQ"); /* 1 instruction cycle */
__asm(" MOV pc, r5"); /* 1 + P instructions (where P is between 1 and 3 depending on pipeline refill) */
__asm(" POP {r4-r5,pc}");
__asm(" .word 10000000");
}
根据您的参考,
The cycle counts are based on a system with zero wait states.
从你的来源来看,循环是,
SUBS r4, #1 /* 1 cycle */
ITE NEQ /* 1 cycle */
MOV pc, r5 /* 4 cycles */
假设编译器没有插入额外的代码,您的内存在重新填充指令流水线时可以处于 2 个等待状态。此外,供应商可能会修改内核并且不需要满足此时序要求。一些供应商许可 'architecture' 并设计逻辑来实现指令集。其他人购买一个实现 Cortex-M4 的逻辑块。我猜 TI 是后者,内存等待状态是你的问题。您没有注意到您的代码位于哪个存储设备中。如果您的系统使用 'serial flash' 两个等待状态,额外的延迟就不足为奇了。这将使循环计数达到您所观察到的 8。
Hence my question, should a semiconductor manufacturer buying IPs from ARM meet the clock cycles for an instruction described in the reference manual?
从上面的答案是否定的。如果他们是架构被许可人,则周期计数可能会有所不同。它们需要二进制兼容(但情况并非总是如此)。但是,在您的情况下,我相信他们正在满足文档,它只需要通过计算内存等待状态将其完全应用于用例。板载 SRAM 也可以有等待状态。通常只有 TCM 是零等待状态。
针对德州仪器的CC3220S,我用C语言开发了一个使用inline Assembly等待1秒的函数(不包括循环前和循环外的指令)。 根据 ARMv7-M reference manual,以 PC 为目标的 MOV 指令需要 1 + P 个指令周期,其中 P 在 1 和 3 之间,具体取决于流水线的重新填充。 最坏情况这意味着循环在 6 个时钟周期内执行。
CC3220S 其时钟速度为 80 MHz。然而,执行循环 1000 万次会产生所需的 1 秒延迟(已使用逻辑分析仪验证)。 这意味着循环使用 8 个时钟周期。 我怀疑指令使用的时钟周期数。 因此我的问题是,从 ARM 购买 IP 的半导体制造商是否应该满足参考手册中描述的指令的时钟周期?
void delay_1sec(void)
{
__asm(" PUSH {r4-r5,lr}");
__asm(" LDR r4, [pc, #12]");
__asm(" MOV r5, pc");
__asm(" NOP");
__asm(" SUBS r4, #1"); /* 1 instruction cycle */
__asm(" ITE NEQ"); /* 1 instruction cycle */
__asm(" MOV pc, r5"); /* 1 + P instructions (where P is between 1 and 3 depending on pipeline refill) */
__asm(" POP {r4-r5,pc}");
__asm(" .word 10000000");
}
根据您的参考,
The cycle counts are based on a system with zero wait states.
从你的来源来看,循环是,
SUBS r4, #1 /* 1 cycle */
ITE NEQ /* 1 cycle */
MOV pc, r5 /* 4 cycles */
假设编译器没有插入额外的代码,您的内存在重新填充指令流水线时可以处于 2 个等待状态。此外,供应商可能会修改内核并且不需要满足此时序要求。一些供应商许可 'architecture' 并设计逻辑来实现指令集。其他人购买一个实现 Cortex-M4 的逻辑块。我猜 TI 是后者,内存等待状态是你的问题。您没有注意到您的代码位于哪个存储设备中。如果您的系统使用 'serial flash' 两个等待状态,额外的延迟就不足为奇了。这将使循环计数达到您所观察到的 8。
Hence my question, should a semiconductor manufacturer buying IPs from ARM meet the clock cycles for an instruction described in the reference manual?
从上面的答案是否定的。如果他们是架构被许可人,则周期计数可能会有所不同。它们需要二进制兼容(但情况并非总是如此)。但是,在您的情况下,我相信他们正在满足文档,它只需要通过计算内存等待状态将其完全应用于用例。板载 SRAM 也可以有等待状态。通常只有 TCM 是零等待状态。