ZHCZ036B April 2024 – February 2025 TMS320F28P550SG , TMS320F28P550SJ , TMS320F28P559SG-Q1 , TMS320F28P559SJ-Q1
FPU:FPU 至 CPU 寄存器移动操作之前是任何 FPU 2p 操作
0、A
当多周期 (2p) FPU 指令后跟 FPU 到 CPU 寄存器转移时,此公告适用。如果 FPU 到 CPU 读取指令源寄存器与 2p 指令目标相同,则在 2p 指令完成之前读取的可能是 FPU 寄存器的值。这是因为 2p 指令依赖于流水线 E3 阶段期间结果的数据转发。如果在 E3 阶段碰巧发生流水线停滞,则读取指令不会及时转发结果。
受此公告影响的 2p 指令是 MPYF32、ADDF32、SUBF32 和 MACF32。FPU 寄存器读取的目标必须是一个 CPU 寄存器(ACC、P、T、XAR0...XAR7)。如果寄存器读取是 FPU 到 FPU 寄存器转移,则此公告不适用。
在下面的示例中,2p 指令 MPYF32 使用 R6H 作为其目标。FPU 寄存器读取 MOV32 使用同一个寄存器 R6H 作为其源,并使用 CPU 寄存器作为目标。如果在 E3 流水线阶段发生停滞,则 MOV32 将在 MPYF32 指令完成之前读取 R6H 的值。
问题示例:
MPYF32 R6H, R5H, R0H ; 2p FPU instruction that writes to R6H
|| MOV32 *XAR7++, R4H
F32TOUI16R R3H, R4H ; delay slot
ADDF32 R2H, R2H, R0H
|| MOV32 *--SP, R2H ; alignment cycle
MOV32 @XAR3, R6H ; FPU register read of R6H
图 3-4 展示了流水线中没有停滞时的问题流水线图。
图 3-4 流水线中没有停滞时的问题流水线图图 3-5 展示了指令 I1 的 E3 时隙中存在停滞时的问题流水线图。
图 3-5 指令 I1 的 E3 时隙中存在停滞时的问题流水线图在本例中,应将 MPYF32、ADDF32、SUBF32 和 MACF32 视为 3p 周期指令。必须将三个 NOP 或非冲突指令放置在指令的延迟时隙中。
C28x 代码生成工具 v.6.2.0 及更高版本都将生成正确的指令序列并检测汇编代码中的错误。在以前的版本 v6.0.5(适用于 6.0.x 分支)和 v.6.1.2(适用于 6.1.x 分支)中,编译器将生成正确的指令序列,但汇编器不会检测汇编代码中的错误。
解决方法示例:
MPYF32 R6H, R5H, R0H
|| MOV32 *XAR7++, R4H ; 3p FPU instruction that writes to R6H
F32TOUI16R R3H, R4H ; delay slot
ADDF32 R2H, R2H, R0H
|| MOV32 *--SP, R2H ; delay slot
NOP ; alignment cycle
MOV32 @XAR3, R6H ; FPU register read of R6H
图 3-6 展示了带解决方法的流水线图。
图 3-6 带解决方法的流水线图