FPU Functional Block Unavailable
If the FPU pipeline is not full, and the FPU attempts to dispatch an instruction from the RD-stage that uses a functional block that is already in use by a prior instruction, an internal structural hazard will result, and the RD-stage will be stalled until such time that the functional block is no longer in use. If the CPU attempts to issue another FPU instruction before this occurs, the FPU will then stall the CPU until the hazard resolves.
This scenario can arise as a result of in-order retirement where instructions that target the
same functional block will be stalled in the pipeline waiting
for slower, older instructions to complete execution. An example
is shown in Figure 3-3 where a slow
instruction (FSIN
) is followed by multiple
instructions that target the same MISC_SP functional block. The
first FMOV
will stall in X [0] waiting for the
FSIN to retire, resulting in an internal structural hazard. The
subsequently issued FMOV
will issue but will be
stalled in the RD-stage because it cannot progress into X [0]
until the first FMOV
is able to move into the
WB-stage, another internal structural hazard. As the RD-stage is
now stalled, should the CPU attempt to issue any additional FPU
FMOV
or FMOVC
instructions (which share the same functional block), the FPU
will stall the CPU until such time that the pipeline can advance
again, causing an external structural hazard.
This scenario will always arise for a sequential issue of the multi-cycle iterative FDIV instruction (all other instructions can be pipelined) as shown in Figure 3-4.