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

Subversion Repositories altor32

[/] [altor32/] [trunk/] [rtl/] [cpu/] [altor32_exec.v] - Blame information for rev 36

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

Line No. Rev Author Line
1 27 ultra_embe
//-----------------------------------------------------------------
2
//                           AltOR32 
3
//                Alternative Lightweight OpenRisc 
4 36 ultra_embe
//                            V2.1
5 27 ultra_embe
//                     Ultra-Embedded.com
6 36 ultra_embe
//                   Copyright 2011 - 2014
7 27 ultra_embe
//
8
//               Email: admin@ultra-embedded.com
9
//
10
//                       License: LGPL
11
//-----------------------------------------------------------------
12
//
13
// Copyright (C) 2011 - 2013 Ultra-Embedded.com
14
//
15
// This source file may be used and distributed without         
16
// restriction provided that this copyright statement is not    
17
// removed from the file and that any derivative work contains  
18
// the original copyright notice and the associated disclaimer. 
19
//
20
// This source file is free software; you can redistribute it   
21
// and/or modify it under the terms of the GNU Lesser General   
22
// Public License as published by the Free Software Foundation; 
23
// either version 2.1 of the License, or (at your option) any   
24
// later version.
25
//
26
// This source is distributed in the hope that it will be       
27
// useful, but WITHOUT ANY WARRANTY; without even the implied   
28
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      
29
// PURPOSE.  See the GNU Lesser General Public License for more 
30
// details.
31
//
32
// You should have received a copy of the GNU Lesser General    
33
// Public License along with this source; if not, write to the 
34
// Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
35
// Boston, MA  02111-1307  USA
36
//-----------------------------------------------------------------
37
 
38
//`define CONF_CORE_DEBUG
39
//`define CONF_CORE_TRACE
40
 
41
//-----------------------------------------------------------------
42
// Module - Instruction Execute
43
//-----------------------------------------------------------------
44
module altor32_exec
45
(
46
    // General
47
    input               clk_i /*verilator public*/,
48
    input               rst_i /*verilator public*/,
49
 
50
    // Maskable interrupt    
51
    input               intr_i /*verilator public*/,
52
 
53
    // Unmaskable interrupt
54
    input               nmi_i /*verilator public*/,
55
 
56
    // Fault
57
    output reg          fault_o /*verilator public*/,
58
 
59
    // Breakpoint / Trap
60
    output reg          break_o /*verilator public*/,
61
 
62
    // Cache control
63
    output reg          icache_flush_o /*verilator public*/,
64
    output reg          dcache_flush_o /*verilator public*/,
65
 
66
    // Branch
67
    output              branch_o /*verilator public*/,
68
    output [31:0]       branch_pc_o /*verilator public*/,
69
    output              stall_o /*verilator public*/,
70
 
71
    // Opcode & arguments
72
    input [31:0]        opcode_i /*verilator public*/,
73
    input [31:0]        opcode_pc_i /*verilator public*/,
74
    input               opcode_valid_i /*verilator public*/,
75
 
76
    // Reg A
77
    input [4:0]         reg_ra_i /*verilator public*/,
78
    input [31:0]        reg_ra_value_i /*verilator public*/,
79
 
80
    // Reg B
81
    input [4:0]         reg_rb_i /*verilator public*/,
82
    input [31:0]        reg_rb_value_i /*verilator public*/,
83
 
84
    // Reg D
85
    input [4:0]         reg_rd_i /*verilator public*/,
86
 
87
    // Output
88
    output [31:0]       opcode_o /*verilator public*/,
89
    output [4:0]        reg_rd_o /*verilator public*/,
90
    output [31:0]       reg_rd_value_o /*verilator public*/,
91
    output              mult_o /*verilator public*/,
92
    output [31:0]       mult_res_o /*verilator public*/,
93
 
94
    // Register write back bypass
95
    input [4:0]         wb_rd_i /*verilator public*/,
96
    input [31:0]        wb_rd_value_i /*verilator public*/,
97
 
98
    // Memory Interface
99
    output reg [31:0]   dmem_addr_o /*verilator public*/,
100
    output reg [31:0]   dmem_data_out_o /*verilator public*/,
101
    input [31:0]        dmem_data_in_i /*verilator public*/,
102 32 ultra_embe
    output reg [3:0]    dmem_sel_o /*verilator public*/,
103
    output reg          dmem_we_o /*verilator public*/,
104
    output reg          dmem_stb_o /*verilator public*/,
105
    output reg          dmem_cyc_o /*verilator public*/,
106
    input               dmem_stall_i /*verilator public*/,
107 27 ultra_embe
    input               dmem_ack_i /*verilator public*/
108
);
109
 
110
//-----------------------------------------------------------------
111 36 ultra_embe
// Includes
112
//-----------------------------------------------------------------
113
`include "altor32_defs.v"
114
`include "altor32_funcs.v"
115
 
116
//-----------------------------------------------------------------
117 27 ultra_embe
// Params
118
//-----------------------------------------------------------------
119
parameter           BOOT_VECTOR         = 32'h00000000;
120
parameter           ISR_VECTOR          = 32'h00000000;
121
 
122
//-----------------------------------------------------------------
123
// Registers
124
//-----------------------------------------------------------------
125
 
126
// Branch PC
127
reg [31:0] r_pc_branch;
128
reg        r_pc_fetch;
129
 
130
// Exception saved program counter
131
reg [31:0] r_epc;
132
 
133
// Supervisor register
134
reg [31:0] r_sr;
135
 
136
// Exception saved supervisor register
137
reg [31:0] r_esr;
138
 
139
// Destination register number (post execute stage)
140
reg [4:0] r_e_rd;
141
 
142
// Current opcode (PC for debug)
143
reg [31:0] r_e_opcode;
144
reg [31:0] r_e_opcode_pc;
145
 
146
// ALU input A
147
reg [31:0] r_e_alu_a;
148
 
149
// ALU input B
150
reg [31:0] r_e_alu_b;
151
 
152
// ALU output
153
wire [31:0] r_e_result;
154
 
155
// Resolved RA/RB register contents
156
wire [31:0] ra_value_resolved;
157
wire [31:0] rb_value_resolved;
158 36 ultra_embe
wire        operand_resolved;
159 27 ultra_embe
wire        resolve_failed;
160
 
161
// ALU Carry
162
wire alu_carry_out;
163
wire alu_carry_update;
164 36 ultra_embe
wire alu_flag_update;
165 27 ultra_embe
 
166 36 ultra_embe
// ALU Comparisons
167
wire compare_equal_w;
168
wire compare_gts_w;
169
wire compare_gt_w;
170
wire compare_lts_w;
171
wire compare_lt_w;
172
 
173 27 ultra_embe
// ALU operation selection
174
reg [3:0] r_e_alu_func;
175
 
176
// Load instruction details
177
reg [4:0] r_load_rd;
178
reg [7:0] r_load_inst;
179
reg [1:0] r_load_offset;
180
 
181
// Load forwarding
182
wire         load_insn;
183
wire [31:0]  load_result;
184
 
185
// Memory access?
186
reg r_mem_load;
187
reg r_mem_store;
188
reg r_mem_access;
189
 
190
wire load_pending;
191
wire store_pending;
192
wire load_insert;
193
wire load_stall;
194
 
195
reg d_mem_load;
196
 
197
// Delayed NMI
198
reg r_nmi;
199
 
200 31 ultra_embe
// SIM PUTC
201
`ifdef SIM_EXT_PUTC
202
    reg [7:0] r_putc;
203
`endif
204
 
205 27 ultra_embe
//-----------------------------------------------------------------
206
// Instantiation
207
//-----------------------------------------------------------------
208
 
