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

Subversion Repositories or1200_hp

[/] [or1200_hp/] [trunk/] [rtl/] [rtl_cm3/] [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_cm3(
127
                clk_i_cml_1,
128
                clk_i_cml_2,
129
 
130
        // Clock and reset
131
        clk, rst,
132
 
133
        // Internal i/f
134
        id_freeze, ex_freeze, wb_freeze, flushpipe, if_insn, ex_insn, branch_op, branch_taken,
135
        rf_addra, rf_addrb, rf_rda, rf_rdb, alu_op, mac_op, shrot_op, comp_op, rf_addrw, rfwb_op,
136
        wb_insn, simm, branch_addrofs, lsu_addrofs, sel_a, sel_b, lsu_op,
137
        cust5_op, cust5_limm,
138
        multicycle, spr_addrimm, wbforw_valid, du_hwbkpt, sig_syscall, sig_trap,
139
        force_dslot_fetch, no_more_dslot, ex_void, id_macrc_op, ex_macrc_op, rfe, except_illegal
140
);
141
 
142
 
143
input clk_i_cml_1;
144
input clk_i_cml_2;
145
reg  ex_freeze_cml_2;
146
reg  wb_freeze_cml_2;
147
reg [ 31 : 0 ] ex_insn_cml_2;
148
reg [ 31 : 0 ] ex_insn_cml_1;
149
reg [ 3 - 1 : 0 ] branch_op_cml_2;
150
reg [ 3 - 1 : 0 ] branch_op_cml_1;
151
reg [ 5 - 1 : 0 ] rf_addrw_cml_2;
152
reg [ 5 - 1 : 0 ] rf_addrw_cml_1;
153
reg [ 4 - 1 : 0 ] alu_op_cml_2;
154
reg [ 4 - 1 : 0 ] alu_op_cml_1;
155
reg [ 2 - 1 : 0 ] mac_op_cml_2;
156
reg [ 2 - 1 : 0 ] mac_op_cml_1;
157
reg [ 2 - 1 : 0 ] shrot_op_cml_2;
158
reg [ 2 - 1 : 0 ] shrot_op_cml_1;
159
reg [ 3 - 1 : 0 ] rfwb_op_cml_2;
160
reg [ 3 - 1 : 0 ] rfwb_op_cml_1;
161
reg [ 31 : 0 ] wb_insn_cml_2;
162
reg [ 31 : 0 ] wb_insn_cml_1;
163
reg [ 4 - 1 : 0 ] lsu_op_cml_2;
164
reg [ 4 - 1 : 0 ] lsu_op_cml_1;
165
reg [ 4 - 1 : 0 ] comp_op_cml_2;
166
reg [ 4 - 1 : 0 ] comp_op_cml_1;
167
reg [ 15 : 0 ] spr_addrimm_cml_2;
168
reg [ 15 : 0 ] spr_addrimm_cml_1;
169
reg  wbforw_valid_cml_2;
170
reg  wbforw_valid_cml_1;
171
reg  sig_syscall_cml_2;
172
reg  sig_syscall_cml_1;
173
reg  sig_trap_cml_2;
174
reg  sig_trap_cml_1;
175
reg  ex_macrc_op_cml_2;
176
reg  ex_macrc_op_cml_1;
177
reg  except_illegal_cml_2;
178
reg  except_illegal_cml_1;
179
reg [ 3 - 1 : 0 ] pre_branch_op_cml_2;
180
reg [ 3 - 1 : 0 ] pre_branch_op_cml_1;
181
reg [ 31 : 0 ] id_insn_cml_2;
182
reg [ 31 : 0 ] id_insn_cml_1;
183
reg [ 5 - 1 : 0 ] wb_rfaddrw_cml_2;
184
reg [ 5 - 1 : 0 ] wb_rfaddrw_cml_1;
185
reg  sel_imm_cml_2;
186
reg  sel_imm_cml_1;
187
 
188
 
189
 
190
//
191
// I/O
192
//
193
input                                   clk;
194
input                                   rst;
195
input                                   id_freeze;
196
input                                   ex_freeze;
197
input                                   wb_freeze;
198
input                                   flushpipe;
199
input   [31:0]                           if_insn;
200
output  [31:0]                           ex_insn;
201
output  [`OR1200_BRANCHOP_WIDTH-1:0]             branch_op;
202
input                                           branch_taken;
203
output  [`OR1200_REGFILE_ADDR_WIDTH-1:0] rf_addrw;
204
output  [`OR1200_REGFILE_ADDR_WIDTH-1:0] rf_addra;
205
output  [`OR1200_REGFILE_ADDR_WIDTH-1:0] rf_addrb;
206
output                                  rf_rda;
207
output                                  rf_rdb;
208
output  [`OR1200_ALUOP_WIDTH-1:0]                alu_op;
209
output  [`OR1200_MACOP_WIDTH-1:0]                mac_op;
210
output  [`OR1200_SHROTOP_WIDTH-1:0]              shrot_op;
211
output  [`OR1200_RFWBOP_WIDTH-1:0]               rfwb_op;
212
output  [31:0]                           wb_insn;
213
output  [31:0]                           simm;
214
output  [31:2]                          branch_addrofs;
215
output  [31:0]                           lsu_addrofs;
216
output  [`OR1200_SEL_WIDTH-1:0]          sel_a;
217
output  [`OR1200_SEL_WIDTH-1:0]          sel_b;
218
output  [`OR1200_LSUOP_WIDTH-1:0]                lsu_op;
219
output  [`OR1200_COMPOP_WIDTH-1:0]               comp_op;
220
output  [`OR1200_MULTICYCLE_WIDTH-1:0]           multicycle;
221
output  [4:0]                            cust5_op;
222
output  [5:0]                            cust5_limm;
223
output  [15:0]                           spr_addrimm;
224
input                                   wbforw_valid;
225
input                                   du_hwbkpt;
226
output                                  sig_syscall;
227
output                                  sig_trap;
228
output                                  force_dslot_fetch;
229
output                                  no_more_dslot;
230
output                                  ex_void;
231
output                                  id_macrc_op;
232
output                                  ex_macrc_op;
233
output                                  rfe;
234
output                                  except_illegal;
235
 
236
//
237
// Internal wires and regs
238
//
239
reg     [`OR1200_BRANCHOP_WIDTH-1:0]             pre_branch_op;
240
reg     [`OR1200_BRANCHOP_WIDTH-1:0]             branch_op;
241
reg     [`OR1200_ALUOP_WIDTH-1:0]                alu_op;
242
`ifdef OR1200_MAC_IMPLEMENTED
243
reg     [`OR1200_MACOP_WIDTH-1:0]                mac_op;
244
reg                                     ex_macrc_op;
245
`else
246
wire    [`OR1200_MACOP_WIDTH-1:0]                mac_op;
247
wire                                    ex_macrc_op;
248
`endif
249
reg     [`OR1200_SHROTOP_WIDTH-1:0]              shrot_op;
250
reg     [31:0]                           id_insn;
251
reg     [31:0]                           ex_insn;
252
reg     [31:0]                           wb_insn;
253
reg     [`OR1200_REGFILE_ADDR_WIDTH-1:0] rf_addrw;
254
reg     [`OR1200_REGFILE_ADDR_WIDTH-1:0] wb_rfaddrw;
255
reg     [`OR1200_RFWBOP_WIDTH-1:0]               rfwb_op;
256
reg     [31:0]                           lsu_addrofs;
257
reg     [`OR1200_SEL_WIDTH-1:0]          sel_a;
258
reg     [`OR1200_SEL_WIDTH-1:0]          sel_b;
259
reg                                     sel_imm;
260
reg     [`OR1200_LSUOP_WIDTH-1:0]                lsu_op;
261
reg     [`OR1200_COMPOP_WIDTH-1:0]               comp_op;
262
reg     [`OR1200_MULTICYCLE_WIDTH-1:0]           multicycle;
263
reg                                     imm_signextend;
264
reg     [15:0]                           spr_addrimm;
265
reg                                     sig_syscall;
266
reg                                     sig_trap;
267
reg                                     except_illegal;
268
wire                                    id_void;
269
 
