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

Subversion Repositories rv01_riscv_core

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

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 madsilicon
-----------------------------------------------------------------
2
--                                                             --
3
-----------------------------------------------------------------
4
--                                                             --
5
-- Copyright (C) 2017 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 CPU module
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_FUNCS_PKG.all;
41
use WORK.RV01_ARITH_PKG.all;
42
use work.RV01_IDEC_PKG.all;
43
use WORK.RV01_OP_PKG.all;
44
use WORK.RV01_CSR_PKG.all;
45
 
46
entity RV01_CPU_2W is
47
  generic(
48
    -- synthesis translate_off
49
    ST_FILENAME : string := "NONE";
50
    WB_FILENAME : string := "NONE";
51
    -- synthesis translate_on
52
    IMEM_SIZE : natural := 1024*32; -- 128Kb
53
    DMEM_SIZE : natural := 1024*16; -- 64Kb
54
    IMEM_LOWM : std_logic := '1';
55
    BHT_SIZE : natural := 256;
56
    CFG_FLAGS : std_logic_vector(16-1 downto 0) := "00000000"&"01100111";
57
    SIMULATION_ONLY : std_logic := '1'
58
  );
59
  port(
60
    CLK_i : in std_logic; -- clock
61
    RST_i : in std_logic; -- reset
62
    -- Instruction memory interface
63
    INSTR_i : in std_logic_vector(ILEN*2-1 downto 0); -- two instructions!
64
    -- Data memory interface
65
    DDAT0_i : in std_logic_vector(SDLEN-1 downto 0); -- data port #0 data-in
66
    DDAT1_i : in std_logic_vector(SDLEN-1 downto 0); -- data port #1 data-in
67
    IADR_ERR_i : in std_logic; -- instr. port address error
68
    DADR0_ERR_i : in std_logic; -- data port #0 address error 
69
    DADR1_ERR_i : in std_logic; -- data port #1 address error
70
    IDADR_CFLT_i : in std_logic; -- address conflict error
71
    -- Check enable (simulation only)
72
    CHK_ENB_i : in std_logic;
73
    -- External Interrupt (from PLIC)
74
    EXT_INT_i : in std_logic;
75
    -- Host interface
76
    MFROMHOST_WE_i : in std_logic; -- MFROMHOST write-enable
77
    MFROMHOST_i : in std_logic_vector(SDLEN-1 downto 0); -- MFROMHOST data-in
78
    -- Control Port
79
    CP_RE_i : in std_logic; -- CP read-enable
80
    CP_WE_i : in std_logic; -- CP write-enable
81
    CP_ADR_i : in std_logic_vector(17-1 downto 0); -- CP address
82
    CP_D_i : in std_logic_vector(SDLEN-1 downto 0); -- CP data-in
83
 
84
    HALT_o : out std_logic; -- halt flag
85
    -- Instruction memory interface
86
    IADR_o : out unsigned(ALEN-1 downto 0); -- instr. port address
87
    -- Data memory interface
88
    DRE_o : out std_logic_vector(2-1 downto 0); -- data port #0/1 read-enable
89
    DWE0_o : out std_logic; -- data port #0 write-enable
90
    DBE_o : out std_logic_vector(4-1 downto 0); -- data port #0 byte-enable
91
    DADR0_o : out unsigned(ALEN-1 downto 0); -- data port #0 address
92
    DADR1_o : out unsigned(ALEN-1 downto 0); -- data port #1 address
93
    DIADR0_o : out unsigned(ALEN-1 downto 0); -- data port #0 address
94
    DIADR1_o : out unsigned(ALEN-1 downto 0); -- data port #1 address
95
    DIMS_o : out std_logic_vector(2-1 downto 0); -- data port #0/1 mem. select
96
    DDAT0_o : out std_logic_vector(SDLEN-1 downto 0); -- data port #0 data-out
97
    -- Host interface
98
    MTOHOST_OE_o : out std_logic; -- MTOHOST output-enable
99
    MTOHOST_o : out std_logic_vector(SDLEN-1 downto 0); -- MTOHOST data-out
100
    -- Control port
101
    CP_Q_o : out std_logic_vector(SDLEN-1 downto 0) -- CP data-out
102
  );
103
end RV01_CPU_2W;
104
 
105
architecture ARC of RV01_CPU_2W is
106
 
107
  constant SZERO : SDWORD_T := (others => '0');
108
  constant LZERO : LDWORD_T := (others => '0');
109
 
110
  constant PARALLEL_EXECUTION_ENABLED : std_logic := CFG_FLAGS(0);
111
  constant DELAYED_EXECUTION_ENABLED : std_logic := CFG_FLAGS(1);
112
  constant BRANCH_PREDICTION_ENABLED : std_logic := CFG_FLAGS(2);
113
  constant JALR_PREDICTION_ENABLED : std_logic := CFG_FLAGS(3);
114
  constant FPU_PRESENT : std_logic := CFG_FLAGS(4);
115
  constant DM_PRESENT : std_logic := CFG_FLAGS(5);
116
 
117
  -- number of (superscalar) ways
118
  constant NW : natural := 2;
119
 
120
  component RV01_FTCHLOG_1W is
121
    port(
122
      CLK_i : in std_logic;
123
      RST_i : in std_logic;
124
      STRT_i : in std_logic;
125
      STRTPC_i : in ADR_T;
126
      HALT_i : in std_logic;
127
      BJX_i : in std_logic;
128
      BJTA_i : in ADR_T;
129
      PBX_i : in std_logic;
130
      PBTA_i : in ADR_T;
131
      KLL1_i : in std_logic;
132
      PJRX_i : std_logic;
133
      PJRTA_i : in ADR_T;
134
      EXCP_i : in std_logic;
135
      ERET_i : in std_logic;
136
      RFTCH_i : in std_logic;
137
      ETVA_i : in ADR_T;
138
      PSTALL_i : in std_logic;
139
      DHALT_i : in std_logic;
140
 
141
      IFV_o : out std_logic;
142
      IADR0_o : out ADR_T;
143
      IADR_MIS_o : out std_logic
144
    );
145
  end component;
146
 
147
  component RV01_FTCHLOG_2W is
148
    port(
149
      CLK_i : in std_logic;
150
      RST_i : in std_logic;
151
      STRT_i : in std_logic;
152
      STRTPC_i : in ADR_T;
153
      HALT_i : in std_logic;
154
      BJX_i : in std_logic;
155
      BJTA_i : in ADR_T;
156
      PBX_i : in std_logic;
157
      PBTA_i : in ADR_T;
158
      KLL1_i : in std_logic;
159
      PJRX_i : in std_logic;
160
      PJRTA_i : in ADR_T;
161
      EXCP_i : in std_logic;
162
      ERET_i : in std_logic;
163
      RFTCH_i : in std_logic;
164
      ETVA_i : in ADR_T;
165
      PSTALL_i : in std_logic;
166
      DHALT_i : in std_logic;
167
 
168
      IFV_o : out std_logic_vector(2-1 downto 0);
169
      IADR0_o : out ADR_T;
170
      IADR1_o : out ADR_T;
171
      IADR_MIS_o : out std_logic
172
    );
173
  end component;
174
 
175
  component RV01_IFQ is
176
    port(
177
      CLK_i : in std_logic;
178
      RST_i : in std_logic;
179
      ID_HALT_i : in std_logic;
180
      IX_BJX_i : in std_logic;
181
      ID_ISSUE_i : in std_logic_vector(2-1 downto 0);
182
      IF_V_i : in std_logic_vector(2-1 downto 0);
183
      IF_PC0_i : in unsigned(ALEN-1 downto 0);
184
      IF_PC1_i : in unsigned(ALEN-1 downto 0);
185
      IF_INSTR0_i : in std_logic_vector(ILEN-1 downto 0);
186
      IF_INSTR1_i : in std_logic_vector(ILEN-1 downto 0);
187
      IF_DEC_INSTR0_i : in DEC_INSTR_T;
188
      IF_DEC_INSTR1_i : in DEC_INSTR_T;
189
      IF_OPA_PC0_i : in std_logic;
190
      IF_OPA_PC1_i : in std_logic;
191
      IF_OPB_IMM0_i : in std_logic;
192
      IF_OPB_IMM1_i : in std_logic;
193
      IF_BPVD0_i : in std_logic_vector(3-1 downto 0);
194
      IF_BPVD1_i : in std_logic_vector(3-1 downto 0);
195
 
196
      PSTALL_o : out std_logic;
197
      ID_V_o : out std_logic_vector(2-1 downto 0);
198
      ID_PC0_o : out unsigned(ALEN-1 downto 0);
199
      ID_PC1_o : out unsigned(ALEN-1 downto 0);
200
      ID_INSTR0_o : out std_logic_vector(ILEN-1 downto 0);
201
      ID_INSTR1_o : out std_logic_vector(ILEN-1 downto 0);
202
      ID_DEC_INSTR0_o : out DEC_INSTR_T;
203
      ID_DEC_INSTR1_o : out DEC_INSTR_T;
204
      ID_OPA_PC0_o : out std_logic;
205
      ID_OPA_PC1_o : out std_logic;
206
      ID_OPB_IMM0_o : out std_logic;
207
      ID_OPB_IMM1_o : out std_logic;
208
      ID_BPVD0_o : out std_logic_vector(3-1 downto 0);
209
      ID_BPVD1_o : out std_logic_vector(3-1 downto 0)
210
    );
211
  end component;
212
 
213
  component RV01_IDEC is
214
    port(
215
      INSTR_i : in std_logic_vector(ILEN-1 downto 0);
216
      IADR_MIS_i : in std_logic;
217
      IADR_ERR_i : in std_logic;
218
 
219
      OPA_PC_o : out std_logic;
220
      OPB_IMM_o : out std_logic;
221
      DEC_INSTR_o : out DEC_INSTR_T
222
    );
223
  end component;
224
 
225
  component RV01_PXLOG is
226
    port(
227
      ID_INSTR0_i : in DEC_INSTR_T;
228
      ID_INSTR1_i : in DEC_INSTR_T;
229
      ID_V_i : in std_logic_vector(2-1 downto 0);
230
      ID_FWDE_i : in std_logic_vector(2-1 downto 0);
231
 
232
      PXE1_o : out std_logic
233
    );
234
  end component;
235
 
236
  component RV01_ISSLOG is
237
    generic(
238
      NW : natural := 2
239
    );
240
    port(
241
      V_i : in std_logic_vector(NW-1 downto 0);
242
      BJX_i : in std_logic;
243
      PC1_i : in ADR_T;
244
      PS_i : in std_logic_vector(NW-1 downto 0);
245
      SBF_i : in std_logic;
246
      DIV_STRT_i : in std_logic;
247
      DIV_BSY_i : in std_logic;
248
      SEQX_i : in std_logic;
249
      PXE_i : in std_logic;
250
      PXE1_i : in std_logic;
251
      STEP_i : in std_logic;
252
      PSLP_i : in std_logic;
253
 
254
      V_o : out std_logic_vector(NW-1 downto 0);
255
      JLRA_o : out ADR_VEC_T(NW-1 downto 0);
256
      ISSUE_o : out std_logic_vector(NW-1 downto 0)
257
    );
258
  end component;
259
 
260
  component RV01_PIPE_A_DEC is
261
    port(
262
      INSTR_i : in DEC_INSTR_T;
263
 
264
      FWDE_o : out std_logic;
265
      SEL_o :  out std_logic_vector(4-1 downto 0)
266
    );
267
  end component;
268
 
269
  component RV01_FWDLOG_2W_P6 is
270
    port(
271
      ID_RX_i : in RID_T;
272
      ID_RRX_i : in std_logic;
273
      IX1_INSTR0_i : in DEC_INSTR_T;
274
      IX2_INSTR0_i : in DEC_INSTR_T;
275
      IX3_INSTR0_i : in DEC_INSTR_T;
276
      IX1_INSTR1_i : in DEC_INSTR_T;
277
      IX2_INSTR1_i : in DEC_INSTR_T;
278
      IX3_INSTR1_i : in DEC_INSTR_T;
279
      IX1_PA_RES0_i : in SDWORD_T;
280
      IX1_PA_RES1_i : in SDWORD_T;
281
      IX2_PA_RES0_i : in SDWORD_T;
282
      IX2_PA_RES1_i : in SDWORD_T;
283
      IX3_PA_RES0_i : in SDWORD_T;
284
      IX3_PA_RES1_i : in SDWORD_T;
285
      ID_OPX_NOFWD_i : in SDWORD_T;
286
      IX1_V_i : in std_logic_vector(2-1 downto 0);
287
      IX2_V_i : in std_logic_vector(2-1 downto 0);
288
      IX3_V_i : in std_logic_vector(2-1 downto 0);
289
      IX1_FWDE_i : in std_logic_vector(2-1 downto 0);
290
      IX2_FWDE_i : in std_logic_vector(2-1 downto 0);
291
      IX3_FWDE_i : in std_logic_vector(2-1 downto 0);
292
      NOREGS_i : in std_logic;
293
      NOREGD_i : in SDWORD_T;
294
 
295
      ID_OPX_o : out SDWORD_T
296
    );
297
  end component;
298
 
299
  component RV01_PIPE_B is
300
    port(
301
      CLK_i : in std_logic;
302
      OP_i :  in ALU_OP_T;
303
      SU_i : in std_logic;
304
      PC0_i : in unsigned(SDLEN-1 downto 0);
305
      PC1_i : in unsigned(SDLEN-1 downto 0);
306
      OPA_i : in SDWORD_T;
307
      OPB_i : in SDWORD_T;
308
 
309
      RES_o : out SDWORD_T
310
    );
311
  end component;
312
 
313
  component RV01_BJXLOG is
314
    generic(
315
      JRPE : std_logic := '1'
316
    );
317
    port(
318
      CLK_i : in std_logic;
319
      RST_i : in std_logic;
320
      BJ_OP_i : in BJ_OP_T;
321
      SU_i : in std_logic;
322
      PC_i : in ADR_T;
323
      OPA_i : in SDWORD_T;
324
      OPB_i : in SDWORD_T;
325
      IMM_i : in SDWORD_T;
326
      IV_i : in std_logic;
327
      FSTLL_i : in std_logic;
328
      MPJRX_i : in std_logic;
329
 
330
      BJX_o : out std_logic;
331
      BJTA_o : out ADR_T
332
    );
333
  end component;
334
 
335
  component RV01_LSU is
336
    port(
337
      CLK_i : in std_logic;
338
      RST_i : in std_logic;
339
      IV_i : in std_logic;
340
      LS_OP_i : in LS_OP_T;
341
      SU_i : in std_logic;
342
      OPA_i : in SDWORD_T;
343
      OPB_i : in SDWORD_T;
344
      IMM_i : in SDWORD_T;
345
      LDAT_i : in std_logic_vector(SDLEN-1 downto 0);
346
 
347
      RE_o : out std_logic;
348
      WE_o : out std_logic;
349
      MALGN_o : out std_logic;
350
      ADR_o : out unsigned(ALEN-1 downto 0);
351
      SBE_o : out std_logic_vector(4-1 downto 0);
352
      SDAT_o : out std_logic_vector(SDLEN-1 downto 0);
353
      LDATV_o : out std_logic;
354
      LDAT_o : out SDWORD_T
355
    );
356
  end component;
357
 
358
  component RV01_SBUF_2W is
359
    generic(
360
      NW : natural := 2;
361
      DEPTH : natural := 4;
362
      SIMULATION_ONLY : std_logic := '0'
363
    );
364
    port(
365
      CLK_i : in std_logic;
366
      RST_i : in std_logic;
367
      CLRB_i : in std_logic;
368
      KTS_i : in std_logic;
369
      RE_i : in std_logic_vector(NW-1 downto 0);
370
      WE_i : in std_logic_vector(NW-1 downto 0);
371
      BE0_i : in std_logic_vector(4-1 downto 0);
372
      BE1_i : in std_logic_vector(4-1 downto 0);
373
      D0_i : in std_logic_vector(SDLEN-1 downto 0);
374
      D1_i : in std_logic_vector(SDLEN-1 downto 0);
375
      IX1_V_i : std_logic_vector(2-1 downto 0);
376
      LS_OP0_i : in LS_OP_T;
377
      LS_OP1_i : in LS_OP_T;
378
      DADR0_i : in ADR_T;
379
      DADR1_i : in ADR_T;
380
      SADR0_i : in ADR_T;
381
      SADR1_i : in ADR_T;
382
 
383
      BF_o : out std_logic;
384
      NOPR_o : out std_logic;
385
      S2LAC_o : out std_logic_vector(2-1 downto 0);
386
      WE_o : out std_logic;
387
      LS_OP_o : out LS_OP_T;
388
      BE_o : out std_logic_vector(4-1 downto 0);
389
      Q_o : out std_logic_vector(SDLEN-1 downto 0);
390
      SADR_o : out ADR_T
391
    );
392
  end component;
393
 
394
  component RV01_REGFILE_32X32_2W is
395
    port(
396
      CLK_i : in std_logic;
397
      RA0_i : in RID_T;
398
      RA1_i : in RID_T;
399
      RA2_i : in RID_T;
400
      RA3_i : in RID_T;
401
      WA0_i : in RID_T;
402
      WA1_i : in RID_T;
403
      WE0_i : in std_logic;
404
      WE1_i : in std_logic;
405
      D0_i : in std_logic_vector(SDLEN-1 downto 0);
406
      D1_i : in std_logic_vector(SDLEN-1 downto 0);
407
 
408
      Q0_o : out std_logic_vector(SDLEN-1 downto 0);
409
      Q1_o : out std_logic_vector(SDLEN-1 downto 0);
410
      Q2_o : out std_logic_vector(SDLEN-1 downto 0);
411
      Q3_o : out std_logic_vector(SDLEN-1 downto 0)
412
    );
413
  end component;
414
 
415
  component RV01_DIVLOG is
416
    port(
417
      V_i : in std_logic;
418
      INSTR_i : in DEC_INSTR_T;
419
      DIV_V_i : in std_logic;
420
 
421
      DIV_STRT_o : out std_logic;
422
      DIV_QS_o : out std_logic;
423
      DIV_CLRV_o : out std_logic
424
    );
425
  end component;
426
 
427
  component RV01_DIVIDER_R2 is
428
    port(
429
      CLK_i : in std_logic;
430
      RST_i : in std_logic;
431
      STRT_i : in std_logic;
432
      SU_i : in std_logic;
433
      QS_i : in std_logic;
434
      DD_i : in SDWORD_T;
435
      DR_i : in SDWORD_T;
436
      CLRD_i : in std_logic;
437
      CLRV_i : in std_logic;
438
 
439
      Q_o : out SDWORD_T;
440
      QV_o : out std_logic;
441
      BSY_o : out std_logic
442
    );
443
  end component;
444
 
445
  component RV01_CSRU is
446
    generic(
447
      PXE : std_logic := '1';
448
      FPU_PRESENT : std_logic := '0';
449
      NW : natural := 2
450
    );
451
    port(
452
      CLK_i : in std_logic;
453
      RST_i : in std_logic;
454
      IX1_V0_i : in std_logic;
455
      CS_OP_i : in CS_OP_T;
456
      RS1_i : in RID_T;
457
      ADR_i : in signed(12-1 downto 0);
458
      WE_i : in std_logic;
459
      CSRD_i : in SDWORD_T;
460
      EXCP_i : in std_logic;
461
      EPC_i : in unsigned(ALEN-1 downto 0);
462
      ECAUSE_i : in std_logic_vector(5-1 downto 0);
463
      EBADR_i : in unsigned(ALEN-1 downto 0);
464
      ERET_i : in std_logic;
465
      IX3_V_i : in std_logic_vector(NW-1 downto 0);
466
      NOPR_i : in std_logic;
467
      HALT_i : in std_logic;
468
      STOPCYCLE_i : in std_logic;
469
      STOPTIME_i : in std_logic;
470
      MFROMHOST_WE_i : in std_logic;
471
      MFROMHOST_i : in std_logic_vector(SDLEN-1 downto 0);
472
      DMODE_i : in std_logic;
473
      DIE_i : in std_logic;
474
      CPRE_i : in std_logic;
475
      CPWE_i : in std_logic;
476
      CPADR_i : in std_logic_vector(17-1 downto 0);
477
      CPD_i : in std_logic_vector(SDLEN-1 downto 0);
478
 
479
      PXE_o : out std_logic;
480
      MSTATUS_o : out SDWORD_T;
481
      MEPC_o : out unsigned(ALEN-1 downto 0);
482
      MBASE_o : out unsigned(ALEN-1 downto 0);
483
      MBOUND_o : out unsigned(ALEN-1 downto 0);
484
      MIBASE_o : out unsigned(ALEN-1 downto 0);
485
      MIBOUND_o : out unsigned(ALEN-1 downto 0);
486
      MDBASE_o : out unsigned(ALEN-1 downto 0);
487
      MDBOUND_o : out unsigned(ALEN-1 downto 0);
488
      ETVA_o : out ADR_T;
489
      MTOHOST_o : out std_logic_vector(SDLEN-1 downto 0);
490
      MTOHOST_OE_o : out std_logic;
491
      ILLG_o : out std_logic;
492
      SFT_INT_o : out std_logic;
493
      TMR_INT_o : out std_logic;
494
      FFLAGS_o : out std_logic_vector(5-1 downto 0);
495
      FRM_o : out std_logic_vector(3-1 downto 0);
496
      IE_o : out std_logic;
497
      CSRQ_o : out SDWORD_T;
498
      CPQ_o : out std_logic_vector(SDLEN-1 downto 0)
499
    );
