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

Subversion Repositories or1200_hp

[/] [or1200_hp/] [trunk/] [rtl/] [rtl_cm4/] [verilog/] [or1200_ctrl.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 tobil
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  OR1200's Instruction decode                                 ////
4
////                                                              ////
5
////  This file is part of the OpenRISC 1200 project              ////
6
////  http://www.opencores.org/cores/or1k/                        ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  Majority of instruction decoding is performed here.         ////
10
////                                                              ////
11
////  To Do:                                                      ////
12
////   - make it smaller and faster                               ////
13
////                                                              ////
14
////  Author(s):                                                  ////
15
////      - Damjan Lampret, lampret@opencores.org                 ////
16
////                                                              ////
17
//////////////////////////////////////////////////////////////////////
18
////                                                              ////
19
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
20
////                                                              ////
21
//// This source file may be used and distributed without         ////
22
//// restriction provided that this copyright statement is not    ////
23
//// removed from the file and that any derivative work contains  ////
24
//// the original copyright notice and the associated disclaimer. ////
25
////                                                              ////
26
//// This source file is free software; you can redistribute it   ////
27
//// and/or modify it under the terms of the GNU Lesser General   ////
28
//// Public License as published by the Free Software Foundation; ////
29
//// either version 2.1 of the License, or (at your option) any   ////
30
//// later version.                                               ////
31
////                                                              ////
32
//// This source is distributed in the hope that it will be       ////
33
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
34
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
35
//// PURPOSE.  See the GNU Lesser General Public License for more ////
36
//// details.                                                     ////
37
////                                                              ////
38
//// You should have received a copy of the GNU Lesser General    ////
39
//// Public License along with this source; if not, download it   ////
40
//// from http://www.opencores.org/lgpl.shtml                     ////
41
////                                                              ////
42
//////////////////////////////////////////////////////////////////////
43
//
44
// CVS Revision History
45
//
46
// $Log: not supported by cvs2svn $
47
// Revision 1.12  2005/01/07 09:31:07  andreje
48
// sign/zero extension for l.sfxxi instructions corrected
49
//
50
// Revision 1.11  2004/06/08 18:17:36  lampret
51
// Non-functional changes. Coding style fixes.
52
//
53
// Revision 1.10  2004/05/09 19:49:04  lampret
54
// Added some l.cust5 custom instructions as example
55
//
56
// Revision 1.9  2004/04/05 08:29:57  lampret
57
// Merged branch_qmem into main tree.
58
//
59
// Revision 1.8.4.1  2004/02/11 01:40:11  lampret
60
// preliminary HW breakpoints support in debug unit (by default disabled). To enable define OR1200_DU_HWBKPTS.
61
//
62
// Revision 1.8  2003/04/24 00:16:07  lampret
63
// No functional changes. Added defines to disable implementation of multiplier/MAC
64
//
65
// Revision 1.7  2002/09/07 05:42:02  lampret
66
// Added optional SR[CY]. Added define to enable additional (compare) flag modifiers. Defines are OR1200_IMPL_ADDC and OR1200_ADDITIONAL_FLAG_MODIFIERS.
67
//
68
// Revision 1.6  2002/03/29 15:16:54  lampret
69
// Some of the warnings fixed.
70
//
71
// Revision 1.5  2002/02/01 19:56:54  lampret
72
// Fixed combinational loops.
73
//
74
// Revision 1.4  2002/01/28 01:15:59  lampret
75
// Changed 'void' nop-ops instead of insn[0] to use insn[16]. Debug unit stalls the tick timer. Prepared new flag generation for add and and insns. Blocked DC/IC while they are turned off. Fixed I/D MMU SPRs layout except WAYs. TODO: smart IC invalidate, l.j 2 and TLB ways.
76
//
77
// Revision 1.3  2002/01/18 14:21:43  lampret
78
// Fixed 'the NPC single-step fix'.
79
//
80
// Revision 1.2  2002/01/14 06:18:22  lampret
81
// Fixed mem2reg bug in FAST implementation. Updated debug unit to work with new genpc/if.
82
//
83
// Revision 1.1  2002/01/03 08:16:15  lampret
84
// New prefixes for RTL files, prefixed module names. Updated cache controllers and MMUs.
85
//
86
// Revision 1.14  2001/11/30 18:59:17  simons
87
// force_dslot_fetch does not work -  allways zero.
88
//
89
// Revision 1.13  2001/11/20 18:46:15  simons
90
// Break point bug fixed
91
//
92
// Revision 1.12  2001/11/18 08:36:28  lampret
93
// For GDB changed single stepping and disabled trap exception.
94
//
95
// Revision 1.11  2001/11/13 10:02:21  lampret
96
// Added 'setpc'. Renamed some signals (except_flushpipe into flushpipe etc)
97
//
98
// Revision 1.10  2001/11/12 01:45:40  lampret
99
// Moved flag bit into SR. Changed RF enable from constant enable to dynamic enable for read ports.
100
//
101
// Revision 1.9  2001/11/10 03:43:57  lampret
102
// Fixed exceptions.
103
//
104
// Revision 1.8  2001/10/21 17:57:16  lampret
105
// Removed params from generic_XX.v. Added translate_off/on in sprs.v and id.v. Removed spr_addr from dc.v and ic.v. Fixed CR+LF.
106
//
107
// Revision 1.7  2001/10/14 13:12:09  lampret
108
// MP3 version.
109
//
110
// Revision 1.1.1.1  2001/10/06 10:18:36  igorm
111
// no message
112
//
113
// Revision 1.2  2001/08/13 03:36:20  lampret
114
// Added cfg regs. Moved all defines into one defines.v file. More cleanup.
115
//
116
// Revision 1.1  2001/08/09 13:39:33  lampret
117
// Major clean-up.
118
//
119
//
120
 
121
// synopsys translate_off
122
`include "timescale.v"
123
// synopsys translate_on
124
`include "or1200_defines.v"
125
 
126
module or1200_ctrl_cm4(
127
                clk_i_cml_1,
128
                clk_i_cml_2,
129
                clk_i_cml_3,
130
 
131
        // Clock and reset
132
        clk, rst,
133
 
134
        // Internal i/f
135
        id_freeze, ex_freeze, wb_freeze, flushpipe, if_insn, ex_insn, branch_op, branch_taken,
136
        rf_addra, rf_addrb, rf_rda, rf_rdb, alu_op, mac_op, shrot_op, comp_op, rf_addrw, rfwb_op,
137
        wb_insn, simm, branch_addrofs, lsu_addrofs, sel_a, sel_b, lsu_op,
138
        cust5_op, cust5_limm,
139
        multicycle, spr_addrimm, wbforw_valid, du_hwbkpt, sig_syscall, sig_trap,
140
        force_dslot_fetch, no_more_dslot, ex_void, id_macrc_op, ex_macrc_op, rfe, except_illegal
141
);
142
 
143
 
144
input clk_i_cml_1;
145
input clk_i_cml_2;
146
input clk_i_cml_3;
147
reg  ex_freeze_cml_3;
148
reg  wb_freeze_cml_3;
149
reg [ 31 : 0 ] ex_insn_cml_3;
150
reg [ 31 : 0 ] ex_insn_cml_2;
151
reg [ 31 : 0 ] ex_insn_cml_1;
152
reg [ 3 - 1 : 0 ] branch_op_cml_3;
153
reg [ 3 - 1 : 0 ] branch_op_cml_2;
154
reg [ 3 - 1 : 0 ] branch_op_cml_1;
155
reg [ 5 - 1 : 0 ] rf_addrw_cml_3;
156
reg [ 5 - 1 : 0 ] rf_addrw_cml_2;
157
reg [ 5 - 1 : 0 ] rf_addrw_cml_1;
158
reg [ 4 - 1 : 0 ] alu_op_cml_3;
159
reg [ 4 - 1 : 0 ] alu_op_cml_2;
160
reg [ 4 - 1 : 0 ] alu_op_cml_1;
161
reg [ 2 - 1 : 0 ] mac_op_cml_3;
162
reg [ 2 - 1 : 0 ] mac_op_cml_2;
163
reg [ 2 - 1 : 0 ] mac_op_cml_1;
164
reg [ 2 - 1 : 0 ] shrot_op_cml_3;
165
reg [ 2 - 1 : 0 ] shrot_op_cml_2;
166
reg [ 2 - 1 : 0 ] shrot_op_cml_1;
167
reg [ 3 - 1 : 0 ] rfwb_op_cml_3;
168
reg [ 3 - 1 : 0 ] rfwb_op_cml_2;
169
reg [ 3 - 1 : 0 ] rfwb_op_cml_1;
170
reg [ 31 : 0 ] wb_insn_cml_3;
171
reg [ 31 : 0 ] wb_insn_cml_2;
172
reg [ 31 : 0 ] wb_insn_cml_1;
173
reg [ 4 - 1 : 0 ] lsu_op_cml_3;
174
reg [ 4 - 1 : 0 ] lsu_op_cml_2;
175
reg [ 4 - 1 : 0 ] lsu_op_cml_1;
176
reg [ 4 - 1 : 0 ] comp_op_cml_3;
177
reg [ 4 - 1 : 0 ] comp_op_cml_2;
178
reg [ 4 - 1 : 0 ] comp_op_cml_1;
179
reg [ 15 : 0 ] spr_addrimm_cml_3;
180
reg [ 15 : 0 ] spr_addrimm_cml_2;
181
reg [ 15 : 0 ] spr_addrimm_cml_1;
182
reg  wbforw_valid_cml_3;
183
reg  wbforw_valid_cml_2;
184
reg  wbforw_valid_cml_1;
185
reg  sig_syscall_cml_3;
186
reg  sig_syscall_cml_2;
187
reg  sig_syscall_cml_1;
188
reg  sig_trap_cml_3;
189
reg  sig_trap_cml_2;
190
reg  sig_trap_cml_1;
191
reg  ex_macrc_op_cml_3;
192
reg  ex_macrc_op_cml_2;
193
reg  ex_macrc_op_cml_1;
194
reg  except_illegal_cml_3;
195
reg  except_illegal_cml_2;
196
reg  except_illegal_cml_1;
197
reg [ 3 - 1 : 0 ] pre_branch_op_cml_3;
198
reg [ 3 - 1 : 0 ] pre_branch_op_cml_2;
199
reg [ 3 - 1 : 0 ] pre_branch_op_cml_1;
200
reg [ 31 : 0 ] id_insn_cml_3;
201
reg [ 31 : 0 ] id_insn_cml_2;
202
reg [ 31 : 0 ] id_insn_cml_1;
203
reg [ 5 - 1 : 0 ] wb_rfaddrw_cml_3;
204
reg [ 5 - 1 : 0 ] wb_rfaddrw_cml_2;
205
reg [ 5 - 1 : 0 ] wb_rfaddrw_cml_1;
206
reg  sel_imm_cml_3;
207
reg  sel_imm_cml_2;
208
reg  sel_imm_cml_1;
209
reg  id_void_cml_1;
210
 
211
 
212
 
213
//
214
// I/O
215
//
216
input                                   clk;
217
input                                   rst;
218
input                                   id_freeze;
219
input                                   ex_freeze;
220
input                                   wb_freeze;
221
input                                   flushpipe;
222
input   [31:0]                           if_insn;
223
output  [31:0]                           ex_insn;
224
output  [`OR1200_BRANCHOP_WIDTH-1:0]             branch_op;
225
input                                           branch_taken;
226
output  [`OR1200_REGFILE_ADDR_WIDTH-1:0] rf_addrw;
227
output  [`OR1200_REGFILE_ADDR_WIDTH-1:0] rf_addra;
228
output  [`OR1200_REGFILE_ADDR_WIDTH-1:0] rf_addrb;
229
output                                  rf_rda;
230
output                                  rf_rdb;
231
output  [`OR1200_ALUOP_WIDTH-1:0]                alu_op;
232
output  [`OR1200_MACOP_WIDTH-1:0]                mac_op;
233
output  [`OR1200_SHROTOP_WIDTH-1:0]              shrot_op;
234
output  [`OR1200_RFWBOP_WIDTH-1:0]               rfwb_op;
235
output  [31:0]                           wb_insn;
236
output  [31:0]                           simm;
237
output  [31:2]                          branch_addrofs;
238
output  [31:0]                           lsu_addrofs;
239
output  [`OR1200_SEL_WIDTH-1:0]          sel_a;
240
output  [`OR1200_SEL_WIDTH-1:0]          sel_b;
241
output  [`OR1200_LSUOP_WIDTH-1:0]                lsu_op;
242
output  [`OR1200_COMPOP_WIDTH-1:0]               comp_op;
243
output  [`OR1200_MULTICYCLE_WIDTH-1:0]           multicycle;
244
output  [4:0]                            cust5_op;
245
output  [5:0]                            cust5_limm;
246
output  [15:0]                           spr_addrimm;
247
input                                   wbforw_valid;
248
input                                   du_hwbkpt;
249
output                                  sig_syscall;
250
output                                  sig_trap;
251
output                                  force_dslot_fetch;
252
output                                  no_more_dslot;
253
output                                  ex_void;
254
output                                  id_macrc_op;
255
output                                  ex_macrc_op;
256
output                                  rfe;
257
output                                  except_illegal;
258
 
259
//
260
// Internal wires and regs
261
//
262
reg     [`OR1200_BRANCHOP_WIDTH-1:0]             pre_branch_op;
263
reg     [`OR1200_BRANCHOP_WIDTH-1:0]             branch_op;
264
reg     [`OR1200_ALUOP_WIDTH-1:0]                alu_op;
265
`ifdef OR1200_MAC_IMPLEMENTED
266
reg     [`OR1200_MACOP_WIDTH-1:0]                mac_op;
267
reg                                     ex_macrc_op;
268
`else
269
wire    [`OR1200_MACOP_WIDTH-1:0]                mac_op;
270
wire                                    ex_macrc_op;
271
`endif
272
reg     [`OR1200_SHROTOP_WIDTH-1:0]              shrot_op;
273
reg     [31:0]                           id_insn;
274
reg     [31:0]                           ex_insn;
275
reg     [31:0]                           wb_insn;
276
reg     [`OR1200_REGFILE_ADDR_WIDTH-1:0] rf_addrw;
277
reg     [`OR1200_REGFILE_ADDR_WIDTH-1:0] wb_rfaddrw;
278
reg     [`OR1200_RFWBOP_WIDTH-1:0]               rfwb_op;
279
reg     [31:0]                           lsu_addrofs;
280
reg     [`OR1200_SEL_WIDTH-1:0]          sel_a;
281
reg     [`OR1200_SEL_WIDTH-1:0]          sel_b;
282
reg                                     sel_imm;
283
reg     [`OR1200_LSUOP_WIDTH-1:0]                lsu_op;
284
reg     [`OR1200_COMPOP_WIDTH-1:0]               comp_op;
285
reg     [`OR1200_MULTICYCLE_WIDTH-1:0]           multicycle;
286
reg                                     imm_signextend;
287
reg     [15:0]                           spr_addrimm;
288
reg                                     sig_syscall;
289
reg                                     sig_trap;
290
reg                                     except_illegal;
291
wire                                    id_void;
292
 
