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

Subversion Repositories g729a_codec

[/] [g729a_codec/] [trunk/] [VHDL/] [G729A_asip_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) 2013 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
-- G.729a ASIP 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.G729A_ASIP_PKG.all;
39
use work.G729A_ASIP_IDEC_2W_PKG.all;
40
--use WORK.G729A_ASIP_BASIC_PKG.all;
41
--use WORK.G729A_ASIP_ARITH_PKG.all;
42
use WORK.G729A_ASIP_OP_PKG.all;
43
 
44
entity G729A_ASIP_FWDLOG_2W_P6 is
45
  port(
46
    ID_RX_i : in RID_T;
47
    ID_RRX_i : in std_logic;
48
    IX1_INSTR0_i : in DEC_INSTR_T;
49
    IX2_INSTR0_i : in DEC_INSTR_T;
50
    IX3_INSTR0_i : in DEC_INSTR_T;
51
    IX1_INSTR1_i : in DEC_INSTR_T;
52
    IX2_INSTR1_i : in DEC_INSTR_T;
53
    IX3_INSTR1_i : in DEC_INSTR_T;
54
    IX1_PA_RES0_i : in SDWORD_T;
55
    IX1_PA_RES1_i : in SDWORD_T;
56
    IX2_PA_RES0_i : in LDWORD_T;
57
    IX2_PA_RES1_i : in LDWORD_T;
58
    IX3_PA_RES0_i : in LDWORD_T;
59
    IX3_PA_RES1_i : in LDWORD_T;
60
    ID_OPX_NOFWD_i : in LDWORD_T;
61
    IX1_V_i : in std_logic_vector(2-1 downto 0);
62
    IX2_V_i : in std_logic_vector(2-1 downto 0);
63
    IX3_V_i : in std_logic_vector(2-1 downto 0);
64
    IX1_FWDE_i : in std_logic_vector(2-1 downto 0);
65
    IX2_FWDE_i : in std_logic_vector(2-1 downto 0);
66
    IX3_FWDE_i : in std_logic_vector(2-1 downto 0);
67
    NOREGS_i : in std_logic;
68
    NOREGD_i : in LDWORD_T;
69
 
70
    ID_OPX_o : out LDWORD_T
71
  );
72
end G729A_ASIP_FWDLOG_2W_P6;
73
 
74
architecture ARC of G729A_ASIP_FWDLOG_2W_P6 is
75
 
76
  constant SZERO : SDWORD_T := (others => '0');
77
  --signal FWDX : std_logic_vector(3 downto 0);
78
 
79
begin
80
 
81
  -- Operand A can be forwarded from stages IX and MA.
82
  -- When forwarding from IX stage, result can come from
83
  -- ALU single-cycle result output or from LSU read data output.
84
  -- When forwarding from MA stage, result can come from
85
  -- ALU double-cycle result output only.
86
 
87
  -- WARNING: it's assumed that *_INSTR.RD always differs from
88
  -- *_INSTR_RD2 because a register can be written only once per
89
  -- cycle. If this condition is not satisfied ASIP behavior is
90
  -- undefined.
91
 
92
  process(ID_RX_i,ID_RRX_i,
93
    IX1_INSTR0_i,IX2_INSTR0_i,IX1_INSTR1_i,IX2_INSTR1_i,
94
    IX3_INSTR0_i,IX3_INSTR1_i,
95
    IX1_PA_RES0_i,IX1_PA_RES1_i,IX2_PA_RES0_i,IX2_PA_RES1_i,
96
    IX3_PA_RES0_i,IX3_PA_RES1_i,
97
    ID_OPX_NOFWD_i,IX1_V_i,IX2_V_i,IX3_V_i,
98
    IX1_FWDE_i,IX2_FWDE_i,IX3_FWDE_i,
99
    NOREGS_i,NOREGD_i)
100
    variable FWD_IX : std_logic_vector(5 downto 0);
101
  begin
102
 
103
    -- forwarding from IX1 stage occurs if:
104
    -- 1) ID stage instr. rA matches IX1 stage instr. rD AND
105
    -- 2) ID stage instr. reads rA AND
106
    -- 3) IX1 stage instr. writes rD AND
107
    -- 4) ID stage instr. is valid (IX1 stage one always is), AND
108
    -- 5) IX1 instr. is forward-enabled
109
 
110
    if(ID_RX_i = IX1_INSTR0_i.RD) then
111
      FWD_IX(0) := IX1_INSTR0_i.WRD and IX1_V_i(0) and
112
        IX1_FWDE_i(0); -- and ID_RRX_i;
113
    else
114
      FWD_IX(0) := '0';
115
    end if;
116
 
117
    if(ID_RX_i = IX1_INSTR1_i.RD) then
118
      FWD_IX(1) := IX1_INSTR1_i.WRD and IX1_V_i(1) and
119
        IX1_FWDE_i(1); -- and ID_RRX_i;
120
    else
121
      FWD_IX(1) := '0';
122
    end if;
123
 
124
    -- forwarding from IX2 stage occurs if:
125
    -- 1) ID stage instr. rA matches IX2 stage instr. rD AND