500
  end component;
501
 
502
  component RV01_DBGLOG_IX2 is
503
    generic(
504
      NW : natural := 2
505
    );
506
    port(
507
      CLK_i : in std_logic;
508
      RST_i : in std_logic;
509
      V_i : in std_logic_vector(NW-1 downto 0);
510
      IMNMC0_i : in INST_MNEMONIC_T;
511
      RFTCH0_i : in std_logic;
512
      STEP_i : in std_logic;
513
      HOBRK_i : in std_logic;
514
      HRQ_i : in std_logic;
515
 
516
      STEP_o : out std_logic;
517
      HALT_o : out std_logic_vector(NW-1 downto 0);
518
      HIS_o : out std_logic
519
    );
520
  end component;
521
 
522
  component RV01_HLTLOG_IX2 is
523
    generic(
524
      NW : natural := 2
525
    );
526
    port(
527
      IMNMC0_i : in INST_MNEMONIC_T;
528
      V_i : in std_logic_vector(NW-1 downto 0);
529
      PC0_i : in unsigned(ALEN-1 downto 0);
530
      PC1_i : in unsigned(ALEN-1 downto 0);
531
      HOBRK_i : in std_logic;
532
      HOADR_i : in std_logic_vector(NW-1 downto 0);
533
      HADR_i : in unsigned(ALEN-1 downto 0);
534
      HRQ_i : in std_logic;
535
 
536
      HALT_o : out std_logic_vector(NW-1 downto 0);
537
      HIS_o : out std_logic
538
    );
539
  end component;
540
 
541
  component RV01_EXCPLOG_IX1 is
542
    generic(
543
      NW : natural := 2
544
    );
545
    port(
546
      INSTR_i : in DEC_INSTR_VEC_T(NW-1 downto 0);
547
      MALGN_i : in std_logic_vector(NW-1 downto 0);
548
      S2LAC_i : in std_logic_vector(NW-1 downto 0);
549
      B2BAC_i : in std_logic;
550
      DIV_V_i : in std_logic;
551
      IDADR_CFLT_i : in std_logic;
552
 
553
      PSLP_o : out std_logic;
554
      INSTR_o : out DEC_INSTR_VEC_T(NW-1 downto 0)
555
    );
556
  end component;
557
 
558
  component RV01_EXCPLOG_IX2 is
559
    generic(
560
      NW : natural := 2
561
    );
562
    port(
563
      V_i : in std_logic_vector(2-1 downto 0); -- slot #0,1 valid flag
564
      INSTR_i : in DEC_INSTR_VEC_T(NW-1 downto 0); -- slot #0/1 inst.
565
      PC0_i : in ADR_T; -- slot #0 pc
566
      PC1_i : in ADR_T; -- slot #1 pc
567
      DADR0_i : in ADR_T; -- slot #0 L/S addr.
568
      DADR1_i : in ADR_T; -- slot #1 L/S addr.
569
      HALT_i : in std_logic_vector(2-1 downto 0); -- halt request flag
570
      RSM_i : in std_logic; -- resume flag
571
      DRSM_i : in std_logic; -- debug resume flag
572
      EXT_INT_i : in std_logic; -- external int. flag
573
      SFT_INT_i : in std_logic; -- soft int. flag
574
      TMR_INT_i : in std_logic; -- timer int. flag 
575
      ETVA_i : in ADR_T; -- exc. target vector addr.
576
      MEPC_i : in ADR_T; -- mepc CSR
577
      DADR0_ERR_i : in std_logic; -- slot #0 L/S addr. err.
578
      DADR1_ERR_i : in std_logic; -- slot #1 L/S addr. err.
579
      CSR_ILLG_i : in std_logic;
580
      IE_i : in std_logic;
581
      STEP_i : in std_logic;
582
 
583
      V_o : out std_logic_vector(2-1 downto 0); -- slot #0,1 valid flag
584
      EV_o : out std_logic_vector(2-1 downto 0); -- slot #0,1 excp. valid flag
585
      INSTR_o : out DEC_INSTR_VEC_T(NW-1 downto 0); -- slot #0/1 inst.
586
      EERTA_o : out ADR_T -- exception, eret and re-fetch target addr.
587
    );
588
  end component;
589
 
590
  component RV01_EXCPLOG_IX3 is
591
    generic(
592
      NW : natural := 2
593
    );
594
    port(
595
      V_i : in std_logic_vector(2-1 downto 0); -- slot #0,1 valid flag
596
      EV_i : in std_logic_vector(2-1 downto 0); -- slot #0,1 valid flag
597
      INSTR_i : in DEC_INSTR_VEC_T(NW-1 downto 0); -- slot #0/1 inst.
598
      PC0_i : in ADR_T; -- slot #0 pc
599
      PC1_i : in ADR_T; -- slot #1 pc
600
      DADR0_i : in ADR_T; -- slot #0 L/S addr.
601
      DADR1_i : in ADR_T; -- slot #1 L/S addr.
602
      HALT_i : in std_logic; -- halt flag
603
      HIS_i : in std_logic; -- halt instruction selector
604
 
605
      EXCP_o : out std_logic; -- exc. flag
606
      ERET_o : out std_logic; -- return from exc. flag
607
      RFTCH_o : out std_logic; -- re-fetch flag
608
      KPRD_o : out std_logic_vector(2-1 downto 0); -- slot #0/1 keep pipe reg. data flag
609
      CLRP_o : out std_logic; -- clear pipe flag
610
      CLRB_o : out std_logic; -- clear store buffer flag
611
      CLRD_o : out std_logic; -- clear divider flag
612
      EPC_o : out ADR_T; -- exc. pc
613
      ECAUSE_o : out std_logic_vector(5-1 downto 0); -- exc. cause
614
      EDADR_o : out ADR_T -- exc. L/S addr.
615
    );
616
  end component;
617
 
618
  component RV01_BPU is
619
    generic(
620
      BHT_SIZE : natural := 64;
621
      PXE : std_logic := '1';
622
      NW : natural := 2
623
    );
624
    port(
625
      CLK_i : in std_logic;
626
      RST_i : in std_logic;
627
      INIT_STRT_i : in std_logic;
628
      IF_V_i : in std_logic_vector(NW-1 downto 0);
629
      IF_PC_i : in ADR_VEC_T(NW-1 downto 0);
630
      IF2_V_i : in std_logic_vector(NW-1 downto 0);
631
      IF2_PC_i : in ADR_VEC_T(NW-1 downto 0);
632
      BHT_BTA_i : in ADR_VEC_T(NW-1 downto 0);
633
      BHT_PC_i : in ADR_VEC_T(NW-1 downto 0);
634
      BHT_CNT0_i : in std_logic_vector(2-1 downto 0);
635
      BHT_CNT1_i : in std_logic_vector(2-1 downto 0);
636
      BHT_WE_i : in std_logic_vector(NW-1 downto 0);
637
 
638
      INIT_END_o : out std_logic;
639
      PBX_o : out std_logic;
640
      KLL1_o : out std_logic;
641
      PBTA_o : out unsigned(ALEN-1 downto 0);
642
      BPVD0_o : out std_logic_vector(3-1 downto 0);
643
      BPVD1_o : out std_logic_vector(3-1 downto 0)
644
    );
645
  end component;
646
 
647
  component RV01_BJXLOG_BV is
648
    generic(
649
      JRPE : std_logic := '1'
650
    );
651
    port(
652
      CLK_i : in std_logic;
653
      RST_i : in std_logic;
654
      BJ_OP_i : in BJ_OP_T;
655
      SU_i : in std_logic;
656
      PC_i : in ADR_T;
657
      OPA_i : in SDWORD_T;
658
      OPB_i : in SDWORD_T;
659
      IMM_i : in SDWORD_T;
660
      IV_i : in std_logic;
661
      FSTLL_i : in std_logic;
662
      BPVD_i : std_logic_vector(3-1 downto 0);
663
      MPJRX_i : in std_logic;
664
 
665
      BJX_o : out std_logic;
666
      BJTA_o : out unsigned(ALEN-1 downto 0);
667
      BHT_WE_o : out std_logic;
668
      BHT_TA_o : out ADR_T;
669
      BHT_PC_o : out ADR_T;
670
      BHT_CNT_o : out std_logic_vector(2-1 downto 0)
671
    );
672
  end component;
673
 
674
  component RV01_JRPU is
675
    generic(
676
      RAS_DEPTH : natural := 4;
677
      JRVQ_DEPTH : natural := 2;
678
      PXE : std_logic := '1';
679
      NW : natural := 2
680
    );
681
    port(
682
      CLK_i : in std_logic;
683
      RST_i : in std_logic;
684
      CLR_i : in std_logic;
685
      KLL1_i : in std_logic;
686
      FSTLL_i : in std_logic;
687
      BJX_i : in std_logic;
688
      -- prediction inputs
689
      INSTR_i : in std_logic_vector(ILEN*2-1 downto 0);
690
      IF2_V_i : in std_logic_vector(NW-1 downto 0);
691
      IF2_INSTR_i : in DEC_INSTR_VEC_T(NW-1 downto 0);
692
      IF2_PC_i : in ADR_VEC_T(NW-1 downto 0);
693
      -- verification inputs
694
      IX1_V_i : in std_logic_vector(NW-1 downto 0);
695
      IX1_INSTR_i : in DEC_INSTR_VEC_T(NW-1 downto 0);
696
      IX1_OPA0_i : SDWORD_T;
697
      IX1_OPA1_i : SDWORD_T;
698
      IX1_PCP4_i : ADR_VEC_T(NW-1 downto 0);
699
      -- RAS management
700
      IX3_V_i : in std_logic_vector(NW-1 downto 0);
701
      IX3_INSTR_i : in DEC_INSTR_VEC_T(NW-1 downto 0);
702
      IX3_PCP4_i : ADR_VEC_T(NW-1 downto 0);
703
 
704
      KLL1_o : out std_logic;
705
      PJRX_o : out std_logic;
706
      PJRTA_o : out ADR_T;
707
      MPJRX_o : out std_logic_vector(NW-1 downto 0)
708
    );
709
  end component;
710
 
711
  component RV01_PIPE_A_ALU is
712
    port(
713
      SEL_i :  in std_logic_vector(4-1 downto 0);
714
      SU_i : in std_logic;
715
      OP_i : in ALU_OP_T;
716
      OPA_i : in SDWORD_T;
717
      OPB_i : in SDWORD_T;
718
 
719
      RES_o : out SDWORD_T --  result
720
    );
721
  end component;
722
 
723
  component RV01_PIPE_A_RMX_X2 is
724
    generic(
725
      NW : natural := 2
726
    );
727
    port(
728
      OPA_V_i :  in std_logic;
729
      OPB_V_i :  in std_logic;
730
      OPA_i : in SDWORD_T;
731
      OPB_i : in SDWORD_T;
732
      INSTR_i : in DEC_INSTR_T;
733
      IX3_V_i : in std_logic_vector(NW-1 downto 0);
734
      IX3_INSTR_i : in DEC_INSTR_VEC_T(NW-1 downto 0);
735
      IX3_RES0_i : in SDWORD_T;
736
      IX3_RES1_i : in SDWORD_T;
737
 
738
      OPA_V_o :  out std_logic;
739
      OPB_V_o :  out std_logic;
740
      OPA_o : out SDWORD_T;
741
      OPB_o : out SDWORD_T
742
  );
743
  end component;
744
 
745
  component RV01_PSTLLOG_2W_P6 is
746
    generic(
747
      DXE : std_logic := '1';
748
      SIMULATION_ONLY : std_logic := '0'
749
    );
750
    port(
751
      CLK_i : in std_logic;
752
      ID_INSTR_i : in DEC_INSTR_T;
753
      ID_V_i : in std_logic;
754
      IX1_INSTR0_i : in DEC_INSTR_T;
755
      IX1_INSTR1_i : in DEC_INSTR_T;
756
      IX1_V_i : in std_logic_vector(2-1 downto 0);
757
      IX1_FWDE_i : in std_logic_vector(2-1 downto 0);
758
      IX2_INSTR0_i : in DEC_INSTR_T;
759
      IX2_INSTR1_i : in DEC_INSTR_T;
760
      IX2_V_i : in std_logic_vector(2-1 downto 0);
761
      IX2_FWDE_i : in std_logic_vector(2-1 downto 0);
762
      IX3_INSTR0_i : in DEC_INSTR_T;
763
      IX3_INSTR1_i : in DEC_INSTR_T;
764
      IX3_V_i : in std_logic_vector(2-1 downto 0);
765
      IX3_FWDE_i : in std_logic_vector(2-1 downto 0);
766
 
767
      OPA_V_o :  out std_logic;
768
      OPB_V_o :  out std_logic;
769
      DSA_o :  out std_logic;
770
      DSB_o :  out std_logic;
771
      PSTALL_o : out std_logic
772
    );
773
  end component;
774
 
775
  component RV01_SHFTU is
776
    port(
777
      CTRL_i : in SHF_CTRL;
778
      SI_i : in SDWORD_T;
779
      SHFT_i : in unsigned(5-1 downto 0);
780
      SU_i : in std_logic;
781
 
782
      SO_o : out SDWORD_T
783
    );
784
  end component;
785
 
786
  component RV01_CPU_INIT is
787
    port(
788
      CLK_i : in std_logic;
789
      RST_i : in std_logic;
790
      STRT_i : in std_logic;
791
      RSM_i : in std_logic;
792
      BHT_INIT_END_i : in std_logic;
793
 
794
      INIT_STRT_o : out std_logic;
795
      STRT_o : out std_logic
796
   );
797
  end component;
798
 
799
  component RV01_DIMSLOG is
800
    generic(
801
      IMEM_LOWM : std_logic := '1';
802
      IMEM_SIZE : natural := 1024*32;
803
      DMEM_SIZE : natural := 1024*16
804
    );
805
    port(
806
      IX1_OPA0_i : in SDWORD_T;
807
      IX1_OPA1_i : in SDWORD_T;
808
      IX1_IMM0_i : in SDWORD_T;
809
      IX1_IMM1_i : in SDWORD_T;
810
      IX1_DADR0_i : in ADR_T;
811
      IX1_DADR1_i : in ADR_T;
812
      IX3_DADR0_i : in ADR_T;
813
 
814
      IX1_DIMS_o : out std_logic_vector(NW-1 downto 0);
815
      IX3_DIMS_o : out std_logic
816
  );
817
  end component;
818
 
819
  component RV01_DBGU is
820
    generic(
821
      NW : natural := 2
822
    );
823
    port(
824
      CLK_i : in std_logic;
825
      RST_i : in std_logic;
826
      HPC_i : in ADR_T;
827
      MMODE_i : in std_logic;
828
      NOPR_i : in std_logic;
829
      -- Debug interface
830
      HALT_i : in std_logic;
831
      -- Control port
832
      CPRE_i : in std_logic;
833
      CPWE_i : in std_logic;
834
      CPADR_i : in std_logic_vector(17-1 downto 0);
835
      CPD_i : in std_logic_vector(SDLEN-1 downto 0);
836
 
837
      RST_o : out std_logic;
838
      HLTRQ_o : out std_logic;
839
      RSM_o : out std_logic;
840
      DPC_o : out ADR_T;
841
      DMODE_o : out std_logic;
842
      DIE_o : out std_logic;
843
      HALTD_o : out std_logic;
844
      STOPTIME_o : out std_logic;
845
      STOPCYCLE_o : out std_logic;
846
      SI_o : out std_logic_vector(SDLEN-1 downto 0);
847
      HOBRK_o : out std_logic;
848
      STEP_o : out std_logic;
849
      FRCSI_o : out std_logic;
850
      -- Control port
851
      CPQ_o : out std_logic_vector(SDLEN-1 downto 0)
852
    );
853
  end component;
854
 
855
  component RV01_HLTU is
856
    generic(
857
      PXE : std_logic := '1';
858
      NW : natural := 2
859
    );
860
    port(
861
      CLK_i : in std_logic;
862
      RST_i : in std_logic;
863
      IX1_V_i : in std_logic_vector(NW-1 downto 0);
864
      IX2_V_i : in std_logic_vector(NW-1 downto 0);
865
      NOPR_i : in std_logic; -- no pending read (in sbuf) flag
866
      MMODE_i : in std_logic; -- machine mode flag
867
      HALT_i : in std_logic; -- halt flag
868
      HPC_i : in ADR_T; -- halt PC
869
      -- CSR interface
870
      CS_OP_i : in CS_OP_T;
871
      RS1_i : in RID_T;
872
      ADR_i : in signed(12-1 downto 0);
873
      WE_i : in std_logic;
874
      CSRD_i : in SDWORD_T;
875
      -- Control port
876
      CPRE_i : in std_logic;
877
      CPWE_i : in std_logic;
878
      CPADR_i : in std_logic_vector(17-1 downto 0);
879
      CPD_i : in std_logic_vector(SDLEN-1 downto 0);
880
 
881
      HMODE_o : out std_logic; -- halt mode flag
882
      STRT_o : out std_logic; -- start flag
883
      STRTPC_o : out ADR_T; -- start PC
884
      RSM_o : out std_logic; -- resume flag
885
      HLTURQ_o : out std_logic; -- halt request flag
886
      HLTOBRK_o : out std_logic; -- halt-on-break enable
887
      HLTOADR_o : out std_logic_vector(NW-1 downto 0); -- halt-on-address enable
888
      HLTADR_o : out ADR_T; -- halt address
889
      -- CSR interface
890
      CSRQ_o : out SDWORD_T;
891
      HCSR_o : out std_logic;
892
      ILLG_o : out std_logic;
893
      -- Control port
894
      HCP_o : out std_logic;
895
      CPQ_o : out std_logic_vector(SDLEN-1 downto 0)
896
    );
897
  end component;
898
 
899
  component RV01_RESMUX_IX1 is
900
    generic(
901
      PXE : std_logic := '1';
902
      DXE : std_logic := '1';
903
      NW : natural := 2
904
    );
905
    port(
906
      OPA0_V_i : in std_logic;
907
      OPA1_V_i : in std_logic;
908
      OPA0_i : in SDWORD_T;
909
      OPA1_i : in SDWORD_T;
910
      OPB0_V_i : in std_logic;
911
      OPB1_V_i : in std_logic;
912
      OPB0_i : in SDWORD_T;
913
      OPB1_i : in SDWORD_T;
914
      SHF_RES0_i : in SDWORD_T;
915
      SHF_RES1_i : in SDWORD_T;
916
      PA0_ALU_RES_i : in SDWORD_T;
917
      PA1_ALU_RES_i : in SDWORD_T;
918
      DIV_V_i : in std_logic;
919
      DIV_RES_i : in SDWORD_T;
920
      PASEL0_i : in std_logic_vector(4-1 downto 0);
921
      PASEL1_i : in std_logic_vector(4-1 downto 0);
922
      FWDE_i : in std_logic_vector(NW-1 downto 0);
923
      DSA0_i : in std_logic;
924
      DSB0_i : in std_logic;
925
      DSA1_i : in std_logic;
926
      DSB1_i : in std_logic;
927
      INSTR_i : in DEC_INSTR_VEC_T(NW-1 downto 0);
928
      IX3_DRD0_i : in SDWORD_T;
929
      IX3_DRD1_i : in SDWORD_T;
930
      IX3_V_i : in std_logic_vector(NW-1 downto 0);
931
      IX3_INSTR_i : in DEC_INSTR_VEC_T(NW-1 downto 0);
932
 
933
      FWDX_o : out std_logic_vector(NW-1 downto 0);
934
      PA0_RES_o : out SDWORD_T;
935
      PA1_RES_o : out SDWORD_T;
936
      OPA0_V_o : out std_logic;
937
      OPA1_V_o : out std_logic;
938
      OPA0_o : out SDWORD_T;
939
      OPA1_o : out SDWORD_T;
940
      OPB0_V_o : out std_logic;
941
      OPB1_V_o : out std_logic;
942
      OPB0_o : out SDWORD_T;
943
      OPB1_o : out SDWORD_T;
944
      DRD0_V_o : out std_logic;
945
      DRD1_V_o : out std_logic;
946
      DRD0_o : out SDWORD_T;
947
      DRD1_o : out SDWORD_T
948
    );
