从 ARM 购买 IP 的半导体制造商是否应该满足参考手册中描述的指令的时钟周期?

Xhe*_*dos 1 assembly arm instruction-set

对于德州仪器的CC3220S,我用C语言开发了一个函数,使用内联汇编等待1秒(不包括循环前和循环外的指令)。根据ARMv7-M 参考手册,针对 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"); 
}
Run Code Online (Sandbox Code Playgroud)

art*_*ise 6

从你的参考,

周期计数基于具有零等待状态的系统。

从你的来源来看,循环是,

SUBS r4, #1   /* 1 cycle */ 
ITE NEQ       /* 1 cycle */ 
MOV pc, r5    /* 4 cycles */ 
Run Code Online (Sandbox Code Playgroud)

假设编译器没有插入额外的代码,当重新填充指令管道时,你的内存可以是 2 个等待状态。此外,供应商可以修改内核并且不需要满足此时序要求。一些供应商许可“架构”并设计实现指令集的逻辑。其他购买实现 Cortex-M4 的逻辑块。我猜 TI 是后者,内存等待状态是你的问题。您没有注意您的代码位于哪个存储设备中。如果您的系统使用“串行闪存”,那么两个等待状态的额外延迟一点也不奇怪。这将使循环计数达到 8,这就是您观察到的。

因此我的问题是,从 ARM 购买 IP 的半导体制造商是否应该满足参考手册中描述的指令的时钟周期?

上面的答案是否定的。如果他们是架构许可证持有者,则周期计数可能会有所不同。它们需要是二进制兼容的(但即使情况并非总是如此)。但是,在您的情况下,我相信他们正在满足文档,只需通过计算内存等待状态将其完全应用于用例即可。板载 SRAM 也可以具有等待状态。通常只有 TCM 处于零等待状态。