209
// ALU
210
altor32_alu alu
211
(
212
    // ALU operation select
213
    .op_i(r_e_alu_func),
214
 
215
    // Operands
216
    .a_i(r_e_alu_a),
217
    .b_i(r_e_alu_b),
218
    .c_i(r_sr[`OR32_SR_CY]),
219
 
220
    // Result
221
    .p_o(r_e_result),
222
 
223
    // Carry
224
    .c_o(alu_carry_out),
225 36 ultra_embe
    .c_update_o(alu_carry_update),
226
 
227
    // Comparisons
228
    .equal_o(compare_equal_w),
229
    .greater_than_signed_o(compare_gts_w),
230
    .greater_than_o(compare_gt_w),
231
    .less_than_signed_o(compare_lts_w),
232
    .less_than_o(compare_lt_w),
233
    .flag_update_o(alu_flag_update)
234 27 ultra_embe
);
235
 
236
// Load result forwarding
237
altor32_lfu
238
u_lfu
239
(
240
    // Opcode
241
    .opcode_i(r_load_inst),
242
 
243
    // Memory load result
244
    .mem_result_i(dmem_data_in_i),
245
    .mem_offset_i(r_load_offset),
246
 
247
    // Result
248
    .load_result_o(load_result),
249
    .load_insn_o(load_insn)
250
);
251
 
252
// Load / store pending logic
253
altor32_lsu
254
u_lsu
255
(
256
    // Current instruction
257
    .opcode_valid_i(opcode_valid_i & ~r_pc_fetch),
258
    .opcode_i({2'b00,opcode_i[31:26]}),
259
 
260
    // Load / Store pending
261
    .load_pending_i(r_mem_load),
262
    .store_pending_i(r_mem_store),
263
 
264
    // Load dest register
265
    .rd_load_i(r_load_rd),
266
 
267
    // Load insn in WB stage
268
    .load_wb_i(d_mem_load),
269
 
270
    // Memory status
271
    .mem_access_i(r_mem_access),
272
    .mem_ack_i(dmem_ack_i),
273
 
274
    // Load / store still pending
275
    .load_pending_o(load_pending),
276
    .store_pending_o(store_pending),
277
 
278
    // Insert load result into pipeline
279
    .write_result_o(load_insert),
280
 
281
    // Stall pipeline due
282
    .stall_o(load_stall)
283
);
284
 
285
// Operand forwarding
286
altor32_dfu
287
u_dfu
288
(
289
    // Input registers
290
    .ra_i(reg_ra_i),
291
    .rb_i(reg_rb_i),
292
 
293
    // Input register contents
294
    .ra_regval_i(reg_ra_value_i),
295
    .rb_regval_i(reg_rb_value_i),
296
 
297
    // Dest register (EXEC stage)
298
    .rd_ex_i(r_e_rd),
299
 
300
    // Dest register (WB stage)
301
    .rd_wb_i(wb_rd_i),
302
 
303
    // Load pending / target
304
    .load_pending_i(load_pending),
305
    .rd_load_i(r_load_rd),
306
 
307
    // Multiplier status
308
    .mult_lo_ex_i(1'b0),
309
    .mult_hi_ex_i(1'b0),
310
    .mult_lo_wb_i(1'b0),
311
    .mult_hi_wb_i(1'b0),
312
 
313
    // Multiplier result
314
    .result_mult_i(64'b0),
315
 
316
    // Result (EXEC)
317
    .result_ex_i(r_e_result),
318
 
319
    // Result (WB)
320
    .result_wb_i(wb_rd_value_i),
321
 
322
    // Resolved register values
323
    .result_ra_o(ra_value_resolved),
324
    .result_rb_o(rb_value_resolved),
325
 
326 36 ultra_embe
    // Operands required forwarding
327
    .resolved_o(operand_resolved),
328
 
329 27 ultra_embe
    // Stall due to failed resolve
330
    .stall_o(resolve_failed)
331
);
332
 
333 31 ultra_embe
//-----------------------------------------------------------------
334
// Opcode decode
335
//-----------------------------------------------------------------
336
reg [7:0]  inst_r;
337
reg [7:0]  alu_op_r;
338
reg [1:0]  shift_op_r;
339
reg [15:0] sfxx_op_r;
340
reg [15:0] uint16_r;
341
reg [31:0] uint32_r;
342
reg [31:0] int32_r;
343
reg [31:0] store_int32_r;
344
reg [15:0] mxspr_uint16_r;
345
reg [31:0] target_int26_r;
346
reg [31:0] reg_ra_r;
347
reg [31:0] reg_rb_r;
348
reg [31:0] shift_rb_r;
349
reg [31:0] shift_imm_r;
350 27 ultra_embe
 
351 31 ultra_embe
always @ *
352 27 ultra_embe
begin
353 31 ultra_embe
    // Instruction
354
    inst_r               = {2'b00,opcode_i[31:26]};
355 27 ultra_embe
 
356 31 ultra_embe
    // Sub instructions
357
    alu_op_r             = {opcode_i[9:6],opcode_i[3:0]};
358 36 ultra_embe
    sfxx_op_r            = {5'b00,opcode_i[31:21]} & `INST_OR32_SFMASK;
359 31 ultra_embe
    shift_op_r           = opcode_i[7:6];
360 27 ultra_embe
 
361 31 ultra_embe
    // Branch target
362
    target_int26_r       = sign_extend_imm26(opcode_i[25:0]);
363 27 ultra_embe
 
364 31 ultra_embe
    // Store immediate
365
    store_int32_r        = sign_extend_imm16({opcode_i[25:21],opcode_i[10:0]});
366 27 ultra_embe
 
367 31 ultra_embe
    // Signed & unsigned imm -> 32-bits
368
    uint16_r             = opcode_i[15:0];
369
    int32_r              = sign_extend_imm16(opcode_i[15:0]);
370
    uint32_r             = extend_imm16(opcode_i[15:0]);
371 27 ultra_embe
 
372 31 ultra_embe
    // Register values [ra/rb]
373
    reg_ra_r             = ra_value_resolved;
374
    reg_rb_r             = rb_value_resolved;
375 27 ultra_embe
 
376 31 ultra_embe
    // Shift ammount (from register[rb])
377
    shift_rb_r           = {26'b00,rb_value_resolved[5:0]};
378 27 ultra_embe
 
379 31 ultra_embe
    // Shift ammount (from immediate)
380
    shift_imm_r          = {26'b00,opcode_i[5:0]};
381 27 ultra_embe
 
382 31 ultra_embe
    // MTSPR/MFSPR operand
383 36 ultra_embe
    // NOTE: Use unresolved register value and stall pipeline if required.
384
    // This is to improve timing.
385
    mxspr_uint16_r       = (reg_ra_value_i[15:0] | {5'b00000,opcode_i[10:0]});
386 31 ultra_embe
end
387 27 ultra_embe
 
388 31 ultra_embe
//-----------------------------------------------------------------
389
// Instruction Decode
390
//-----------------------------------------------------------------
391
wire inst_add_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_ADD);  // l.add
392
wire inst_addc_w    = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_ADDC); // l.addc
393
wire inst_and_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_AND);  // l.and
394
wire inst_or_w      = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_OR);   // l.or
395
wire inst_sll_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_SLL);  // l.sll
396
wire inst_sra_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_SRA);  // l.sra
397
wire inst_srl_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_SRL);  // l.srl
398
wire inst_sub_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_SUB);  // l.sub
399
wire inst_xor_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_XOR);  // l.xor
400 36 ultra_embe
wire inst_mul_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_MUL);  // l.mul
401
wire inst_mulu_w    = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_MULU); // l.mulu
402 27 ultra_embe
 
403 31 ultra_embe
wire inst_addi_w    = (inst_r == `INST_OR32_ADDI);  // l.addi
404
wire inst_andi_w    = (inst_r == `INST_OR32_ANDI);  // l.andi
405
wire inst_bf_w      = (inst_r == `INST_OR32_BF);    // l.bf
406
wire inst_bnf_w     = (inst_r == `INST_OR32_BNF);   // l.bnf
407
wire inst_j_w       = (inst_r == `INST_OR32_J);     // l.j
408
wire inst_jal_w     = (inst_r == `INST_OR32_JAL);   // l.jal
409
wire inst_jalr_w    = (inst_r == `INST_OR32_JALR);  // l.jalr
410
wire inst_jr_w      = (inst_r == `INST_OR32_JR);    // l.jr
411
wire inst_lbs_w     = (inst_r == `INST_OR32_LBS);   // l.lbs
412
wire inst_lhs_w     = (inst_r == `INST_OR32_LHS);   // l.lhs
413
wire inst_lws_w     = (inst_r == `INST_OR32_LWS);   // l.lws
414
wire inst_lbz_w     = (inst_r == `INST_OR32_LBZ);   // l.lbz
415
wire inst_lhz_w     = (inst_r == `INST_OR32_LHZ);   // l.lhz
416
wire inst_lwz_w     = (inst_r == `INST_OR32_LWZ);   // l.lwz
417
wire inst_mfspr_w   = (inst_r == `INST_OR32_MFSPR); // l.mfspr
418
wire inst_mtspr_w   = (inst_r == `INST_OR32_MTSPR); // l.mtspr
419
wire inst_movhi_w   = (inst_r == `INST_OR32_MOVHI); // l.movhi
420
wire inst_nop_w     = (inst_r == `INST_OR32_NOP);   // l.nop
421
wire inst_ori_w     = (inst_r == `INST_OR32_ORI);   // l.ori
422
wire inst_rfe_w     = (inst_r == `INST_OR32_RFE);   // l.rfe
423 27 ultra_embe
 