949
  end component;
950
 
951
  component RV01_RESMUX_IX2 is
952
    generic(
953
      PXE : std_logic := '1';
954
      DXE : std_logic := '1';
955
      NW : natural := 2
956
    );
957
    port(
958
      OPA0_V_i : in std_logic;
959
      OPA1_V_i : in std_logic;
960
      OPA0_i : in SDWORD_T;
961
      OPA1_i : in SDWORD_T;
962
      OPB0_V_i : in std_logic;
963
      OPB1_V_i : in std_logic;
964
      OPB0_i : in SDWORD_T;
965
      OPB1_i : in SDWORD_T;
966
      DRD0_V_i : in std_logic;
967
      DRD1_V_i : in std_logic;
968
      DRD0_i : in SDWORD_T;
969
      DRD1_i : in SDWORD_T;
970
      DDAT0_i : in std_logic_vector(SDLEN-1 downto 0);
971
      DDAT1_i : in std_logic_vector(SDLEN-1 downto 0);
972
      PA0_ALU_RES_i : in SDWORD_T;
973
      PA1_ALU_RES_i : in SDWORD_T;
974
      PB0_RES_i : in SDWORD_T;
975
      PC1P4_i : in unsigned(SDLEN-1 downto 0);
976
      PASEL0_i : in std_logic_vector(4-1 downto 0);
977
      PASEL1_i : in std_logic_vector(4-1 downto 0);
978
      FWDE_i : in std_logic_vector(NW-1 downto 0);
979
      INSTR_i : in DEC_INSTR_VEC_T(NW-1 downto 0);
980
      IX3_DRD0_i : in SDWORD_T;
981
      IX3_DRD1_i : in SDWORD_T;
982
      IX3_V_i : in std_logic_vector(NW-1 downto 0);
983
      IX3_INSTR_i : in DEC_INSTR_VEC_T(NW-1 downto 0);
984
 
985
      FWDX_o : out std_logic_vector(NW-1 downto 0);
986
      PA0_RES_o : out SDWORD_T;
987
      PA1_RES_o : out SDWORD_T;
988
      OPA0_V_o : out std_logic;
989
      OPA1_V_o : out std_logic;
990
      OPA0_o : out SDWORD_T;
991
      OPA1_o : out SDWORD_T;
992
      OPB0_V_o : out std_logic;
993
      OPB1_V_o : out std_logic;
994
      OPB0_o : out SDWORD_T;
995
      OPB1_o : out SDWORD_T;
996
      DRD0_o : out SDWORD_T;
997
      DRD1_o : out SDWORD_T
998
    );
999
  end component;
1000
 
1001
  component RV01_RESMUX_IX3 is
1002
    generic(
1003
      PXE : std_logic := '1';
1004
      DXE : std_logic := '1';
1005
      NW : natural := 2
1006
    );
1007
    port(
1008
      DRD0_i : in SDWORD_T;
1009
      DRD1_i : in SDWORD_T;
1010
      PA0_ALU_RES_i : in SDWORD_T;
1011
      PA1_ALU_RES_i : in SDWORD_T;
1012
      LDAT0_i : in SDWORD_T;
1013
      LDAT1_i : in SDWORD_T;
1014
      LDAT_V_i : in std_logic_vector(NW-1 downto 0);
1015
      PASEL0_i : in std_logic_vector(4-1 downto 0);
1016
      PASEL1_i : in std_logic_vector(4-1 downto 0);
1017
      FWDE_i : in std_logic_vector(NW-1 downto 0);
1018
      RES_SRC0_i : in RES_SRC_T;
1019
      CSRU_RES_i : in SDWORD_T;
1020
 
1021
      DRD0_o : out SDWORD_T;
1022
      DRD1_o : out SDWORD_T
1023
    );
1024
  end component;
1025
 
1026
  component RV01_CDCOMUX is
1027
    generic(
1028
      DMP : std_logic := '0'
1029
    );
1030
    port(
1031
      CLK_i : in std_logic;
1032
      HCSR_i : in std_logic;
1033
      HCSRQ_i : in SDWORD_T;
1034
      CSRQ_i : in SDWORD_T;
1035
      HILLG_i : in std_logic;
1036
      ILLG_i : in std_logic;
1037
      CP_ADR_MSB_i : in std_logic;
1038
      HCP_i : in std_logic;
1039
      HCPQ_i : in std_logic_vector(SDLEN-1 downto 0);
1040
      CPQ_i : in std_logic_vector(SDLEN-1 downto 0);
1041
      DCPQ_i : in std_logic_vector(SDLEN-1 downto 0);
1042
      STRT_i : in std_logic;
1043
      DRSM_i : in std_logic;
1044
      DPC_i : in ADR_T;
1045
      STRTPC_i : in ADR_T;
1046
 
1047
      ILLG_o : out std_logic;
1048
      CSRU_RES_o : out SDWORD_T;
1049
      CP_Q_o : out std_logic_vector(SDLEN-1 downto 0);
1050
      STRT_o : out std_logic;
1051
      STRTPC_o : out ADR_T
1052
    );
1053
  end component;
1054
 
1055
  component RV01_MISCLOG_IX3 is
1056
    generic(
1057
      PXE : std_logic := '0';
1058
      NW : natural := 2
1059
    );
1060
    port(
1061
      IX1_V0_i : in std_logic;
1062
      IX1_WCSR0_i : in std_logic;
1063
      V_i : in std_logic_vector(NW-1 downto 0);
1064
      DWE_i : in std_logic_vector(NW-1 downto 0);
1065
      KPRD_i : in std_logic_vector(NW-1 downto 0);
1066
      WRD0_i : in std_logic;
1067
      WRD1_i : in std_logic;
1068
      HALT_i : in std_logic_vector(NW-1 downto 0);
1069
      CLRP_i : in std_logic;
1070
      CLRD_i : in std_logic;
1071
      HIS_i : in std_logic;
1072
      PC0_i : in ADR_T;
1073
      PC1_i : in ADR_T;
1074
 
1075
      CP_WE_o : out std_logic;
1076
      SBRE_o : out std_logic_vector(NW-1 downto 0);
1077
      STL_o : out std_logic_vector(NW-1 downto 0);
1078
      WE_o : out std_logic_vector(NW-1 downto 0);
1079
      HALT_o : out std_logic;
1080
      CLRP_o : out std_logic;
1081
      CLRD_o : out std_logic;
1082
      HPC_o : out ADR_T
1083
    );
1084
  end component;
1085
 
1086
  signal ZERO : std_logic := '0';
1087
  signal ONE : std_logic := '1';
1088
 
1089
  signal INIT_STRT : std_logic;
1090
  signal BHT_INIT_END : std_logic;
1091
  signal STRT : std_logic;
1092
  signal IRST : std_logic;
1093
 
1094
  signal IF1_V,IF1_V_q : std_logic_vector(NW-1 downto 0);
1095
  signal IF2_V_q : std_logic_vector(NW-1 downto 0);
1096
  signal IF1_PC : ADR_VEC_T(NW-1 downto 0);
1097
  signal IF1_PC_q : ADR_VEC_T(NW-1 downto 0);
1098
  signal IF1_IADR_MIS : std_logic;
1099
  signal IF1_IADR_MIS_q : std_logic_vector(NW-1 downto 0);
1100
 
1101
  signal IF2_DEC_INSTR : DEC_INSTR_VEC_T(NW-1 downto 0);
1102
  signal IF2_DEC_INSTR_q : DEC_INSTR_VEC_T(NW-1 downto 0);
1103
  signal IF2_OPA_PC : std_logic_vector(NW-1 downto 0);
1104
  signal IF2_OPA_PC_q : std_logic_vector(NW-1 downto 0);
1105
  signal IF2_OPB_IMM : std_logic_vector(NW-1 downto 0);
1106
  signal IF2_OPB_IMM_q : std_logic_vector(NW-1 downto 0);
1107
  signal IF2_PC_q : ADR_VEC_T(NW-1 downto 0);
1108
  signal IF2_INSTR0,IF2_INSTR1 : std_logic_vector(ILEN-1 downto 0);
1109
  signal IF2_V : std_logic_vector(NW-1 downto 0);
1110
  signal IF2_KLL1 : std_logic;
1111
  signal IF2_V_KILL : std_logic;
1112
  signal IF2_PBX : std_logic;
1113
  signal IF2_PBTA : ADR_T;
1114
  signal IF2_BPVD0 : std_logic_vector(3-1 downto 0);
1115
  signal IF2_BPVD1 : std_logic_vector(3-1 downto 0);
1116
  signal IF2_BPVD0_q : std_logic_vector(3-1 downto 0);
1117
  signal IF2_BPVD1_q : std_logic_vector(3-1 downto 0);
1118
  signal IF2_JRKLL1 : std_logic;
1119
  signal IF2_PJRX : std_logic;
1120
  signal IF2_PJRTA : ADR_T;
1121
 
1122
  signal ID_INSTR0,ID_INSTR1 : DEC_INSTR_T;
1123
  signal ID_INSTR_q : DEC_INSTR_VEC_T(NW-1 downto 0);
1124
  signal ID_V,ID_V_q : std_logic_vector(NW-1 downto 0);
1125
  signal ID_ISSUE : std_logic_vector(NW-1 downto 0);
1126
  signal ID_PC_q : ADR_VEC_T(NW-1 downto 0);
1127
  signal ID_OPA0,ID_OPA0_q : SDWORD_T;
1128
  signal ID_OPB0,ID_OPB0_q : SDWORD_T;
1129
  signal ID_OPA1,ID_OPA1_q : SDWORD_T;
1130
  signal ID_OPB1,ID_OPB1_q : SDWORD_T;
1131
  signal ID_PSTALL : std_logic;
1132
  signal ID_PS : std_logic_vector(NW-1 downto 0);
1133
  signal ID_PXE1 : std_logic;
1134
  signal ID_JLRA : ADR_VEC_T(NW-1 downto 0);
1135
  signal ID_FWDE : std_logic_vector(NW-1 downto 0);
1136
  signal ID_FWDE_q : std_logic_vector(NW-1 downto 0);
1137
  signal ID_FWDX_q : std_logic_vector(NW-1 downto 0);
1138
  signal ID_PASEL0,ID_PASEL1 :  std_logic_vector(4-1 downto 0);
1139
  signal ID_PASEL0_q,ID_PASEL1_q :  std_logic_vector(4-1 downto 0);
1140
  signal ID_OPA_PC_q : std_logic_vector(NW-1 downto 0);
1141
  signal ID_DIV_BSY : std_logic;
1142
  signal ID_BPVD0_q : std_logic_vector(3-1 downto 0);
1143
  signal ID_BPVD1_q : std_logic_vector(3-1 downto 0);
1144
  signal ID_OPA0_V : std_logic;
1145
  signal ID_OPB0_V : std_logic;
1146
  signal ID_OPA1_V : std_logic;
1147
  signal ID_OPB1_V : std_logic;
1148
  signal ID_OPA0_V_q : std_logic;
1149
  signal ID_OPB0_V_q : std_logic;
1150
  signal ID_OPA1_V_q : std_logic;
1151
  signal ID_OPB1_V_q : std_logic;
1152
  signal ID_DSA0,ID_DSA0_q : std_logic;
1153
  signal ID_DSB0,ID_DSB0_q : std_logic;
1154
  signal ID_DSA1,ID_DSA1_q : std_logic;
1155
  signal ID_DSB1,ID_DSB1_q : std_logic;
1156
 
1157
  signal IX1_INSTR : DEC_INSTR_VEC_T(NW-1 downto 0);
1158
  signal IX1_INSTR_q : DEC_INSTR_VEC_T(NW-1 downto 0);
1159
  signal IX1_SRST : std_logic;
1160
  signal IX1_BJX : std_logic;
1161
  signal IX1_BJTA : ADR_T;
1162
  signal IX1_BJX0 : std_logic;
1163
  signal IX1_BJTA0 : ADR_T;
1164
  signal IX1_BJX1 : std_logic;
1165
  signal IX1_BJTA1 : ADR_T;
1166
  signal IX1_BJX0_q : std_logic;
1167
  signal IX1_BJTA0_q : ADR_T;
1168
  signal IX1_BJX1_q : std_logic;
1169
  signal IX1_BJTA1_q : ADR_T;
1170
  signal IX1_DWE : std_logic_vector(NW-1 downto 0);
1171
  signal IX1_PDWE : std_logic_vector(NW-1 downto 0);
1172
  signal IX1_DDATO0,IX1_DDATO1 : std_logic_vector(SDLEN-1 downto 0);
1173
  signal IX1_DADR0,IX1_DADR1 : ADR_T;
1174
  signal IX1_DADR0_q,IX1_DADR1_q : ADR_T;
1175
  signal IX1_V,IX1_V_q : std_logic_vector(NW-1 downto 0);
1176
  signal IX1_FWDE_q : std_logic_vector(NW-1 downto 0);
1177
  signal IX1_FWDX_q : std_logic_vector(NW-1 downto 0);
1178
  signal IX1_PA0_RES : SDWORD_T;
1179
  signal IX1_PA1_RES : SDWORD_T;
1180
  signal IX1_DBE0,IX1_DBE1 : std_logic_vector(4-1 downto 0);
1181
  signal IX1_PC0_q,IX1_PC1_q : ADR_T;
1182
  signal IX1_S2LAC : std_logic_vector(2-1 downto 0);
1183
  signal IX1_DIV_STRT,IX1_DIV_QS : std_logic;
1184
  signal IX1_PC0P4,IX1_PC0P4_q : ADR_T;
1185
  signal IX1_PC1P4,IX1_PC1P4_q : ADR_T;
1186
  signal IX1_MALGN : std_logic_vector(NW-1 downto 0);
1187
  signal IX1_SBF : std_logic;
1188
  signal IX1_DWE_q : std_logic_vector(2-1 downto 0);
1189
  signal IX1_DIV_RES : SDWORD_T;
1190
  signal IX1_DIV_V : std_logic;
1191
  signal IX1_DIV_CLRV : std_logic;
1192
  signal IX1_DRD0,IX1_DRD1 : SDWORD_T;
1193
  signal IX1_DRD0_q,IX1_DRD1_q : SDWORD_T;
1194
  signal IX1_DRD0_V,IX1_DRD1_V : std_logic;
1195
  signal IX1_DRD0_V_q,IX1_DRD1_V_q : std_logic;
1196
  signal IX1_NOPR : std_logic;
1197
  signal IX1_CP_WE : std_logic;
1198
  signal IX1_BHT_TA : ADR_VEC_T(NW-1 downto 0);
1199
  signal IX1_BHT_CNT0 : std_logic_vector(2-1 downto 0);
1200
  signal IX1_BHT_CNT1 : std_logic_vector(2-1 downto 0);
1201
  signal IX1_BHT_PWE : std_logic;
1202
  signal IX1_BHT_WE : std_logic_vector(2-1 downto 0);
1203
  signal IX1_PDADR0,IX1_PDADR1 : ADR_T;
1204
  signal IX1_PDIADR0,IX1_PDIADR1 : ADR_T;
1205
  signal IX1_DIMS : std_logic_vector(NW-1 downto 0);
1206
  signal IX1_MPJRX : std_logic_vector(NW-1 downto 0);
1207
  signal IX1_OPA0_V : std_logic;
1208
  signal IX1_OPB0_V : std_logic;
1209
  signal IX1_OPA1_V : std_logic;
1210
  signal IX1_OPB1_V : std_logic;
1211
  signal IX1_OPA0_V_q : std_logic;
1212
  signal IX1_OPB0_V_q : std_logic;
1213
  signal IX1_OPA1_V_q : std_logic;
1214
  signal IX1_OPB1_V_q : std_logic;
1215
  signal IX1_OPA0 : SDWORD_T;
1216
  signal IX1_OPB0 : SDWORD_T;
1217
  signal IX1_OPA1 : SDWORD_T;
1218
  signal IX1_OPB1 : SDWORD_T;
1219
  signal IX1_OPA0_q : SDWORD_T;
1220
  signal IX1_OPB0_q : SDWORD_T;
1221
  signal IX1_OPA1_q : SDWORD_T;
1222
  signal IX1_OPB1_q : SDWORD_T;
1223
  signal IX1_PASEL0_q : std_logic_vector(4-1 downto 0);
1224
  signal IX1_PASEL1_q : std_logic_vector(4-1 downto 0);
1225
  signal IX1_FWDX : std_logic_vector(NW-1 downto 0);
1226
  signal IX1_SHFT0,IX1_SHFT1 :  unsigned(5-1 downto 0);
1227
  signal IX1_SHF_CTRL0,IX1_SHF_CTRL1 : SHF_CTRL;
1228
  signal IX1_SHF_RES0,IX1_SHF_RES1 : SDWORD_T;
1229
  signal IX1_PA0_ALU_RES : SDWORD_T;
1230
  signal IX1_PA1_ALU_RES : SDWORD_T;
1231
  signal IX1_B2BAC : std_logic;
1232
  signal IX1_SHF0_V : std_logic;
1233
  signal IX1_SHF1_V : std_logic;
1234
  signal IX1_KTS : std_logic;
1235
  signal IX1_KTS_q : std_logic;
1236
  signal IX1_PSLP : std_logic;
1237
 
1238
  signal IX2_DRD0,IX2_DRD1 : SDWORD_T;
1239
  signal IX2_PA0_RES : SDWORD_T;
1240
  signal IX2_PA1_RES : SDWORD_T;
1241
  signal IX2_PB0_RES : SDWORD_T;
1242
  signal IX2_PB1_RES : SDWORD_T;
1243
  signal IX2_INSTR : DEC_INSTR_VEC_T(NW-1 downto 0);
1244
  signal IX2_INSTR_q : DEC_INSTR_VEC_T(NW-1 downto 0);
1245
  signal IX2_DRD0_q,IX2_DRD1_q : SDWORD_T;
1246
  signal IX2_DADR0_q,IX2_DADR1_q : ADR_T;
1247
  signal IX2_V,IX2_V_q : std_logic_vector(NW-1 downto 0);
1248
  signal IX2_V_BJX : std_logic_vector(NW-1 downto 0);
1249
  signal IX2_EV,IX2_EV_q : std_logic_vector(NW-1 downto 0);
1250
  signal IX2_FWDE_q : std_logic_vector(NW-1 downto 0);
1251
  signal IX2_FWDX : std_logic_vector(NW-1 downto 0);
1252
  signal IX2_FWDX_q : std_logic_vector(NW-1 downto 0);
1253
  signal IX2_CSRU_RES,IX2_CSRU_RES_q : SDWORD_T;
1254
  signal IX2_PC0_q,IX2_PC1_q : ADR_T;
1255
  signal IX2_ILLG : std_logic;
1256
  signal IX2_LSADR0_q,IX2_LSADR1_q : ADR_T;
1257
  signal IX2_DWE_q : std_logic_vector(NW-1 downto 0);
1258
  signal IX2_MALGN_q : std_logic_vector(NW-1 downto 0);
1259
  signal IX2_EERTA,IX2_EERTA_q : ADR_T;
1260
  signal IX2_OPA0_V : std_logic;
1261
  signal IX2_OPB0_V : std_logic;
1262
  signal IX2_OPA1_V : std_logic;
1263
  signal IX2_OPB1_V : std_logic;
1264
  signal IX2_OPA0 : SDWORD_T;
1265
  signal IX2_OPB0 : SDWORD_T;
1266
  signal IX2_OPA1 : SDWORD_T;
1267
  signal IX2_OPB1 : SDWORD_T;
1268
  signal IX2_OPA0_q : SDWORD_T;