270
//
271
// Register file read addresses
272
//
273
assign rf_addra = if_insn[20:16];
274
assign rf_addrb = if_insn[15:11];
275
assign rf_rda = if_insn[31];
276
assign rf_rdb = if_insn[30];
277
 
278
//
279
// Force fetch of delay slot instruction when jump/branch is preceeded by load/store
280
// instructions
281
//
282
// SIMON
283
// assign force_dslot_fetch = ((|pre_branch_op) & (|lsu_op));
284
assign force_dslot_fetch = 1'b0;
285
assign no_more_dslot = |branch_op & !id_void & branch_taken | (branch_op == `OR1200_BRANCHOP_RFE);
286
assign id_void = (id_insn[31:26] == `OR1200_OR32_NOP) & id_insn[16];
287
 
288
// SynEDA CoreMultiplier
289
// assignment(s): ex_void
290
// replace(s): ex_insn
291
assign ex_void = (ex_insn_cml_1[31:26] == `OR1200_OR32_NOP) & ex_insn_cml_1[16];
292
 
293
//
294
// Sign/Zero extension of immediates
295
//
296
 
297
// SynEDA CoreMultiplier
298
// assignment(s): simm
299
// replace(s): id_insn
300
assign simm = (imm_signextend == 1'b1) ? {{16{id_insn_cml_2[15]}}, id_insn_cml_2[15:0]} : {{16'b0}, id_insn_cml_2[15:0]};
301
 
302
//
303
// Sign extension of branch offset
304
//
305
assign branch_addrofs = {{4{ex_insn[25]}}, ex_insn[25:0]};
306
 
307
//
308
// l.macrc in ID stage
309
//
310
`ifdef OR1200_MAC_IMPLEMENTED
311
 
312
// SynEDA CoreMultiplier
313
// assignment(s): id_macrc_op
314
// replace(s): id_insn
315
assign id_macrc_op = (id_insn_cml_2[31:26] == `OR1200_OR32_MOVHI) & id_insn_cml_2[16];
316
`else
317
assign id_macrc_op = 1'b0;
318
`endif
319
 
320
//
321
// cust5_op, cust5_limm (L immediate)
322
//
323
assign cust5_op = ex_insn[4:0];
324
assign cust5_limm = ex_insn[10:5];
325
 
326
//
327
//
328
//
329
 
330
// SynEDA CoreMultiplier
331
// assignment(s): rfe
332
// replace(s): branch_op, pre_branch_op
333
assign rfe = (pre_branch_op_cml_2 == `OR1200_BRANCHOP_RFE) | (branch_op_cml_2 == `OR1200_BRANCHOP_RFE);
334
 
335
//
336
// Generation of sel_a
337
//
338
 
339
// SynEDA CoreMultiplier
340
// assignment(s): sel_a
341
// replace(s): rf_addrw, rfwb_op, wbforw_valid, id_insn, wb_rfaddrw
342
always @(rf_addrw_cml_2 or id_insn_cml_2 or rfwb_op_cml_2 or wbforw_valid_cml_2 or wb_rfaddrw_cml_2)
343
        if ((id_insn_cml_2[20:16] == rf_addrw_cml_2) && rfwb_op_cml_2[0])
344
                sel_a = `OR1200_SEL_EX_FORW;
345
        else if ((id_insn_cml_2[20:16] == wb_rfaddrw_cml_2) && wbforw_valid_cml_2)
346
                sel_a = `OR1200_SEL_WB_FORW;
347
        else
348
                sel_a = `OR1200_SEL_RF;
349
 
350
//
351
// Generation of sel_b
352
//
353
 
354
// SynEDA CoreMultiplier
355
// assignment(s): sel_b
356
// replace(s): rf_addrw, rfwb_op, wbforw_valid, id_insn, wb_rfaddrw, sel_imm
357
always @(rf_addrw_cml_2 or sel_imm_cml_2 or id_insn_cml_2 or rfwb_op_cml_2 or wbforw_valid_cml_2 or wb_rfaddrw_cml_2)
358
        if (sel_imm_cml_2)
359
                sel_b = `OR1200_SEL_IMM;
360
        else if ((id_insn_cml_2[15:11] == rf_addrw_cml_2) && rfwb_op_cml_2[0])
361
                sel_b = `OR1200_SEL_EX_FORW;
362
        else if ((id_insn_cml_2[15:11] == wb_rfaddrw_cml_2) && wbforw_valid_cml_2)
363
                sel_b = `OR1200_SEL_WB_FORW;
364
        else
365
                sel_b = `OR1200_SEL_RF;
366
 
367
//
368
// l.macrc in EX stage
369
//
370
`ifdef OR1200_MAC_IMPLEMENTED
371
 
372
// SynEDA CoreMultiplier
373
// assignment(s): ex_macrc_op
374
// replace(s): ex_freeze, ex_macrc_op
375
always @(posedge clk or posedge rst) begin
376
        if (rst)
377
                ex_macrc_op <= #1 1'b0;
378
        else begin  ex_macrc_op <= ex_macrc_op_cml_2; if (!ex_freeze_cml_2 & id_freeze | flushpipe)
379
                ex_macrc_op <= #1 1'b0;
380
        else if (!ex_freeze_cml_2)
381
                ex_macrc_op <= #1 id_macrc_op; end
382
end
383
`else
384
assign ex_macrc_op = 1'b0;
385
`endif
386
 
387
//
388
// Decode of spr_addrimm
389
//
390
 
391
// SynEDA CoreMultiplier
392
// assignment(s): spr_addrimm
393
// replace(s): ex_freeze, spr_addrimm, id_insn
394
always @(posedge clk or posedge rst) begin
395
        if (rst)
396
                spr_addrimm <= #1 16'h0000;
397
        else begin  spr_addrimm <= spr_addrimm_cml_2; if (!ex_freeze_cml_2 & id_freeze | flushpipe)
398
                spr_addrimm <= #1 16'h0000;
399
        else if (!ex_freeze_cml_2) begin
400
                case (id_insn_cml_2[31:26])     // synopsys parallel_case
401
                        // l.mfspr
402
                        `OR1200_OR32_MFSPR:
403
                                spr_addrimm <= #1 id_insn_cml_2[15:0];
404
                        // l.mtspr
405
                        default:
406
                                spr_addrimm <= #1 {id_insn_cml_2[25:21], id_insn_cml_2[10:0]};
407
                endcase
408
        end end
409
end
410
 
411
//
412
// Decode of multicycle
413
//
414
 
415
// SynEDA CoreMultiplier
416
// assignment(s): multicycle
417
// replace(s): id_insn
418
always @(id_insn_cml_2) begin
419
  case (id_insn_cml_2[31:26])           // synopsys parallel_case
420
`ifdef UNUSED
421
    // l.lwz
422
    `OR1200_OR32_LWZ:
423
      multicycle = `OR1200_TWO_CYCLES;
424
 
425
    // l.lbz
426
    `OR1200_OR32_LBZ:
427
      multicycle = `OR1200_TWO_CYCLES;
428
 
429
    // l.lbs
430
    `OR1200_OR32_LBS:
431
      multicycle = `OR1200_TWO_CYCLES;
432
 
433
    // l.lhz
434
    `OR1200_OR32_LHZ:
435
      multicycle = `OR1200_TWO_CYCLES;
436
 
437
    // l.lhs
438
    `OR1200_OR32_LHS:
439
      multicycle = `OR1200_TWO_CYCLES;
440
 
441
    // l.sw
442
    `OR1200_OR32_SW:
443
      multicycle = `OR1200_TWO_CYCLES;
444
 
445
    // l.sb
446
    `OR1200_OR32_SB:
447
      multicycle = `OR1200_TWO_CYCLES;
448
 
449
    // l.sh
450
    `OR1200_OR32_SH:
451
      multicycle = `OR1200_TWO_CYCLES;
452
`endif
453
    // ALU instructions except the one with immediate
454
    `OR1200_OR32_ALU:
455
      multicycle = id_insn_cml_2[`OR1200_ALUMCYC_POS];
456
 
457
    // Single cycle instructions
458
    default: begin
459
      multicycle = `OR1200_ONE_CYCLE;
460
    end
461
 
462
  endcase
463
 
464
end
465
 
466
//
467
// Decode of imm_signextend
468
//
469
 
470
// SynEDA CoreMultiplier
471
// assignment(s): imm_signextend
472
// replace(s): id_insn
473
always @(id_insn_cml_2) begin
474
  case (id_insn_cml_2[31:26])           // synopsys parallel_case
475
 
476
        // l.addi
477
        `OR1200_OR32_ADDI:
478
                imm_signextend = 1'b1;
479
 
480
        // l.addic
481
        `OR1200_OR32_ADDIC:
482
                imm_signextend = 1'b1;
483
 
484
        // l.xori
485
        `OR1200_OR32_XORI:
486
                imm_signextend = 1'b1;
487
 
488
        // l.muli
489
`ifdef OR1200_MULT_IMPLEMENTED
490
        `OR1200_OR32_MULI:
491
                imm_signextend = 1'b1;
492
`endif
493
 
494
        // l.maci
495
`ifdef OR1200_MAC_IMPLEMENTED
496
        `OR1200_OR32_MACI:
497
                imm_signextend = 1'b1;
498
`endif
499
 
500
        // SFXX insns with immediate
501
        `OR1200_OR32_SFXXI:
502
                imm_signextend = 1'b1;
503
 
504
        // Instructions with no or zero extended immediate
505
        default: begin
506
                imm_signextend = 1'b0;
507
        end
508
 
509
endcase
510
 
511
end
512
 
513
//
514
// LSU addr offset
515
//
516
always @(lsu_op or ex_insn) begin
517
        lsu_addrofs[10:0] = ex_insn[10:0];
518
        case(lsu_op)    // synopsys parallel_case
519
                `OR1200_LSUOP_SW, `OR1200_LSUOP_SH, `OR1200_LSUOP_SB :
520
                        lsu_addrofs[31:11] = {{16{ex_insn[25]}}, ex_insn[25:21]};
521
                default :
522
                        lsu_addrofs[31:11] = {{16{ex_insn[15]}}, ex_insn[15:11]};
523
        endcase
524
end
525
 
526
//
527
// Register file write address
528
//
529
 
530
// SynEDA CoreMultiplier
531
// assignment(s): rf_addrw
532
// replace(s): ex_freeze, rf_addrw, pre_branch_op, id_insn
533
always @(posedge clk or posedge rst) begin
534
        if (rst)
535
                rf_addrw <= #1 5'd0;
536
        else begin  rf_addrw <= rf_addrw_cml_2; if (!ex_freeze_cml_2 & id_freeze)
537
                rf_addrw <= #1 5'd00;
538
        else if (!ex_freeze_cml_2)
539
                case (pre_branch_op_cml_2)      // synopsys parallel_case
540
                        `OR1200_BRANCHOP_JR, `OR1200_BRANCHOP_BAL:
541
                                rf_addrw <= #1 5'd09;   // link register r9
542
                        default:
543
                                rf_addrw <= #1 id_insn_cml_2[25:21];
544
                endcase end
545
end
546
 
547
//
548
// rf_addrw in wb stage (used in forwarding logic)
549
//
550
 
551
// SynEDA CoreMultiplier
552
// assignment(s): wb_rfaddrw
553
// replace(s): wb_freeze, rf_addrw, wb_rfaddrw
554
always @(posedge clk or posedge rst) begin
555
        if (rst)
556
                wb_rfaddrw <= #1 5'd0;
557
        else begin  wb_rfaddrw <= wb_rfaddrw_cml_2; if (!wb_freeze_cml_2)
558
                wb_rfaddrw <= #1 rf_addrw_cml_2; end
559
end
560
 
561
//
562
// Instruction latch in id_insn
563
//
564
 
565
// SynEDA CoreMultiplier
566
// assignment(s): id_insn
567
// replace(s): id_insn
568
always @(posedge clk or posedge rst) begin
569
        if (rst)
570
                id_insn <= #1 {`OR1200_OR32_NOP, 26'h041_0000};
571
        else begin  id_insn <= id_insn_cml_2; if (flushpipe)
572
                id_insn <= #1 {`OR1200_OR32_NOP, 26'h041_0000};        // id_insn[16] must be 1
573
        else if (!id_freeze) begin
574
                id_insn <= #1 if_insn;
575
`ifdef OR1200_VERBOSE
576
// synopsys translate_off
577
                $display("%t: id_insn <= %h", $time, if_insn);
578
// synopsys translate_on
579
`endif
580
        end end
581
end
582
 
583
//
584
// Instruction latch in ex_insn
585
//
586
 
587
// SynEDA CoreMultiplier
588
// assignment(s): ex_insn
589
// replace(s): ex_freeze, ex_insn, id_insn
590
always @(posedge clk or posedge rst) begin
591
        if (rst)
592
                ex_insn <= #1 {`OR1200_OR32_NOP, 26'h041_0000};
593
        else begin  ex_insn <= ex_insn_cml_2; if (!ex_freeze_cml_2 & id_freeze | flushpipe)
594
                ex_insn <= #1 {`OR1200_OR32_NOP, 26'h041_0000}; // ex_insn[16] must be 1
595
        else if (!ex_freeze_cml_2) begin
596
                ex_insn <= #1 id_insn_cml_2;
597
`ifdef OR1200_VERBOSE
598
// synopsys translate_off
599
                $display("%t: ex_insn <= %h", $time, id_insn);
600
// synopsys translate_on
601
`endif
602
        end end
603
end
604
 
605
//
606
// Instruction latch in wb_insn
607
//
608
 
609
// SynEDA CoreMultiplier
610
// assignment(s): wb_insn
611
// replace(s): wb_freeze, ex_insn, wb_insn
612
always @(posedge clk or posedge rst) begin
613
        if (rst)
614
                wb_insn <= #1 {`OR1200_OR32_NOP, 26'h041_0000};
615
        else begin  wb_insn <= wb_insn_cml_2; if (flushpipe)
616
                wb_insn <= #1 {`OR1200_OR32_NOP, 26'h041_0000}; // wb_insn[16] must be 1
617
        else if (!wb_freeze_cml_2) begin
618
                wb_insn <= #1 ex_insn_cml_2;
619
        end end
620
end
621
 
622
//
623
// Decode of sel_imm
624
//
625
 
626
// SynEDA CoreMultiplier
627
// assignment(s): sel_imm
628
// replace(s): sel_imm
629
always @(posedge clk or posedge rst) begin
630
        if (rst)
631
                sel_imm <= #1 1'b0;
632
        else begin  sel_imm <= sel_imm_cml_2; if (!id_freeze) begin
633
          case (if_insn[31:26])         // synopsys parallel_case
634
 
635
            // j.jalr
636
            `OR1200_OR32_JALR:
637
              sel_imm <= #1 1'b0;
638
 
639
            // l.jr
640
            `OR1200_OR32_JR:
641
              sel_imm <= #1 1'b0;
642
 
643
            // l.rfe
644
            `OR1200_OR32_RFE:
645
              sel_imm <= #1 1'b0;
646
 
647
            // l.mfspr
648
            `OR1200_OR32_MFSPR:
649
              sel_imm <= #1 1'b0;
650
 
651
            // l.mtspr
652
            `OR1200_OR32_MTSPR:
653
              sel_imm <= #1 1'b0;
654
 
655
            // l.sys, l.brk and all three sync insns
656
            `OR1200_OR32_XSYNC:
657
              sel_imm <= #1 1'b0;
658
 
659
            // l.mac/l.msb
660
`ifdef OR1200_MAC_IMPLEMENTED
661
            `OR1200_OR32_MACMSB:
662
              sel_imm <= #1 1'b0;
663
`endif
664
 
665
            // l.sw
666
            `OR1200_OR32_SW:
667
              sel_imm <= #1 1'b0;
668
 
669
            // l.sb
670
            `OR1200_OR32_SB:
671
              sel_imm <= #1 1'b0;
672
 
673
            // l.sh
674
            `OR1200_OR32_SH:
675
              sel_imm <= #1 1'b0;
676
 
677
            // ALU instructions except the one with immediate
678
            `OR1200_OR32_ALU:
679
              sel_imm <= #1 1'b0;
680
 
681
            // SFXX instructions
682
            `OR1200_OR32_SFXX:
683
              sel_imm <= #1 1'b0;
684
 
685
`ifdef OR1200_OR32_CUST5
686
            // l.cust5 instructions
687
            `OR1200_OR32_CUST5:
688
              sel_imm <= #1 1'b0;
689
`endif
690
 
691
            // l.nop
692
            `OR1200_OR32_NOP:
693
              sel_imm <= #1 1'b0;
694
 
695
            // All instructions with immediates
696
            default: begin
697
              sel_imm <= #1 1'b1;
698
            end
699
 
700
          endcase
701
 
702
        end end
703
end
704
 
705
//
706
// Decode of except_illegal
707
//
708
 
709
// SynEDA CoreMultiplier
710
// assignment(s): except_illegal
711
// replace(s): ex_freeze, except_illegal, id_insn
712
always @(posedge clk or posedge rst) begin
713
        if (rst)
714
                except_illegal <= #1 1'b0;
715
        else begin  except_illegal <= except_illegal_cml_2; if (!ex_freeze_cml_2 & id_freeze | flushpipe)
716
                except_illegal <= #1 1'b0;
717
        else if (!ex_freeze_cml_2) begin
718
          case (id_insn_cml_2[31:26])           // synopsys parallel_case
719
 
720
            `OR1200_OR32_J,
721
            `OR1200_OR32_JAL,
722
            `OR1200_OR32_JALR,
723
            `OR1200_OR32_JR,
724
            `OR1200_OR32_BNF,
725
            `OR1200_OR32_BF,
726
            `OR1200_OR32_RFE,
727
            `OR1200_OR32_MOVHI,
728
            `OR1200_OR32_MFSPR,
729
            `OR1200_OR32_XSYNC,
730
`ifdef OR1200_MAC_IMPLEMENTED
731
            `OR1200_OR32_MACI,
732
`endif
733
            `OR1200_OR32_LWZ,
734
            `OR1200_OR32_LBZ,
735
            `OR1200_OR32_LBS,
736
            `OR1200_OR32_LHZ,
737
            `OR1200_OR32_LHS,
738
            `OR1200_OR32_ADDI,
739
            `OR1200_OR32_ADDIC,
740
            `OR1200_OR32_ANDI,
741
            `OR1200_OR32_ORI,
742
            `OR1200_OR32_XORI,
743
`ifdef OR1200_MULT_IMPLEMENTED
744
            `OR1200_OR32_MULI,
745
`endif
746
            `OR1200_OR32_SH_ROTI,
747
            `OR1200_OR32_SFXXI,
748
            `OR1200_OR32_MTSPR,
749
`ifdef OR1200_MAC_IMPLEMENTED
750
            `OR1200_OR32_MACMSB,
751
`endif
752
            `OR1200_OR32_SW,
753
            `OR1200_OR32_SB,
754
            `OR1200_OR32_SH,
755
            `OR1200_OR32_ALU,
756
            `OR1200_OR32_SFXX,
757
`ifdef OR1200_OR32_CUST5
758
            `OR1200_OR32_CUST5,
759
`endif
760
            `OR1200_OR32_NOP:
761
                except_illegal <= #1 1'b0;
762
 
763
            // Illegal and OR1200 unsupported instructions
764
            default:
765
              except_illegal <= #1 1'b1;
766
 
767
          endcase
768
 
769
        end end
770
end
771
 
772
//
773
// Decode of alu_op
774
//
775
 
776
// SynEDA CoreMultiplier
777
// assignment(s): alu_op
778
// replace(s): ex_freeze, alu_op, id_insn
779
always @(posedge clk or posedge rst) begin
780
        if (rst)
781
                alu_op <= #1 `OR1200_ALUOP_NOP;
782
        else begin  alu_op <= alu_op_cml_2; if (!ex_freeze_cml_2 & id_freeze | flushpipe)
783
                alu_op <= #1 `OR1200_ALUOP_NOP;
784
        else if (!ex_freeze_cml_2) begin
785
          case (id_insn_cml_2[31:26])           // synopsys parallel_case
786
 
787
            // l.j
788
            `OR1200_OR32_J:
789
              alu_op <= #1 `OR1200_ALUOP_IMM;
790
 
791
            // j.jal
792
            `OR1200_OR32_JAL:
793
              alu_op <= #1 `OR1200_ALUOP_IMM;
794
 
795
            // l.bnf
796
            `OR1200_OR32_BNF:
797
              alu_op <= #1 `OR1200_ALUOP_NOP;
798
 
799
            // l.bf
800
            `OR1200_OR32_BF:
801
              alu_op <= #1 `OR1200_ALUOP_NOP;
802
 
803
            // l.movhi
804
            `OR1200_OR32_MOVHI:
805
              alu_op <= #1 `OR1200_ALUOP_MOVHI;
806
 
807
            // l.mfspr
808
            `OR1200_OR32_MFSPR:
809
              alu_op <= #1 `OR1200_ALUOP_MFSR;
810
 
811
            // l.mtspr
812
            `OR1200_OR32_MTSPR:
813
              alu_op <= #1 `OR1200_ALUOP_MTSR;
814
 
815
            // l.addi
816
            `OR1200_OR32_ADDI:
817
              alu_op <= #1 `OR1200_ALUOP_ADD;
818
 
819
            // l.addic
820
            `OR1200_OR32_ADDIC:
821
              alu_op <= #1 `OR1200_ALUOP_ADDC;
822
 
823
            // l.andi
824
            `OR1200_OR32_ANDI:
825
              alu_op <= #1 `OR1200_ALUOP_AND;
826
 
827
            // l.ori
828
            `OR1200_OR32_ORI:
829
              alu_op <= #1 `OR1200_ALUOP_OR;
830
 
831
            // l.xori
832
            `OR1200_OR32_XORI:
833
              alu_op <= #1 `OR1200_ALUOP_XOR;
834
 
835
            // l.muli
836
`ifdef OR1200_MULT_IMPLEMENTED
837
            `OR1200_OR32_MULI:
838
              alu_op <= #1 `OR1200_ALUOP_MUL;
839
`endif
840
 
841
            // Shift and rotate insns with immediate
842
            `OR1200_OR32_SH_ROTI:
843
              alu_op <= #1 `OR1200_ALUOP_SHROT;
844
 
845
            // SFXX insns with immediate
846
            `OR1200_OR32_SFXXI:
847
              alu_op <= #1 `OR1200_ALUOP_COMP;
848
 
849
            // ALU instructions except the one with immediate
850
            `OR1200_OR32_ALU:
851
              alu_op <= #1 id_insn_cml_2[3:0];
852
 
853
            // SFXX instructions
854
            `OR1200_OR32_SFXX:
855
              alu_op <= #1 `OR1200_ALUOP_COMP;
856
 
857
`ifdef OR1200_OR32_CUST5
858
            // l.cust5 instructions
859
            `OR1200_OR32_CUST5:
860
              alu_op <= #1 `OR1200_ALUOP_CUST5;
861
`endif
862
 
863
            // Default
864
            default: begin
865
              alu_op <= #1 `OR1200_ALUOP_NOP;
866
            end
867
 
868
          endcase
869
 
870
        end end
871
end
872
 
873
//
874
// Decode of mac_op
875
//
876
`ifdef OR1200_MAC_IMPLEMENTED
877
 
878
// SynEDA CoreMultiplier
879
// assignment(s): mac_op
880
// replace(s): ex_freeze, mac_op, id_insn
881
always @(posedge clk or posedge rst) begin
882
        if (rst)
883
                mac_op <= #1 `OR1200_MACOP_NOP;
884
        else begin  mac_op <= mac_op_cml_2; if (!ex_freeze_cml_2 & id_freeze | flushpipe)
885
                mac_op <= #1 `OR1200_MACOP_NOP;
886
        else if (!ex_freeze_cml_2)
887
          case (id_insn_cml_2[31:26])           // synopsys parallel_case
888
 
889
            // l.maci
890
            `OR1200_OR32_MACI:
891
              mac_op <= #1 `OR1200_MACOP_MAC;
892
 
893
            // l.nop
894
            `OR1200_OR32_MACMSB:
895
              mac_op <= #1 id_insn_cml_2[1:0];
896
 
897
            // Illegal and OR1200 unsupported instructions
898
            default: begin
899
              mac_op <= #1 `OR1200_MACOP_NOP;
900
            end
901
 
902
          endcase
903
        else
904
                mac_op <= #1 `OR1200_MACOP_NOP; end
905
end
906
`else
907
assign mac_op = `OR1200_MACOP_NOP;
908
`endif
909
 
910
//
911
// Decode of shrot_op
912
//
913
 
914
// SynEDA CoreMultiplier
915
// assignment(s): shrot_op
916
// replace(s): ex_freeze, shrot_op, id_insn
917
always @(posedge clk or posedge rst) begin
918
        if (rst)
919
                shrot_op <= #1 `OR1200_SHROTOP_NOP;
920
        else begin  shrot_op <= shrot_op_cml_2; if (!ex_freeze_cml_2 & id_freeze | flushpipe)
921
                shrot_op <= #1 `OR1200_SHROTOP_NOP;
922
        else if (!ex_freeze_cml_2) begin
923
                shrot_op <= #1 id_insn_cml_2[`OR1200_SHROTOP_POS];
924
        end end
925
end
926
 
927
//
928
// Decode of rfwb_op
929
//
930
 
931
// SynEDA CoreMultiplier
932
// assignment(s): rfwb_op
933
// replace(s): ex_freeze, rfwb_op, id_insn
934
always @(posedge clk or posedge rst) begin
935
        if (rst)
936
                rfwb_op <= #1 `OR1200_RFWBOP_NOP;
937
        else begin  rfwb_op <= rfwb_op_cml_2;  if (!ex_freeze_cml_2 & id_freeze | flushpipe)
938
                rfwb_op <= #1 `OR1200_RFWBOP_NOP;
939
        else  if (!ex_freeze_cml_2) begin
940
                case (id_insn_cml_2[31:26])             // synopsys parallel_case
941
 
942
                  // j.jal
943
                  `OR1200_OR32_JAL:
944
                    rfwb_op <= #1 `OR1200_RFWBOP_LR;
945
 
946
                  // j.jalr
947
                  `OR1200_OR32_JALR:
948
                    rfwb_op <= #1 `OR1200_RFWBOP_LR;
949
 
950
                  // l.movhi
951
                  `OR1200_OR32_MOVHI:
952
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
953
 
954
                  // l.mfspr
955
                  `OR1200_OR32_MFSPR:
956
                    rfwb_op <= #1 `OR1200_RFWBOP_SPRS;
957
 
958
                  // l.lwz
959
                  `OR1200_OR32_LWZ:
960
                    rfwb_op <= #1 `OR1200_RFWBOP_LSU;
961
 
962
                  // l.lbz
963
                  `OR1200_OR32_LBZ:
964
                    rfwb_op <= #1 `OR1200_RFWBOP_LSU;
965
 
966
                  // l.lbs
967
                  `OR1200_OR32_LBS:
968
                    rfwb_op <= #1 `OR1200_RFWBOP_LSU;
969
 
970
                  // l.lhz
971
                  `OR1200_OR32_LHZ:
972
                    rfwb_op <= #1 `OR1200_RFWBOP_LSU;
973
 
974
                  // l.lhs
975
                  `OR1200_OR32_LHS:
976
                    rfwb_op <= #1 `OR1200_RFWBOP_LSU;
977
 
978
                  // l.addi
979
                  `OR1200_OR32_ADDI:
980
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
981
 
982
                  // l.addic
983
                  `OR1200_OR32_ADDIC:
984
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
985
 
986
                  // l.andi
987
                  `OR1200_OR32_ANDI:
988
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
989
 
990
                  // l.ori
991
                  `OR1200_OR32_ORI:
992
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
993
 
994
                  // l.xori
995
                  `OR1200_OR32_XORI:
996
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
997
 
998
                  // l.muli
999
`ifdef OR1200_MULT_IMPLEMENTED
1000
                  `OR1200_OR32_MULI:
1001
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
1002
`endif
1003
 
1004
                  // Shift and rotate insns with immediate
1005
                  `OR1200_OR32_SH_ROTI:
1006
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
1007
 
1008
                  // ALU instructions except the one with immediate
1009
                  `OR1200_OR32_ALU:
1010
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
1011
 
1012
`ifdef OR1200_OR32_CUST5
1013
                  // l.cust5 instructions
1014
                  `OR1200_OR32_CUST5:
1015
                    rfwb_op <= #1 `OR1200_RFWBOP_ALU;
1016
`endif
1017
 
1018
                  // Instructions w/o register-file write-back
1019
                  default: begin
1020
                    rfwb_op <= #1 `OR1200_RFWBOP_NOP;
1021
                  end
1022
 
1023
                endcase
1024
        end end
1025
end
1026
 
1027
//
1028
// Decode of pre_branch_op
1029
//
1030
 
1031
// SynEDA CoreMultiplier
1032
// assignment(s): pre_branch_op
1033
// replace(s): pre_branch_op
1034
always @(posedge clk or posedge rst) begin
1035
        if (rst)
1036
                pre_branch_op <= #1 `OR1200_BRANCHOP_NOP;
1037
        else begin  pre_branch_op <= pre_branch_op_cml_2; if (flushpipe)
1038
                pre_branch_op <= #1 `OR1200_BRANCHOP_NOP;
1039
        else if (!id_freeze) begin
1040
                case (if_insn[31:26])           // synopsys parallel_case
1041
 
1042
                  // l.j
1043
                  `OR1200_OR32_J:
1044
                    pre_branch_op <= #1 `OR1200_BRANCHOP_BAL;
1045
 
1046
                  // j.jal
1047
                  `OR1200_OR32_JAL:
1048
                    pre_branch_op <= #1 `OR1200_BRANCHOP_BAL;
1049
 
1050
                  // j.jalr
1051
                  `OR1200_OR32_JALR:
1052
                    pre_branch_op <= #1 `OR1200_BRANCHOP_JR;
1053
 
1054
                  // l.jr
1055
                  `OR1200_OR32_JR:
1056
                    pre_branch_op <= #1 `OR1200_BRANCHOP_JR;
1057
 
1058
                  // l.bnf
1059
                  `OR1200_OR32_BNF:
1060
                    pre_branch_op <= #1 `OR1200_BRANCHOP_BNF;
1061
 
1062
                  // l.bf
1063
                  `OR1200_OR32_BF:
1064
                    pre_branch_op <= #1 `OR1200_BRANCHOP_BF;
1065
 
1066
                  // l.rfe
1067
                  `OR1200_OR32_RFE:
1068
                    pre_branch_op <= #1 `OR1200_BRANCHOP_RFE;
1069
 
1070
                  // Non branch instructions
1071
                  default: begin
1072
                    pre_branch_op <= #1 `OR1200_BRANCHOP_NOP;
1073
                  end
1074
                endcase
1075
        end end
1076
end
1077
 
1078
//
1079
// Generation of branch_op
1080
//
1081
 
1082
// SynEDA CoreMultiplier
1083
// assignment(s): branch_op
1084
// replace(s): ex_freeze, branch_op, pre_branch_op
1085
always @(posedge clk or posedge rst)
1086
        if (rst)
1087
                branch_op <= #1 `OR1200_BRANCHOP_NOP;
1088
        else begin  branch_op <= branch_op_cml_2; if (!ex_freeze_cml_2 & id_freeze | flushpipe)
1089
                branch_op <= #1 `OR1200_BRANCHOP_NOP;
1090
        else if (!ex_freeze_cml_2)
1091
                branch_op <= #1 pre_branch_op_cml_2; end
1092
 
1093
//
1094
// Decode of lsu_op
1095
//
1096
 
1097
// SynEDA CoreMultiplier
1098
// assignment(s): lsu_op
1099
// replace(s): ex_freeze, lsu_op, id_insn
1100
always @(posedge clk or posedge rst) begin
1101
        if (rst)
1102
                lsu_op <= #1 `OR1200_LSUOP_NOP;
1103
        else begin  lsu_op <= lsu_op_cml_2; if (!ex_freeze_cml_2 & id_freeze | flushpipe)
1104
                lsu_op <= #1 `OR1200_LSUOP_NOP;
1105
        else if (!ex_freeze_cml_2)  begin
1106
          case (id_insn_cml_2[31:26])           // synopsys parallel_case
1107
 
1108
            // l.lwz
1109
            `OR1200_OR32_LWZ:
1110
              lsu_op <= #1 `OR1200_LSUOP_LWZ;
1111
 
1112
            // l.lbz
1113
            `OR1200_OR32_LBZ:
1114
              lsu_op <= #1 `OR1200_LSUOP_LBZ;
1115
 
1116
            // l.lbs
1117
            `OR1200_OR32_LBS:
1118
              lsu_op <= #1 `OR1200_LSUOP_LBS;
1119
 
1120
            // l.lhz
1121
            `OR1200_OR32_LHZ:
1122
              lsu_op <= #1 `OR1200_LSUOP_LHZ;
1123
 
1124
            // l.lhs
1125
            `OR1200_OR32_LHS:
1126
              lsu_op <= #1 `OR1200_LSUOP_LHS;
1127
 
1128
            // l.sw
1129
            `OR1200_OR32_SW:
1130
              lsu_op <= #1 `OR1200_LSUOP_SW;
1131
 
1132
            // l.sb
1133
            `OR1200_OR32_SB:
1134
              lsu_op <= #1 `OR1200_LSUOP_SB;
1135
 
1136
            // l.sh
1137
            `OR1200_OR32_SH:
1138
              lsu_op <= #1 `OR1200_LSUOP_SH;
1139
 
1140
            // Non load/store instructions
1141
            default: begin
1142
              lsu_op <= #1 `OR1200_LSUOP_NOP;
1143
            end
1144
          endcase
1145
        end end
1146
end
1147
 
1148
//
1149
// Decode of comp_op
1150
//
1151
 
1152
// SynEDA CoreMultiplier
1153
// assignment(s): comp_op
1154
// replace(s): ex_freeze, comp_op, id_insn
1155
always @(posedge clk or posedge rst) begin
1156
        if (rst) begin
1157
                comp_op <= #1 4'd0;
1158
        end else begin  comp_op <= comp_op_cml_2; if (!ex_freeze_cml_2 & id_freeze | flushpipe)
1159
                comp_op <= #1 4'd0;
1160
        else if (!ex_freeze_cml_2)
1161
                comp_op <= #1 id_insn_cml_2[24:21]; end
1162
end
1163
 
1164
//
1165
// Decode of l.sys
1166
//
1167
 
1168
// SynEDA CoreMultiplier
1169
// assignment(s): sig_syscall
1170
// replace(s): ex_freeze, sig_syscall, id_insn
1171
always @(posedge clk or posedge rst) begin
1172
        if (rst)
1173
                sig_syscall <= #1 1'b0;
1174
        else begin  sig_syscall <= sig_syscall_cml_2; if (!ex_freeze_cml_2 & id_freeze | flushpipe)
1175
                sig_syscall <= #1 1'b0;
1176
        else if (!ex_freeze_cml_2) begin
1177
`ifdef OR1200_VERBOSE
1178
// synopsys translate_off
1179
                if (id_insn_cml_2[31:23] == {`OR1200_OR32_XSYNC, 3'b000})
1180
                        $display("Generating sig_syscall");
1181
// synopsys translate_on
1182
`endif
1183
                sig_syscall <= #1 (id_insn_cml_2[31:23] == {`OR1200_OR32_XSYNC, 3'b000});
1184
        end end
1185
end
1186
 
1187
//
1188
// Decode of l.trap
1189
//
1190
 
1191
// SynEDA CoreMultiplier
1192
// assignment(s): sig_trap
1193
// replace(s): ex_freeze, sig_trap, id_insn
1194
always @(posedge clk or posedge rst) begin
1195
        if (rst)
1196
                sig_trap <= #1 1'b0;
1197
        else begin  sig_trap <= sig_trap_cml_2; if (!ex_freeze_cml_2 & id_freeze | flushpipe)
1198
                sig_trap <= #1 1'b0;
1199
        else if (!ex_freeze_cml_2) begin
1200
`ifdef OR1200_VERBOSE
1201
// synopsys translate_off
1202
                if (id_insn_cml_2[31:23] == {`OR1200_OR32_XSYNC, 3'b010})
1203
                        $display("Generating sig_trap");
1204
// synopsys translate_on
1205
`endif
1206
                sig_trap <= #1 (id_insn_cml_2[31:23] == {`OR1200_OR32_XSYNC, 3'b010})
1207
                        | du_hwbkpt;
1208
        end end
1209
end
1210
 
1211
 
1212
always @ (posedge clk_i_cml_1) begin
1213
ex_insn_cml_1 <= ex_insn;
1214
branch_op_cml_1 <= branch_op;
1215
rf_addrw_cml_1 <= rf_addrw;
1216
alu_op_cml_1 <= alu_op;
1217
mac_op_cml_1 <= mac_op;
1218
shrot_op_cml_1 <= shrot_op;
1219
rfwb_op_cml_1 <= rfwb_op;
1220
wb_insn_cml_1 <= wb_insn;
1221
lsu_op_cml_1 <= lsu_op;
1222
comp_op_cml_1 <= comp_op;
1223
spr_addrimm_cml_1 <= spr_addrimm;
1224
wbforw_valid_cml_1 <= wbforw_valid;
1225
sig_syscall_cml_1 <= sig_syscall;
1226
sig_trap_cml_1 <= sig_trap;
1227
ex_macrc_op_cml_1 <= ex_macrc_op;
1228
except_illegal_cml_1 <= except_illegal;
1229
pre_branch_op_cml_1 <= pre_branch_op;
1230
id_insn_cml_1 <= id_insn;
1231
wb_rfaddrw_cml_1 <= wb_rfaddrw;
1232
sel_imm_cml_1 <= sel_imm;
1233
end
1234
always @ (posedge clk_i_cml_2) begin
1235
ex_freeze_cml_2 <= ex_freeze;
1236
wb_freeze_cml_2 <= wb_freeze;
1237
ex_insn_cml_2 <= ex_insn_cml_1;
1238
branch_op_cml_2 <= branch_op_cml_1;
1239
rf_addrw_cml_2 <= rf_addrw_cml_1;
1240
alu_op_cml_2 <= alu_op_cml_1;
1241
mac_op_cml_2 <= mac_op_cml_1;
1242
shrot_op_cml_2 <= shrot_op_cml_1;
1243
rfwb_op_cml_2 <= rfwb_op_cml_1;
1244
wb_insn_cml_2 <= wb_insn_cml_1;
1245
lsu_op_cml_2 <= lsu_op_cml_1;
1246
comp_op_cml_2 <= comp_op_cml_1;
1247
spr_addrimm_cml_2 <= spr_addrimm_cml_1;
1248
wbforw_valid_cml_2 <= wbforw_valid_cml_1;
1249
sig_syscall_cml_2 <= sig_syscall_cml_1;
1250
sig_trap_cml_2 <= sig_trap_cml_1;
1251
ex_macrc_op_cml_2 <= ex_macrc_op_cml_1;
1252
except_illegal_cml_2 <= except_illegal_cml_1;
1253
pre_branch_op_cml_2 <= pre_branch_op_cml_1;
1254
id_insn_cml_2 <= id_insn_cml_1;
1255
wb_rfaddrw_cml_2 <= wb_rfaddrw_cml_1;
1256
sel_imm_cml_2 <= sel_imm_cml_1;
1257
end
1258
endmodule
1259
 

powered by: WebSVN 2.1.0

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