OpenCores
URL https://opencores.org/ocsvn/rv01_riscv_core/rv01_riscv_core/trunk

Subversion Repositories rv01_riscv_core

[/] [rv01_riscv_core/] [trunk/] [VHDL/] [RV01_fwdlog_2w_p6.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 madsilicon
-----------------------------------------------------------------
2
--                                                             --
3
-----------------------------------------------------------------
4
--                                                             --
5
-- Copyright (C) 2015 Stefano Tonello                          --
6
--                                                             --
7
-- This source file may be used and distributed without        --
8
-- restriction provided that this copyright statement is not   --
9
-- removed from the file and that any derivative work contains --
10
-- the original copyright notice and the associated disclaimer.--
11
--                                                             --
12
-- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY         --
13
-- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   --
14
-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   --
15
-- FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      --
16
-- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         --
17
-- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    --
18
-- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   --
19
-- GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        --
20
-- BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  --
21
-- LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  --
22
-- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  --
23
-- OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         --
24
-- POSSIBILITY OF SUCH DAMAGE.                                 --
25
--                                                             --
26
-----------------------------------------------------------------
27
 
28
---------------------------------------------------------------
29
-- RV01 result forwarding logic
30
---------------------------------------------------------------
31
 
32
library IEEE;
33
use IEEE.std_logic_1164.all;
34
use IEEE.numeric_std.all;
35
use STD.textio.all;
36
 
37
library work;
38
use work.RV01_CONSTS_PKG.all;
39
use work.RV01_TYPES_PKG.all;
40
use work.RV01_IDEC_PKG.all;
41
 
42
entity RV01_FWDLOG_2W_P6 is
43
  port(
44
    ID_RX_i : in RID_T;
45
    ID_RRX_i : in std_logic;
46
    IX1_INSTR0_i : in DEC_INSTR_T;
47
    IX2_INSTR0_i : in DEC_INSTR_T;
48
    IX3_INSTR0_i : in DEC_INSTR_T;
49
    IX1_INSTR1_i : in DEC_INSTR_T;
50
    IX2_INSTR1_i : in DEC_INSTR_T;
51
    IX3_INSTR1_i : in DEC_INSTR_T;
52
    IX1_PA_RES0_i : in SDWORD_T;
53
    IX1_PA_RES1_i : in SDWORD_T;
54
    IX2_PA_RES0_i : in SDWORD_T;
55
    IX2_PA_RES1_i : in SDWORD_T;
56
    IX3_PA_RES0_i : in SDWORD_T;
57
    IX3_PA_RES1_i : in SDWORD_T;
58
    ID_OPX_NOFWD_i : in SDWORD_T;
59
    IX1_V_i : in std_logic_vector(2-1 downto 0);
60
    IX2_V_i : in std_logic_vector(2-1 downto 0);
61
    IX3_V_i : in std_logic_vector(2-1 downto 0);
62
    IX1_FWDE_i : in std_logic_vector(2-1 downto 0);
63
    IX2_FWDE_i : in std_logic_vector(2-1 downto 0);
64
    IX3_FWDE_i : in std_logic_vector(2-1 downto 0);
65
    NOREGS_i : in std_logic;
66
    NOREGD_i : in SDWORD_T;
67
 
68
    ID_OPX_o : out SDWORD_T
69
  );
70
end RV01_FWDLOG_2W_P6;
71
 
72
architecture ARC of RV01_FWDLOG_2W_P6 is
73
 
74
  constant SZERO : SDWORD_T := (others => '0');
75
 
76
begin
77
 
78
  -- Operand A can be forwarded from stages IX and MA.
79
  -- When forwarding from IX stage, result can come from
80
  -- ALU single-cycle result output or from LSU read data output.
81
  -- When forwarding from MA stage, result can come from
82
  -- ALU double-cycle result output only.
83
 
84
  -- WARNING: it's assumed that *_INSTR.RD always differs from
85
  -- *_INSTR_RD2 because a register can be written only once per
86
  -- cycle. If this condition is not satisfied ASIP behavior is
87
  -- undefined.
88
 
89
  process(ID_RX_i,ID_RRX_i,
90
    IX1_INSTR0_i,IX2_INSTR0_i,IX1_INSTR1_i,IX2_INSTR1_i,
91
    IX3_INSTR0_i,IX3_INSTR1_i,
92
    IX1_PA_RES0_i,IX1_PA_RES1_i,IX2_PA_RES0_i,IX2_PA_RES1_i,
93
    IX3_PA_RES0_i,IX3_PA_RES1_i,
94
    ID_OPX_NOFWD_i,IX1_V_i,IX2_V_i,IX3_V_i,
95
    IX1_FWDE_i,IX2_FWDE_i,IX3_FWDE_i,
96
    NOREGS_i,NOREGD_i)
97
    variable FWD_IX : std_logic_vector(5 downto 0);
98
  begin
99
 
100
    -- forwarding from IX1 stage occurs if:
101
    -- 1) ID stage instr. rA matches IX1 stage instr. rD AND
102
    -- 2) ID stage instr. reads rA AND
103
    -- 3) IX1 stage instr. writes rD AND
104
    -- 4) ID stage instr. is valid (IX1 stage one always is), AND
105
    -- 5) IX1 instr. is forward-enabled
106
 
107
    if(ID_RX_i = IX1_INSTR0_i.RD) then
108
      FWD_IX(0) := IX1_INSTR0_i.WRD and IX1_V_i(0) and
109
        IX1_FWDE_i(0); -- and ID_RRX_i;
110
    else
