library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_unsigned.all;

--******************************************************************************
--** ENTITY forwardingU

--**
--** Deskripsi: Entityini menguraikan Forwarding Unit.
--**            Ini termasuk dua multiplexers yang memilih nilai yang mana untuk
--**            diberikan kembali ke ALU dalam EX stage dari pipeline.
--**            ini memilih dari ALU result, MEM result atau the IDEX read
--**            registers. 
--******************************************************************************
ENTITY forwardingU IS
    PORT(ID_readOne, ID_readTwo, EX_result : IN STD_LOGIC_VECTOR(15 DOWNTO 0); 
         MEM_result                        : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
         exmemcrw, memwbc                  : IN STD_LOGIC;
         exmemwb, wbWReg, ReadRegOne       : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
         ReadRegTwo                        : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
        RegA, RegB                         : OUT STD_LOGIC_VECTOR(15 DOWNTO 0));
END ENTITY forwardingU;

ARCHITECTURE structural_forwardingU OF forwardingU IS
    --Menentukan isyarat yang dibutuhkan
    SIGNAL SelA, SelB                      : STD_LOGIC_VECTOR(1 DOWNTO 0);
    
    --**************************************************************************
    --** Ini dimana struktur dari forwarding unit dimulai.
    --** Ini dibuat dari actual forwarding unit dan dua muxes
    --** yang mengontrol nilai mana yang dismapaikan ke ALU.
    --**************************************************************************
    BEGIN
    
    --**************************************************************************
    --** Forward Unit
    --** PORT MAP ini menunjukkan bagaimana Forward Unit yang memutuskan nilai apa
    --** yang disampaikan ke ALU yang dihubungkan ke rest of the forwarding unit
    --** circuit.
    --**************************************************************************
    forward : work.forward
        PORT MAP(exmemcrw, memwbc, exmemwb, wbWReg, ReadRegOne, ReadRegTwo, 
                 SelA, SelB);
    
    --**************************************************************************
    --** Selector
    --** PORT MAP ini menunjukkan hubungan dari Multiplexer yang meneruskan
    --** read register, hasil dari ALU atau hasil dari Mem stage
    --** dikembalikan ke ALU.
    --**************************************************************************             
    mux1 : work.rselector
        PORT MAP(ID_readOne, EX_result, MEM_result, SelA, RegA);
    
    --**************************************************************************
    --** Selector
    --** PORT MAP ini menunjukkan hubungan dari Multiplexer yang meneruskan
    --** read register, hasil dari ALU atau hasil dari Mem stage
    --** dikembalikan ke ALU.
    --**************************************************************************             
    mux2 : work.rselector
        PORT MAP(ID_readTwo, EX_result, MEM_result, SelB, RegB);
    
END ARCHITECTURE structural_forwardingU;