424 31 ultra_embe
wire inst_sb_w      = (inst_r == `INST_OR32_SB);    // l.sb
425
wire inst_sh_w      = (inst_r == `INST_OR32_SH);    // l.sh
426
wire inst_sw_w      = (inst_r == `INST_OR32_SW);    // l.sw
427 27 ultra_embe
 
428 31 ultra_embe
wire inst_slli_w    = (inst_r == `INST_OR32_SHIFTI) & (shift_op_r == `INST_OR32_SLLI);  // l.slli
429
wire inst_srai_w    = (inst_r == `INST_OR32_SHIFTI) & (shift_op_r == `INST_OR32_SRAI);  // l.srai
430
wire inst_srli_w    = (inst_r == `INST_OR32_SHIFTI) & (shift_op_r == `INST_OR32_SRLI);  // l.srli
431 27 ultra_embe
 
432 31 ultra_embe
wire inst_xori_w    = (inst_r == `INST_OR32_XORI);   // l.xori
433 27 ultra_embe
 
434 31 ultra_embe
wire inst_sfxx_w    = (inst_r == `INST_OR32_SFXX);
435
wire inst_sfxxi_w   = (inst_r == `INST_OR32_SFXXI);
436 27 ultra_embe
 
437 36 ultra_embe
wire inst_sfeq_w    = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFEQ);   // l.sfeq
438
wire inst_sfges_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFGES);  // l.sfges
439 27 ultra_embe
 
440 36 ultra_embe
wire inst_sfgeu_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFGEU);  // l.sfgeu
441
wire inst_sfgts_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFGTS);  // l.sfgts
442
wire inst_sfgtu_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFGTU);  // l.sfgtu
443
wire inst_sfles_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFLES);  // l.sfles
444
wire inst_sfleu_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFLEU);  // l.sfleu
445
wire inst_sflts_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFLTS);  // l.sflts
446
wire inst_sfltu_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFLTU);  // l.sfltu
447
wire inst_sfne_w    = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFNE);   // l.sfne
448 27 ultra_embe
 
449 31 ultra_embe
wire inst_sys_w     = (inst_r == `INST_OR32_MISC) & (opcode_i[31:24] == `INST_OR32_SYS);  // l.sys
450
wire inst_trap_w    = (inst_r == `INST_OR32_MISC) & (opcode_i[31:24] == `INST_OR32_TRAP); // l.trap
451 27 ultra_embe
 
452 31 ultra_embe
//-----------------------------------------------------------------
453
// Stall / Execute
454
//-----------------------------------------------------------------
455
reg execute_inst_r;
456
reg stall_inst_r;
457 27 ultra_embe
 
458 31 ultra_embe
always @ *
459
begin
460
    execute_inst_r  = 1'b1;
461
    stall_inst_r    = 1'b0;
462 27 ultra_embe
 
463 31 ultra_embe
    // No opcode ready or branch delay slot
464
    if (~opcode_valid_i | r_pc_fetch)
465
        execute_inst_r  = 1'b0;
466
    // Valid instruction, but load result / operand not ready
467 36 ultra_embe
    else if (resolve_failed | load_stall |
468
            (operand_resolved & (inst_mfspr_w | inst_mtspr_w)))
469 31 ultra_embe
        stall_inst_r    = 1'b1;
470
end
471 27 ultra_embe
 
472 31 ultra_embe
//-----------------------------------------------------------------
473
// Next PC
474
//-----------------------------------------------------------------
475
reg [31:0]  next_pc_r;
476 27 ultra_embe
 
477 31 ultra_embe
always @ *
478
begin
479
    // Next expected PC (current PC + 4)
480
    next_pc_r  = (opcode_pc_i + 4);
481
end
482 27 ultra_embe
 
483 31 ultra_embe
//-----------------------------------------------------------------
484
// Next SR
485
//-----------------------------------------------------------------
486
reg [31:0]  next_sr_r;
487
reg         compare_result_r;
488
always @ *
489
begin
490
    next_sr_r = r_sr;
491 27 ultra_embe
 
492 36 ultra_embe
    // Update SR.F
493
    if (alu_flag_update)
494
        next_sr_r[`OR32_SR_F] = compare_result_r;
495
 
496 31 ultra_embe
    // Latch carry if updated
497
    if (alu_carry_update)
498
        next_sr_r[`OR32_SR_CY] = alu_carry_out;
499 27 ultra_embe
 
500 31 ultra_embe
    // If valid instruction, check if SR needs updating
501
    if (execute_inst_r & ~stall_inst_r)
502
    begin
503
      case (1'b1)
504
      inst_mtspr_w:
505
      begin
506
          case (mxspr_uint16_r)
507
          // SR - Supervision register
508
          `SPR_REG_SR:
509
          begin
510
              next_sr_r = reg_rb_r;
511 27 ultra_embe
 
512 31 ultra_embe
              // Don't store cache flush requests
513
              next_sr_r[`OR32_SR_ICACHE_FLUSH] = 1'b0;