126
    -- 2) ID stage instr. reads rA AND
127
    -- 3) IX2 stage instr. writes rD AND
128
    -- 4) ID stage instr. is valid (IX1 stage one always is), AND
129
    -- 5) IX2 instr. is forward-enabled
130
 
131
    if(ID_RX_i = IX2_INSTR0_i.RD) then
132
      FWD_IX(2) := IX2_INSTR0_i.WRD and IX2_V_i(0) and
133
        IX2_FWDE_i(0); -- and ID_RRX_i;
134
    else
135
      FWD_IX(2) := '0';
136
    end if;
137
 
138
    if(ID_RX_i = IX2_INSTR1_i.RD) then
139
      FWD_IX(3) := IX2_INSTR1_i.WRD and IX2_V_i(1) and
140
        IX2_FWDE_i(1); -- and ID_RRX_i;
141
    else
142
      FWD_IX(3) := '0';
143
    end if;
144
 
145
    -- forwarding from IX3 stage occurs if:
146
    -- 1) ID stage instr. rA matches IX3 stage instr. rD AND
147
    -- 2) ID stage instr. reads rA AND
148
    -- 3) IX3 stage instr. writes rD AND
149
    -- 4) ID stage instr. is valid (IX1 stage one always is), AND
150
    -- 5) IX3 instr. is forward-enabled
151
 
152
    if(ID_RX_i = IX3_INSTR0_i.RD) then
153
      FWD_IX(4) := IX3_INSTR0_i.WRD and IX3_V_i(0) and
154
        IX3_FWDE_i(0); -- and ID_RRX_i;
155
    else
156
      FWD_IX(4) := '0';
157
    end if;
158
 
159
    if(ID_RX_i = IX3_INSTR1_i.RD) then
160
      FWD_IX(5) := IX3_INSTR1_i.WRD and IX3_V_i(1) and
161
        IX3_FWDE_i(1); -- and ID_RRX_i;
162
    else
163
      FWD_IX(5) := '0';
164
    end if;
165
 
166
    ---- result forwarding mux
167
    --if(FWD_IX(0) = '1' and ID_RRX_i = '1') then
168
    --  ID_OPX_o <= SZERO & IX1_PA_RES0_i;
169
    --elsif(FWD_IX(1) = '1' and ID_RRX_i = '1') then
170
    --  ID_OPX_o <= SZERO & IX1_PA_RES1_i;
171
    --elsif(FWD_IX(2) = '1' and ID_RRX_i = '1') then
172
    --  ID_OPX_o <= IX2_PA_RES0_i;
173
    --elsif(FWD_IX(3) = '1' and ID_RRX_i = '1') then
174
    --  ID_OPX_o <= IX2_PA_RES1_i;
175
    --elsif((FWD_IX(4) = '0' and FWD_IX(5) = '0') or ID_RRX_i = '0') then
176
    --  if(NOREGS_i = '0') then
177
    --    ID_OPX_o <= ID_OPX_NOFWD_i; -- give higher priority to RF output
178
    --  else
179
    --    ID_OPX_o <= NOREGD_i;
180
    --  end if;
181
    --elsif(FWD_IX(4) = '1' and ID_RRX_i = '1') then
182
    --  ID_OPX_o <= IX3_PA_RES0_i;
183
    --else --elsif(FWD_IX(5) = '1' and ID_RRX_i = '1') then
184
    --  ID_OPX_o <= IX3_PA_RES1_i;
185
    ----else
186
    ----  ID_OPX_o <= ID_OPX_NOFWD_i;
187
    --end if;
188
 
189
    -- result forwarding mux
190
    if(FWD_IX(1) = '1' and NOREGS_i = '0') then
191
      ID_OPX_o <= SZERO & IX1_PA_RES1_i;
192
    elsif(FWD_IX(0) = '1' and NOREGS_i = '0') then
193
      ID_OPX_o <= SZERO & IX1_PA_RES0_i;
194
    elsif(FWD_IX(3) = '1' and NOREGS_i = '0') then
195
      ID_OPX_o <= IX2_PA_RES1_i;
196
    elsif(FWD_IX(2) = '1' and NOREGS_i = '0') then
197
      ID_OPX_o <= IX2_PA_RES0_i;
198
    elsif((FWD_IX(4) = '0' and FWD_IX(5) = '0') and NOREGS_i = '0') then
199
        ID_OPX_o <= ID_OPX_NOFWD_i; -- give higher priority to RF output
200
    elsif(NOREGS_i = '1') then
201
        ID_OPX_o <= NOREGD_i;
202
    elsif(FWD_IX(5) = '1') then -- and NOREGS_i = '0') then
203
      ID_OPX_o <= IX3_PA_RES1_i;
204
    else --elsif(FWD_IX(4) = '1' and NOREGS_i = '0') then
205
      ID_OPX_o <= IX3_PA_RES0_i;
206
    --else
207
    --  ID_OPX_o <= ID_OPX_NOFWD_i;
208
    end if;
209
 
210
    --FWDX <= FWD_IX;
211
 
212
  end process;
213
 
214
end ARC;

powered by: WebSVN 2.1.0

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