293
//
294
// Register file read addresses
295
//
296
assign rf_addra = if_insn[20:16];
297
assign rf_addrb = if_insn[15:11];
298
assign rf_rda = if_insn[31];
299
assign rf_rdb = if_insn[30];
300
 
301
//
302
// Force fetch of delay slot instruction when jump/branch is preceeded by load/store
303
// instructions
304
//
305
// SIMON
306
// assign force_dslot_fetch = ((|pre_branch_op) & (|lsu_op));
307
assign force_dslot_fetch = 1'b0;
308
 
309
// SynEDA CoreMultiplier
310
// assignment(s): no_more_dslot
311
// replace(s): branch_op, id_void
312
assign no_more_dslot = |branch_op_cml_1 & !id_void_cml_1 & branch_taken | (branch_op_cml_1 == `OR1200_BRANCHOP_RFE);
313
assign id_void = (id_insn[31:26] == `OR1200_OR32_NOP) & id_insn[16];
314
 
315
// SynEDA CoreMultiplier
316
// assignment(s): ex_void
317
// replace(s): ex_insn
318
assign ex_void = (ex_insn_cml_1[31:26] == `OR1200_OR32_NOP) & ex_insn_cml_1[16];
319
 
320
//
321
// Sign/Zero extension of immediates
322
//
323
 
324
// SynEDA CoreMultiplier
325
// assignment(s): simm
326
// replace(s): id_insn
327
assign simm = (imm_signextend == 1'b1) ? {{16{id_insn_cml_3[15]}}, id_insn_cml_3[15:0]} : {{16'b0}, id_insn_cml_3[15:0]};
328
 
329
//
330
// Sign extension of branch offset
331
//
332
assign branch_addrofs = {{4{ex_insn[25]}}, ex_insn[25:0]};
333
 
334
//
335
// l.macrc in ID stage
336
//
337
`ifdef OR1200_MAC_IMPLEMENTED
338
 
339
// SynEDA CoreMultiplier
340
// assignment(s): id_macrc_op
341
// replace(s): id_insn
342
assign id_macrc_op = (id_insn_cml_3[31:26] == `OR1200_OR32_MOVHI) & id_insn_cml_3[16];
343
`else
344
assign id_macrc_op = 1'b0;
345
`endif
346
 
347
//
348
// cust5_op, cust5_limm (L immediate)
349
//
350
assign cust5_op = ex_insn[4:0];
351
assign cust5_limm = ex_insn[10:5];
352
 
353
//
354
//
355
//
356
 
357
// SynEDA CoreMultiplier
358
// assignment(s): rfe
359
// replace(s): branch_op, pre_branch_op
360
assign rfe = (pre_branch_op_cml_3 == `OR1200_BRANCHOP_RFE) | (branch_op_cml_3 == `OR1200_BRANCHOP_RFE);
361
 
362
//
363
// Generation of sel_a
364
//
365
 
366
// SynEDA CoreMultiplier
367
// assignment(s): sel_a
368
// replace(s): rf_addrw, rfwb_op, wbforw_valid, id_insn, wb_rfaddrw
369
always @(rf_addrw_cml_3 or id_insn_cml_3 or rfwb_op_cml_3 or wbforw_valid_cml_3 or wb_rfaddrw_cml_3)
370
        if ((id_insn_cml_3[20:16] == rf_addrw_cml_3) && rfwb_op_cml_3[0])
371
                sel_a = `OR1200_SEL_EX_FORW;
372
        else if ((id_insn_cml_3[20:16] == wb_rfaddrw_cml_3) && wbforw_valid_cml_3)
373
                sel_a = `OR1200_SEL_WB_FORW;
374
        else
375
                sel_a = `OR1200_SEL_RF;
376
 
377
//
378
// Generation of sel_b
379
//
380
 
381
// SynEDA CoreMultiplier
382
// assignment(s): sel_b
383
// replace(s): rf_addrw, rfwb_op, wbforw_valid, id_insn, wb_rfaddrw, sel_imm
384
always @(rf_addrw_cml_3 or sel_imm_cml_3 or id_insn_cml_3 or rfwb_op_cml_3 or wbforw_valid_cml_3 or wb_rfaddrw_cml_3)
385
        if (sel_imm_cml_3)
386
                sel_b = `OR1200_SEL_IMM;
387
        else if ((id_insn_cml_3[15:11] == rf_addrw_cml_3) && rfwb_op_cml_3[0])
388
                sel_b = `OR1200_SEL_EX_FORW;
389
        else if ((id_insn_cml_3[15:11] == wb_rfaddrw_cml_3) && wbforw_valid_cml_3)
390
                sel_b = `OR1200_SEL_WB_FORW;
391
        else
392
                sel_b = `OR1200_SEL_RF;
393
 
394
//
395
// l.macrc in EX stage
396
//
397
`ifdef OR1200_MAC_IMPLEMENTED
398
 
399
// SynEDA CoreMultiplier
400
// assignment(s): ex_macrc_op
401
// replace(s): ex_freeze, ex_macrc_op
402
always @(posedge clk or posedge rst) begin
403
        if (rst)
404
                ex_macrc_op <= #1 1'b0;
405
        else begin  ex_macrc_op <= ex_macrc_op_cml_3; if (!ex_freeze_cml_3 & id_freeze | flushpipe)
406
                ex_macrc_op <= #1 1'b0;
407
        else if (!ex_freeze_cml_3)
408
                ex_macrc_op <= #1 id_macrc_op; end
409
end
410
`else
411
assign ex_macrc_op = 1'b0;
412
`endif
413
 
414
//
415
// Decode of spr_addrimm
416
//
417
 
418
// SynEDA CoreMultiplier
419
// assignment(s): spr_addrimm
420
// replace(s): ex_freeze, spr_addrimm, id_insn
421
always @(posedge clk or posedge rst) begin
422
        if (rst)
423
                spr_addrimm <= #1 16'h0000;
424
        else begin  spr_addrimm <= spr_addrimm_cml_3; if (!ex_freeze_cml_3 & id_freeze | flushpipe)
425
                spr_addrimm <= #1 16'h0000;
426
        else if (!ex_freeze_cml_3) begin
427
                case (id_insn_cml_3[31:26])     // synopsys parallel_case
428
                        // l.mfspr
429
                        `OR1200_OR32_MFSPR:
430
                                spr_addrimm <= #1 id_insn_cml_3[15:0];
431
                        // l.mtspr
432
                        default:
433
                                spr_addrimm <= #1 {id_insn_cml_3[25:21], id_insn_cml_3[10:0]};
434
                endcase
435
        end end
436
end
437
 
438
//
439
// Decode of multicycle
440
//
441
 
442
// SynEDA CoreMultiplier
443
// assignment(s): multicycle
444
// replace(s): id_insn
445
always @(id_insn_cml_3) begin
446
  case (id_insn_cml_3[31:26])           // synopsys parallel_case
447
`ifdef UNUSED
448
    // l.lwz
449
    `OR1200_OR32_LWZ:
450
      multicycle = `OR1200_TWO_CYCLES;
451
 
452
    // l.lbz
453
    `OR1200_OR32_LBZ:
454
      multicycle = `OR1200_TWO_CYCLES;
455
 
456
    // l.lbs
457
    `OR1200_OR32_LBS:
458
      multicycle = `OR1200_TWO_CYCLES;
459
 
460
    // l.lhz
461
    `OR1200_OR32_LHZ:
462
      multicycle = `OR1200_TWO_CYCLES;
463
 
464
    // l.lhs
465
    `OR1200_OR32_LHS:
466
      multicycle = `OR1200_TWO_CYCLES;
467
 
468
    // l.sw
469
    `OR1200_OR32_SW:
470
      multicycle = `OR1200_TWO_CYCLES;
471
 
472
    // l.sb
473
    `OR1200_OR32_SB:
474
      multicycle = `OR1200_TWO_CYCLES;
475
 
476
    // l.sh
477
    `OR1200_OR32_SH:
478
      multicycle = `OR1200_TWO_CYCLES;
479
`endif
480
    // ALU instructions except the one with immediate
481
    `OR1200_OR32_ALU:
482
      multicycle = id_insn_cml_3[`OR1200_ALUMCYC_POS];
483
 
484
    // Single cycle instructions
485
    default: begin
486
      multicycle = `OR1200_ONE_CYCLE;
487
    end
488
 
489
  endcase
490
 
491
end
492
 
493
//
494
// Decode of imm_signextend
495
//
496
 
497
// SynEDA CoreMultiplier
498
// assignment(s): imm_signextend
499
// replace(s): id_insn
500
always @(id_insn_cml_3) begin
501
  case (id_insn_cml_3[31:26])           // synopsys parallel_case
502
 
503
        // l.addi
504
        `OR1200_OR32_ADDI:
505
                imm_signextend = 1'b1;
506
 
507
        // l.addic
508
        `OR1200_OR32_ADDIC:
509
                imm_signextend = 1'b1;
510
 
511
        // l.xori
512
        `OR1200_OR32_XORI:
513
                imm_signextend = 1'b1;
514
 
515
        // l.muli
516
`ifdef OR1200_MULT_IMPLEMENTED
517
        `OR1200_OR32_MULI:
518
                imm_signextend = 1'b1;
519
`endif
520
 
521
        // l.maci
522
`ifdef OR1200_MAC_IMPLEMENTED
523
        `OR1200_OR32_MACI:
524
                imm_signextend = 1'b1;
525
`endif
526
 
527
        // SFXX insns with immediate
528
        `OR1200_OR32_SFXXI:
529
                imm_signextend = 1'b1;
530
 
531
        // Instructions with no or zero extended immediate
532
        default: begin
533
                imm_signextend = 1'b0;
534
        end
535
 
536
endcase
537
 
538
end
539
 
540
//
541
// LSU addr offset
542
//
543
always @(lsu_op or ex_insn) begin
544
        lsu_addrofs[10:0] = ex_insn[10:0];
545
        case(lsu_op)    // synopsys parallel_case
546
                `OR1200_LSUOP_SW, `OR1200_LSUOP_SH, `OR1200_LSUOP_SB :
547
                        lsu_addrofs[31:11] = {{16{ex_insn[25]}}, ex_insn[25:21]};
548
                default :
549
                        lsu_addrofs[31:11] = {{16{ex_insn[15]}}, ex_insn[15:11]};
550
        endcase
551
end
552
 
553
//
554
// Register file write address
555
//
556
 
557
// SynEDA CoreMultiplier
558
// assignment(s): rf_addrw
559
// replace(s): ex_freeze, rf_addrw, pre_branch_op, id_insn
560
always @(posedge clk or posedge rst) begin
561
        if (rst)
562
                rf_addrw <= #1 5'd0;
563
        else begin  rf_addrw <= rf_addrw_cml_3; if (!ex_freeze_cml_3 & id_freeze)
564
                rf_addrw <= #1 5'd00;
565
        else if (!ex_freeze_cml_3)
566
                case (pre_branch_op_cml_3)      // synopsys parallel_case
567
                        `OR1200_BRANCHOP_JR, `OR1200_BRANCHOP_BAL:
568
                                rf_addrw <= #1 5'd09;   // link register r9
569
                        default:
570
                                rf_addrw <= #1 id_insn_cml_3[25:21];
571
                endcase end
572
end
573
 
574
//
575
// rf_addrw in wb stage (used in forwarding logic)
576
//
577
 
578
// SynEDA CoreMultiplier
579
// assignment(s): wb_rfaddrw
580
// replace(s): wb_freeze, rf_addrw, wb_rfaddrw
581
always @(posedge clk or posedge rst) begin
582
        if (rst)
583
                wb_rfaddrw <= #1 5'd0;
584
        else begin  wb_rfaddrw <= wb_rfaddrw_cml_3; if (!wb_freeze_cml_3)
585
                wb_rfaddrw <= #1 rf_addrw_cml_3; end
586
end
587
 
588
//
589
// Instruction latch in id_insn
590
//
591
 
592
// SynEDA CoreMultiplier
593
// assignment(s): id_insn
594
// replace(s): id_insn
595
always @(posedge clk or posedge rst) begin
596
        if (rst)
597
                id_insn <= #1 {`OR1200_OR32_NOP, 26'h041_0000};
598
        else begin  id_insn <= id_insn_cml_3; if (flushpipe)
599
                id_insn <= #1 {`OR1200_OR32_NOP, 26'h041_0000};        // id_insn[16] must be 1
600
        else if (!id_freeze) begin
601
                id_insn <= #1 if_insn;
602
`ifdef OR1200_VERBOSE
603
// synopsys translate_off
604
                $display("%t: id_insn <= %h", $time, if_insn);
605
// synopsys translate_on
606
`endif
607
        end end
608
end
609
 
610
//
611
// Instruction latch in ex_insn
612
//
613
 
614
// SynEDA CoreMultiplier
615
// assignment(s): ex_insn
616
// replace(s): ex_freeze, ex_insn, id_insn
617
always @(posedge clk or posedge rst) begin
618
        if (rst)
619
                ex_insn <= #1 {`OR1200_OR32_NOP, 26'h041_0000};
620
        else begin  ex_insn <= ex_insn_cml_3; if (!ex_freeze_cml_3 & id_freeze | flushpipe)
621
                ex_insn <= #1 {`OR1200_OR32_NOP, 26'h041_0000}; // ex_insn[16] must be 1
622
        else if (!ex_freeze_cml_3) begin
623
                ex_insn <= #1 id_insn_cml_3;
624
`ifdef OR1200_VERBOSE
625
// synopsys translate_off
626
                $display("%t: ex_insn <= %h", $time, id_insn);
627
// synopsys translate_on
628
`endif
629
        end end
630
end
631
 
632
//
633
// Instruction latch in wb_insn
634
//
635
 
636
// SynEDA CoreMultiplier
637
// assignment(s): wb_insn
638
// replace(s): wb_freeze, ex_insn, wb_insn
639
always @(posedge clk or posedge rst) begin
640
        if (rst)
641
                wb_insn <= #1 {`OR1200_OR32_NOP, 26'h041_0000};
642
        else begin  wb_insn <= wb_insn_cml_3; if (flushpipe)
643
                wb_insn <= #1 {`OR1200_OR32_NOP, 26'h041_0000}; // wb_insn[16] must be 1
644
        else if (!wb_freeze_cml_3) begin
645
                wb_insn <= #1 ex_insn_cml_3;
646
        end end
647
end
648
 
649
//
650
// Decode of sel_imm
651
//
652
 
653
// SynEDA CoreMultiplier
654
// assignment(s): sel_imm
655
// replace(s): sel_imm
656
always @(posedge clk or posedge rst) begin
657
        if (rst)
658
                sel_imm <= #1 1'b0;
659
        else begin  sel_imm <= sel_imm_cml_3; if (!id_freeze) begin
660
          case (if_insn[31:26])         // synopsys parallel_case
661
 
662
            // j.jalr
663
            `OR1200_OR32_JALR:
664
              sel_imm <= #1 1'b0;
665
 
666
            // l.jr
667
            `OR1200_OR32_JR:
668
              sel_imm <= #1 1'b0;
669
 
670
            // l.rfe
671
            `OR1200_OR32_RFE:
672
              sel_imm <= #1 1'b0;
673
 
674
            // l.mfspr
675
            `OR1200_OR32_MFSPR:
676
              sel_imm <= #1 1'b0;
677
 
678
            // l.mtspr
679
            `OR1200_OR32_MTSPR:
680
              sel_imm <= #1 1'b0;
681
 
682
            // l.sys, l.brk and all three sync insns
683
            `OR1200_OR32_XSYNC:
684
              sel_imm <= #1 1'b0;
685
 
686
            // l.mac/l.msb
687
`ifdef OR1200_MAC_IMPLEMENTED
688
            `OR1200_OR32_MACMSB:
689
              sel_imm <= #1 1'b0;
690
`endif
691
 
692
            // l.sw
693
            `OR1200_OR32_SW:
694
              sel_imm <= #1 1'b0;
695
 
696
            // l.sb
697
            `OR1200_OR32_SB:
698
              sel_imm <= #1 1'b0;
699
 
700
            // l.sh
701
            `OR1200_OR32_SH:
702
              sel_imm <= #1 1'b0;
703
 
704
            // ALU instructions except the one with immediate
705
            `OR1200_OR32_ALU:
706
              sel_imm <= #1 1'b0;
707
 
708
            // SFXX instructions
709
            `OR1200_OR32_SFXX:
710
              sel_imm <= #1 1'b0;
711
 
712
`ifdef OR1200_OR32_CUST5
713
            // l.cust5 instructions
714
            `OR1200_OR32_CUST5:
715
              sel_imm <= #1 1'b0;
716
`endif
717
 
718
            // l.nop
719
            `OR1200_OR32_NOP:
720
              sel_imm <= #1 1'b0;
721
 
722
            // All instructions with immediates
723
            default: begin
724
              sel_imm <= #1 1'b1;
725
            end
726
 
727
          endcase
728
 
729
        end end
730
end
731
 
732
//
733
// Decode of except_illegal
734
//
735
 
736
// SynEDA CoreMultiplier
737
// assignment(s): except_illegal
738
// replace(s): ex_freeze, except_illegal, id_insn
739
always @(posedge clk or posedge rst) begin
740
        if (rst)
741
                except_illegal <= #1 1'b0;
742
        else begin  except_illegal <= except_illegal_cml_3; if (!ex_freeze_cml_3 & id_freeze | flushpipe)
743
                except_illegal <= #1 1'b0;
744
        else if (!ex_freeze_cml_3) begin
745
          case (id_insn_cml_3[31:26])           // synopsys parallel_case
746
 
747
            `OR1200_OR32_J,
748
            `OR1200_OR32_JAL,
749
            `OR1200_OR32_JALR,
750
            `OR1200_OR32_JR,
751
            `OR1200_OR32_BNF,
752
            `OR1200_OR32_BF,
753
            `OR1200_OR32_RFE,
754
            `OR1200_OR32_MOVHI,
755
            `OR1200_OR32_MFSPR,
756
            `OR1200_OR32_XSYNC,
757
`ifdef OR1200_MAC_IMPLEMENTED
758
            `OR1200_OR32_MACI,
759
`endif
760
            `OR1200_OR32_LWZ,
761
            `OR1200_OR32_LBZ,
762
            `OR1200_OR32_LBS,
763
            `OR1200_OR32_LHZ,
764
            `OR1200_OR32_LHS,
765
            `OR1200_OR32_ADDI,
766
            `OR1200_OR32_ADDIC,
767
            `OR1200_OR32_ANDI,
768
            `OR1200_OR32_ORI,
769
            `OR1200_OR32_XORI,
770
`ifdef OR1200_MULT_IMPLEMENTED
771
            `OR1200_OR32_MULI,
772
`endif
773
            `OR1200_OR32_SH_ROTI,
774
            `OR1200_OR32_SFXXI,
775
            `OR1200_OR32_MTSPR,
776
`ifdef OR1200_MAC_IMPLEMENTED
777
            `OR1200_OR32_MACMSB,
778
`endif
779
            `OR1200_OR32_SW,
780
            `OR1200_OR32_SB,
781
            `OR1200_OR32_SH,
782
            `OR1200_OR32_ALU,
783
            `OR1200_OR32_SFXX,
784
`ifdef OR1200_OR32_CUST5
785
            `OR1200_OR32_CUST5,
786
`endif
787
            `OR1200_OR32_NOP:
788
                except_illegal <= #1 1'b0;
789
 
790
            // Illegal and OR1200 unsupported instructions
791
            default:
792
              except_illegal <= #1 1'b1;
793
 
794
          endcase
795
 
796
        end end
797
end
798
 
799
//
800
// Decode of alu_op
801
//
802
 
803
// SynEDA CoreMultiplier
804
// assignment(s): alu_op
805
// replace(s): ex_freeze, alu_op, id_insn
806
always @(posedge clk or posedge rst) begin
807
        if (rst)
808
                alu_op <= #1 `OR1200_ALUOP_NOP;
809
        else begin  alu_op <= alu_op_cml_3; if (!ex_freeze_cml_3 & id_freeze | flushpipe)
810
                alu_op <= #1 `OR1200_ALUOP_NOP;
811
        else if (!ex_freeze_cml_3) begin
812
          case (id_insn_cml_3[31:26])           // synopsys parallel_case
813
 
814
            // l.j
815
            `OR1200_OR32_J:
816
              alu_op <= #1 `OR1200_ALUOP_IMM;
817
 
818
            // j.jal
819
            `OR1200_OR32_JAL:
820
              alu_op <= #1 `OR1200_ALUOP_IMM;
821
 
822
            // l.bnf
823
            `OR1200_OR32_BNF:
824
              alu_op <= #1 `OR1200_ALUOP_NOP;
825
 
826
            // l.bf
827
            `OR1200_OR32_BF:
828
              alu_op <= #1 `OR1200_ALUOP_NOP;
829
 
830
            // l.movhi
831
            `OR1200_OR32_MOVHI:
832
              alu_op <= #1 `OR1200_ALUOP_MOVHI;
833
 
834
            // l.mfspr
835
            `OR1200_OR32_MFSPR:
836
              alu_op <= #1 `OR1200_ALUOP_MFSR;
837
 
838
            // l.mtspr
839
            `OR1200_OR32_MTSPR:
840
              alu_op <= #1 `OR1200_ALUOP_MTSR;
841
 
842
            // l.addi
843
            `OR1200_OR32_ADDI:
844
              alu_op <= #1 `OR1200_ALUOP_ADD;
845
 
846
            // l.addic
847
            `OR1200_OR32_ADDIC:
848
              alu_op <= #1 `OR1200_ALUOP_ADDC;
849
 
850
            // l.andi
851
            `OR1200_OR32_ANDI:
852
              alu_op <= #1 `OR1200_ALUOP_AND;
853
 
854
            // l.ori
855
            `OR1200_OR32_ORI:
856
              alu_op <= #1 `OR1200_ALUOP_OR;
857
 
858
            // l.xori
859
            `OR1200_OR32_XORI:
860
              alu_op <= #1 `OR1200_ALUOP_XOR;
861
 
862
            // l.muli
863
`ifdef OR1200_MULT_IMPLEMENTED
864
            `OR1200_OR32_MULI:
865
              alu_op <= #1 `OR1200_ALUOP_MUL;
866
`endif
867
 
868
            // Shift and rotate insns with immediate
869
            `OR1200_OR32_SH_ROTI:
870
              alu_op <= #1 `OR1200_ALUOP_SHROT;
871
 
872
            // SFXX insns with immediate
873
            `OR1200_OR32_SFXXI:
874
              alu_op <= #1 `OR1200_ALUOP_COMP;
875
 
876
            // ALU instructions except the one with immediate
877
            `OR1200_OR32_ALU:
878
              alu_op <= #1 id_insn_cml_3[3:0];
879
 
880
            // SFXX instructions
881
            `OR1200_OR32_SFXX:
882
              alu_op <= #1 `OR1200_ALUOP_COMP;
883
 
884
`ifdef OR1200_OR32_CUST5
885
            // l.cust5 instructions
886
            `OR1200_OR32_CUST5:
887
              alu_op <= #1 `OR1200_ALUOP_CUST5;
888
`endif
889
 
890
            // Default
891
            default: begin
892
              alu_op <= #1 `OR1200_ALUOP_NOP;
893
            end
894
 
895
          endcase
896
 
897
        end end
898
end
899
 
900
//
901
// Decode of mac_op
902
//
903
`ifdef OR1200_MAC_IMPLEMENTED
904
 
905
// SynEDA CoreMultiplier
906
// assignment(s): mac_op
907
// replace(s): ex_freeze, mac_op, id_insn
908
always @(posedge clk or posedge rst) begin
909
        if (rst)
910
                mac_op <= #1 `OR1200_MACOP_NOP;
911
        else begin  mac_op <= mac_op_cml_3; if (!ex_freeze_cml_3 & id_freeze | flushpipe)
912
                mac_op <= #1 `OR1200_MACOP_NOP;
913
        else if (!ex_freeze_cml_3)
914
          case (id_insn_cml_3[31:26])           // synopsys parallel_case
915
 
916
            // l.maci
917
            `OR1200_OR32_MACI:
918
              mac_op <= #1 `OR1200_MACOP_MAC;
919
 
920
            // l.nop
921
            `OR1200_OR32_MACMSB:
922
              mac_op <= #1 id_insn_cml_3[1:0];
923
 
924
            // Illegal and OR1200 unsupported instructions
925
            default: begin
926
              mac_op <= #1 `OR1200_MACOP_NOP;
927
            end
928
 
929
          endcase
930
        else
931
                mac_op <= #1 `OR1200_MACOP_NOP; end
932
end
933
`else
934
assign mac_op = `OR1200_MACOP_NOP;
935
`endif
936
 
937
//
938
// Decode of shrot_op
939
//
940
 
941
// SynEDA CoreMultiplier
942
// assignment(s): shrot_op
943
// replace(s): ex_freeze, shrot_op, id_insn
944
always @(posedge clk or posedge rst) begin
945
        if (rst)
946
                shrot_op <= #1 `OR1200_SHROTOP_NOP;
947
        else begin  shrot_op <= shrot_op_cml_3; if (!ex_freeze_cml_3 & id_freeze | flushpipe)
948
                shrot_op <= #1 `OR1200_SHROTOP_NOP;
949
        else if (!ex_freeze_cml_3) begin
950
                shrot_op <= #1 id_insn_cml_3[`OR1200_SHROTOP_POS];
951
        end end
952
end
953
 
954
//
955
// Decode of rfwb_op
956
//
957
 
958
// SynEDA CoreMultiplier
959
// assignment(s): rfwb_op
960
// replace(s): ex_freeze, rfwb_op, id_insn
961
always @(posedge clk or posedge rst) begin
962
        if (rst)
963
                rfwb_op <= #1 `OR1200_RFWBOP_NOP;
964
        else begin  rfwb_op <= rfwb_op_cml_3;  if (!ex_freeze_cml_3 & id_freeze | flushpipe)
965
                rfwb_op <= #1 `OR1200_RFWBOP_NOP;
966
        else  if (!ex_freeze_cml_3) begin
967
                case (id_insn_cml_3[31:26])             // synopsys parallel_case
968
 
969
                  // j.jal
970
                  `OR1200_OR32_JAL:
971
                    rfwb_op <= #1 `OR1200_RFWBOP_LR;
972
 
973
                  // j.jalr
974
                  `OR1200_OR32_JALR:
975
                    rfwb_op <= #1 `OR1200_RFWBOP_LR;
976
 
977
                  // l.movhi
978
                  `OR1200_OR32_MOVHI:
979
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
980
 
981
                  // l.mfspr
982
                  `OR1200_OR32_MFSPR:
983
                    rfwb_op <= #1 `OR1200_RFWBOP_SPRS;
984
 
985
                  // l.lwz
986
                  `OR1200_OR32_LWZ:
987
                    rfwb_op <= #1 `OR1200_RFWBOP_LSU;
988
 
989
                  // l.lbz
990
                  `OR1200_OR32_LBZ:
991
                    rfwb_op <= #1 `OR1200_RFWBOP_LSU;
992
 
993
                  // l.lbs
994
                  `OR1200_OR32_LBS:
995
                    rfwb_op <= #1 `OR1200_RFWBOP_LSU;
996
 
997
                  // l.lhz
998
                  `OR1200_OR32_LHZ:
999
                    rfwb_op <= #1 `OR1200_RFWBOP_LSU;
1000
 
1001
                  // l.lhs
1002
                  `OR1200_OR32_LHS:
1003
                    rfwb_op <= #1 `OR1200_RFWBOP_LSU;
1004
 
1005
                  // l.addi
1006
                  `OR1200_OR32_ADDI:
1007
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
1008
 
1009
                  // l.addic
1010
                  `OR1200_OR32_ADDIC:
1011
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
1012
 
1013
                  // l.andi
1014
                  `OR1200_OR32_ANDI:
1015
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
1016
 
1017
                  // l.ori
1018
                  `OR1200_OR32_ORI:
1019
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
1020
 
1021
                  // l.xori
1022
                  `OR1200_OR32_XORI:
1023
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
1024
 
1025
                  // l.muli
1026
`ifdef OR1200_MULT_IMPLEMENTED
1027
                  `OR1200_OR32_MULI:
1028
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
1029
`endif
1030
 
1031
                  // Shift and rotate insns with immediate
1032
                  `OR1200_OR32_SH_ROTI:
1033
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
1034
 
1035
                  // ALU instructions except the one with immediate
1036
                  `OR1200_OR32_ALU:
1037
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
1038
 
1039
`ifdef OR1200_OR32_CUST5
1040
                  // l.cust5 instructions
1041
                  `OR1200_OR32_CUST5:
1042
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
1043
`endif
1044
 
1045
                  // Instructions w/o register-file write-back
1046
                  default: begin
1047
                    rfwb_op <= #1 `OR1200_RFWBOP_NOP;
1048
                  end
1049
 
1050
                endcase
1051
        end end
1052
end
1053
 
1054
//
1055
// Decode of pre_branch_op
1056
//
1057
 
1058
// SynEDA CoreMultiplier
1059
// assignment(s): pre_branch_op
1060
// replace(s): pre_branch_op
1061
always @(posedge clk or posedge rst) begin
1062
        if (rst)
1063
                pre_branch_op <= #1 `OR1200_BRANCHOP_NOP;
1064
        else begin  pre_branch_op <= pre_branch_op_cml_3; if (flushpipe)
1065
                pre_branch_op <= #1 `OR1200_BRANCHOP_NOP;
1066
        else if (!id_freeze) begin
1067
                case (if_insn[31:26])           // synopsys parallel_case
1068
 
1069
                  // l.j
1070
                  `OR1200_OR32_J:
1071
                    pre_branch_op <= #1 `OR1200_BRANCHOP_BAL;
1072
 
1073
                  // j.jal
1074
                  `OR1200_OR32_JAL:
1075
                    pre_branch_op <= #1 `OR1200_BRANCHOP_BAL;
1076
 
1077
                  // j.jalr
1078
                  `OR1200_OR32_JALR:
1079
                    pre_branch_op <= #1 `OR1200_BRANCHOP_JR;
1080
 
1081
                  // l.jr
1082
                  `OR1200_OR32_JR:
1083
                    pre_branch_op <= #1 `OR1200_BRANCHOP_JR;
1084
 
1085
                  // l.bnf
1086
                  `OR1200_OR32_BNF:
1087
                    pre_branch_op <= #1 `OR1200_BRANCHOP_BNF;
1088
 
1089
                  // l.bf
1090
                  `OR1200_OR32_BF:
1091
                    pre_branch_op <= #1 `OR1200_BRANCHOP_BF;
1092
 
1093
                  // l.rfe
1094
                  `OR1200_OR32_RFE:
1095
                    pre_branch_op <= #1 `OR1200_BRANCHOP_RFE;
1096
 
1097
                  // Non branch instructions
1098
                  default: begin
1099
                    pre_branch_op <= #1 `OR1200_BRANCHOP_NOP;
1100
                  end
1101
                endcase
1102
        end end
1103
end
1104
 
1105
//
1106
// Generation of branch_op
1107
//
1108
 
1109
// SynEDA CoreMultiplier
1110
// assignment(s): branch_op
1111
// replace(s): ex_freeze, branch_op, pre_branch_op
1112
always @(posedge clk or posedge rst)
1113
        if (rst)
1114
                branch_op <= #1 `OR1200_BRANCHOP_NOP;
1115
        else begin  branch_op <= branch_op_cml_3; if (!ex_freeze_cml_3 & id_freeze | flushpipe)
1116
                branch_op <= #1 `OR1200_BRANCHOP_NOP;
1117
        else if (!ex_freeze_cml_3)
1118
                branch_op <= #1 pre_branch_op_cml_3; end
1119
 
1120
//
1121
// Decode of lsu_op
1122
//
1123
 
1124
// SynEDA CoreMultiplier
1125
// assignment(s): lsu_op
1126
// replace(s): ex_freeze, lsu_op, id_insn
1127
always @(posedge clk or posedge rst) begin
1128
        if (rst)
1129
                lsu_op <= #1 `OR1200_LSUOP_NOP;
1130
        else begin  lsu_op <= lsu_op_cml_3; if (!ex_freeze_cml_3 & id_freeze | flushpipe)
1131
                lsu_op <= #1 `OR1200_LSUOP_NOP;
1132
        else if (!ex_freeze_cml_3)  begin
1133
          case (id_insn_cml_3[31:26])           // synopsys parallel_case
1134
 
1135
            // l.lwz
1136
            `OR1200_OR32_LWZ:
1137
              lsu_op <= #1 `OR1200_LSUOP_LWZ;
1138
 
1139
            // l.lbz
1140
            `OR1200_OR32_LBZ:
1141
              lsu_op <= #1 `OR1200_LSUOP_LBZ;
1142
 
1143
            // l.lbs
1144
            `OR1200_OR32_LBS:
1145
              lsu_op <= #1 `OR1200_LSUOP_LBS;
1146
 
1147
            // l.lhz
1148
            `OR1200_OR32_LHZ:
1149
              lsu_op <= #1 `OR1200_LSUOP_LHZ;
1150
 
1151
            // l.lhs
1152
            `OR1200_OR32_LHS:
1153
              lsu_op <= #1 `OR1200_LSUOP_LHS;
1154
 
1155
            // l.sw
1156
            `OR1200_OR32_SW:
1157
              lsu_op <= #1 `OR1200_LSUOP_SW;
1158
 
1159
            // l.sb
1160
            `OR1200_OR32_SB:
1161
              lsu_op <= #1 `OR1200_LSUOP_SB;
1162
 
1163
            // l.sh
1164
            `OR1200_OR32_SH:
1165
              lsu_op <= #1 `OR1200_LSUOP_SH;
1166
 
1167
            // Non load/store instructions
1168
            default: begin
1169
              lsu_op <= #1 `OR1200_LSUOP_NOP;
1170
            end
1171
          endcase
1172
        end end
1173
end
1174
 
1175
//
1176
// Decode of comp_op
1177
//
1178
 
1179
// SynEDA CoreMultiplier
1180
// assignment(s): comp_op
1181
// replace(s): ex_freeze, comp_op, id_insn
1182
always @(posedge clk or posedge rst) begin
1183
        if (rst) begin
1184
                comp_op <= #1 4'd0;
1185
        end else begin  comp_op <= comp_op_cml_3; if (!ex_freeze_cml_3 & id_freeze | flushpipe)
1186
                comp_op <= #1 4'd0;
1187
        else if (!ex_freeze_cml_3)
1188
                comp_op <= #1 id_insn_cml_3[24:21]; end
1189
end
1190
 
1191
//
1192
// Decode of l.sys
1193
//
1194
 
1195
// SynEDA CoreMultiplier
1196
// assignment(s): sig_syscall
1197
// replace(s): ex_freeze, sig_syscall, id_insn
1198
always @(posedge clk or posedge rst) begin
1199
        if (rst)
1200
                sig_syscall <= #1 1'b0;
1201
        else begin  sig_syscall <= sig_syscall_cml_3; if (!ex_freeze_cml_3 & id_freeze | flushpipe)
1202
                sig_syscall <= #1 1'b0;
1203
        else if (!ex_freeze_cml_3) begin
1204
`ifdef OR1200_VERBOSE
1205
// synopsys translate_off
1206
                if (id_insn_cml_3[31:23] == {`OR1200_OR32_XSYNC, 3'b000})
1207
                        $display("Generating sig_syscall");
1208
// synopsys translate_on
1209
`endif
1210
                sig_syscall <= #1 (id_insn_cml_3[31:23] == {`OR1200_OR32_XSYNC, 3'b000});
1211
        end end
1212
end
1213
 
1214
//
1215
// Decode of l.trap
1216
//
1217
 
1218
// SynEDA CoreMultiplier
1219
// assignment(s): sig_trap
1220
// replace(s): ex_freeze, sig_trap, id_insn
1221
always @(posedge clk or posedge rst) begin
1222
        if (rst)
1223
                sig_trap <= #1 1'b0;
1224
        else begin  sig_trap <= sig_trap_cml_3; if (!ex_freeze_cml_3 & id_freeze | flushpipe)
1225
                sig_trap <= #1 1'b0;
1226
        else if (!ex_freeze_cml_3) begin
1227
`ifdef OR1200_VERBOSE
1228
// synopsys translate_off
1229
                if (id_insn_cml_3[31:23] == {`OR1200_OR32_XSYNC, 3'b010})
1230
                        $display("Generating sig_trap");
1231
// synopsys translate_on
1232
`endif
1233
                sig_trap <= #1 (id_insn_cml_3[31:23] == {`OR1200_OR32_XSYNC, 3'b010})
1234
                        | du_hwbkpt;
1235
        end end
1236
end
1237
 
1238
 
1239
always @ (posedge clk_i_cml_1) begin
1240
ex_insn_cml_1 <= ex_insn;
1241
branch_op_cml_1 <= branch_op;
1242
rf_addrw_cml_1 <= rf_addrw;
1243
alu_op_cml_1 <= alu_op;
1244
mac_op_cml_1 <= mac_op;
1245
shrot_op_cml_1 <= shrot_op;
1246
rfwb_op_cml_1 <= rfwb_op;
1247
wb_insn_cml_1 <= wb_insn;
1248
lsu_op_cml_1 <= lsu_op;
1249
comp_op_cml_1 <= comp_op;
1250
spr_addrimm_cml_1 <= spr_addrimm;
1251
wbforw_valid_cml_1 <= wbforw_valid;
1252
sig_syscall_cml_1 <= sig_syscall;
1253
sig_trap_cml_1 <= sig_trap;
1254
ex_macrc_op_cml_1 <= ex_macrc_op;
1255
except_illegal_cml_1 <= except_illegal;
1256
pre_branch_op_cml_1 <= pre_branch_op;
1257
id_insn_cml_1 <= id_insn;
1258
wb_rfaddrw_cml_1 <= wb_rfaddrw;
1259
sel_imm_cml_1 <= sel_imm;
1260
id_void_cml_1 <= id_void;
1261
end
1262
always @ (posedge clk_i_cml_2) begin
1263
ex_insn_cml_2 <= ex_insn_cml_1;
1264
branch_op_cml_2 <= branch_op_cml_1;
1265
rf_addrw_cml_2 <= rf_addrw_cml_1;
1266
alu_op_cml_2 <= alu_op_cml_1;
1267
mac_op_cml_2 <= mac_op_cml_1;
1268
shrot_op_cml_2 <= shrot_op_cml_1;
1269
rfwb_op_cml_2 <= rfwb_op_cml_1;
1270
wb_insn_cml_2 <= wb_insn_cml_1;
1271
lsu_op_cml_2 <= lsu_op_cml_1;
1272
comp_op_cml_2 <= comp_op_cml_1;
1273
spr_addrimm_cml_2 <= spr_addrimm_cml_1;
1274
wbforw_valid_cml_2 <= wbforw_valid_cml_1;
1275
sig_syscall_cml_2 <= sig_syscall_cml_1;
1276
sig_trap_cml_2 <= sig_trap_cml_1;
1277
ex_macrc_op_cml_2 <= ex_macrc_op_cml_1;
1278
except_illegal_cml_2 <= except_illegal_cml_1;
1279
pre_branch_op_cml_2 <= pre_branch_op_cml_1;
1280
id_insn_cml_2 <= id_insn_cml_1;
1281
wb_rfaddrw_cml_2 <= wb_rfaddrw_cml_1;
1282
sel_imm_cml_2 <= sel_imm_cml_1;
1283
end
1284
always @ (posedge clk_i_cml_3) begin
1285
ex_freeze_cml_3 <= ex_freeze;
1286
wb_freeze_cml_3 <= wb_freeze;
1287
ex_insn_cml_3 <= ex_insn_cml_2;
1288
branch_op_cml_3 <= branch_op_cml_2;
1289
rf_addrw_cml_3 <= rf_addrw_cml_2;
1290
alu_op_cml_3 <= alu_op_cml_2;
1291
mac_op_cml_3 <= mac_op_cml_2;
1292
shrot_op_cml_3 <= shrot_op_cml_2;
1293
rfwb_op_cml_3 <= rfwb_op_cml_2;
1294
wb_insn_cml_3 <= wb_insn_cml_2;
1295
lsu_op_cml_3 <= lsu_op_cml_2;
1296
comp_op_cml_3 <= comp_op_cml_2;
1297
spr_addrimm_cml_3 <= spr_addrimm_cml_2;
1298
wbforw_valid_cml_3 <= wbforw_valid_cml_2;
1299
sig_syscall_cml_3 <= sig_syscall_cml_2;
1300
sig_trap_cml_3 <= sig_trap_cml_2;
1301
ex_macrc_op_cml_3 <= ex_macrc_op_cml_2;
1302
except_illegal_cml_3 <= except_illegal_cml_2;
1303
pre_branch_op_cml_3 <= pre_branch_op_cml_2;
1304
id_insn_cml_3 <= id_insn_cml_2;
1305
wb_rfaddrw_cml_3 <= wb_rfaddrw_cml_2;
1306
sel_imm_cml_3 <= sel_imm_cml_2;
1307
end
1308
endmodule
1309
 

powered by: WebSVN 2.1.0

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