1269
  signal IX2_OPB0_q : SDWORD_T;
1270
  signal IX2_OPA1_q : SDWORD_T;
1271
  signal IX2_OPB1_q : SDWORD_T;
1272
  signal IX2_PASEL0_q : std_logic_vector(4-1 downto 0);
1273
  signal IX2_PASEL1_q : std_logic_vector(4-1 downto 0);
1274
  signal IX2_PA0_RES_X : SDWORD_T;
1275
  signal IX2_PA1_RES_X : SDWORD_T;
1276
  signal IX2_ERR0_q : std_logic;
1277
  signal IX2_ERR1_q : std_logic;
1278
  signal IX2_PA0_ALU_RES : SDWORD_T;
1279
  signal IX2_PA1_ALU_RES : SDWORD_T;
1280
  signal IX2_NOLD0_RES : SDWORD_T;
1281
  signal IX2_NOLD1_RES : SDWORD_T;
1282
  signal IX2_PC0P4_q,IX2_PC1P4_q : ADR_T;
1283
  signal IX2_SBRK0,IX2_HOBRK0 : std_logic;
1284
  signal IX2_HOADR,IX2_HALT,IX2_HALT_q : std_logic_vector(NW-1 downto 0);
1285
  signal IX2_DRSM : std_logic_vector(NW-1 downto 0);
1286
  signal IX2_HIS,IX2_HIS_q : std_logic;
1287
  signal IX2_DHIS,IX2_DHIS_q : std_logic;
1288
  signal IX2_STEP : std_logic;
1289
  signal IX2_BJX : std_logic;
1290
  signal IX2_BJTA : ADR_T;
1291
 
1292
  signal IX3_DRD0,IX3_DRD1 : SDWORD_T;
1293
  signal IX3_DRD0_X,IX3_DRD1_X : SDWORD_T;
1294
  signal IX3_LDAT0_V : std_logic;
1295
  signal IX3_LDAT0 : SDWORD_T;
1296
  signal IX3_LDAT1_V : std_logic;
1297
  signal IX3_LDAT1 : SDWORD_T;
1298
  signal IX3_EXCP : std_logic;
1299
  signal IX3_EPC : ADR_T;
1300
  signal IX3_ECAUSE : std_logic_vector(5-1 downto 0);
1301
  signal IX3_EDADR : ADR_T;
1302
  signal IX3_ERET : std_logic;
1303
  signal IX3_HALT : std_logic;
1304
  signal IX3_STL : std_logic_vector(NW-1 downto 0);
1305
  signal IX3_SBRE : std_logic_vector(NW-1 downto 0);
1306
  signal IX3_DWE : std_logic;
1307
  signal IX3_SDATO : std_logic_vector(SDLEN-1 downto 0);
1308
  signal IX3_DBE : std_logic_vector(4-1 downto 0);
1309
  signal IX3_DADR0 : ADR_T;
1310
  signal IX3_LS_OP : LS_OP_T;
1311
  signal IX3_RFTCH : std_logic;
1312
  signal IX3_EERX : std_logic;
1313
  signal IX3_CLRP : std_logic;
1314
  signal IX3_CLRB : std_logic;
1315
  signal IX3_CLRD : std_logic;
1316
  signal IX3_KPRD : std_logic_vector(NW-1 downto 0);
1317
  signal IX3_WE : std_logic_vector(NW-1 downto 0);
1318
  signal IX3_PA0_ALU_RES : SDWORD_T;
1319
  signal IX3_PA1_ALU_RES : SDWORD_T;
1320
  signal IX3_PDADR0 : ADR_T;
1321
  signal IX3_PDIADR0 : ADR_T;
1322
  signal IX3_DIMS : std_logic;
1323
  signal IX3_HPC : ADR_T;
1324
  signal IX3_CLRP_NOHLT : std_logic;
1325
  signal IX3_CLRD_NOHLT : std_logic;
1326
 
1327
  signal WB_SFT_INT : std_logic;
1328
  signal WB_TMR_INT : std_logic;
1329
  signal WB_RDA0,WB_RDB0 : std_logic_vector(SDLEN-1 downto 0);
1330
  signal WB_RDA1,WB_RDB1 : std_logic_vector(SDLEN-1 downto 0);
1331
  signal WB_PXE : std_logic;
1332
  signal WB_EXCP,WB_EIS : std_logic;
1333
  signal WB_ETVA : ADR_T;
1334
  signal WB_MSTATUS : SDWORD_T;
1335
  signal WB_MEPC : ADR_T;
1336
  signal WB_MBASE : ADR_T;
1337
  signal WB_MBOUND : ADR_T;
1338
  signal WB_MIBASE : ADR_T;
1339
  signal WB_MIBOUND : ADR_T;
1340
  signal WB_MDBASE : ADR_T;
1341
  signal WB_MDBOUND : ADR_T;
1342
  signal WB_FFLAGS : std_logic_vector(5-1 downto 0);
1343
  signal WB_FRM : std_logic_vector(3-1 downto 0);
1344
  signal WB_DHLTRQ : std_logic;
1345
  signal WB_DRSM : std_logic;
1346
  signal WB_DPC : ADR_T;
1347
  signal WB_DMODE : std_logic;
1348
  signal WB_DIE : std_logic;
1349
  signal WB_CHK_ENB : std_logic;
1350
  signal WB_STRT : std_logic;
1351
  signal WB_STRTPC : ADR_T;
1352
  signal WB_RSM : std_logic;
1353
  signal WB_HLTRQ : std_logic;
1354
  signal WB_HLTURQ : std_logic;
1355
  signal WB_HLTOBRK : std_logic;
1356
  signal WB_HLTOADR : std_logic_vector(NW-1 downto 0);
1357
  signal WB_HLTADR : ADR_T;
1358
  signal WB_IE : std_logic;
1359
  signal WB_DRST : std_logic;
1360
  signal WB_HALTD : std_logic;
1361
  signal WB_STOPTIME : std_logic;
1362
  signal WB_STOPCYCLE : std_logic;
1363
  signal WB_DHOBRK : std_logic;
1364
  signal WB_DHOADR : std_logic;
1365
  signal WB_DHADR : ADR_T;
1366
  signal WB_CPQ,WB_DCPQ : std_logic_vector(SDLEN-1 downto 0);
1367
  signal WB_MMODE : std_logic;
1368
  signal WB_DSI : std_logic_vector(SDLEN-1 downto 0);
1369
  signal WB_XSTRT : std_logic;
1370
  signal WB_XSTRTPC : ADR_T;
1371
  signal WB_DSTEP : std_logic;
1372
  signal WB_DFRCSI,IF1_DFRCSI_q : std_logic;
1373
  signal WB_HCSRQ : SDWORD_T;
1374
  signal WB_HCSR : std_logic;
1375
  signal WB_HILLG : std_logic;
1376
  signal WB_HCPQ : std_logic_vector(SDLEN-1 downto 0);
1377
  signal WB_CSRQ : SDWORD_T;
1378
  signal WB_ILLG : std_logic;
1379
  signal WB_HCP : std_logic;
1380
 
1381
  -- debug-only modules
1382
 
1383
  component RV01_ST_CHECKER is
1384
    generic(
1385
      ST_FILENAME : string := "NONE"
1386
   );
1387
    port(
1388
      CLK_i : in std_logic;
1389
      ENB_i : in std_logic;
1390
      LS_OP_i : in LS_OP_T;
1391
      DWE_i : in std_logic;
1392
      BE_i : in std_logic_vector(4-1 downto 0);
1393
      DADR_i : in unsigned(ALEN-1 downto 0);
1394
      DDATO_i : in std_logic_vector(SDLEN-1 downto 0)
1395
    );
1396
  end component;
1397
 
1398
  component RV01_WB_CHECKER is
1399
    generic(
1400
      WB_FILENAME : string := "NONE"
1401
    );
1402
    port(
1403
      CLK_i : in std_logic;
1404
      ENB_i : in std_logic;
1405
      WE0_i : in std_logic;
1406
      WE1_i : in std_logic;
1407
      IX_INSTR0_i : in DEC_INSTR_T;
1408
      IX_INSTR1_i : in DEC_INSTR_T;
1409
      IX_DRD0_i : in SDWORD_T;
1410
      IX_DRD1_i : in SDWORD_T
1411
    );
1412
  end component;
1413
 
1414
  component RV01_STATS is
1415
    port(
1416
      CLK_i : in std_logic;
1417
      RST_i : in std_logic;
1418
      ID_V_i : in std_logic_vector(2-1 downto 0);
1419
      ID_PS_i : in std_logic_vector(2-1 downto 0);
1420
      ID_PXE1_i : std_logic;
1421
      IX2_V_i : in std_logic_vector(2-1 downto 0);
1422
      STRT_i : in std_logic;
1423
      HALT_i : in std_logic
1424
    );
1425
  end component;
1426
 
1427
begin
1428
 
1429
  ----------------------------------------------------
1430
  -- Notes:
1431
  ----------------------------------------------------
1432
 
1433
  -- *** Pipeline organisation ***
1434
  -- RV0101 employs the following 7-stage pipeline:
1435
  -- 1) Instruction Fetch (IF1)
1436
  -- 2) Instruction Fetch (IF2)
1437
  -- 3) Instruction Decode (ID)
1438
  -- 4) Instruction Execute (IX1)
1439
  -- 5) Instruction Execute (IX2)
1440
  -- 6) Instruction Execute (IX3)
1441
  -- 7) Write Back (WB)
1442
 
1443
  -- *** Branch & Jump processing ***
1444
  -- When branch prediction is not enabled, branches and
1445
  -- jumps are processed in IX1 stage and there's a fixed
1446
  -- branch penalty of 2 cycles.
1447
  -- When branch prediction is enabled, branches and jal
1448
  -- instructions are predicted in IF2 stage using a branch
1449
  -- history table (jalr instructions are not predicted
1450
  -- at all). Prediction are verified in IX1 stage, so 
1451
  -- penalty for mis-predicted branches is of 2 cycles.
1452
 
1453
  ----------------------------------------------------
1454
  -- Reset
1455
  ----------------------------------------------------
1456
 
1457
  IRST <= RST_i or WB_DRST;
1458
 
1459
  ----------------------------------------------------
1460
  -- CPU initialization logic
1461
  ----------------------------------------------------
1462
 
1463
  GINIT_1 : if(BRANCH_PREDICTION_ENABLED = '1') generate
1464
 
1465
  -- Branch prediction is enabled: initialize BHT RAM
1466
  -- before starting the CPU.
1467
 
1468
  U_INIT: RV01_CPU_INIT
1469
    port map(
1470
      CLK_i => CLK_i,
1471
      RST_i => IRST,
1472
      STRT_i => WB_XSTRT,
1473
      RSM_i => ZERO,
1474
      BHT_INIT_END_i => BHT_INIT_END,
1475
 
1476
      INIT_STRT_o => INIT_STRT,
1477
      STRT_o => STRT
1478
   );
1479
 
1480
   end generate;
1481
 
1482
   GINIT_0 : if(BRANCH_PREDICTION_ENABLED = '0') generate
1483
 
1484
   -- Branch prediction is disabled: start the CPU
1485
   -- immediately.
1486
 
1487
   INIT_STRT <= '0';
1488
   STRT <= WB_XSTRT;
1489
 
1490
   end generate;
1491
 
1492
  ----------------------------------------------------
1493
  -- IF1 Stage:
1494
  ----------------------------------------------------
1495
 
1496
  -- Instruction Fetch Logic 
1497
 
1498
  GPX_IF1_1 : if(PARALLEL_EXECUTION_ENABLED = '1') generate
1499
 
1500
  U_FTCH : RV01_FTCHLOG_2W
1501
    port map(
1502
      CLK_i => CLK_i,
1503
      RST_i => IRST,
1504
      STRT_i => STRT,
1505
      STRTPC_i => WB_XSTRTPC,
1506
      HALT_i => IX3_HALT,
1507
      BJX_i => IX2_BJX,
1508
      BJTA_i => IX2_BJTA,
1509
      PBX_i => IF2_PBX,
1510
      PBTA_i => IF2_PBTA,
1511
      --KLL1_i => IF2_KLL1,
1512
      KLL1_i => IF2_JRKLL1,
1513
      PJRX_i => IF2_PJRX,
1514
      PJRTA_i => IF2_PJRTA,
1515
      EXCP_i => IX3_EXCP,
1516
      ERET_i => IX3_ERET,
1517
      RFTCH_i => IX3_RFTCH,
1518
      ETVA_i => IX2_EERTA_q,
1519
      PSTALL_i => ID_PSTALL,
1520
      DHALT_i => IX3_HALT,
1521
 
1522
      IFV_o => IF1_V,
1523
      IADR0_o => IF1_PC(0),
1524
      IADR1_o => IF1_PC(1),
1525
      IADR_MIS_o => IF1_IADR_MIS
1526
    );
1527
 
1528
  end generate;
1529
 
1530
  GPX_IF1_0 : if(PARALLEL_EXECUTION_ENABLED = '0') generate
1531
 
1532
  U_FTCH : RV01_FTCHLOG_1W
1533
    port map(
1534
      CLK_i => CLK_i,
1535
      RST_i => IRST,
1536
      STRT_i => STRT,
1537
      HALT_i => IX3_HALT,
1538
      STRTPC_i => WB_XSTRTPC,
1539
      BJX_i => IX2_BJX,
1540
      BJTA_i => IX2_BJTA,
1541
      PBX_i => IF2_PBX,
1542
      PBTA_i => IF2_PBTA,
1543
      --KLL1_i => IF2_KLL1,
1544
      KLL1_i => IF2_JRKLL1,
1545
      PJRX_i => IF2_PJRX,
1546
      PJRTA_i => IF2_PJRTA,
1547
      EXCP_i => IX3_EXCP,
1548
      ERET_i => IX3_ERET,
1549
      RFTCH_i => IX3_RFTCH,
1550
      ETVA_i => IX2_EERTA_q,
1551
      PSTALL_i => ID_PSTALL,
1552
      DHALT_i => IX3_HALT,
1553
 
1554
      IFV_o => IF1_V(0),
1555
      IADR0_o => IF1_PC(0),
1556
      IADR_MIS_o => IF1_IADR_MIS
1557
    );
1558
 
1559
  IF1_V(1) <= '0';
1560
  IF1_PC(1) <= (others => '0');
1561
 
1562
  end generate;
1563
 
1564
  -- CPU Halt flag
1565
  HALT_o <= WB_HALTD;
1566
 
1567
  -- Instruction address virtual to physical translation
1568
  IADR_o <= IF1_PC(0);
1569
 
1570
  -- Pipeline Registers
1571
 
1572
  process(CLK_i)
1573
  begin
