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 4

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

powered by: WebSVN 2.1.0

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