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

Subversion Repositories rv01_riscv_core

[/] [rv01_riscv_core/] [trunk/] [VHDL/] [RV01_pipe_a.vhd] - Blame information for rev 4

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 pipeline-A (dedicated) decoder 
30
---------------------------------------------------------------
31
 
32
library IEEE;
33
use IEEE.std_logic_1164.all;
34
use IEEE.numeric_std.all;
35
 
36
library WORK;
37
use WORK.RV01_CONSTS_PKG.all;
38
use WORK.RV01_TYPES_PKG.all;
39
use work.RV01_IDEC_PKG.all;
40
use WORK.RV01_OP_PKG.all;
41
 
42
entity RV01_PIPE_A_DEC is
43
  port(
44
    INSTR_i : in DEC_INSTR_T;
45
 
46
    FWDE_o : out std_logic;
47
    SEL_o :  out std_logic_vector(4-1 downto 0)
48
  );
49
end RV01_PIPE_A_DEC;
50
 
51
architecture ARC of RV01_PIPE_A_DEC is
52
 
53
begin
54
 
55
  -- Result forward-enable flag
56
 
57
  FWDE_o <= '1' when (
58
    INSTR_i.IMNMC = IM_ADD or
59
    INSTR_i.IMNMC = IM_ADDI or
60
    INSTR_i.IMNMC = IM_SLL or
61
    INSTR_i.IMNMC = IM_SLLI or
62
    INSTR_i.IMNMC = IM_SRL or
63
    INSTR_i.IMNMC = IM_SRLI or
64
    INSTR_i.IMNMC = IM_SRA or
65
    INSTR_i.IMNMC = IM_SRAI or
66
    INSTR_i.IMNMC = IM_AND or
67
    INSTR_i.IMNMC = IM_ANDI or
68
    INSTR_i.IMNMC = IM_OR or
69
    INSTR_i.IMNMC = IM_ORI or
70
    INSTR_i.IMNMC = IM_XOR or
71
    INSTR_i.IMNMC = IM_XORI or
72
    INSTR_i.IMNMC = IM_LW
73
  ) else '0';
74
 
75
  -- pipe-A operation selector
76
 
77
  process(INSTR_i)
78
  begin
79
    case INSTR_i.IMNMC is
80
      when IM_ADD|IM_ADDI => SEL_o <= "0001";
81
      when IM_SLL|IM_SLLI|IM_SRL|IM_SRLI|IM_SRA|IM_SRAI => SEL_o <= "0010";
82
      when IM_AND|IM_ANDI|IM_OR|IM_ORI|IM_XOR|IM_XORI  => SEL_o <= "0100";
83
      when others => SEL_o <= "1000"; -- lw
84
    end case;
85
  end process;
86
 
87
end ARC;
88
 
89
---------------------------------------------------------------
90
-- A-pipeline ALU
91
---------------------------------------------------------------
92
 
93
library IEEE;
94
use IEEE.std_logic_1164.all;
95
use IEEE.numeric_std.all;
96
 
97
library WORK;
98
use WORK.RV01_CONSTS_PKG.all;
99
use WORK.RV01_TYPES_PKG.all;
100
use WORK.RV01_FUNCS_PKG.all;
101
use WORK.RV01_ARITH_PKG.all;
102
use work.RV01_IDEC_PKG.all;
103
use WORK.RV01_OP_PKG.all;
104
 
105
entity RV01_PIPE_A_ALU is
106
  port(
107
    SEL_i :  in std_logic_vector(4-1 downto 0);
108
    SU_i : in std_logic;
109
    OP_i : in ALU_OP_T;
110
    OPA_i : in SDWORD_T;
111
    OPB_i : in SDWORD_T;
112
 
113
    RES_o : out SDWORD_T --  result
114
  );
115
end RV01_PIPE_A_ALU;
116
 
117
architecture ARC of RV01_PIPE_A_ALU is
118
 
119
  constant OP_ADD : natural := 0;
120
  constant OP_SHF : natural := 1;
121
  constant OP_LOG : natural := 2;
122
  constant OP_LOAD : natural := 3;
123
 
124
  component RV01_ADDER_F is
125
    generic(
126
      LEN1 : integer := 16;
127
      LEN2 : integer := 16
128
    );
129
    port(
130
      OPA_i : in signed(LEN1+LEN2-1 downto 0);
131
      OPB_i : in signed(LEN1+LEN2-1 downto 0);
132
      CI_i : in std_logic;
133
 
134
      SUM_o : out signed(LEN1+LEN2-1 downto 0)
135
    );
136
  end component;
137
 
138
  component RV01_LOGICU is
139
    port(
140
      CTRL_i : in LOG_CTRL;
141
      OPA_i : in SDWORD_T;
142
      OPB_i : in SDWORD_T;
143
 
144
      RES_o : out SDWORD_T
145
    );
146
  end component;
147
 
148
  signal ZERO : std_logic := '0';
149
  signal ONE : std_logic := '1';
150
  signal ADD_RES : SDWORD_T;
151
  signal LOG_RES : SDWORD_T;
152
  signal LC : LOG_CTRL;
153
  signal RES : SDWORD_T;
154
 
155
begin
156
 
157
  ------------------------------------
158
  -- addition
159
  ------------------------------------
160
 
161
  -- carry-select adder (to improve timing)
162
 
163
  U_ADD : RV01_ADDER_F
164
    generic map(
165
      LEN1 => SDLEN/2,
166
      LEN2 => SDLEN/2
167
    )
168
    port map(
169
      OPA_i => OPA_i,
170
      OPB_i => OPB_i,
171
      CI_i => ZERO,
172
      SUM_o => ADD_RES
173
    );
174
 
175
  ------------------------------------
176
  -- Logic unit operation selection
177
  ------------------------------------
178
 
179
  process(OP_i)
180
  begin
181
    case OP_i is
182
      when ALU_AND =>
183
        LC <= LC_AND;
184
      when ALU_OR =>
185
        LC <= LC_OR;
186
      when others =>
187
        LC <= LC_XOR;
188
    end case;
189
  end process;
190
 
191
  ------------------------------------
192
  -- Logic unit
193
  ------------------------------------
194
 
195
  U_LOG : RV01_LOGICU
196
    port map(
197
      CTRL_i => LC,
198
      OPA_i => OPA_i,
199
      OPB_i => OPB_i,
200
 
201
      RES_o => LOG_RES
202
    );
203
 
204
  -- Result mux
205
 
206
  RES <= ADD_RES when (SEL_i(OP_ADD) = '1') else LOG_RES;
207
 
208
  RES_o <= RES;
209
 
210
end ARC;

powered by: WebSVN 2.1.0

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