execute: Implement bypass from output of execute1 to input
authorPaul Mackerras <paulus@ozlabs.org>
Mon, 13 Jan 2020 02:23:42 +0000 (13:23 +1100)
committerPaul Mackerras <paulus@ozlabs.org>
Tue, 14 Jan 2020 11:42:50 +0000 (22:42 +1100)
commitb14d9820116ebe8c39179c8b6c5565d340bdb72c
tree723271c8b4271fe5e250b25bd82135ca88acfe01
parent0c714f1be680ed36373be0ee9c15d30a7cc263b6
execute: Implement bypass from output of execute1 to input

This enables back-to-back execution of integer instructions where
the first instruction writes a GPR and the second reads the same
GPR.  This is done with a set of multiplexers at the start of
execute1 which enable any of the three input operands to be taken
from the output of execute1 (i.e. r.e.write_data) rather than the
input from decode2 (i.e. e_in.read_data[123]).

This also requires changes to the hazard detection and handling.
Decode2 generates a signal indicating that the GPR being written
is available for bypass, which is true for instructions that are
executed in execute1 (rather than loadstore1/dcache).  The
gpr_hazard module stores this "bypassable" bit, and if the same
GPR needs to be read by a subsequent instruction, it outputs a
"use_bypass" signal rather than generating a stall.  The
use_bypass signal is then latched at the output of decode2 and
passed down to execute1 to control the input multiplexer.

At the moment there is no bypass on the inputs to loadstore1, but that
is OK because all load and store instructions are marked as
single-issue.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
common.vhdl
control.vhdl
core.vhdl
decode2.vhdl
execute1.vhdl
gpr_hazard.vhdl