111
      FWD_IX(0) := '0';
112
    end if;
113
 
114
    if(ID_RX_i = IX1_INSTR1_i.RD) then
115
      FWD_IX(1) := IX1_INSTR1_i.WRD and IX1_V_i(1) and
116
        IX1_FWDE_i(1); -- and ID_RRX_i;
117
    else
118
      FWD_IX(1) := '0';
119
    end if;
120
 
121
    -- forwarding from IX2 stage occurs if:
122
    -- 1) ID stage instr. rA matches IX2 stage instr. rD AND
123
    -- 2) ID stage instr. reads rA AND
124
    -- 3) IX2 stage instr. writes rD AND
125
    -- 4) ID stage instr. is valid (IX1 stage one always is), AND
126
    -- 5) IX2 instr. is forward-enabled
127
 
128
    if(ID_RX_i = IX2_INSTR0_i.RD) then
129
      FWD_IX(2) := IX2_INSTR0_i.WRD and IX2_V_i(0) and
130
        IX2_FWDE_i(0); -- and ID_RRX_i;
131
    else
132
      FWD_IX(2) := '0';
133
    end if;
134
 
135
    if(ID_RX_i = IX2_INSTR1_i.RD) then
136
      FWD_IX(3) := IX2_INSTR1_i.WRD and IX2_V_i(1) and
137
        IX2_FWDE_i(1); -- and ID_RRX_i;
138
    else
139
      FWD_IX(3) := '0';
140
    end if;
141
 
142
    -- forwarding from IX3 stage occurs if:
143
    -- 1) ID stage instr. rA matches IX3 stage instr. rD AND
144
    -- 2) ID stage instr. reads rA AND
145
    -- 3) IX3 stage instr. writes rD AND
146
    -- 4) ID stage instr. is valid (IX1 stage one always is), AND
147
    -- 5) IX3 instr. is forward-enabled
148
 
149
    if(ID_RX_i = IX3_INSTR0_i.RD) then
150
      FWD_IX(4) := IX3_INSTR0_i.WRD and IX3_V_i(0) and
151
        IX3_FWDE_i(0); -- and ID_RRX_i;
152
    else
153
      FWD_IX(4) := '0';
154
    end if;
155
 
156
    if(ID_RX_i = IX3_INSTR1_i.RD) then
157
      FWD_IX(5) := IX3_INSTR1_i.WRD and IX3_V_i(1) and
158
        IX3_FWDE_i(1); -- and ID_RRX_i;
159
    else
160
      FWD_IX(5) := '0';
161
    end if;
162
 
163
    ---- result forwarding mux
164
    --if(FWD_IX(0) = '1' and ID_RRX_i = '1') then
165
    --  ID_OPX_o <= SZERO & IX1_PA_RES0_i;
166
    --elsif(FWD_IX(1) = '1' and ID_RRX_i = '1') then
167
    --  ID_OPX_o <= SZERO & IX1_PA_RES1_i;
168
    --elsif(FWD_IX(2) = '1' and ID_RRX_i = '1') then
169
    --  ID_OPX_o <= IX2_PA_RES0_i;
170
    --elsif(FWD_IX(3) = '1' and ID_RRX_i = '1') then
171
    --  ID_OPX_o <= IX2_PA_RES1_i;
172
    --elsif((FWD_IX(4) = '0' and FWD_IX(5) = '0') or ID_RRX_i = '0') then
173
    --  if(NOREGS_i = '0') then
174
    --    ID_OPX_o <= ID_OPX_NOFWD_i; -- give higher priority to RF output
175
    --  else
176
    --    ID_OPX_o <= NOREGD_i;
177
    --  end if;
178
    --elsif(FWD_IX(4) = '1' and ID_RRX_i = '1') then
179
    --  ID_OPX_o <= IX3_PA_RES0_i;
180
    --else --elsif(FWD_IX(5) = '1' and ID_RRX_i = '1') then
181
    --  ID_OPX_o <= IX3_PA_RES1_i;
182
    ----else
183
    ----  ID_OPX_o <= ID_OPX_NOFWD_i;
184
    --end if;
185
 
186
    -- result forwarding mux
187
    if(FWD_IX(1) = '1' and NOREGS_i = '0') then
188
      ID_OPX_o <= IX1_PA_RES1_i;
189
    elsif(FWD_IX(0) = '1' and NOREGS_i = '0') then
190
      ID_OPX_o <= IX1_PA_RES0_i;
191
    elsif(FWD_IX(3) = '1' and NOREGS_i = '0') then
192
      ID_OPX_o <= IX2_PA_RES1_i;
193
    elsif(FWD_IX(2) = '1' and NOREGS_i = '0') then
194
      ID_OPX_o <= IX2_PA_RES0_i;
195
    elsif((FWD_IX(4) = '0' and FWD_IX(5) = '0') and NOREGS_i = '0') then
196
        ID_OPX_o <= ID_OPX_NOFWD_i; -- give higher priority to RF output
197
    elsif(NOREGS_i = '1') then
198
        ID_OPX_o <= NOREGD_i;
199
    elsif(FWD_IX(5) = '1') then -- and NOREGS_i = '0') then
200
      ID_OPX_o <= IX3_PA_RES1_i;
201
    else --elsif(FWD_IX(4) = '1' and NOREGS_i = '0') then
202
      ID_OPX_o <= IX3_PA_RES0_i;
203
    --else
204
    --  ID_OPX_o <= ID_OPX_NOFWD_i;
205
    end if;
206
 
207
  end process;
208
 
209
end ARC;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.