1574
    if(CLK_i = '1' and CLK_i'event) then
1575
 
1576
      if(IRST = '1') then
1577
        IF1_V_q <= "00";
1578
      elsif(IX3_HALT = '1') then
1579
        IF1_V_q <= "00";
1580
      elsif(ID_PSTALL = '0') then
1581
        if(WB_DFRCSI = '1') then
1582
          IF1_V_q <= "01";
1583
        else
1584
          IF1_V_q <= IF1_V;
1585
        end if;
1586
      end if;
1587
 
1588
      if(IRST = '1') then
1589
        IF1_DFRCSI_q <= '0';
1590
      else
1591
        IF1_DFRCSI_q <= WB_DFRCSI;
1592
      end if;
1593
 
1594
      IF1_PC_q(0) <= IF1_PC(0);
1595
      IF1_PC_q(1) <= IF1_PC(1);
1596
      IF1_IADR_MIS_q <= (IF1_IADR_MIS & IF1_IADR_MIS);
1597
 
1598
    end if;
1599
  end process;
1600
 
1601
  -- Exception processing: fetch logic detects address
1602
  -- misalignments and records them into IF_ADR_MIS_q
1603
  -- (each instruction of the pair get its own copy of
1604
  -- the flag, in case instruction #0 is invalid).
1605
 
1606
  GBPE_0 : if(BRANCH_PREDICTION_ENABLED = '0') generate
1607
 
1608
  BHT_INIT_END <= '1';
1609
  IF2_PBX <= '0';
1610
  IF2_KLL1 <= '0';
1611
  IF2_PBTA <= (others => '0');
1612
  IF2_BPVD0 <= (others => '0');
1613
  IF2_BPVD1 <= (others => '0');
1614
 
1615
  end generate;
1616
 
1617
  GBPE_1 : if(BRANCH_PREDICTION_ENABLED = '1') generate
1618
 
1619
  -- Branches (and jal's) prediction unit
1620
 
1621
  U_BPU : RV01_BPU
1622
    generic map(
1623
      BHT_SIZE => BHT_SIZE,
1624
      PXE => PARALLEL_EXECUTION_ENABLED,
1625
      NW => NW
1626
    )
1627
    port map(
1628
      CLK_i => CLK_i,
1629
      RST_i => IRST,
1630
      INIT_STRT_i => INIT_STRT,
1631
      IF_V_i => IF1_V,
1632
      IF_PC_i => IF1_PC,
1633
      IF2_V_i => IF2_V,
1634
      IF2_PC_i => IF1_PC_q,
1635
      BHT_BTA_i => IX1_BHT_TA,
1636
      BHT_PC_i => ID_PC_q,
1637
      BHT_CNT0_i => IX1_BHT_CNT0,
1638
      BHT_CNT1_i => IX1_BHT_CNT1,
1639
      BHT_WE_i => IX1_BHT_WE,
1640
 
1641
      INIT_END_o => BHT_INIT_END,
1642
      PBX_o => IF2_PBX,
1643
      KLL1_o => IF2_KLL1,
1644
      PBTA_o => IF2_PBTA,
1645
      BPVD0_o => IF2_BPVD0,
1646
      BPVD1_o => IF2_BPVD1
1647
    );
1648
 
1649
  end generate;
1650
 
1651
  GJRPE_1 : if(JALR_PREDICTION_ENABLED = '1') generate
1652
 
1653
  U_JRPU : RV01_JRPU
1654
    generic map(
1655
      RAS_DEPTH => 4,
1656
      JRVQ_DEPTH => 2,
1657
      PXE => PARALLEL_EXECUTION_ENABLED,
1658
      NW => NW
1659
    )
1660
    port map(
1661
      CLK_i => CLK_i,
1662
      RST_i => IRST,
1663
      CLR_i => IX3_CLRP,
1664
      KLL1_i => IF2_KLL1,
1665
      FSTLL_i => ID_PSTALL,
1666
      BJX_i => IX2_BJX,
1667
      INSTR_i => INSTR_i,
1668
      IF2_V_i => IF1_V_q,
1669
      IF2_INSTR_i => IF2_DEC_INSTR,
1670
      IF2_PC_i => IF1_PC_q,
1671
      IX1_V_i => ID_V_q,
1672
      IX1_INSTR_i => ID_INSTR_q,
1673
      IX1_OPA0_i => ID_OPA0_q,
1674
      IX1_OPA1_i => ID_OPA1_q,
1675
      IX1_PCP4_i(0) => IX1_PC0P4,
1676
      IX1_PCP4_i(1) => IX1_PC1P4,
1677
      IX3_V_i => IX2_V_q,
1678
      IX3_INSTR_i => IX2_INSTR_q,
1679
      IX3_PCP4_i(0) => IX2_PC0P4_q,
1680
      IX3_PCP4_i(1) => IX2_PC1P4_q,
1681
 
1682
      KLL1_o => IF2_JRKLL1,
1683
      PJRX_o => IF2_PJRX,
1684
      PJRTA_o => IF2_PJRTA,
1685
      MPJRX_o => IX1_MPJRX
1686
    );
1687
 
1688
  end generate;
1689
 
1690
  GJRPE_0 : if(JALR_PREDICTION_ENABLED = '0') generate
1691
  IF2_JRKLL1 <= '0';
1692
  IF2_PJRX <= '0';
1693
  IF2_PJRTA <= (others => '0');
1694
  IX1_MPJRX <= "00";
1695
  end generate;
1696
 
1697
  ----------------------------------------------------
1698
  -- IF2 Stage
1699
  ----------------------------------------------------
1700
 
1701
  -- Split instruction memory output into two individual instructions
1702
 
1703
  -- Note: slot #0 instrucion is forced to content of debug unit
1704
  -- Stuff Instruction register when IF1_DFRCSI_q = '1'.
1705
 
1706
  IF2_INSTR0 <=
1707
    INSTR_i(ILEN*1-1 downto ILEN*0) when IF1_DFRCSI_q = '0' else WB_DSI;
1708
 
1709
  IF2_INSTR1 <=
1710
    INSTR_i(ILEN*2-1 downto ILEN*1);
1711
 
1712
  -- Pre-decode individual instructions
1713
 
1714
  U_IDEC0 : RV01_IDEC
1715
    port map(
1716
      INSTR_i => IF2_INSTR0,
1717
      IADR_MIS_i => IF1_IADR_MIS_q(0),
1718
      IADR_ERR_i => IADR_ERR_i,
1719
 
1720
      OPA_PC_o => IF2_OPA_PC(0),
1721
      OPB_IMM_o => IF2_OPB_IMM(0),
1722
      DEC_INSTR_o => IF2_DEC_INSTR(0)
1723
    );
1724
 
1725
  GPX_IF2_1 : if(PARALLEL_EXECUTION_ENABLED = '1') generate
1726
 
1727
  U_IDEC1 : RV01_IDEC
1728
    port map(
1729
      INSTR_i => IF2_INSTR1,
1730
      IADR_MIS_i => IF1_IADR_MIS_q(1),
1731
      IADR_ERR_i => IADR_ERR_i,
1732
 
1733
      OPA_PC_o => IF2_OPA_PC(1),
1734
      OPB_IMM_o => IF2_OPB_IMM(1),
1735
      DEC_INSTR_o => IF2_DEC_INSTR(1)
1736
    );
1737
 
1738
  end generate;
1739
 
1740
  GPX_IF2_0 : if(PARALLEL_EXECUTION_ENABLED = '0') generate
1741
 
1742
  IF2_OPA_PC(1) <= '0';
1743
  IF2_OPB_IMM(1) <= '0';
1744
  IF2_DEC_INSTR(1) <= DEC_NIL;
1745
 
1746
  end generate;
1747
 
1748
  -- Exception processing: instruction address errors
1749
  -- are reported by memory sub-system using IADR_ERR_i.
1750
  -- Illegal instructions are detected by decoding logic.
1751
  -- All type of exception raised up to this point are
1752
  -- recorded by IF2_DEC_INSTR*.[EXCP,EIS,ECAUSE].
1753
 
1754
  -- IF2 instruction valid bits (slot #1 instructions gets
1755
  -- invalidated if slot #0 one is a predicted taken
1756
  -- branch/jal or a jalr).
1757
 
1758
  IF2_V(0) <= IF1_V_q(0);
1759
  IF2_V(1) <= IF1_V_q(1) and not(IF2_KLL1) and not(IF2_JRKLL1);
1760
 
1761
  -- IFQ valid bits "kill" flag (instructions in the
1762
  -- queue must be invalidated when a branch/jump is
1763
  -- executed, an exception is raised or an instruction
1764
  -- is re-fetched).
1765
 
1766
  -- Instruction queue (includes pipeline registers
1767
  -- between IF2 and ID stages).
1768
 
1769
  IF2_V_KILL <= IX2_BJX or IX3_CLRP;
1770
 
1771
  U_IFQ : RV01_IFQ
1772
    port map(
1773
      CLK_i => CLK_i,
1774
      RST_i => IRST,
1775
      ID_HALT_i => IX3_HALT,
1776
      IX_BJX_i => IF2_V_KILL,
1777
      ID_ISSUE_i => ID_ISSUE,
1778
      IF_V_i => IF2_V,
1779
      IF_PC0_i => IF1_PC_q(0),
1780
      IF_PC1_i => IF1_PC_q(1),
1781
      IF_INSTR0_i => IF2_INSTR0,
1782
      IF_INSTR1_i => IF2_INSTR1,
1783
      IF_DEC_INSTR0_i => IF2_DEC_INSTR(0),
1784
      IF_DEC_INSTR1_i => IF2_DEC_INSTR(1),
1785
      IF_OPA_PC0_i => IF2_OPA_PC(0),
1786
      IF_OPA_PC1_i => IF2_OPA_PC(1),
1787
      IF_OPB_IMM0_i => IF2_OPB_IMM(0),
1788
      IF_OPB_IMM1_i => IF2_OPB_IMM(1),
1789
      IF_BPVD0_i => IF2_BPVD0,
1790
      IF_BPVD1_i => IF2_BPVD1,
1791
 
1792
      PSTALL_o => ID_PSTALL,
1793
      ID_V_o => IF2_V_q,
1794
      ID_PC0_o => IF2_PC_q(0),
1795
      ID_PC1_o => IF2_PC_q(1),
1796
      ID_INSTR0_o => open,
1797
      ID_INSTR1_o => open,
1798
      ID_DEC_INSTR0_o => IF2_DEC_INSTR_q(0),
1799
      ID_DEC_INSTR1_o => IF2_DEC_INSTR_q(1),
1800
      ID_OPA_PC0_o => IF2_OPA_PC_q(0),
1801
      ID_OPA_PC1_o => IF2_OPA_PC_q(1),
1802
      ID_OPB_IMM0_o => IF2_OPB_IMM_q(0),
1803
      ID_OPB_IMM1_o => IF2_OPB_IMM_q(1),
1804
      ID_BPVD0_o => IF2_BPVD0_q,
1805
      ID_BPVD1_o => IF2_BPVD1_q
1806
    );
1807
 
1808
  ----------------------------------------------------
1809
  -- ID Stage
1810
  ----------------------------------------------------
1811
 
1812
  -- Pipeline stall logic
1813
 
1814
  U_PSTL0 : RV01_PSTLLOG_2W_P6
1815
    generic map(
1816
      DXE => DELAYED_EXECUTION_ENABLED,
1817
      SIMULATION_ONLY => SIMULATION_ONLY
1818
    )
1819
    port map(
1820
      CLK_i => CLK_i,
1821
      ID_INSTR_i => IF2_DEC_INSTR_q(0),
1822
      ID_V_i => IF2_V_q(0),
1823
      IX1_INSTR0_i => ID_INSTR_q(0),
1824
      IX1_INSTR1_i => ID_INSTR_q(1),
1825
      IX1_V_i => ID_V_q,
1826
      IX1_FWDE_i => ID_FWDX_q,
1827
      IX2_INSTR0_i => IX1_INSTR_q(0),
1828
      IX2_INSTR1_i => IX1_INSTR_q(1),
1829
      IX2_V_i => IX1_V_q,
1830
      IX2_FWDE_i => IX1_FWDX_q,
1831
      IX3_INSTR0_i => IX2_INSTR_q(0),
1832
      IX3_INSTR1_i => IX2_INSTR_q(1),
1833
      IX3_V_i => IX2_V_q,
1834
      IX3_FWDE_i => IX2_FWDX_q,
1835
 
1836
      OPA_V_o => ID_OPA0_V,
1837
      OPB_V_o => ID_OPB0_V,
1838
      DSA_o => ID_DSA0,
1839
      DSB_o => ID_DSB0,
1840
      PSTALL_o => ID_PS(0)
1841
    );
1842
 
1843
  GPX_ID_0_1 : if(PARALLEL_EXECUTION_ENABLED = '1') generate
1844
 
1845
  U_PSTL1 : RV01_PSTLLOG_2W_P6
1846
    generic map(
1847
      DXE => DELAYED_EXECUTION_ENABLED,
1848
      SIMULATION_ONLY => SIMULATION_ONLY
1849
    )
1850
    port map(
1851
      CLK_i => CLK_i,
1852
      ID_INSTR_i => IF2_DEC_INSTR_q(1),
1853
      ID_V_i => IF2_V_q(1),
1854
      IX1_INSTR0_i => ID_INSTR_q(0),
1855
      IX1_INSTR1_i => ID_INSTR_q(1),
1856
      IX1_V_i => ID_V_q,
1857
      IX1_FWDE_i => ID_FWDX_q,
1858
      IX2_INSTR0_i => IX1_INSTR_q(0),
1859
      IX2_INSTR1_i => IX1_INSTR_q(1),
1860
      IX2_V_i => IX1_V_q,
1861
      IX2_FWDE_i => IX1_FWDX_q,
1862
      IX3_INSTR0_i => IX2_INSTR_q(0),
1863
      IX3_INSTR1_i => IX2_INSTR_q(1),
1864
      IX3_V_i => IX2_V_q,
1865
      IX3_FWDE_i => IX2_FWDX_q,
1866
 
1867
      OPA_V_o => ID_OPA1_V,
1868
      OPB_V_o => ID_OPB1_V,
1869
      DSA_o => ID_DSA1,
1870
      DSB_o => ID_DSB1,
1871
      PSTALL_o => ID_PS(1)
1872
    );
1873
 
1874
  end generate;
1875
 
1876
  GPX_ID_0_0 : if(PARALLEL_EXECUTION_ENABLED = '0') generate
1877
 
1878
    ID_OPA1_V <= '0';
1879
    ID_OPB1_V <= '0';
1880
    ID_DSA1 <= '0';
1881
    ID_DSB1 <= '0';
1882
    ID_PS(1) <= '0';
1883
 
1884
  end generate;
1885
 
1886
  -- Parallel eXecution logic
1887
 
1888
  GPX_ID_1_1 : if(PARALLEL_EXECUTION_ENABLED = '1') generate
1889
 
1890
  U_PXLOG : RV01_PXLOG
1891
    port map(
1892
      ID_INSTR0_i => IF2_DEC_INSTR_q(0),
1893
      ID_INSTR1_i => IF2_DEC_INSTR_q(1),
1894
      ID_V_i => IF2_V_q(2-1 downto 0),
1895
      ID_FWDE_i => ID_FWDE,
1896
 
1897
      PXE1_o => ID_PXE1
1898
    );
1899
 
1900
  end generate;
1901
 
1902
  GPX_ID_1_0 : if(PARALLEL_EXECUTION_ENABLED = '0') generate
1903
 
1904
  ID_PXE1 <= '0';
1905
 
1906
  end generate;
1907
 
1908
  -- Instruction issue logic
1909
 
1910
  U_ISSLOG: RV01_ISSLOG
1911
    generic map(
1912
      NW => NW
1913
    )
1914
    port map(
1915
      V_i => IF2_V_q,
1916
      BJX_i => IX2_BJX,
1917
      PC1_i => IF2_PC_q(1),
1918
      PS_i => ID_PS,
1919
      SBF_i => IX1_SBF,
1920
      DIV_STRT_i => IX1_DIV_STRT,
1921
      DIV_BSY_i => ID_DIV_BSY,
1922
      SEQX_i => IF2_DEC_INSTR_q(0).SEQX,
1923
      PXE_i => WB_PXE,
1924
      PXE1_i => ID_PXE1,
1925
      STEP_i => IX2_STEP,
1926
      PSLP_i => IX1_PSLP,
1927
 
1928
      V_o => ID_V,
1929
      JLRA_o => ID_JLRA,
1930
      ISSUE_o => ID_ISSUE
1931
    );
1932
 
1933
  -- Instruction #0 Operand A forward logic
1934
 
1935
  U_FWDLOGA0 : RV01_FWDLOG_2W_P6
1936
    port map(
1937
      ID_RX_i => IF2_DEC_INSTR_q(0).RS1,
1938
      ID_RRX_i => IF2_DEC_INSTR_q(0).RRS1,
1939
      IX1_INSTR0_i => ID_INSTR_q(0),
1940
      IX2_INSTR0_i => IX1_INSTR_q(0),
1941
      IX3_INSTR0_i => IX2_INSTR_q(0),
1942
      IX1_INSTR1_i => ID_INSTR_q(1),
1943
      IX2_INSTR1_i => IX1_INSTR_q(1),
1944
      IX3_INSTR1_i => IX2_INSTR_q(1),
1945
      IX1_PA_RES0_i => IX1_PA0_RES,
1946
      IX1_PA_RES1_i => IX1_PA1_RES,
1947
      IX2_PA_RES0_i => IX2_PA0_RES,
1948
      IX2_PA_RES1_i => IX2_PA1_RES,
1949
      IX3_PA_RES0_i => IX3_DRD0,
1950
      IX3_PA_RES1_i => IX3_DRD1,
1951
      ID_OPX_NOFWD_i => to_signed(WB_RDA0),
1952
      IX1_V_i => ID_V_q,
1953
      IX2_V_i => IX1_V_q,
1954
      IX3_V_i => IX2_V_q,
1955
      IX1_FWDE_i => ID_FWDX_q,
1956
      IX2_FWDE_i => IX1_FWDX_q,
1957
      IX3_FWDE_i => IX2_FWDX_q,
1958
      NOREGS_i => IF2_OPA_PC_q(0),
1959
      NOREGD_i => to_signed(ID_JLRA(0)),
1960
 
1961
      ID_OPX_o => ID_OPA0
1962
    );
1963
 
1964
  -- Instruction #1 Operand A forward logic
1965
 
1966
  GPX_ID_2_1 : if(PARALLEL_EXECUTION_ENABLED = '1') generate
1967
 
1968
  U_FWDLOGA1 : RV01_FWDLOG_2W_P6
1969
    port map(
1970
      ID_RX_i => IF2_DEC_INSTR_q(1).RS1,
1971
      ID_RRX_i => IF2_DEC_INSTR_q(1).RRS1,
1972
      IX1_INSTR0_i => ID_INSTR_q(0),
1973
      IX2_INSTR0_i => IX1_INSTR_q(0),
1974
      IX3_INSTR0_i => IX2_INSTR_q(0),
1975
      IX1_INSTR1_i => ID_INSTR_q(1),
1976
      IX2_INSTR1_i => IX1_INSTR_q(1),
1977
      IX3_INSTR1_i => IX2_INSTR_q(1),
1978
      IX1_PA_RES0_i => IX1_PA0_RES,
1979
      IX1_PA_RES1_i => IX1_PA1_RES,
1980
      IX2_PA_RES0_i => IX2_PA0_RES,
1981
      IX2_PA_RES1_i => IX2_PA1_RES,
1982
      IX3_PA_RES0_i => IX3_DRD0,
1983
      IX3_PA_RES1_i => IX3_DRD1,
1984
      ID_OPX_NOFWD_i => to_signed(WB_RDA1),
1985
      IX1_V_i => ID_V_q,
1986
      IX2_V_i => IX1_V_q,
1987
      IX3_V_i => IX2_V_q,
1988
      IX1_FWDE_i => ID_FWDX_q,
1989
      IX2_FWDE_i => IX1_FWDX_q,
1990
      IX3_FWDE_i => IX2_FWDX_q,
1991
      NOREGS_i => IF2_OPA_PC_q(1),
1992
      NOREGD_i => to_signed(ID_JLRA(1)),
1993
 
1994
      ID_OPX_o => ID_OPA1
1995
    );
1996
 
1997
  end generate;
1998
 
1999
  GPX_ID_2_0 : if(PARALLEL_EXECUTION_ENABLED = '0') generate
2000
 
2001
  ID_OPA1 <= (others => '0');
2002
 
2003
  end generate;
2004
 
2005
  -- Instruction #0 Operand B forward logic
2006
 
2007
  U_FWDLOGB0 : RV01_FWDLOG_2W_P6
2008
    port map(
2009
      ID_RX_i => IF2_DEC_INSTR_q(0).RS2,
2010
      ID_RRX_i => IF2_DEC_INSTR_q(0).RRS2,
2011
      IX1_INSTR0_i => ID_INSTR_q(0),
2012
      IX2_INSTR0_i => IX1_INSTR_q(0),
2013
      IX3_INSTR0_i => IX2_INSTR_q(0),
2014
      IX1_INSTR1_i => ID_INSTR_q(1),
2015
      IX2_INSTR1_i => IX1_INSTR_q(1),
2016
      IX3_INSTR1_i => IX2_INSTR_q(1),
2017
      IX1_PA_RES0_i => IX1_PA0_RES,
2018
      IX1_PA_RES1_i => IX1_PA1_RES,
2019
      IX2_PA_RES0_i => IX2_PA0_RES,
2020
      IX2_PA_RES1_i => IX2_PA1_RES,
2021
      IX3_PA_RES0_i => IX3_DRD0,
2022
      IX3_PA_RES1_i => IX3_DRD1,
2023
      ID_OPX_NOFWD_i => to_signed(WB_RDB0),
2024
      IX1_V_i => ID_V_q,
2025
      IX2_V_i => IX1_V_q,
2026
      IX3_V_i => IX2_V_q,
2027
      IX1_FWDE_i => ID_FWDX_q,
2028
      IX2_FWDE_i => IX1_FWDX_q,
2029
      IX3_FWDE_i => IX2_FWDX_q,
2030
      NOREGS_i => IF2_OPB_IMM_q(0),
2031
      NOREGD_i => IF2_DEC_INSTR_q(0).IMM,
2032
 
2033
      ID_OPX_o => ID_OPB0
2034
    );
2035
 
2036
  -- Instruction #1 Operand B forward logic
2037
 
2038
  GPX_ID_3_1 : if(PARALLEL_EXECUTION_ENABLED = '1') generate
2039
 
2040
  U_FWDLOGB1 : RV01_FWDLOG_2W_P6
2041
    port map(
2042
      ID_RX_i => IF2_DEC_INSTR_q(1).RS2,
2043
      ID_RRX_i => IF2_DEC_INSTR_q(1).RRS2,
2044
      IX1_INSTR0_i => ID_INSTR_q(0),
2045
      IX2_INSTR0_i => IX1_INSTR_q(0),
2046
      IX3_INSTR0_i => IX2_INSTR_q(0),
2047
      IX1_INSTR1_i => ID_INSTR_q(1),
2048
      IX2_INSTR1_i => IX1_INSTR_q(1),
2049
      IX3_INSTR1_i => IX2_INSTR_q(1),
2050
      IX1_PA_RES0_i => IX1_PA0_RES,
2051
      IX1_PA_RES1_i => IX1_PA1_RES,
2052
      IX2_PA_RES0_i => IX2_PA0_RES,
2053
      IX2_PA_RES1_i => IX2_PA1_RES,
2054
      IX3_PA_RES0_i => IX3_DRD0,
2055
      IX3_PA_RES1_i => IX3_DRD1,
2056
      ID_OPX_NOFWD_i => to_signed(WB_RDB1),
2057
      IX1_V_i => ID_V_q,
2058
      IX2_V_i => IX1_V_q,
2059
      IX3_V_i => IX2_V_q,
2060
      IX1_FWDE_i => ID_FWDX_q,
2061
      IX2_FWDE_i => IX1_FWDX_q,
2062
      IX3_FWDE_i => IX2_FWDX_q,
2063
      NOREGS_i => IF2_OPB_IMM_q(1),
2064
      NOREGD_i => IF2_DEC_INSTR_q(1).IMM,
2065
 
2066
      ID_OPX_o => ID_OPB1
2067
    );
2068
 
2069
  end generate;
2070
 
2071
  GPX_ID_3_0 : if(PARALLEL_EXECUTION_ENABLED = '0') generate
2072
 
2073
  ID_OPB1 <= (others => '0');
2074
 
2075
  end generate;
2076
 
2077
  -- Pipeline-A (dedicated) pre-decoder
2078
 
2079
  U_PADEC0 : RV01_PIPE_A_DEC
2080
    port map(
2081
      INSTR_i => IF2_DEC_INSTR_q(0),
2082
 
2083
      FWDE_o => ID_FWDE(0),
2084
      SEL_o => ID_PASEL0
2085
    );
2086
 
2087
  GPX_ID_4_1 : if(PARALLEL_EXECUTION_ENABLED = '1') generate
2088
 
2089
  U_PADEC1 : RV01_PIPE_A_DEC
2090
    port map(
2091
      INSTR_i => IF2_DEC_INSTR_q(1),
2092
 
2093
      FWDE_o => ID_FWDE(1),
2094
      SEL_o => ID_PASEL1
2095
    );
2096
 
2097
  end generate;
2098
 
2099
  GPX_ID_4_0 : if(PARALLEL_EXECUTION_ENABLED = '0') generate
2100
 
2101
  ID_FWDE(1) <= '0';
2102
  ID_PASEL1 <= (others => '0');
2103
 
2104
  end generate;
2105
 
2106
  -- Pipeline Registers 
2107
 
2108
  process(CLK_i)
2109
  begin
2110
    if(CLK_i = '1' and CLK_i'event) then
2111
      if(IRST = '1' or IX3_CLRP = '1') then
2112
        ID_V_q <= "00";
2113
      else
2114
        ID_V_q(0) <= ID_V(0);
2115
        ID_V_q(1) <= ID_V(1) or (IX1_PSLP and not(IX2_BJX));
2116
      end if;
2117
        ID_PC_q(0) <= IF2_PC_q(0);
2118
        ID_INSTR_q(0) <= IF2_DEC_INSTR_q(0);
2119
        ID_OPA0_q <= ID_OPA0;
2120
        ID_OPB0_q <= ID_OPB0;
2121
        ID_FWDE_q(0) <= ID_FWDE(0);
2122
        ID_FWDX_q(0) <= ID_FWDE(0) and ID_OPA0_V and ID_OPB0_V;
2123
        ID_PASEL0_q <= ID_PASEL0;
2124
        ID_BPVD0_q <= IF2_BPVD0_q;
2125
        ID_OPA0_V_q <= ID_OPA0_V;
2126
        ID_OPB0_V_q <= ID_OPB0_V;
2127
        ID_DSA0_q <= ID_DSA0;
2128
        ID_DSB0_q <= ID_DSB0;
2129
      if(IX1_PSLP = '0') then
2130
        ID_PC_q(1) <= IF2_PC_q(1);
2131
        ID_INSTR_q(1) <= IF2_DEC_INSTR_q(1);
2132
        ID_OPA1_q <= ID_OPA1;
2133
        ID_OPB1_q <= ID_OPB1;
2134
        ID_FWDE_q(1) <= ID_FWDE(1);
2135
        ID_FWDX_q(1) <= ID_FWDE(1) and ID_OPA1_V and ID_OPB1_V;
2136
        ID_PASEL1_q <= ID_PASEL1;
2137
        ID_BPVD1_q <= IF2_BPVD1_q;
2138
        ID_OPA1_V_q <= ID_OPA1_V;
2139
        ID_OPB1_V_q <= ID_OPB1_V;
2140
        ID_DSA1_q <= ID_DSA1;
2141
        ID_DSB1_q <= ID_DSB1;
2142
      end if;
2143
    end if;
2144
  end process;
2145
 
2146
  ----------------------------------------------------
2147
  -- IX1 Stage
2148
  ----------------------------------------------------
2149
 
2150
  -- Pipeline-A
2151
 
2152
  -- Delayed Execution pipeline-A
2153
 
2154
  U_PA0ALU_X1: RV01_PIPE_A_ALU
2155
    port map(
2156
      SEL_i => ID_PASEL0_q,
2157
      SU_i => ID_INSTR_q(0).SU,
2158
      OP_i => ID_INSTR_q(0).ALU_OP,
2159
      OPA_i => ID_OPA0_q,
2160
      OPB_i => ID_OPB0_q,
2161
 
2162
      RES_o => IX1_PA0_ALU_RES
2163
    );
2164
 
2165
  GPX_X1_1_1 : if(PARALLEL_EXECUTION_ENABLED = '1') generate
2166
 
2167
  U_PA1ALU_X1: RV01_PIPE_A_ALU
2168
    port map(
2169
      SEL_i => ID_PASEL1_q,
2170
      SU_i => ID_INSTR_q(1).SU,
2171
      OP_i => ID_INSTR_q(1).ALU_OP,
2172
      OPA_i => ID_OPA1_q,
2173
      OPB_i => ID_OPB1_q,
2174
 
2175
      RES_o => IX1_PA1_ALU_RES
2176
    );
2177
 
2178
  end generate; -- GPX_X1_1_1
2179
 
2180
  IX1_SHFT0 <= to_unsigned(ID_OPB0_q(5-1 downto 0));
2181
 
2182
  process(ID_INSTR_q(0))
2183
  begin
2184
    case ID_INSTR_q(0).ALU_OP is
2185
      when ALU_SHL =>
2186
        IX1_SHF_CTRL0 <= SC_SHL;
2187
      when ALU_SHR =>
2188
        IX1_SHF_CTRL0 <= SC_SHR;
2189
      when others =>
2190
        IX1_SHF_CTRL0 <= SC_NIL;
2191
    end case;
2192
  end process;
2193
 
2194
  U_SHF0 : RV01_SHFTU
2195
    port map(
2196
      CTRL_i => IX1_SHF_CTRL0,
2197
      SI_i => ID_OPA0_q,
2198
      SHFT_i => IX1_SHFT0,
2199
      SU_i => ID_INSTR_q(0).SU,
2200
 
2201
      SO_o => IX1_SHF_RES0
2202
    );
2203
 
2204
  GPX_X1_2_1 : if(PARALLEL_EXECUTION_ENABLED = '1') generate
2205
 
2206
  IX1_SHFT1 <= to_unsigned(ID_OPB1_q(5-1 downto 0));
2207
 
2208
  process(ID_INSTR_q(1))
2209
  begin
2210
    case ID_INSTR_q(1).ALU_OP is
2211
      when ALU_SHL =>
2212
        IX1_SHF_CTRL1 <= SC_SHL;
2213
      when ALU_SHR =>
2214
        IX1_SHF_CTRL1 <= SC_SHR;
2215
      when others =>
2216
        IX1_SHF_CTRL1 <= SC_NIL;
2217
    end case;
2218
  end process;
2219
 
2220
  U_SHF1 : RV01_SHFTU
2221
    port map(
2222
      CTRL_i => IX1_SHF_CTRL1,
2223
      SI_i => ID_OPA1_q,
2224
      SHFT_i => IX1_SHFT1,
2225
      SU_i => ID_INSTR_q(1).SU,
2226
 
2227
      SO_o => IX1_SHF_RES1
2228
    );
2229
 
2230
  end generate; -- GPX_X1_2_1
2231
 
2232
  GDX1_1 : if(DELAYED_EXECUTION_ENABLED = '1') generate
2233
 
2234
  -- DX Pipe registers (IX1->IX2)
2235
 
2236
  process(CLK_i)
2237
  begin
2238
    if(CLK_i = '1' and CLK_i'event) then
2239
      if(IRST = '1') then
2240
        IX1_OPA0_V_q <= '0';
2241
        IX1_OPB0_V_q <= '0';
2242
        IX1_OPA1_V_q <= '0';
2243
        IX1_OPB1_V_q <= '0';
2244
      else
2245
        IX1_OPA0_V_q <= IX1_OPA0_V and not(ID_DSA0_q);
2246
        IX1_OPB0_V_q <= IX1_OPB0_V and not(ID_DSB0_q);
2247
        IX1_OPA1_V_q <= IX1_OPA1_V and not(ID_DSA1_q);
2248
        IX1_OPB1_V_q <= IX1_OPB1_V and not(ID_DSB1_q);
2249
      end if;
2250
      IX1_OPA0_q <= IX1_OPA0;
2251
      IX1_OPB0_q <= IX1_OPB0;
2252
      IX1_OPA1_q <= IX1_OPA1;
2253
      IX1_OPB1_q <= IX1_OPB1;
2254
    end if;
2255
  end process;
2256
 
2257
  end generate;
2258
 
2259
  process(CLK_i)
2260
  begin
2261
    if(CLK_i = '1' and CLK_i'event) then
2262
      IX1_PASEL0_q <= ID_PASEL0_q;
2263
      IX1_PASEL1_q <= ID_PASEL1_q;
2264
    end if;
2265
  end process;
2266
 
2267
  U_RMUX1 : RV01_RESMUX_IX1
2268
    generic map(
2269
      PXE => PARALLEL_EXECUTION_ENABLED,
2270
      DXE => DELAYED_EXECUTION_ENABLED,
2271
      NW => NW
2272
    )
2273
    port map(
2274
      OPA0_V_i => ID_OPA0_V_q,
2275
      OPA1_V_i => ID_OPA1_V_q,
2276
      OPA0_i => ID_OPA0_q,
2277
      OPA1_i => ID_OPA1_q,
2278
      OPB0_V_i => ID_OPB0_V_q,
2279
      OPB1_V_i => ID_OPB1_V_q,
2280
      OPB0_i => ID_OPB0_q,
2281
      OPB1_i => ID_OPB1_q,
2282
      SHF_RES0_i => IX1_SHF_RES0,
2283
      SHF_RES1_i => IX1_SHF_RES1,
2284
      PA0_ALU_RES_i => IX1_PA0_ALU_RES,
2285
      PA1_ALU_RES_i => IX1_PA1_ALU_RES,
2286
      DIV_V_i => IX1_DIV_V,
2287
      DIV_RES_i => IX1_DIV_RES,
2288
      PASEL0_i => ID_PASEL0_q,
2289
      PASEL1_i => ID_PASEL1_q,
2290
      FWDE_i => ID_FWDE_q,
2291
      DSA0_i => ID_DSA0_q,
2292
      DSB0_i => ID_DSB0_q,
2293
      DSA1_i => ID_DSA1_q,
2294
      DSB1_i => ID_DSB1_q,
2295
      INSTR_i => ID_INSTR_q,
2296
      IX3_DRD0_i => IX3_DRD0,
2297
      IX3_DRD1_i => IX3_DRD1,
2298
      IX3_V_i => IX2_V_q,
2299
      IX3_INSTR_i => IX2_INSTR_q,
2300
 
2301
      FWDX_o => IX1_FWDX,
2302
      PA0_RES_o => IX1_PA0_RES,
2303
      PA1_RES_o => IX1_PA1_RES,
2304
      OPA0_V_o => IX1_OPA0_V,
2305
      OPA1_V_o => IX1_OPA1_V,
2306
      OPA0_o => IX1_OPA0,
2307
      OPA1_o => IX1_OPA1,
2308
      OPB0_V_o => IX1_OPB0_V,
2309
      OPB1_V_o => IX1_OPB1_V,
2310
      OPB0_o => IX1_OPB0,
2311
      OPB1_o => IX1_OPB1,
2312
      DRD0_V_o => IX1_DRD0_V,
2313
      DRD1_V_o => IX1_DRD1_V,
2314
      DRD0_o => IX1_DRD0,
2315
      DRD1_o => IX1_DRD1
2316
    );
2317
 
2318
  -- Pipeline-B
2319
 
2320
  IX1_PC0P4 <= ID_PC_q(0) + 4;
2321
  IX1_PC1P4 <= ID_PC_q(1) + 4;
2322
 
2323
  U_PIPEB : RV01_PIPE_B
2324
    port map(
2325
      CLK_i => CLK_i,
2326
      OP_i => ID_INSTR_q(0).ALU_OP,
2327
      SU_i => ID_INSTR_q(0).SU,
2328
      PC0_i => ID_PC_q(0),
2329
      PC1_i => IX1_PC0P4_q,
2330
      OPA_i => ID_OPA0_q,
2331
      OPB_i => ID_OPB0_q,
2332
 
2333
      RES_o => IX2_PB0_RES
2334
    );
2335
 
2336
  GBJX0 : if BRANCH_PREDICTION_ENABLED = '0' generate
2337
 
2338
  -- Branch/Jump processing logic (pipe #0)
2339
 
2340
  U_BJXLOG0 : RV01_BJXLOG
2341
    generic map(
2342
      JRPE => JALR_PREDICTION_ENABLED
2343
    )
2344
    port map(
2345
      CLK_i => CLK_i,
2346
      RST_i => IRST,
2347
      BJ_OP_i => ID_INSTR_q(0).BJ_OP,
2348
      SU_i => ID_INSTR_q(0).SU,
2349
      PC_i => ID_PC_q(0),
2350
      OPA_i => ID_OPA0_q,
2351
      OPB_i => ID_OPB0_q,
2352
      IMM_i => ID_INSTR_q(0).IMM,
2353
      IV_i => ID_V_q(0),
2354
      FSTLL_i => ID_PSTALL,
2355
      MPJRX_i => IX1_MPJRX(0),
2356
 
2357
      BJX_o => IX1_BJX0,
2358
      BJTA_o => IX1_BJTA0
2359
    );
2360
 
2361
  GPX_X1_6_1 : if(PARALLEL_EXECUTION_ENABLED = '1') generate
2362
 
2363
  -- Branch/Jump processing logic (pipe #1)
2364
 
2365
  U_BJXLOG1 : RV01_BJXLOG
2366
    generic map(
2367
      JRPE => JALR_PREDICTION_ENABLED
2368
    )
2369
    port map(
2370
      CLK_i => CLK_i,
2371
      RST_i => IRST,
2372
      BJ_OP_i => ID_INSTR_q(1).BJ_OP,
2373
      SU_i => ID_INSTR_q(1).SU,
2374
      PC_i => ID_PC_q(1),
2375
      OPA_i => ID_OPA1_q,
2376
      OPB_i => ID_OPB1_q,
2377
      IMM_i => ID_INSTR_q(1).IMM,
2378
      IV_i => ID_V_q(1),
2379
      FSTLL_i => ID_PSTALL,
2380
      MPJRX_i => IX1_MPJRX(1),
2381
 
2382
      BJX_o => IX1_BJX1,
2383
      BJTA_o => IX1_BJTA1
2384
    );
2385
 
2386
  IX1_B2BAC <= '0';
2387
 
2388
  end generate; -- GPX_X1_6_1
2389
 
2390
  GPX_X1_6_0 : if(PARALLEL_EXECUTION_ENABLED = '0') generate
2391
 
2392
  IX1_BJX1 <= '0';
2393
  IX1_BJTA1 <= (others =>'0');
2394
 
2395
  end generate; -- GPX_X1_6_0
2396
 
2397
  end generate;
2398
 
2399
  GBJX1 : if BRANCH_PREDICTION_ENABLED = '1' generate
2400
 
2401
  -- Branch/Jump processing logic (pipe #0)
2402
 
2403
  U_BJXLOG0 : RV01_BJXLOG_BV
2404
    generic map(
2405
      JRPE => JALR_PREDICTION_ENABLED
2406
    )
2407
    port map(
2408
      CLK_i => CLK_i,
2409
      RST_i => IRST,
2410
      BJ_OP_i => ID_INSTR_q(0).BJ_OP,
2411
      SU_i => ID_INSTR_q(0).SU,
2412
      PC_i => ID_PC_q(0),
2413
      OPA_i => ID_OPA0_q,
2414
      OPB_i => ID_OPB0_q,
2415
      IMM_i => ID_INSTR_q(0).IMM,
2416
      IV_i => ID_V_q(0),
2417
      FSTLL_i => ID_PSTALL,
2418
      BPVD_i => ID_BPVD0_q,
2419
      MPJRX_i => IX1_MPJRX(0),
2420
 
2421
      BJX_o => IX1_BJX0,
2422
      BJTA_o => IX1_BJTA0,
2423
      BHT_WE_o => IX1_BHT_WE(0),
2424
      BHT_TA_o => IX1_BHT_TA(0),
2425
      BHT_PC_o => open,
2426
      BHT_CNT_o => IX1_BHT_CNT0
2427
    );
2428
 
2429
  GPX_X1_6_1 : if(PARALLEL_EXECUTION_ENABLED = '1') generate
2430
 
2431
  -- Branch/Jump processing logic (pipe #1)
2432
 
2433
  U_BJXLOG1 : RV01_BJXLOG_BV
2434
    generic map(
2435
      JRPE => JALR_PREDICTION_ENABLED
2436
    )
2437
    port map(
2438
      CLK_i => CLK_i,
2439
      RST_i => IRST,
2440
      BJ_OP_i => ID_INSTR_q(1).BJ_OP,
2441
      SU_i => ID_INSTR_q(1).SU,
2442
      PC_i => ID_PC_q(1),
2443
      OPA_i => ID_OPA1_q,
2444
      OPB_i => ID_OPB1_q,
2445
      IMM_i => ID_INSTR_q(1).IMM,
2446
      IV_i => ID_V_q(1),
2447
      FSTLL_i => ID_PSTALL,
2448
      BPVD_i => ID_BPVD1_q,
2449
      MPJRX_i => IX1_MPJRX(1),
2450
 
2451
      BJX_o => IX1_BJX1,
2452
      BJTA_o => IX1_BJTA1,
2453
      BHT_WE_o => IX1_BHT_PWE,
2454
      BHT_TA_o => IX1_BHT_TA(1),
2455
      BHT_PC_o => open,
2456
      BHT_CNT_o => IX1_BHT_CNT1
2457
    );
2458
 
2459
    -- IX1 slot #1 BHT write-enable flag must be
2460
    -- cleared if there's a jump or taken branch in slot #0, 
2461
    -- or a branch-2-branch address conflict causing slot #1 re-fetch. 
2462
    IX1_BHT_WE(1) <= IX1_BHT_PWE and not(IX1_BJX0) and not(IX1_B2BAC);
2463
 
2464
    -- branch-2-branch address conflict flag (an even-even, or
2465
    -- odd-odd, branch pair can't be handled by BHT update logic)
2466
    IX1_B2BAC <= (IX1_BHT_WE(0) and IX1_BHT_PWE) when
2467
      (ID_PC_q(0)(2) = ID_PC_q(1)(2)) else '0';
2468
 
2469
  end generate; -- GPX_X1_6_1
2470
 
2471
  GPX_X1_6_0 : if(PARALLEL_EXECUTION_ENABLED = '0') generate
2472
 
2473
  IX1_BJX1 <= '0';
2474
  IX1_BJTA1 <= (others => '0');
2475
  IX1_BHT_WE(1) <= '0';
2476
  IX1_BHT_TA(1) <= (others => '0');
2477
  IX1_BHT_CNT1 <= (others => '0');
2478
  IX1_B2BAC <= '0';
2479
 
2480
  end generate; -- GPX_X1_6_0
2481
 
2482
  end generate;
2483
 
2484
  -- Branch/Jump eXecute flag
2485
  IX1_BJX <= IX1_BJX0 or IX1_BJX1;
2486
 
2487
  -- Branch/Jump target address mux (slot #0 takes
2488
  -- priority because it holds oldest instruction).
2489
 
2490
  IX1_BJTA <= IX1_BJTA0 when (
2491
    IX1_BJX0 = '1' or PARALLEL_EXECUTION_ENABLED = '0'
2492
  ) else IX1_BJTA1;
2493
 
2494
  -- Instruction valid flags
2495
 
2496
  -- IX1 slot #0 valid flag is just a copy of ID one.
2497
  IX1_V(0) <= ID_V_q(0) and not(IX2_BJX);
2498
 
2499
  -- IX1 slot #1 valid flag must be cleared if there's
2500
  -- a jump or taken branch in slot #0.
2501
  IX1_V(1) <= ID_V_q(1) and not(IX2_BJX);
2502
 
2503
  -- Load/Store logic
2504
 
2505
  U_LSU0 : RV01_LSU
2506
    port map(
2507
      CLK_i => CLK_i,
2508
      RST_i => IRST,
2509
      IV_i => ID_V_q(0),
2510
      LS_OP_i => ID_INSTR_q(0).LS_OP,
2511
      SU_i => ID_INSTR_q(0).SU,
2512
      OPA_i => ID_OPA0_q,
2513
      OPB_i => ID_OPB0_q,
2514
      IMM_i => ID_INSTR_q(0).IMM,
2515
      LDAT_i => DDAT0_i,
2516
 
2517
      RE_o => DRE_o(0),
2518
      WE_o => IX1_PDWE(0),
2519
      MALGN_o => IX1_MALGN(0),
2520
      ADR_o => IX1_DADR0,
2521
      SBE_o => IX1_DBE0,
2522
      SDAT_o => IX1_DDATO0,
2523
      LDATV_o => IX3_LDAT0_V,
2524
      LDAT_o => IX3_LDAT0
2525
    );
2526
 
2527
  GPX_X1_7_1 : if(PARALLEL_EXECUTION_ENABLED = '1') generate
2528
 
2529
  U_LSU1 : RV01_LSU
2530
    port map(
2531
      CLK_i => CLK_i,
2532
      RST_i => IRST,
2533
      IV_i => ID_V_q(1),
2534
      LS_OP_i => ID_INSTR_q(1).LS_OP,
2535
      SU_i => ID_INSTR_q(1).SU,
2536
      OPA_i => ID_OPA1_q,
2537
      OPB_i => ID_OPB1_q,
2538
      IMM_i => ID_INSTR_q(1).IMM,
2539
      LDAT_i => DDAT1_i,
2540
 
2541
      RE_o => DRE_o(1),
2542
      WE_o => IX1_PDWE(1),
2543
      MALGN_o => IX1_MALGN(1),
2544
      ADR_o => IX1_DADR1,
2545
      SBE_o => IX1_DBE1,
2546
      SDAT_o => IX1_DDATO1,
2547
      LDATV_o => IX3_LDAT1_V,
2548
      LDAT_o => IX3_LDAT1
2549
    );
2550
 
2551
  end generate; -- GPX_X1_7_1
2552
 
2553
  GPX_X1_7_0 : if(PARALLEL_EXECUTION_ENABLED = '0') generate
2554
 
2555
  DRE_o(1) <= '0';
2556
  IX1_PDWE(1) <= '0';
2557
  IX1_MALGN(1) <= '0';
2558
  IX1_DADR1 <= (others => '0');
2559
  IX1_DBE1 <= (others => '0');
2560
  IX1_DDATO1 <= (others => '0');
2561
  IX3_LDAT1_V <= '0';
2562
  IX3_LDAT1 <= (others => '0');
2563
 
2564
  end generate; -- GPX_X1_7_0
2565
 
2566
  -- Slot #1 DWE must be cleared if there's
2567
  -- a jump or taken branch in slot #0.
2568
 
2569
  IX1_DWE(0) <= IX1_PDWE(0) and not(IX2_BJX);
2570
  IX1_DWE(1) <= IX1_PDWE(1) and not(IX2_BJX);
2571
 
2572
  -- "Kill Top Store" flag (remove an invalidated
2573
  -- store from store buffer).
2574
 
2575
  IX1_KTS <= IX1_PDWE(1) and IX1_BJX0 and not(IX2_BJX);
2576
 
2577
  -- Data address virtual to address translation
2578
 
2579
  IX1_PDADR0 <= IX1_DADR0 - IMEM_SIZE*4;
2580
  IX1_PDADR1 <= IX1_DADR1 - IMEM_SIZE*4;
2581
  IX1_PDIADR0 <= IX1_DADR0;
2582
  IX1_PDIADR1 <= IX1_DADR1;
2583
  IX3_PDADR0 <= IX3_DADR0 - IMEM_SIZE*4;
2584
  IX3_PDIADR0 <= IX3_DADR0;
2585
 
2586
  DADR0_o <= IX3_PDADR0 when(IX3_DWE = '1') else IX1_PDADR0;
2587
  DADR1_o <= IX1_PDADR1;
2588
 
2589
  DIADR0_o <= IX3_PDIADR0 when(IX3_DWE = '1') else IX1_PDIADR0;
2590
  DIADR1_o <= IX1_PDIADR1;
2591
 
2592
  -- Data/Instructions memory selection logic
2593
 
2594
  U_DIMSLOG : RV01_DIMSLOG
2595
    generic map(
2596
      IMEM_LOWM => IMEM_LOWM,
2597
      IMEM_SIZE => IMEM_SIZE,
2598
      DMEM_SIZE => DMEM_SIZE
2599
    )
2600
    port map(
2601
      IX1_OPA0_i => ID_OPA0_q,
2602
      IX1_OPA1_i => ID_OPA1_q,
2603
      IX1_IMM0_i => ID_INSTR_q(0).IMM,
2604
      IX1_IMM1_i => ID_INSTR_q(1).IMM,
2605
      IX1_DADR0_i => IX1_DADR0,
2606
      IX1_DADR1_i => IX1_DADR1,
2607
      IX3_DADR0_i => IX3_DADR0,
2608
 
2609
      IX1_DIMS_o => IX1_DIMS,
2610
      IX3_DIMS_o => IX3_DIMS
2611
  );
2612
 
2613
  -- When a store is committed, its address and the related
2614
  -- memory selection flag value must be forced on DADR0_o
2615
  -- and DIMS_o(0). 
2616
 
2617
  DIMS_o(0) <= IX3_DIMS when (IX3_DWE = '1') else IX1_DIMS(0);
2618
  DIMS_o(1) <= IX1_DIMS(1) and PARALLEL_EXECUTION_ENABLED;
2619
 
2620
  -- Memory interface signals
2621
 
2622
  DBE_o <= IX3_DBE;
2623
  DWE0_o <= IX3_DWE;
2624
  DDAT0_o <= IX3_SDATO;
2625
 
2626
  -- Store buffer
2627
 
2628
  U_SBUF : RV01_SBUF_2W
2629
    generic map(
2630
      NW => NW,
2631
      DEPTH => 16,
2632
      SIMULATION_ONLY => SIMULATION_ONLY
2633
    )
2634
    port map(
2635
      CLK_i => CLK_i,
2636
      RST_i => IRST,
2637
      CLRB_i => IX3_CLRP,
2638
      KTS_i => IX1_KTS_q,
2639
      RE_i => IX3_SBRE,
2640
      WE_i => IX1_DWE,
2641
      BE0_i => IX1_DBE0,
2642
      BE1_i => IX1_DBE1,
2643
      D0_i => IX1_DDATO0,
2644
      D1_i => IX1_DDATO1,
2645
      IX1_V_i => ID_V_q,
2646
      LS_OP0_i => ID_INSTR_q(0).LS_OP,
2647
      LS_OP1_i => ID_INSTR_q(1).LS_OP,
2648
      DADR0_i => IX1_DADR0,
2649
      DADR1_i => IX1_DADR1,
2650
      SADR0_i => IX2_DADR0_q,
2651
      SADR1_i => IX2_DADR1_q,
2652
 
2653
      BF_o => IX1_SBF,
2654
      NOPR_o => IX1_NOPR,
2655
      S2LAC_o => IX1_S2LAC,
2656
      WE_o => IX3_DWE,
2657
      LS_OP_o => IX3_LS_OP,
2658
      BE_o => IX3_DBE,
2659
      Q_o => IX3_SDATO,
2660
      SADR_o => IX3_DADR0
2661
    );
2662
 
2663
  -- Divider support logic
2664
 
2665
  U_DIVLOG:  RV01_DIVLOG
2666
    port map(
2667
      V_i => IX1_V(0), --ID_V_q(0),
2668
      INSTR_i => ID_INSTR_q(0),
2669
      DIV_V_i => IX1_DIV_V,
2670
 
2671
      DIV_STRT_o => IX1_DIV_STRT,
2672
      DIV_QS_o => IX1_DIV_QS,
2673
      DIV_CLRV_o => IX1_DIV_CLRV
2674
    );
2675
 
2676
  -- Divider unit
2677
 
2678
  U_DIV : RV01_DIVIDER_R2
2679
    port map(
2680
      CLK_i => CLK_i,
2681
      RST_i => IRST,
2682
      STRT_i => IX1_DIV_STRT,
2683
      SU_i => ID_INSTR_q(0).SU,
2684
      QS_i => IX1_DIV_QS,
2685
      DD_i => ID_OPA0_q,
2686
      DR_i => ID_OPB0_q,
2687
      CLRD_i => IX3_CLRD,
2688
      CLRV_i => IX1_DIV_CLRV,
2689
 
2690
      Q_o => IX1_DIV_RES,
2691
      QV_o => IX1_DIV_V,
2692
      BSY_o => ID_DIV_BSY
2693
    );
2694
 
2695
  -- Exception processing
2696
 
2697
  U_EXCPLX1 : RV01_EXCPLOG_IX1
2698
    generic map(
2699
      NW => NW
2700
    )
2701
    port map(
2702
      INSTR_i => ID_INSTR_q,
2703
      MALGN_i => IX1_MALGN,
2704
      S2LAC_i => IX1_S2LAC,
2705
      B2BAC_i => IX1_B2BAC,
2706
      DIV_V_i => IX1_DIV_V,
2707
      IDADR_CFLT_i => IDADR_CFLT_i,
2708
 
2709
      PSLP_o => IX1_PSLP,
2710
      INSTR_o => IX1_INSTR
2711
    );
2712
 
2713
  -- Pipeline Registers
2714
 
2715
  process(CLK_i)
2716
  begin
2717
    if(CLK_i = '1' and CLK_i'event) then
2718
      if(IRST = '1' or IX3_CLRP = '1') then
2719
        IX1_V_q <= "00";
2720
        IX1_BJX0_q <= '0';
2721
        IX1_BJX1_q <= '0';
2722
        IX1_KTS_q <= '0';
2723
      else
2724
        IX1_V_q(0) <= IX1_V(0);
2725
        IX1_V_q(1) <= IX1_V(1) and not(IX1_PSLP);
2726
        IX1_BJX0_q <= IX1_BJX0;
2727
        IX1_BJX1_q <= IX1_BJX1;
2728
        IX1_KTS_q <= IX1_KTS;
2729
      end if;
2730
        IX1_INSTR_q(0) <= IX1_INSTR(0);
2731
        IX1_FWDE_q(0) <= ID_FWDE_q(0);
2732
        IX1_FWDX_q(0) <= IX1_FWDX(0);
2733
        IX1_PC0P4_q <= IX1_PC0P4;
2734
        IX1_PC0_q <= ID_PC_q(0);
2735
        IX1_DADR0_q <= IX1_DADR0;
2736
        IX1_DWE_q <= IX1_DWE and not('0' & IX1_KTS);
2737
        IX1_DRD0_q <= IX1_DRD0;
2738
        IX1_DRD0_V_q <= IX1_DRD0_V;
2739
        IX1_INSTR_q(1) <= IX1_INSTR(1);
2740
        IX1_FWDE_q(1) <= ID_FWDE_q(1);
2741
        IX1_FWDX_q(1) <= IX1_FWDX(1);
2742
        IX1_PC1P4_q <= IX1_PC1P4;
2743
        IX1_PC1_q <= ID_PC_q(1);
2744
        IX1_DADR1_q <= IX1_DADR1;
2745
        IX1_DRD1_q <= IX1_DRD1;
2746
        IX1_DRD1_V_q <= IX1_DRD1_V;
2747
        IX1_BJTA0_q <= IX1_BJTA0;
2748
        IX1_BJTA1_q <= IX1_BJTA1;
2749
    end if;
2750
  end process;
2751
 
2752
  ----------------------------------------------------
2753
  -- Store Checker & Log File Generator
2754
  ----------------------------------------------------
2755
 
2756
  -- synthesis translate_off
2757
 
2758
  G_ST : if(SIMULATION_ONLY = '1') generate
2759
 
2760
  U_STCHK : RV01_ST_CHECKER
2761
    generic map(
2762
      ST_FILENAME => ST_FILENAME
2763
    )
2764
    port map(
2765
      CLK_i => CLK_i,
2766
      ENB_i => CHK_ENB_i,
2767
      LS_OP_i => IX3_LS_OP,
2768
      DWE_i => IX3_DWE,
2769
      BE_i => IX3_DBE,
2770
      DADR_i => IX3_DADR0,
2771
      DDATO_i => IX3_SDATO
2772
    );
2773
 
2774
  end generate;
2775
 
2776
  -- synthesis translate_on
2777
 
2778
  ----------------------------------------------------
2779
  -- IX2 Stage
2780
  ----------------------------------------------------
2781
 
2782
  -- In stage IX2 results from pipe #0 A and B 
2783
  -- sub-pipes get merged, making all result available
2784
  -- for forwarding.
2785
 
2786
  -- FWDE(n) signal flags that instruction in slot #n
2787
  -- belong to subset enabled to forward results, while
2788
  -- FWDX(n) signal flags that instruction in slot #n
2789
  -- has a result ready for forwarding (i.e. generated
2790
  -- from valid operands).
2791
 
2792
  -- pipe #0 carries also pipe-B instructions which
2793
  -- have FWDE(0) set to zero, but are allowed to
2794
  -- forward results from IX3 stage.
2795
 
2796
  -- Branch/Jump eXecute flag
2797
  IX2_BJX <=
2798
    (IX1_BJX0_q and IX1_V_q(0)) or
2799
    (IX1_BJX1_q and IX1_V_q(1));
2800
 
2801
  -- Branch/Jump target address mux (slot #0 takes
2802
  -- priority because it holds oldest instruction).
2803
 
2804
  IX2_BJTA <= IX1_BJTA0_q when (
2805
    (IX1_BJX0_q = '1' and IX1_V_q(0) = '1') or PARALLEL_EXECUTION_ENABLED = '0'
2806
  ) else IX1_BJTA1_q;
2807
 
2808
  GDX2_1 : if(DELAYED_EXECUTION_ENABLED = '1') generate
2809
 
2810
   U_PA0ALU_X2: RV01_PIPE_A_ALU
2811
    port map(
2812
      SEL_i => IX1_PASEL0_q,
2813
      SU_i => IX1_INSTR_q(0).SU,
2814
      OP_i => IX1_INSTR_q(0).ALU_OP,
2815
      OPA_i => IX1_OPA0_q,
2816
      OPB_i => IX1_OPB0_q,
2817
 
2818
      RES_o => IX2_PA0_ALU_RES
2819
    );
2820
 
2821
  GPX_X2_0_1 : if(PARALLEL_EXECUTION_ENABLED = '1') generate
2822
 
2823
  U_PA1ALU_X2: RV01_PIPE_A_ALU
2824
    port map(
2825
      SEL_i => IX1_PASEL1_q,
2826
      SU_i => IX1_INSTR_q(1).SU,
2827
      OP_i => IX1_INSTR_q(1).ALU_OP,
2828
      OPA_i => IX1_OPA1_q,
2829
      OPB_i => IX1_OPB1_q,
2830
 
2831
      RES_o => IX2_PA1_ALU_RES
2832
    );
2833
 
2834
  end generate; -- GPX_X2_0_1
2835
 
2836
  process(CLK_i)
2837
  begin
2838
    if(CLK_i = '1' and CLK_i'event) then
2839
      IX2_OPA0_q <= IX2_OPA0;
2840
      IX2_OPB0_q <= IX2_OPB0;
2841
      IX2_OPA1_q <= IX2_OPA1;
2842
      IX2_OPB1_q <= IX2_OPB1;
2843
    end if;
2844
  end process;
2845
 
2846
  end generate; -- GDX2_1  
2847
 
2848
  U_RMX2 : RV01_RESMUX_IX2
2849
    generic map(
2850
      PXE => PARALLEL_EXECUTION_ENABLED,
2851
      DXE => DELAYED_EXECUTION_ENABLED,
2852
      NW => NW
2853
    )
2854
    port map(
2855
      OPA0_V_i => IX1_OPA0_V_q,
2856
      OPA1_V_i => IX1_OPA1_V_q,
2857
      OPA0_i => IX1_OPA0_q,
2858
      OPA1_i => IX1_OPA1_q,
2859
      OPB0_V_i => IX1_OPB0_V_q,
2860
      OPB1_V_i => IX1_OPB1_V_q,
2861
      OPB0_i => IX1_OPB0_q,
2862
      OPB1_i => IX1_OPB1_q,
2863
      DRD0_V_i => IX1_DRD0_V_q,
2864
      DRD1_V_i => IX1_DRD1_V_q,
2865
      DRD0_i => IX1_DRD0_q,
2866
      DRD1_i => IX1_DRD1_q,
2867
      DDAT0_i => DDAT0_i,
2868
      DDAT1_i => DDAT1_i,
2869
      PA0_ALU_RES_i => IX2_PA0_ALU_RES,
2870
      PA1_ALU_RES_i => IX2_PA1_ALU_RES,
2871
      PB0_RES_i => IX2_PB0_RES,
2872
      PC1P4_i => IX1_PC1P4_q,
2873
      PASEL0_i => IX1_PASEL0_q,
2874
      PASEL1_i => IX1_PASEL1_q,
2875
      FWDE_i => IX1_FWDE_q,
2876
      INSTR_i => IX1_INSTR_q,
2877
      IX3_DRD0_i => IX3_DRD0,
2878
      IX3_DRD1_i => IX3_DRD1,
2879
      IX3_V_i => IX2_V_q,
2880
      IX3_INSTR_i => IX2_INSTR_q,
2881
 
2882
      FWDX_o => IX2_FWDX,
2883
      PA0_RES_o => IX2_PA0_RES,
2884
      PA1_RES_o => IX2_PA1_RES,
2885
      OPA0_V_o => IX2_OPA0_V,
2886
      OPA1_V_o => IX2_OPA1_V,
2887
      OPA0_o => IX2_OPA0,
2888
      OPA1_o => IX2_OPA1,
2889
      OPB0_V_o => IX2_OPB0_V,
2890
      OPB1_V_o => IX2_OPB1_V,
2891
      OPB0_o => IX2_OPB0,
2892
      OPB1_o => IX2_OPB1,
2893
      DRD0_o => IX2_DRD0,
2894
      DRD1_o => IX2_DRD1
2895
    );
2896
 
2897
  -- Exception processing: data address errors are
2898
  -- detected by memory sub-system and reported
2899
  -- using DADR*_ERR_i.
2900
 
2901
  IX2_V_BJX(0) <= IX1_V_q(0);
2902
  IX2_V_BJX(1) <= IX1_V_q(1) and not(IX1_BJX0_q);
2903
 
2904
  U_EXCPLX2 : RV01_EXCPLOG_IX2
2905
    generic map(
2906
      NW => NW
2907
    )
2908
    port map(
2909
      V_i => IX2_V_BJX, --IX1_V_q,
2910
      INSTR_i => IX1_INSTR_q,
2911
      PC0_i => IX1_PC0_q,
2912
      PC1_i => IX1_PC1_q,
2913
      DADR0_i => IX1_DADR0_q,
2914
      DADR1_i => IX1_DADR1_q,
2915
      HALT_i => IX2_HALT,
2916
      RSM_i => WB_RSM,
2917
      DRSM_i => WB_DRSM,
2918
      EXT_INT_i => EXT_INT_i,
2919
      SFT_INT_i => WB_SFT_INT,
2920
      TMR_INT_i => WB_TMR_INT,
2921
      ETVA_i => WB_ETVA,
2922
      MEPC_i => WB_MEPC,
2923
      DADR0_ERR_i => DADR0_ERR_i,
2924
      DADR1_ERR_i => DADR1_ERR_i,
2925
      CSR_ILLG_i => IX2_ILLG,
2926
      IE_i => WB_IE,
2927
      STEP_i => IX2_STEP,
2928
 
2929
      V_o => IX2_V,
2930
      EV_o => IX2_EV,
2931
      INSTR_o => IX2_INSTR,
2932
      EERTA_o => IX2_EERTA
2933
    );
2934
 
2935
  GDM0_1 : if (DM_PRESENT = '1') generate
2936
 
2937
  -- Debug logic
2938
 
2939
  UDBGLOGX2 : RV01_DBGLOG_IX2
2940
    generic map(
2941
      NW => NW
2942
    )
2943
    port map(
2944
      CLK_i => CLK_i,
2945
      RST_i => IRST,
2946
      V_i => IX1_V_q,
2947
      IMNMC0_i => IX1_INSTR_q(0).IMNMC,
2948
      RFTCH0_i => IX1_INSTR_q(0).RFTCH,
2949
      STEP_i => WB_DSTEP,
2950
      HOBRK_i => WB_DHOBRK,
2951
      HRQ_i => WB_DHLTRQ,
2952
 
2953
      STEP_o => IX2_STEP,
2954
      HALT_o => IX2_HALT,
2955
      HIS_o => IX2_HIS
2956
    );
2957
 
2958
  end generate;
2959
 
2960
  GDM0_0 : if (DM_PRESENT = '0') generate
2961
 
2962
  -- Halting logic
2963
 
2964
  UHLTLOGX2:  RV01_HLTLOG_IX2
2965
    generic map(
2966
      NW => NW
2967
    )
2968
    port map(
2969
      V_i => IX1_V_q,
2970
      IMNMC0_i => IX1_INSTR_q(0).IMNMC,
2971
      PC0_i => IX1_PC0_q,
2972
      PC1_i => IX1_PC1_q,
2973
      HOBRK_i => WB_HLTOBRK,
2974
      HOADR_i => WB_HLTOADR,
2975
      HADR_i => WB_HLTADR,
2976
      HRQ_i => WB_HLTURQ,
2977
 
2978
      HALT_o => IX2_HALT,
2979
      HIS_o => IX2_HIS
2980
    );
2981
 
2982
  IX2_STEP <= '0';
2983
 
2984
  end generate;
2985
 
2986
  -- Pipeline Registers
2987
 
2988
  process(CLK_i)
2989
  begin
2990
    if(CLK_i = '1' and CLK_i'event) then
2991
      if(IRST = '1') then
2992
        IX2_V_q <= "00";
2993
        IX2_EV_q <= "00";
2994
      else
2995
        if(IX3_STL(0) = '0') then
2996
          IX2_V_q(0) <= IX2_V(0) and not(IX3_CLRP);
2997
          IX2_EV_q(0) <= IX2_EV(0) and not(IX3_CLRP);
2998
        end if;
2999
        if(IX3_STL(1) = '0') then
3000
          IX2_V_q(1) <= IX2_V(1) and not(IX3_CLRP);
3001
          IX2_EV_q(1) <= IX2_EV(1) and not(IX3_CLRP);
3002
        end if;
3003
      end if;
3004
      if(IRST = '1') then
3005
        IX2_DWE_q <= "00";
3006
        IX2_HALT_q <= "00";
3007
      elsif(IX3_STL(0) = '0') then
3008
        IX2_INSTR_q(0) <= IX2_INSTR(0);
3009
        IX2_PC0_q <= IX1_PC0_q;
3010
        IX2_FWDE_q(0) <= IX1_FWDE_q(0);
3011
        IX2_FWDX_q(0) <= IX2_FWDX(0);
3012
        IX2_DRD0_q <= IX2_DRD0;
3013
        IX2_DADR0_q <= IX1_DADR0_q;
3014
        IX2_CSRU_RES_q <= IX2_CSRU_RES;
3015
        IX2_DWE_q(0) <= IX1_DWE_q(0);
3016
        IX2_HALT_q(0) <= IX2_HALT(0) and not(IX3_CLRP);
3017
        IX2_PASEL1_q <= IX1_PASEL1_q;
3018
      end if;
3019
      if(IX3_STL(1) = '0') then
3020
        IX2_INSTR_q(1) <= IX2_INSTR(1);
3021
        IX2_PC1_q <= IX1_PC1_q;
3022
        IX2_FWDE_q(1) <= IX1_FWDE_q(1);
3023
        IX2_FWDX_q(1) <= IX2_FWDX(1);
3024
        IX2_DRD1_q <= IX2_DRD1;
3025
        IX2_DADR1_q <= IX1_DADR1_q;
3026
        IX2_DWE_q(1) <= IX1_DWE_q(1);
3027
        IX2_HALT_q(1) <= IX2_HALT(1) and not(IX3_CLRP);
3028
        IX2_PASEL0_q <= IX1_PASEL0_q;
3029
      end if;
3030
      if(IX3_STL = "00") then
3031
        IX2_EERTA_q <= IX2_EERTA;
3032
      end if;
3033
      IX2_HIS_q <= IX2_HIS;
3034
      IX2_PC0P4_q <= IX1_PC0P4_q;
3035
      IX2_PC1P4_q <= IX1_PC1P4_q;
3036
    end if;
3037
  end process;
3038
 
3039
  ----------------------------------------------------
3040
  -- IX3 Stage
3041
  ----------------------------------------------------
3042
 
3043
  -- Stage IX3 is used to perform data alignment operations
3044
  -- for LB* and LH* instructions and for exception 
3045
  -- processing.
3046
 
3047
  GDX3_1 : if(DELAYED_EXECUTION_ENABLED = '1') generate
3048
 
3049
  U_PA0ALU_X3: RV01_PIPE_A_ALU
3050
    port map(
3051
      SEL_i => IX2_PASEL0_q,
3052
      SU_i => IX2_INSTR_q(0).SU,
3053
      OP_i => IX2_INSTR_q(0).ALU_OP,
3054
      OPA_i => IX2_OPA0_q,
3055
      OPB_i => IX2_OPB0_q,
3056
 
3057
      RES_o => IX3_PA0_ALU_RES
3058
    );
3059
 
3060
  GPX_X3_0_1 : if(PARALLEL_EXECUTION_ENABLED = '1') generate
3061
 
3062
  U_PA1ALU_X3: RV01_PIPE_A_ALU
3063
    port map(
3064
      SEL_i => IX2_PASEL1_q,
3065
      SU_i => IX2_INSTR_q(1).SU,
3066
      OP_i => IX2_INSTR_q(1).ALU_OP,
3067
      OPA_i => IX2_OPA1_q,
3068
      OPB_i => IX2_OPB1_q,
3069
 
3070
      RES_o => IX3_PA1_ALU_RES
3071
    );
3072
 
3073
  end generate; -- GPX_X3_0_1
3074
 
3075
  end generate;
3076
 
3077
  -- Result mux
3078
 
3079
  U_RMX3: RV01_RESMUX_IX3
3080
    generic map(
3081
      PXE => PARALLEL_EXECUTION_ENABLED,
3082
      DXE => DELAYED_EXECUTION_ENABLED,
3083
      NW => NW
3084
    )
3085
    port map(
3086
      DRD0_i => IX2_DRD0_q,
3087
      DRD1_i => IX2_DRD1_q,
3088
      PA0_ALU_RES_i => IX3_PA0_ALU_RES,
3089
      PA1_ALU_RES_i => IX3_PA1_ALU_RES,
3090
      LDAT0_i => IX3_LDAT0,
3091
      LDAT1_i => IX3_LDAT1,
3092
      LDAT_V_i(0) => IX3_LDAT0_V,
3093
      LDAT_V_i(1) => IX3_LDAT1_V,
3094
      PASEL0_i => IX2_PASEL0_q,
3095
      PASEL1_i => IX2_PASEL1_q,
3096
      FWDE_i => IX2_FWDE_q,
3097
      RES_SRC0_i => IX2_INSTR_q(0).RES_SRC,
3098
      CSRU_RES_i => IX2_CSRU_RES_q,
3099
 
3100
      DRD0_o => IX3_DRD0,
3101
      DRD1_o => IX3_DRD1
3102
    );
3103
 
3104
  -- Exception logic
3105
 
3106
  U_EXCPLX3 : RV01_EXCPLOG_IX3
3107
    generic map(
3108
      NW => NW
3109
    )
3110
    port map(
3111
      V_i  => IX2_V_q,
3112
      EV_i  => IX2_EV_q,
3113
      INSTR_i  => IX2_INSTR_q,
3114
      PC0_i => IX2_PC0_q,
3115
      PC1_i => IX2_PC1_q,
3116
      DADR0_i => IX2_DADR0_q,
3117
      DADR1_i => IX2_DADR1_q,
3118
      HALT_i => IX3_HALT,
3119
      HIS_i => IX2_HIS_q,
3120
 
3121
      EXCP_o => IX3_EXCP,
3122
      ERET_o => IX3_ERET,
3123
      RFTCH_o => IX3_RFTCH,
3124
      KPRD_o => IX3_KPRD,
3125
      CLRP_o => IX3_CLRP_NOHLT,
3126
      CLRB_o => IX3_CLRB,
3127
      CLRD_o => IX3_CLRD_NOHLT,
3128
      EPC_o => IX3_EPC,
3129
      ECAUSE_o => IX3_ECAUSE,
3130
      EDADR_o => IX3_EDADR
3131
    );
3132
 
3133
  -- Miscellaneous logic
3134
 
3135
  U_MLOGX3 : RV01_MISCLOG_IX3
3136
    generic map(
3137
      PXE => PARALLEL_EXECUTION_ENABLED,
3138
      NW => NW
3139
    )
3140
    port map(
3141
      IX1_V0_i => ID_V_q(0),
3142
      IX1_WCSR0_i => ID_INSTR_q(0).WCSR,
3143
      V_i => IX2_V_q ,
3144
      DWE_i => IX2_DWE_q,
3145
      KPRD_i => IX3_KPRD,
3146
      WRD0_i => IX2_INSTR_q(0).WRD,
3147
      WRD1_i => IX2_INSTR_q(1).WRD,
3148
      HALT_i => IX2_HALT_q,
3149
      CLRP_i => IX3_CLRP_NOHLT,
3150
      CLRD_i => IX3_CLRD_NOHLT,
3151
      HIS_i => IX2_HIS_q,
3152
      PC0_i => IX2_PC0_q,
3153
      PC1_i => IX2_PC1_q,
3154
 
3155
      CP_WE_o => IX1_CP_WE,
3156
      SBRE_o => IX3_SBRE,
3157
      STL_o => IX3_STL,
3158
      WE_o => IX3_WE,
3159
      HALT_o => IX3_HALT,
3160
      CLRP_o => IX3_CLRP,
3161
      CLRD_o => IX3_CLRD,
3162
      HPC_o => IX3_HPC
3163
    );
3164
 
3165
  ----------------------------------------------------
3166
  -- WB Stage
3167
  ----------------------------------------------------
3168
 
3169
  -- Register File
3170
 
3171
  U_REGF : RV01_REGFILE_32X32_2W
3172
    port map(
3173
      CLK_i => CLK_i,
3174
      RA0_i => IF2_DEC_INSTR_q(0).RS1,
3175
      RA1_i => IF2_DEC_INSTR_q(0).RS2,
3176
      RA2_i => IF2_DEC_INSTR_q(1).RS1,
3177
      RA3_i => IF2_DEC_INSTR_q(1).RS2,
3178
      WA0_i => IX2_INSTR_q(0).RD,
3179
      WA1_i => IX2_INSTR_q(1).RD,
3180
      WE0_i => IX3_WE(0),
3181
      WE1_i => IX3_WE(1),
3182
      D0_i => to_std_logic_vector(IX3_DRD0),
3183
      D1_i => to_std_logic_vector(IX3_DRD1),
3184
 
3185
      Q0_o => WB_RDA0,
3186
      Q1_o => WB_RDB0,
3187
      Q2_o => WB_RDA1,
3188
      Q3_o => WB_RDB1
3189
    );
3190
 
3191
  -- CSR's management Unit
3192
 
3193
  U_CSRU : RV01_CSRU
3194
    generic map(
3195
      PXE => PARALLEL_EXECUTION_ENABLED,
3196
      FPU_PRESENT => FPU_PRESENT,
3197
      NW => NW
3198
    )
3199
    port map(
3200
      CLK_i => CLK_i,
3201
      RST_i => IRST,
3202
      IX1_V0_i => ID_V_q(0),
3203
      CS_OP_i => ID_INSTR_q(0).CS_OP,
3204
      RS1_i => ID_INSTR_q(0).RS1,
3205
      ADR_i => ID_INSTR_q(0).IMM(12-1 downto 0),
3206
      WE_i => IX1_CP_WE,
3207
      CSRD_i => ID_OPA0_q,
3208
      EXCP_i => IX3_EXCP,
3209
      EPC_i => IX3_EPC,
3210
      ECAUSE_i => IX3_ECAUSE,
3211
      EBADR_i => IX3_EDADR,
3212
      ERET_i => IX3_ERET,
3213
      IX3_V_i => IX2_V_q,
3214
      NOPR_i => IX1_NOPR,
3215
      HALT_i => IX2_HALT(0),
3216
      STOPCYCLE_i => WB_STOPCYCLE,
3217
      STOPTIME_i => WB_STOPTIME,
3218
      MFROMHOST_WE_i => MFROMHOST_WE_i,
3219
      MFROMHOST_i => MFROMHOST_i,
3220
      DMODE_i => WB_DMODE,
3221
      DIE_i => WB_DIE,
3222
      CPRE_i => CP_RE_i,
3223
      CPWE_i => CP_WE_i,
3224
      CPADR_i => CP_ADR_i,
3225
      CPD_i => CP_D_i,
3226
 
3227
      PXE_o => WB_PXE,
3228
      MSTATUS_o => WB_MSTATUS,
3229
      MEPC_o => WB_MEPC,
3230
      MBASE_o => WB_MBASE,
3231
      MBOUND_o => WB_MBOUND,
3232
      MIBASE_o => WB_MIBASE,
3233
      MIBOUND_o => WB_MIBOUND,
3234
      MDBASE_o => WB_MDBASE,
3235
      MDBOUND_o => WB_MDBOUND,
3236
      ETVA_o => WB_ETVA,
3237
      MTOHOST_o => MTOHOST_o,
3238
      MTOHOST_OE_o => MTOHOST_OE_o,
3239
      ILLG_o => WB_ILLG,
3240
      SFT_INT_o => WB_SFT_INT,
3241
      TMR_INT_o => WB_TMR_INT,
3242
      FFLAGS_o => WB_FFLAGS,
3243
      FRM_o => WB_FRM,
3244
      IE_o => WB_IE,
3245
      CSRQ_o => WB_CSRQ,
3246
      -- Control port
3247
      CPQ_o => WB_CPQ
3248
    );
3249
 
3250
  WB_MMODE <= '1' when (
3251
    WB_MSTATUS(2 downto 1) = "11"
3252
  ) else '0';
3253
 
3254
  -- Debug module
3255
 
3256
  GDM1_1 : if(DM_PRESENT = '1') generate
3257
 
3258
  -- Debug module
3259
 
3260
  U_DBGU : RV01_DBGU
3261
    generic map(
3262
      NW => 2
3263
    )
3264
    port map(
3265
      CLK_i => CLK_i,
3266
      RST_i => RST_i, -- pay attention!
3267
      HPC_i => IX3_HPC, --IX3_DHPC,
3268
      MMODE_i => WB_MMODE,
3269
      NOPR_i => IX1_NOPR,
3270
      HALT_i => IX3_HALT, --IX3_DHALT,
3271
      CPRE_i => CP_RE_i,
3272
      CPWE_i => CP_WE_i,
3273
      CPADR_i => CP_ADR_i,
3274
      CPD_i => CP_D_i,
3275
 
3276
      RST_o => WB_DRST,
3277
      HLTRQ_o => WB_DHLTRQ,
3278
      RSM_o => WB_DRSM,
3279
      DPC_o => WB_DPC,
3280
      DMODE_o => WB_DMODE,
3281
      DIE_o => WB_DIE,
3282
      HALTD_o => WB_HALTD,
3283
      STOPTIME_o => WB_STOPTIME,
3284
      STOPCYCLE_o => WB_STOPCYCLE,
3285
      SI_o => WB_DSI,
3286
      HOBRK_o => WB_DHOBRK,
3287
      STEP_o => WB_DSTEP,
3288
      FRCSI_o => WB_DFRCSI,
3289
      CPQ_o => WB_DCPQ
3290
    );
3291
 
3292
  -- Halt module (disabled)
3293
 
3294
  WB_HALTD <= '0';
3295
  WB_STRT <= '0';
3296
  WB_STRTPC <= (others => '0');
3297
  WB_RSM <= '0';
3298
  WB_HLTURQ <= '0';
3299
  WB_HLTOBRK <= '0';
3300
  WB_HLTOADR<= (others => '0');
3301
  WB_HLTADR <= (others => '0');
3302
  WB_HCSRQ <= (others => '0');
3303
  WB_HCSR <= '0';
3304
  WB_HILLG <= '0';
3305
  WB_HCP <= '0';
3306
  WB_HCPQ <= (others => '0');
3307
 
3308
  end generate;
3309
 
3310
  GDM1_0 : if(DM_PRESENT = '0') generate
3311
 
3312
  -- Debug module  (disabled)
3313
 
3314
  WB_DRST <= '0';
3315
  WB_DHLTRQ <= '0';
3316
  WB_DRSM <= '0';
3317
  WB_DPC <= (others => '0');
3318
  WB_DMODE <= '0';
3319
  WB_DIE <= '1';
3320
  WB_STOPTIME <= '0';
3321
  WB_STOPCYCLE <= '0';
3322
  WB_DSI <= (others => '0');
3323
  WB_DHOBRK <= '0';
3324
  WB_DSTEP <= '0';
3325
  WB_DFRCSI <= '0';
3326
  WB_DCPQ <= (others => '0');
3327
 
3328
  -- Halt module
3329
 
3330
  U_HLTU : RV01_HLTU
3331
    generic map(
3332
      PXE => PARALLEL_EXECUTION_ENABLED,
3333
      NW => NW
3334
    )
3335
    port map(
3336
      CLK_i => CLK_i,
3337
      RST_i => IRST,
3338
      IX1_V_i => ID_V_q,
3339
      IX2_V_i => IX1_V_q,
3340
      NOPR_i => IX1_NOPR,
3341
      MMODE_i => WB_MMODE,
3342
      HALT_i => IX3_HALT,
3343
      HPC_i => IX3_HPC,
3344
      CS_OP_i => ID_INSTR_q(0).CS_OP,
3345
      RS1_i => ID_INSTR_q(0).RS1,
3346
      ADR_i => ID_INSTR_q(0).IMM(12-1 downto 0),
3347
      WE_i => IX1_CP_WE,
3348
      CSRD_i => ID_OPA0_q,
3349
      CPRE_i => CP_RE_i,
3350
      CPWE_i => CP_WE_i,
3351
      CPADR_i => CP_ADR_i,
3352
      CPD_i => CP_D_i,
3353
 
3354
      HMODE_o => WB_HALTD,
3355
      STRT_o => WB_STRT,
3356
      STRTPC_o => WB_STRTPC,
3357
      RSM_o => WB_RSM,
3358
      HLTURQ_o => WB_HLTURQ,
3359
      HLTOBRK_o => WB_HLTOBRK,
3360
      HLTOADR_o => WB_HLTOADR,
3361
      HLTADR_o => WB_HLTADR,
3362
      CSRQ_o => WB_HCSRQ,
3363
      HCSR_o => WB_HCSR,
3364
      ILLG_o => WB_HILLG,
3365
      HCP_o => WB_HCP,
3366
      CPQ_o => WB_HCPQ
3367
    );
3368
 
3369
  end generate;
3370
 
3371
  -- Mux CSRU and HLTU/DBGU commmon output signals
3372
 
3373
  U_CDCOMUX : RV01_CDCOMUX
3374
    generic map(
3375
      DMP => DM_PRESENT
3376
    )
3377
    port map(
3378
      CLK_i => CLK_i,
3379
      HCSR_i => WB_HCSR,
3380
      HCSRQ_i => WB_HCSRQ,
3381
      CSRQ_i => WB_CSRQ,
3382
      HILLG_i => WB_HILLG,
3383
      ILLG_i => WB_ILLG,
3384
      CP_ADR_MSB_i => CP_ADR_i(16),
3385
      HCP_i => WB_HCP,
3386
      HCPQ_i => WB_HCPQ,
3387
      CPQ_i => WB_CPQ,
3388
      DCPQ_i => WB_DCPQ,
3389
      STRT_i => WB_STRT,
3390
      DRSM_i => WB_DRSM,
3391
      DPC_i => WB_DPC,
3392
      STRTPC_i => WB_STRTPC,
3393
 
3394
      ILLG_o => IX2_ILLG,
3395
      CSRU_RES_o => IX2_CSRU_RES,
3396
      CP_Q_o => CP_Q_o,
3397
      STRT_o => WB_XSTRT,
3398
      STRTPC_o => WB_XSTRTPC
3399
    );
3400
 
3401
  ----------------------------------------------------
3402
  -- Write-Back Checker
3403
  ----------------------------------------------------
3404
 
3405
  -- synthesis translate_off
3406
 
3407
  G_WB : if(SIMULATION_ONLY = '1') generate
3408
 
3409
  WB_CHK_ENB <= CHK_ENB_i and not(WB_DMODE);
3410
 
3411
  U_WBCHK : RV01_WB_CHECKER
3412
    generic map(
3413
      WB_FILENAME => WB_FILENAME
3414
    )
3415
    port map(
3416
      CLK_i => CLK_i,
3417
      ENB_i => WB_CHK_ENB,
3418
      WE0_i => IX3_WE(0),
3419
      WE1_i => IX3_WE(1),
3420
      IX_INSTR0_i => IX2_INSTR_q(0),
3421
      IX_INSTR1_i => IX2_INSTR_q(1),
3422
      IX_DRD0_i => IX3_DRD0,
3423
      IX_DRD1_i => IX3_DRD1
3424
    );
3425
 
3426
  end generate;
3427
 
3428
  -- synthesis translate_on
3429
 
3430
  ----------------------------------------------------
3431
  -- Statistics
3432
  ----------------------------------------------------
3433
 
3434
  -- synthesis translate_off
3435
 
3436
  G_STAT : if(SIMULATION_ONLY = '1') generate
3437
 
3438
  U_STAT : RV01_STATS
3439
    port map(
3440
      CLK_i => CLK_i,
3441
      RST_i => IRST,
3442
      ID_V_i => IF2_V_q,
3443
      ID_PS_i(0) => ID_PS(0),
3444
      ID_PS_i(1) => ID_PS(1),
3445
      ID_PXE1_i => ID_PXE1,
3446
      IX2_V_i => IX2_V_q,
3447
      STRT_i => STRT,
3448
      HALT_i => IX3_HALT
3449
    );
3450
 
3451
  end generate;
3452
 
3453
  -- synthesis translate_on
3454
 
3455
end ARC;

powered by: WebSVN 2.1.0

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