514
              next_sr_r[`OR32_SR_DCACHE_FLUSH] = 1'b0;
515
          end
516
          default:
517
            ;
518
          endcase
519
      end
520
      inst_rfe_w:
521
          next_sr_r = r_esr;
522
      default:
523
        ;
524
      endcase
525
    end
526
end
527 27 ultra_embe
 
528 31 ultra_embe
//-----------------------------------------------------------------
529
// Next EPC/ESR
530
//-----------------------------------------------------------------
531
reg [31:0]  next_epc_r;
532
reg [31:0]  next_esr_r;
533 27 ultra_embe
 
534 31 ultra_embe
always @ *
535
begin
536
    next_epc_r = r_epc;
537
    next_esr_r = r_esr;
538
 
539
    case (1'b1)
540
    inst_mtspr_w: // l.mtspr
541
    begin
542
       case (mxspr_uint16_r)
543
           // EPCR - EPC Exception saved PC
544
           `SPR_REG_EPCR:   next_epc_r = reg_rb_r;
545 27 ultra_embe
 
546 31 ultra_embe
           // ESR - Exception saved SR
547
           `SPR_REG_ESR:    next_esr_r = reg_rb_r;
548
       endcase
549
    end
550
    default:
551
      ;
552
    endcase
553
end
554 27 ultra_embe
 
555 31 ultra_embe
//-----------------------------------------------------------------
556
// ALU inputs
557
//-----------------------------------------------------------------
558 27 ultra_embe
 
559 31 ultra_embe
// ALU operation selection
560
reg [3:0]  alu_func_r;
561 27 ultra_embe
 
562 31 ultra_embe
// ALU operands
563
reg [31:0] alu_input_a_r;
564
reg [31:0] alu_input_b_r;
565
reg        write_rd_r;
566 27 ultra_embe
 
567 31 ultra_embe
always @ *
568
begin
569
   alu_func_r     = `ALU_NONE;
570
   alu_input_a_r  = 32'b0;
571
   alu_input_b_r  = 32'b0;
572
   write_rd_r     = 1'b0;
573 27 ultra_embe
 
574 31 ultra_embe
   case (1'b1)
575 27 ultra_embe
 
576 31 ultra_embe
     inst_add_w: // l.add
577
     begin
578
       alu_func_r     = `ALU_ADD;
579
       alu_input_a_r  = reg_ra_r;
580
       alu_input_b_r  = reg_rb_r;
581
       write_rd_r     = 1'b1;
582
     end
583
 
584
     inst_addc_w: // l.addc
585
     begin
586
         alu_func_r     = `ALU_ADDC;
587
         alu_input_a_r  = reg_ra_r;
588
         alu_input_b_r  = reg_rb_r;
589
         write_rd_r     = 1'b1;
590
     end
591 27 ultra_embe
 
592 31 ultra_embe
     inst_and_w: // l.and
593
     begin
594
         alu_func_r     = `ALU_AND;
595
         alu_input_a_r  = reg_ra_r;
596
         alu_input_b_r  = reg_rb_r;
597
         write_rd_r     = 1'b1;
598
     end
599 27 ultra_embe
 
600 31 ultra_embe
     inst_or_w: // l.or
601
     begin
602
         alu_func_r     = `ALU_OR;
603
         alu_input_a_r  = reg_ra_r;
604
         alu_input_b_r  = reg_rb_r;
605
         write_rd_r     = 1'b1;
606
     end
607 27 ultra_embe
 
608 31 ultra_embe
     inst_sll_w: // l.sll
609
     begin
610
         alu_func_r     = `ALU_SHIFTL;
611
         alu_input_a_r  = reg_ra_r;
612
         alu_input_b_r  = shift_rb_r;
613
         write_rd_r     = 1'b1;
614
     end
615 27 ultra_embe
 
616 31 ultra_embe
     inst_sra_w: // l.sra
617
     begin
618
         alu_func_r     = `ALU_SHIRTR_ARITH;
619
         alu_input_a_r  = reg_ra_r;
620
         alu_input_b_r  = shift_rb_r;
621
         write_rd_r     = 1'b1;
622
     end
623 27 ultra_embe
 
624 31 ultra_embe
     inst_srl_w: // l.srl
625
     begin
626
         alu_func_r     = `ALU_SHIFTR;
627
         alu_input_a_r  = reg_ra_r;
628
         alu_input_b_r  = shift_rb_r;
629
         write_rd_r     = 1'b1;
630
     end
631 27 ultra_embe
 
632 31 ultra_embe
     inst_sub_w: // l.sub
633
     begin
634
         alu_func_r     = `ALU_SUB;
635
         alu_input_a_r  = reg_ra_r;
636
         alu_input_b_r  = reg_rb_r;
637
         write_rd_r     = 1'b1;
638
     end
639
 
640
     inst_xor_w: // l.xor
641
     begin
642
         alu_func_r     = `ALU_XOR;
643
         alu_input_a_r  = reg_ra_r;
644
         alu_input_b_r  = reg_rb_r;
645
         write_rd_r     = 1'b1;
646 36 ultra_embe
     end
647 31 ultra_embe
 
648 36 ultra_embe
     inst_mul_w,   // l.mul
649
     inst_mulu_w:  // l.mulu
650
     begin
651
         write_rd_r     = 1'b1;
652
     end
653
 
654 31 ultra_embe
     inst_addi_w: // l.addi
655
     begin
656
         alu_func_r     = `ALU_ADD;
657
         alu_input_a_r  = reg_ra_r;
658
         alu_input_b_r  = int32_r;
659
         write_rd_r     = 1'b1;
660
     end
661
 
662
     inst_andi_w: // l.andi
663
     begin
664
         alu_func_r     = `ALU_AND;
665
         alu_input_a_r  = reg_ra_r;
666
         alu_input_b_r  = uint32_r;
667
         write_rd_r     = 1'b1;
668
     end
669
 
670
     inst_jal_w: // l.jal
671
     begin
672
         alu_input_a_r  = next_pc_r;
673
         write_rd_r     = 1'b1;
674
     end
675
 
676
     inst_jalr_w: // l.jalr
677
     begin
678
         alu_input_a_r  = next_pc_r;
679
         write_rd_r     = 1'b1;
680
     end
681
 
682
     inst_mfspr_w: // l.mfspr
683
     begin
684
        case (mxspr_uint16_r)
685
           // SR - Supervision register
686
           `SPR_REG_SR:
687 27 ultra_embe
           begin
688 31 ultra_embe
               alu_input_a_r = next_sr_r;
689
               write_rd_r    = 1'b1;
690 27 ultra_embe
           end
691
 
692 31 ultra_embe
           // EPCR - EPC Exception saved PC
693
           `SPR_REG_EPCR:
694 27 ultra_embe
           begin
695 31 ultra_embe
               alu_input_a_r  = r_epc;
696
               write_rd_r     = 1'b1;
697 27 ultra_embe
           end
698
 
699 31 ultra_embe
           // ESR - Exception saved SR
700
           `SPR_REG_ESR:
701 27 ultra_embe
           begin
702 31 ultra_embe
               alu_input_a_r  = r_esr;
703
               write_rd_r     = 1'b1;
704 27 ultra_embe
           end
705 31 ultra_embe
           default:
706
              ;
707
        endcase
708
     end
709 27 ultra_embe
 
710 31 ultra_embe
     inst_movhi_w: // l.movhi
711
     begin
712
         alu_input_a_r  = {uint16_r,16'h0000};
713
         write_rd_r     = 1'b1;
714
     end
715 27 ultra_embe
 
716 31 ultra_embe
     inst_ori_w: // l.ori
717
     begin
718
         alu_func_r     = `ALU_OR;
719
         alu_input_a_r  = reg_ra_r;
720
         alu_input_b_r  = uint32_r;
721
         write_rd_r     = 1'b1;
722
     end
723 27 ultra_embe
 
724 31 ultra_embe
     inst_slli_w: // l.slli
725
     begin
726
         alu_func_r     = `ALU_SHIFTL;
727
         alu_input_a_r  = reg_ra_r;
728
         alu_input_b_r  = shift_imm_r;
729
         write_rd_r     = 1'b1;
730
     end
731 27 ultra_embe
 
732 31 ultra_embe
     inst_srai_w: // l.srai
733
     begin
734
         alu_func_r     = `ALU_SHIRTR_ARITH;
735
         alu_input_a_r  = reg_ra_r;
736
         alu_input_b_r  = shift_imm_r;
737
         write_rd_r     = 1'b1;
738
     end
739 27 ultra_embe
 
740 31 ultra_embe
     inst_srli_w: // l.srli
741
     begin
742
         alu_func_r     = `ALU_SHIFTR;
743
         alu_input_a_r  = reg_ra_r;
744
         alu_input_b_r  = shift_imm_r;
745
         write_rd_r     = 1'b1;
746
     end
747 27 ultra_embe
 
748 31 ultra_embe
     // l.lbs l.lhs l.lws l.lbz l.lhz l.lwz
749
     inst_lbs_w,
750
     inst_lhs_w,
751
     inst_lws_w,
752
     inst_lbz_w,
753
     inst_lhz_w,
754
     inst_lwz_w:
755
          write_rd_r    = 1'b1;
756 27 ultra_embe
 
757 36 ultra_embe
     // l.sf*i
758
     inst_sfxxi_w:
759
     begin
760
         alu_func_r     = `ALU_COMPARE;
761
         alu_input_a_r  = reg_ra_r;
762
         alu_input_b_r  = int32_r;
763
     end
764
 
765
     // l.sf*
766
     inst_sfxx_w:
767
     begin
768
         alu_func_r     = `ALU_COMPARE;
769
         alu_input_a_r  = reg_ra_r;
770
         alu_input_b_r  = reg_rb_r;
771
     end
772
 
773 31 ultra_embe
     inst_xori_w: // l.xori
774
     begin
775
         alu_func_r     = `ALU_XOR;
776
         alu_input_a_r  = reg_ra_r;
777
         alu_input_b_r  = int32_r;
778
         write_rd_r     = 1'b1;
779
     end
780
     default:
781
        ;
782
   endcase
783
end
784 27 ultra_embe
 
785 31 ultra_embe
//-----------------------------------------------------------------
786 36 ultra_embe
// Comparisons (from ALU outputs)
787 31 ultra_embe
//-----------------------------------------------------------------
788 36 ultra_embe
reg inst_sfges_r;
789
reg inst_sfgeu_r;
790
reg inst_sfgts_r;
791
reg inst_sfgtu_r;
792
reg inst_sfles_r;
793
reg inst_sfleu_r;
794
reg inst_sflts_r;
795
reg inst_sfltu_r;
796
reg inst_sfne_r;
797
reg inst_sfges_q;
798
reg inst_sfgeu_q;
799
reg inst_sfgts_q;
800
reg inst_sfgtu_q;
801
reg inst_sfles_q;
802
reg inst_sfleu_q;
803
reg inst_sflts_q;
804
reg inst_sfltu_q;
805
reg inst_sfne_q;
806
 
807 31 ultra_embe
always @ *
808
begin
809 36 ultra_embe
    inst_sfges_r = 1'b0;
810
    inst_sfgeu_r = 1'b0;
811
    inst_sfgts_r = 1'b0;
812
    inst_sfgtu_r = 1'b0;
813
    inst_sfles_r = 1'b0;
814
    inst_sfleu_r = 1'b0;
815
    inst_sflts_r = 1'b0;
816
    inst_sfltu_r = 1'b0;
817
    inst_sfne_r  = 1'b0;
818 32 ultra_embe
 
819 36 ultra_embe
    // Valid instruction
820
    if (execute_inst_r && ~stall_inst_r)
821
    begin
822 32 ultra_embe
 
823 36 ultra_embe
        case (1'b1)
824
        inst_sfges_w:  // l.sfges
825
            inst_sfges_r = 1'b1;
826 32 ultra_embe
 
827 36 ultra_embe
        inst_sfgeu_w:  // l.sfgeu
828
            inst_sfgeu_r = 1'b1;
829 32 ultra_embe
 
830 36 ultra_embe
        inst_sfgts_w:  // l.sfgts
831
            inst_sfgts_r = 1'b1;
832 32 ultra_embe
 
833 36 ultra_embe
        inst_sfgtu_w:  // l.sfgtu
834
            inst_sfgtu_r = 1'b1;
835 32 ultra_embe
 
836 36 ultra_embe
        inst_sfles_w:  // l.sfles
837
            inst_sfles_r = 1'b1;
838 32 ultra_embe
 
839 36 ultra_embe
        inst_sfleu_w:  // l.sfleu
840
            inst_sfleu_r = 1'b1;
841 27 ultra_embe
 
842 36 ultra_embe
        inst_sflts_w:  // l.sflts
843
            inst_sflts_r = 1'b1;
844 27 ultra_embe
 
845 36 ultra_embe
        inst_sfltu_w:  // l.sfltu
846
            inst_sfltu_r = 1'b1;
847 27 ultra_embe
 
848 36 ultra_embe
        inst_sfne_w:  // l.sfne
849
            inst_sfne_r  = 1'b1;
850 27 ultra_embe
 
851 36 ultra_embe
        default:
852
            ;
853
        endcase
854
    end
855
end
856 27 ultra_embe
 
857 36 ultra_embe
always @ (posedge clk_i or posedge rst_i)
858
begin
859
   if (rst_i == 1'b1)
860
   begin
861
        inst_sfges_q <= 1'b0;
862
        inst_sfgeu_q <= 1'b0;
863
        inst_sfgts_q <= 1'b0;
864
        inst_sfgtu_q <= 1'b0;
865
        inst_sfles_q <= 1'b0;
866
        inst_sfleu_q <= 1'b0;
867
        inst_sflts_q <= 1'b0;
868
        inst_sfltu_q <= 1'b0;
869
        inst_sfne_q <= 1'b0;
870
   end
871
   else
872
   begin
873
        inst_sfges_q <= inst_sfges_r;
874
        inst_sfgeu_q <= inst_sfgeu_r;
875
        inst_sfgts_q <= inst_sfgts_r;
876
        inst_sfgtu_q <= inst_sfgtu_r;
877
        inst_sfles_q <= inst_sfles_r;
878
        inst_sfleu_q <= inst_sfleu_r;
879
        inst_sflts_q <= inst_sflts_r;
880
        inst_sfltu_q <= inst_sfltu_r;
881
        inst_sfne_q  <= inst_sfne_r;
882
   end
883
end
884 27 ultra_embe
 
885 36 ultra_embe
always @ *
886
begin
887
    case (1'b1)
888
    inst_sfges_q: // l.sfges
889
        compare_result_r = compare_gts_w | compare_equal_w;
890 27 ultra_embe
 
891 36 ultra_embe
    inst_sfgeu_q: // l.sfgeu
892
        compare_result_r = compare_gt_w | compare_equal_w;
893 27 ultra_embe
 
894 36 ultra_embe
    inst_sfgts_q: // l.sfgts
895
        compare_result_r = compare_gts_w;
896 27 ultra_embe
 
897 36 ultra_embe
    inst_sfgtu_q: // l.sfgtu
898
        compare_result_r = compare_gt_w;
899 27 ultra_embe
 
900 36 ultra_embe
    inst_sfles_q: // l.sfles
901
        compare_result_r = compare_lts_w | compare_equal_w;
902 27 ultra_embe
 
903 36 ultra_embe
    inst_sfleu_q: // l.sfleu
904
        compare_result_r = compare_lt_w | compare_equal_w;
905 27 ultra_embe
 
906 36 ultra_embe
    inst_sflts_q: // l.sflts
907
        compare_result_r = compare_lts_w;
908 27 ultra_embe
 
909 36 ultra_embe
    inst_sfltu_q: // l.sfltu
910
        compare_result_r = compare_lt_w;
911 27 ultra_embe
 
912 36 ultra_embe
    inst_sfne_q: // l.sfne
913
        compare_result_r = ~compare_equal_w;
914
 
915
    default: // l.sfeq
916
        compare_result_r = compare_equal_w;
917 31 ultra_embe
    endcase
918
end
919 27 ultra_embe
 
920 31 ultra_embe
//-----------------------------------------------------------------
921
// Load/Store operation?
922
//-----------------------------------------------------------------
923
reg         load_inst_r;
924
reg         store_inst_r;
925
reg [31:0]  mem_addr_r;
926
always @ *
927
begin
928
    load_inst_r  = inst_lbs_w | inst_lhs_w | inst_lws_w |
929
                   inst_lbz_w | inst_lhz_w | inst_lwz_w;
930
    store_inst_r = inst_sb_w  | inst_sh_w  | inst_sw_w;
931 27 ultra_embe
 
932 31 ultra_embe
    // Memory address is relative to RA
933
    mem_addr_r = reg_ra_r + (store_inst_r ? store_int32_r : int32_r);
934
end
935 27 ultra_embe
 
936 31 ultra_embe
//-----------------------------------------------------------------
937
// Branches
938
//-----------------------------------------------------------------
939
reg         branch_r;
940
reg         branch_link_r;
941
reg [31:0]  branch_target_r;
942
reg         branch_except_r;
943 27 ultra_embe
 
944 31 ultra_embe
always @ *
945
begin
946 27 ultra_embe
 
947 31 ultra_embe
    branch_r        = 1'b0;
948
    branch_link_r   = 1'b0;
949
    branch_except_r = 1'b0;
950 27 ultra_embe
 
951 31 ultra_embe
    // Default branch target is relative to current PC
952
    branch_target_r = (opcode_pc_i + {target_int26_r[29:0],2'b00});
953 27 ultra_embe
 
954 31 ultra_embe
    case (1'b1)
955
    inst_bf_w: // l.bf
956 36 ultra_embe
        branch_r      = next_sr_r[`OR32_SR_F];
957 27 ultra_embe
 
958 31 ultra_embe
    inst_bnf_w: // l.bnf
959 36 ultra_embe
        branch_r      = ~next_sr_r[`OR32_SR_F];
960 27 ultra_embe
 
961 31 ultra_embe
    inst_j_w: // l.j
962
        branch_r      = 1'b1;
963 27 ultra_embe
 
964 31 ultra_embe
    inst_jal_w: // l.jal
965
    begin
966
        // Write to REG_9_LR
967
        branch_link_r = 1'b1;
968
        branch_r      = 1'b1;
969
    end
970 27 ultra_embe
 
971 31 ultra_embe
    inst_jalr_w: // l.jalr
972
    begin
973
        // Write to REG_9_LR
974
        branch_link_r   = 1'b1;
975
        branch_r        = 1'b1;
976
        branch_target_r = reg_rb_r;
977
    end
978 27 ultra_embe
 
979 31 ultra_embe
    inst_jr_w: // l.jr
980
    begin
981
        branch_r        = 1'b1;
982
        branch_target_r = reg_rb_r;
983
    end
984 27 ultra_embe
 
985 31 ultra_embe
    inst_rfe_w: // l.rfe
986
    begin
987
        branch_r        = 1'b1;
988
        branch_target_r = r_epc;
989
    end
990 27 ultra_embe
 
991 31 ultra_embe
    inst_sys_w: // l.sys
992
    begin
993
        branch_r        = 1'b1;
994
        branch_except_r = 1'b1;
995
        branch_target_r = ISR_VECTOR + `VECTOR_SYSCALL;
996
    end
997 27 ultra_embe
 
998 31 ultra_embe
    inst_trap_w: // l.trap
999
    begin
1000
        branch_r        = 1'b1;
1001
        branch_except_r = 1'b1;
1002
        branch_target_r = ISR_VECTOR + `VECTOR_TRAP;
1003
    end
1004 27 ultra_embe
 
1005 31 ultra_embe
    default:
1006
        ;
1007
    endcase
1008
end
1009
 
1010
//-----------------------------------------------------------------
1011
// Invalid instruction
1012
//-----------------------------------------------------------------
1013
reg invalid_inst_r;
1014
 
1015
always @ *
1016
begin
1017
    case (1'b1)
1018
       inst_add_w,
1019
       inst_addc_w,
1020
       inst_and_w,
1021
       inst_or_w,
1022
       inst_sll_w,
1023
       inst_sra_w,
1024
       inst_srl_w,
1025
       inst_sub_w,
1026 36 ultra_embe
       inst_xor_w,
1027 31 ultra_embe
       inst_addi_w,
1028
       inst_andi_w,
1029
       inst_bf_w,
1030
       inst_bnf_w,
1031
       inst_j_w,
1032
       inst_jal_w,
1033
       inst_jalr_w,
1034
       inst_jr_w,
1035
       inst_lbs_w,
1036
       inst_lhs_w,
1037
       inst_lws_w,
1038
       inst_lbz_w,
1039
       inst_lhz_w,
1040
       inst_lwz_w,
1041
       inst_mfspr_w,
1042
       inst_mtspr_w,
1043
       inst_movhi_w,
1044
       inst_nop_w,
1045
       inst_ori_w,
1046
       inst_rfe_w,
1047
       inst_sb_w,
1048
       inst_sh_w,
1049
       inst_sw_w,
1050
       inst_xori_w,
1051
       inst_slli_w,
1052
       inst_srai_w,
1053
       inst_srli_w,
1054
       inst_sfeq_w,
1055
       inst_sfges_w,
1056
       inst_sfgeu_w,
1057
       inst_sfgts_w,
1058
       inst_sfgtu_w,
1059
       inst_sfles_w,
1060
       inst_sfleu_w,
1061
       inst_sflts_w,
1062
       inst_sfltu_w,
1063
       inst_sfne_w,
1064
       inst_sys_w,
1065
       inst_trap_w:
1066
          invalid_inst_r = 1'b0;
1067
       default:
1068
          invalid_inst_r = 1'b1;
1069
    endcase
1070
end
1071
 
1072
//-----------------------------------------------------------------
1073
// Execute: ALU control
1074
//-----------------------------------------------------------------
1075
always @ (posedge clk_i or posedge rst_i)
1076
begin
1077
   if (rst_i == 1'b1)
1078
   begin
1079
       r_e_alu_func         <= `ALU_NONE;
1080
       r_e_alu_a            <= 32'h00000000;
1081
       r_e_alu_b            <= 32'h00000000;
1082
       r_e_rd               <= 5'b00000;
1083
   end
1084
   else
1085
   begin
1086
       //---------------------------------------------------------------
1087
       // Instruction not ready
1088
       //---------------------------------------------------------------
1089
       if (~execute_inst_r | stall_inst_r)
1090
       begin
1091
           // Insert load result?
1092
           if (load_insert)
1093 27 ultra_embe
           begin
1094 31 ultra_embe
               // Feed load result into pipeline
1095
               r_e_alu_func   <= `ALU_NONE;
1096
               r_e_alu_a      <= load_result;
1097
               r_e_alu_b      <= 32'b0;
1098
               r_e_rd         <= r_load_rd;
1099 27 ultra_embe
           end
1100 31 ultra_embe
           else
1101 27 ultra_embe
           begin
1102 31 ultra_embe
               // No ALU operation (output == input_a)
1103
               r_e_alu_func   <= `ALU_NONE;
1104
               r_e_alu_a      <= 32'b0;
1105
               r_e_alu_b      <= 32'b0;
1106
               r_e_rd         <= 5'b0;
1107 27 ultra_embe
           end
1108 31 ultra_embe
       end
1109 27 ultra_embe
       //---------------------------------------------------------------
1110 31 ultra_embe
       // Valid instruction
1111 27 ultra_embe
       //---------------------------------------------------------------
1112 36 ultra_embe
       else
1113 31 ultra_embe
       begin
1114
           // Update ALU input flops
1115
           r_e_alu_func         <= alu_func_r;
1116
           r_e_alu_a            <= alu_input_a_r;
1117
           r_e_alu_b            <= alu_input_b_r;
1118 27 ultra_embe
 
1119 31 ultra_embe
           // Branch and link (Rd = LR/R9)
1120
           if (branch_link_r)
1121
              r_e_rd            <= 5'd9;
1122
           // Instruction with register writeback
1123
           else if (write_rd_r)
1124
              r_e_rd            <= reg_rd_i;
1125
           else
1126
              r_e_rd            <= 5'b0;
1127 27 ultra_embe
       end
1128 31 ultra_embe
   end
1129
end
1130
 
1131
//-----------------------------------------------------------------
1132
// Execute: Update executed PC / opcode
1133
//-----------------------------------------------------------------
1134
always @ (posedge clk_i or posedge rst_i)
1135
begin
1136
   if (rst_i == 1'b1)
1137
   begin
1138
       r_e_opcode           <= 32'h00000000;
1139
       r_e_opcode_pc        <= 32'h00000000;
1140
   end
1141
   else
1142
   begin
1143
       // Instruction not ready
1144
       if (~execute_inst_r | stall_inst_r)
1145 27 ultra_embe
       begin
1146 31 ultra_embe
           // Store bubble opcode
1147
           r_e_opcode            <= `OPCODE_INST_BUBBLE;
1148
           r_e_opcode_pc         <= opcode_pc_i;
1149
       end
1150
       // Valid instruction
1151 36 ultra_embe
       else
1152 27 ultra_embe
       begin
1153 31 ultra_embe
           // Store opcode
1154
           r_e_opcode            <= opcode_i;
1155
           r_e_opcode_pc         <= opcode_pc_i;
1156 27 ultra_embe
 
1157 31 ultra_embe
        `ifdef CONF_CORE_TRACE
1158
           $display("%08x: Execute 0x%08x", opcode_pc_i, opcode_i);
1159
           $display(" rA[%d] = 0x%08x", reg_ra_i, reg_ra_r);
1160
           $display(" rB[%d] = 0x%08x", reg_rb_i, reg_rb_r);
1161
        `endif
1162 27 ultra_embe
       end
1163 31 ultra_embe
   end
1164
end
1165 27 ultra_embe
 
1166 31 ultra_embe
//-----------------------------------------------------------------
1167
// Execute: Branch / exceptions
1168
//-----------------------------------------------------------------
1169
always @ (posedge clk_i or posedge rst_i)
1170
begin
1171
   if (rst_i == 1'b1)
1172
   begin
1173
       r_pc_branch          <= 32'h00000000;
1174
       r_pc_fetch           <= 1'b0;
1175 27 ultra_embe
 
1176 31 ultra_embe
       // Status registers
1177
       r_epc                <= 32'h00000000;
1178
       r_sr                 <= 32'h00000000;
1179
       r_esr                <= 32'h00000000;
1180 27 ultra_embe
 
1181 31 ultra_embe
       fault_o              <= 1'b0;
1182 27 ultra_embe
 
1183 31 ultra_embe
       r_nmi                <= 1'b0;
1184
   end
1185
   else
1186
   begin
1187
      // Record NMI in-case it can't be processed this cycle
1188
      if (nmi_i)
1189
          r_nmi             <= 1'b1;
1190 27 ultra_embe
 
1191 31 ultra_embe
       // Reset branch request
1192
       r_pc_fetch           <= 1'b0;
1193 27 ultra_embe
 
1194 31 ultra_embe
       // Update SR
1195
       r_sr                 <= next_sr_r;
1196
 
1197
       // Instruction ready
1198
       if (execute_inst_r & ~stall_inst_r)
1199 27 ultra_embe
       begin
1200 31 ultra_embe
           // Exception: Instruction opcode not valid / supported, invalid PC
1201
           if (invalid_inst_r || (opcode_pc_i[1:0] != 2'b00))
1202
           begin
1203
                // Save PC of next instruction
1204
                r_epc       <= next_pc_r;
1205
                r_esr       <= next_sr_r;
1206 27 ultra_embe
 
1207 31 ultra_embe
                // Disable further interrupts
1208
                r_sr        <= 32'b0;
1209 27 ultra_embe
 
1210 31 ultra_embe
                // Set PC to exception vector
1211
                if (invalid_inst_r)
1212
                    r_pc_branch <= ISR_VECTOR + `VECTOR_ILLEGAL_INST;
1213
                else
1214
                    r_pc_branch <= ISR_VECTOR + `VECTOR_BUS_ERROR;
1215
                r_pc_fetch  <= 1'b1;
1216 27 ultra_embe
 
1217 31 ultra_embe
                fault_o     <= 1'b1;
1218
           end
1219
           // Exception: Syscall / Break
1220
           else if (branch_except_r)
1221
           begin
1222
                // Save PC of next instruction
1223
                r_epc       <= next_pc_r;
1224
                r_esr       <= next_sr_r;
1225
 
1226
                // Disable further interrupts
1227
                r_sr        <= 32'b0;
1228
 
1229
                // Set PC to exception vector
1230
                r_pc_branch <= branch_target_r;
1231
                r_pc_fetch  <= 1'b1;
1232
 
1233
    `ifdef CONF_CORE_DEBUG
1234
               $display(" Exception 0x%08x", branch_target_r);
1235
    `endif
1236
           end
1237
           // Non-maskable interrupt
1238
           else if (nmi_i | r_nmi)
1239
           begin
1240
                r_nmi       <= 1'b0;
1241
 
1242
                // Save PC of next instruction
1243
                if (branch_r)
1244
                    r_epc <= branch_target_r;
1245
                // Next expected PC (current PC + 4)
1246
                else
1247
                    r_epc <= next_pc_r;
1248
 
1249
                r_esr       <= next_sr_r;
1250
 
1251
                // Disable further interrupts
1252
                r_sr        <= 32'b0;
1253
 
1254
                // Set PC to exception vector
1255
                r_pc_branch <= ISR_VECTOR + `VECTOR_NMI;
1256
                r_pc_fetch  <= 1'b1;
1257
 
1258
    `ifdef CONF_CORE_DEBUG
1259
               $display(" NMI 0x%08x", ISR_VECTOR + `VECTOR_NMI);
1260
    `endif
1261
           end
1262
           // External interrupt
1263
           else if (intr_i && next_sr_r[`OR32_SR_IEE])
1264
           begin
1265
                // Save PC of next instruction & SR
1266
                if (branch_r)
1267
                    r_epc <= branch_target_r;
1268
                // Next expected PC (current PC + 4)
1269
                else
1270
                    r_epc <= next_pc_r;
1271
 
1272
                r_esr       <= next_sr_r;
1273
 
1274
                // Disable further interrupts
1275
                r_sr        <= 32'b0;
1276
 
1277
                // Set PC to external interrupt vector
1278
                r_pc_branch <= ISR_VECTOR + `VECTOR_EXTINT;
1279
                r_pc_fetch  <= 1'b1;
1280
 
1281
    `ifdef CONF_CORE_DEBUG
1282
               $display(" External Interrupt 0x%08x", ISR_VECTOR + `VECTOR_EXTINT);
1283
    `endif
1284
           end
1285
           // Branch (l.bf, l.bnf, l.j, l.jal, l.jr, l.jalr, l.rfe)
1286
           else if (branch_r)
1287
           begin
1288
                // Perform branch
1289
                r_pc_branch    <= branch_target_r;
1290
                r_pc_fetch     <= 1'b1;
1291
 
1292
    `ifdef CONF_CORE_DEBUG
1293
               $display(" Branch to 0x%08x", branch_target_r);
1294
    `endif
1295
           end
1296
           // Non branch
1297
           else
1298
           begin
1299
                // Update EPC / ESR which may have been updated
1300
                // by an MTSPR write
1301
                r_epc          <= next_epc_r;
1302
                r_esr          <= next_esr_r;
1303
           end
1304
      end
1305
   end
1306
end
1307
 
1308
//-----------------------------------------------------------------
1309
// Execute: Memory operations
1310
//-----------------------------------------------------------------
1311
always @ (posedge clk_i or posedge rst_i)
1312
begin
1313
   if (rst_i == 1'b1)
1314
   begin
1315
       // Data memory
1316
       dmem_addr_o          <= 32'h00000000;
1317
       dmem_data_out_o      <= 32'h00000000;
1318 32 ultra_embe
       dmem_we_o            <= 1'b0;
1319
       dmem_sel_o           <= 4'b0000;
1320
       dmem_stb_o           <= 1'b0;
1321
       dmem_cyc_o           <= 1'b0;
1322 27 ultra_embe
 
1323 31 ultra_embe
       r_mem_load           <= 1'b0;
1324
       r_mem_store          <= 1'b0;
1325
       r_mem_access         <= 1'b0;
1326
 
1327
       r_load_rd            <= 5'b00000;
1328
       r_load_inst          <= 8'h00;
1329
       r_load_offset        <= 2'b00;
1330
 
1331
       d_mem_load           <= 1'b0;
1332
   end
1333
   else
1334
   begin
1335
 
1336
       // If memory access accepted by slave
1337 32 ultra_embe
       if (~dmem_stall_i)
1338
           dmem_stb_o   <= 1'b0;
1339
 
1340
       if (dmem_ack_i)
1341
            dmem_cyc_o  <= 1'b0;
1342 36 ultra_embe
 
1343 31 ultra_embe
       r_mem_access     <= 1'b0;
1344
       d_mem_load       <= r_mem_access & r_mem_load;
1345
 
1346
       // Pending accesses
1347
       r_mem_load   <= load_pending;
1348
       r_mem_store  <= store_pending;
1349
 
1350
       //---------------------------------------------------------------
1351
       // Valid instruction
1352
       //---------------------------------------------------------------
1353 36 ultra_embe
       if (execute_inst_r & ~stall_inst_r)
1354 27 ultra_embe
       begin
1355 31 ultra_embe
           // Branch and link (Rd = LR/R9)
1356
           if (branch_link_r)
1357
           begin
1358
              // Load outstanding, check if result target is being
1359
              // overwritten (to avoid WAR hazard)
1360
              if (r_load_rd == 5'd9)
1361
                  // Ditch load result when it arrives
1362
                  r_load_rd     <= 5'b00000;
1363
           end
1364
           // Instruction with register writeback
1365
           else if (write_rd_r)
1366
           begin
1367
              // Load outstanding, check if result target is being
1368
              // overwritten (to avoid WAR hazard)
1369
              if (reg_rd_i == r_load_rd && ~load_inst_r)
1370
                  // Ditch load result when it arrives
1371
                  r_load_rd     <= 5'b00000;
1372
           end
1373
 
1374
           case (1'b1)
1375
 
1376
             // l.lbs l.lhs l.lws l.lbz l.lhz l.lwz
1377
             load_inst_r:
1378
             begin
1379
                 dmem_addr_o      <= mem_addr_r;
1380
                 dmem_data_out_o  <= 32'h00000000;
1381 32 ultra_embe
                 dmem_sel_o       <= 4'b1111;
1382
                 dmem_we_o        <= 1'b0;
1383
                 dmem_stb_o       <= 1'b1;
1384
                 dmem_cyc_o       <= 1'b1;
1385 31 ultra_embe
 
1386
                 // Mark load as pending
1387
                 r_mem_load      <= 1'b1;
1388
                 r_mem_access    <= 1'b1;
1389
 
1390
                 // Record target register
1391
                 r_load_rd        <= reg_rd_i;
1392
                 r_load_inst      <= inst_r;
1393
                 r_load_offset    <= mem_addr_r[1:0];
1394
 
1395
  `ifdef CONF_CORE_DEBUG
1396
                 $display(" Load from 0x%08x to R%d", mem_addr_r, reg_rd_i);
1397
  `endif
1398
             end
1399
 
1400
             inst_sb_w: // l.sb
1401
             begin
1402
                 dmem_addr_o <= mem_addr_r;
1403
                 r_mem_access <= 1'b1;
1404
                 case (mem_addr_r[1:0])
1405
                     2'b00 :
1406
                     begin
1407
                         dmem_data_out_o  <= {reg_rb_r[7:0],24'h000000};
1408 32 ultra_embe
                         dmem_sel_o       <= 4'b1000;
1409
                         dmem_we_o        <= 1'b1;
1410
                         dmem_stb_o       <= 1'b1;
1411
                         dmem_cyc_o       <= 1'b1;
1412 31 ultra_embe
                         r_mem_store      <= 1'b1;
1413
                     end
1414
                     2'b01 :
1415
                     begin
1416
                         dmem_data_out_o  <= {{8'h00,reg_rb_r[7:0]},16'h0000};
1417 32 ultra_embe
                         dmem_sel_o       <= 4'b0100;
1418
                         dmem_we_o        <= 1'b1;
1419
                         dmem_stb_o       <= 1'b1;
1420
                         dmem_cyc_o       <= 1'b1;
1421 31 ultra_embe
                         r_mem_store      <= 1'b1;
1422
                     end
1423
                     2'b10 :
1424
                     begin
1425
                         dmem_data_out_o  <= {{16'h0000,reg_rb_r[7:0]},8'h00};
1426 32 ultra_embe
                         dmem_sel_o       <= 4'b0010;
1427
                         dmem_we_o        <= 1'b1;
1428
                         dmem_stb_o       <= 1'b1;
1429
                         dmem_cyc_o       <= 1'b1;
1430 31 ultra_embe
                         r_mem_store      <= 1'b1;
1431
                     end
1432
                     2'b11 :
1433
                     begin
1434
                         dmem_data_out_o  <= {24'h000000,reg_rb_r[7:0]};
1435 32 ultra_embe
                         dmem_sel_o       <= 4'b0001;
1436
                         dmem_we_o        <= 1'b1;
1437
                         dmem_stb_o       <= 1'b1;
1438
                         dmem_cyc_o       <= 1'b1;
1439 31 ultra_embe
                         r_mem_store      <= 1'b1;
1440
                     end
1441
                     default :
1442 32 ultra_embe
                        ;
1443 31 ultra_embe
                 endcase
1444
             end
1445
 
1446
            inst_sh_w: // l.sh
1447 27 ultra_embe
            begin
1448 31 ultra_embe
                 dmem_addr_o <= mem_addr_r;
1449
                 r_mem_access <= 1'b1;
1450
                 case (mem_addr_r[1:0])
1451
                     2'b00 :
1452
                     begin
1453
                         dmem_data_out_o  <= {reg_rb_r[15:0],16'h0000};
1454 32 ultra_embe
                         dmem_sel_o       <= 4'b1100;
1455
                         dmem_we_o        <= 1'b1;
1456
                         dmem_stb_o       <= 1'b1;
1457
                         dmem_cyc_o       <= 1'b1;
1458 31 ultra_embe
                         r_mem_store      <= 1'b1;
1459
                     end
1460
                     2'b10 :
1461
                     begin
1462
                         dmem_data_out_o  <= {16'h0000,reg_rb_r[15:0]};
1463 32 ultra_embe
                         dmem_sel_o       <= 4'b0011;
1464
                         dmem_we_o        <= 1'b1;
1465
                         dmem_stb_o       <= 1'b1;
1466
                         dmem_cyc_o       <= 1'b1;
1467 31 ultra_embe
                         r_mem_store      <= 1'b1;
1468
                     end
1469
                     default :
1470 32 ultra_embe
                        ;
1471 31 ultra_embe
                 endcase
1472
            end
1473 27 ultra_embe
 
1474 31 ultra_embe
            inst_sw_w: // l.sw
1475
            begin
1476
                 dmem_addr_o      <= mem_addr_r;
1477
                 dmem_data_out_o  <= reg_rb_r;
1478 32 ultra_embe
                 dmem_sel_o       <= 4'b1111;
1479
                 dmem_we_o        <= 1'b1;
1480
                 dmem_stb_o       <= 1'b1;
1481
                 dmem_cyc_o       <= 1'b1;
1482 31 ultra_embe
                 r_mem_access     <= 1'b1;
1483
                 r_mem_store      <= 1'b1;
1484
 
1485
  `ifdef CONF_CORE_DEBUG
1486
                 $display(" Store R%d to 0x%08x = 0x%08x", reg_rb_i, {mem_addr_r[31:2],2'b00}, reg_rb_r);
1487
  `endif
1488 27 ultra_embe
            end
1489 31 ultra_embe
            default:
1490
                ;
1491
         endcase
1492
       end
1493
   end
1494
end
1495 27 ultra_embe
 
1496 31 ultra_embe
//-----------------------------------------------------------------
1497
// Execute: Misc operations
1498
//-----------------------------------------------------------------
1499
always @ (posedge clk_i or posedge rst_i)
1500
begin
1501
   if (rst_i == 1'b1)
1502
   begin
1503
       break_o              <= 1'b0;
1504
       icache_flush_o       <= 1'b0;
1505
       dcache_flush_o       <= 1'b0;
1506
   end
1507
   else
1508
   begin
1509
       break_o              <= 1'b0;
1510
       icache_flush_o       <= 1'b0;
1511
       dcache_flush_o       <= 1'b0;
1512
 
1513
       //---------------------------------------------------------------
1514
       // Valid instruction
1515
       //---------------------------------------------------------------
1516 36 ultra_embe
       if (execute_inst_r & ~stall_inst_r)
1517 31 ultra_embe
       begin
1518
          case (1'b1)
1519
          inst_mtspr_w: // l.mtspr
1520
          begin
1521
               case (mxspr_uint16_r)
1522
                   // SR - Supervision register
1523
                   `SPR_REG_SR:
1524
                   begin
1525
                       // Cache flush request?
1526
                       icache_flush_o <= reg_rb_r[`OR32_SR_ICACHE_FLUSH];
1527
                       dcache_flush_o <= reg_rb_r[`OR32_SR_DCACHE_FLUSH];
1528
                   end
1529
               endcase
1530
          end
1531
 
1532
          inst_trap_w: // l.trap
1533
              break_o <= 1'b1;
1534
          default:
1535
              ;
1536
         endcase
1537 27 ultra_embe
       end
1538
   end
1539
end
1540
 
1541 31 ultra_embe
//-----------------------------------------------------------------
1542
// Execute: NOP (simulation) operations
1543
//-----------------------------------------------------------------
1544
`ifdef SIMULATION
1545
    always @ (posedge clk_i or posedge rst_i)
1546
    begin
1547
       if (rst_i == 1'b1)
1548
       begin
1549
    `ifdef SIM_EXT_PUTC
1550
          r_putc                <= 8'b0;
1551
    `endif
1552
       end
1553
       else
1554
       begin
1555
    `ifdef SIM_EXT_PUTC
1556
          r_putc                <= 8'b0;
1557
    `endif
1558
           //---------------------------------------------------------------
1559
           // Valid instruction
1560
           //---------------------------------------------------------------
1561 36 ultra_embe
           if (execute_inst_r & ~stall_inst_r)
1562 31 ultra_embe
           begin
1563
 
1564
               case (1'b1)
1565
               inst_nop_w: // l.nop
1566
                begin
1567
                    case (uint16_r)
1568
                    // NOP_PUTC
1569
                    16'h0004:
1570
                    begin
1571
      `ifdef SIM_EXT_PUTC
1572
                      r_putc  <= reg_ra_r[7:0];
1573
      `else
1574
                      $write("%c", reg_ra_r[7:0]);
1575
      `endif
1576
                    end
1577
                    // NOP
1578
                    16'h0000: ;
1579
                    endcase
1580
                end
1581
                default:
1582
                    ;
1583
             endcase
1584
           end
1585
       end
1586
    end
1587
`endif
1588
 
1589 27 ultra_embe
//-------------------------------------------------------------------
1590
// Assignments
1591
//-------------------------------------------------------------------
1592
 
1593
assign branch_pc_o          = r_pc_branch;
1594
assign branch_o             = r_pc_fetch;
1595 36 ultra_embe
assign stall_o              = stall_inst_r;
1596 27 ultra_embe
 
1597
assign opcode_o             = r_e_opcode;
1598
 
1599
assign reg_rd_o             = r_e_rd;
1600
assign reg_rd_value_o       = r_e_result;
1601
 
1602
assign mult_o               = 1'b0;
1603
assign mult_res_o           = 32'b0;
1604
 
1605
//-------------------------------------------------------------------
1606
// Hooks for debug
1607
//-------------------------------------------------------------------
1608
`ifdef verilator
1609
   function [31:0] get_opcode_ex;
1610
      // verilator public
1611
      get_opcode_ex = r_e_opcode;
1612
   endfunction
1613
   function [31:0] get_pc_ex;
1614
      // verilator public
1615
      get_pc_ex = r_e_opcode_pc;
1616
   endfunction
1617 31 ultra_embe
   function [7:0] get_putc;
1618
      // verilator public
1619
   `ifdef SIM_EXT_PUTC
1620
      get_putc = r_putc;
1621
   `else
1622
      get_putc = 8'b0;
1623
   `endif
1624
   endfunction
1625 32 ultra_embe
   function [0:0] get_reg_valid;
1626
      // verilator public
1627 36 ultra_embe
      get_reg_valid = ~(resolve_failed | load_stall | ~opcode_valid_i);
1628 32 ultra_embe
   endfunction
1629
   function [4:0] get_reg_ra;
1630
      // verilator public
1631
      get_reg_ra = reg_ra_i;
1632
   endfunction
1633
   function [31:0] get_reg_ra_value;
1634
      // verilator public
1635
      get_reg_ra_value = ra_value_resolved;
1636
   endfunction
1637
   function [4:0] get_reg_rb;
1638
      // verilator public
1639
      get_reg_rb = reg_rb_i;
1640
   endfunction
1641
   function [31:0] get_reg_rb_value;
1642
      // verilator public
1643
      get_reg_rb_value = rb_value_resolved;
1644
   endfunction
1645 27 ultra_embe
`endif
1646
 
1647
endmodule

powered by: WebSVN 2.1.0

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