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

Subversion Repositories altor32

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

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 37 ultra_embe
// Copyright (C) 2011 - 2014 Ultra-Embedded.com
14 27 ultra_embe
//
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 44 ultra_embe
    // Break interrupt
54
    input               break_i /*verilator public*/,
55 27 ultra_embe
 
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 37 ultra_embe
    output [31:0]       opcode_pc_o /*verilator public*/,
90 27 ultra_embe
    output [4:0]        reg_rd_o /*verilator public*/,
91
    output [31:0]       reg_rd_value_o /*verilator public*/,
92 40 ultra_embe
    output [63:0]       mult_res_o /*verilator public*/,
93 27 ultra_embe
 
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 37 ultra_embe
reg [31:0]  pc_branch_q;
128
reg         pc_fetch_q;
129 27 ultra_embe
 
130
// Exception saved program counter
131 37 ultra_embe
reg [31:0]  epc_q;
132 27 ultra_embe
 
133
// Supervisor register
134 37 ultra_embe
reg [31:0]  sr_q;
135 27 ultra_embe
 
136
// Exception saved supervisor register
137 37 ultra_embe
reg [31:0]  esr_q;
138 27 ultra_embe
 
139
// Destination register number (post execute stage)
140 37 ultra_embe
reg [4:0]   ex_rd_q;
141 27 ultra_embe
 
142
// Current opcode (PC for debug)
143 37 ultra_embe
reg [31:0]  ex_opcode_q;
144
reg [31:0]  ex_opcode_pc_q;
145 27 ultra_embe
 
146
// ALU input A
147 37 ultra_embe
reg [31:0]  ex_alu_a_q;
148 27 ultra_embe
 
149
// ALU input B
150 37 ultra_embe
reg [31:0]  ex_alu_b_q;
151 27 ultra_embe
 
152
// ALU output
153 37 ultra_embe
wire [31:0] ex_result_w;
154 27 ultra_embe
 
155
// Resolved RA/RB register contents
156 37 ultra_embe
wire [31:0] ra_resolved_w;
157
wire [31:0] rb_resolved_w;
158
wire        operand_resolved_w;
159
wire        resolve_failed_w;
160 27 ultra_embe
 
161
// ALU Carry
162 37 ultra_embe
wire        alu_carry_out_w;
163
wire        alu_carry_update_w;
164
wire        alu_flag_update_w;
165 27 ultra_embe
 
166 36 ultra_embe
// ALU Comparisons
167 37 ultra_embe
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 36 ultra_embe
 
173 27 ultra_embe
// ALU operation selection
174 37 ultra_embe
reg [3:0]   ex_alu_func_q;
175 27 ultra_embe
 
176
// Load instruction details
177 37 ultra_embe
reg [4:0]   load_rd_q;
178
reg [7:0]   load_inst_q;
179
reg [1:0]   load_offset_q;
180 27 ultra_embe
 
181
// Load forwarding
182 37 ultra_embe
wire        load_inst_w;
183
wire [31:0] load_result_w;
184 27 ultra_embe
 
185
// Memory access?
186 37 ultra_embe
reg         mem_load_q;
187
reg         mem_store_q;
188
reg         mem_access_q;
189 27 ultra_embe
 
190 37 ultra_embe
wire        load_pending_w;
191
wire        store_pending_w;
192
wire        load_insert_w;
193
wire        load_stall_w;
194 27 ultra_embe
 
195 37 ultra_embe
reg         d_mem_load_q;
196 27 ultra_embe
 
197 44 ultra_embe
reg         break_q;
198 27 ultra_embe
 
199 39 ultra_embe
// Exception/Interrupt was last instruction
200
reg         exc_last_q;
201
 
202 31 ultra_embe
// SIM PUTC
203
`ifdef SIM_EXT_PUTC
204 37 ultra_embe
    reg [7:0] putc_q;
205 31 ultra_embe
`endif
206
 
207 27 ultra_embe
//-----------------------------------------------------------------
208 37 ultra_embe
// ALU
209 27 ultra_embe
//-----------------------------------------------------------------
210
altor32_alu alu
211
(
212
    // ALU operation select
213 37 ultra_embe
    .op_i(ex_alu_func_q),
214 27 ultra_embe
 
215
    // Operands
216 37 ultra_embe
    .a_i(ex_alu_a_q),
217
    .b_i(ex_alu_b_q),
218 39 ultra_embe
    .c_i(sr_q[`SR_CY]),
219 27 ultra_embe
 
220
    // Result
221 37 ultra_embe
    .p_o(ex_result_w),
222 27 ultra_embe
 
223
    // Carry
224 37 ultra_embe
    .c_o(alu_carry_out_w),
225
    .c_update_o(alu_carry_update_w),
226 36 ultra_embe
 
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 37 ultra_embe
    .flag_update_o(alu_flag_update_w)
234 27 ultra_embe
);
235
 
236 37 ultra_embe
//-----------------------------------------------------------------
237 27 ultra_embe
// Load result forwarding
238 37 ultra_embe
//-----------------------------------------------------------------
239 27 ultra_embe
altor32_lfu
240
u_lfu
241
(
242
    // Opcode
243 37 ultra_embe
    .opcode_i(load_inst_q),
244 27 ultra_embe
 
245
    // Memory load result
246
    .mem_result_i(dmem_data_in_i),
247 37 ultra_embe
    .mem_offset_i(load_offset_q),
248 27 ultra_embe
 
249
    // Result
250 37 ultra_embe
    .load_result_o(load_result_w),
251
    .load_insn_o(load_inst_w)
252 27 ultra_embe
);
253
 
254 37 ultra_embe
//-----------------------------------------------------------------
255 27 ultra_embe
// Load / store pending logic
256 37 ultra_embe
//-----------------------------------------------------------------
257 27 ultra_embe
altor32_lsu
258
u_lsu
259
(
260
    // Current instruction
261 37 ultra_embe
    .opcode_valid_i(opcode_valid_i & ~pc_fetch_q),
262 27 ultra_embe
    .opcode_i({2'b00,opcode_i[31:26]}),
263
 
264
    // Load / Store pending
265 37 ultra_embe
    .load_pending_i(mem_load_q),
266
    .store_pending_i(mem_store_q),
267 27 ultra_embe
 
268
    // Load dest register
269 37 ultra_embe
    .rd_load_i(load_rd_q),
270 27 ultra_embe
 
271
    // Load insn in WB stage
272 37 ultra_embe
    .load_wb_i(d_mem_load_q),
273 27 ultra_embe
 
274
    // Memory status
275 37 ultra_embe
    .mem_access_i(mem_access_q),
276 27 ultra_embe
    .mem_ack_i(dmem_ack_i),
277
 
278
    // Load / store still pending
279 37 ultra_embe
    .load_pending_o(load_pending_w),
280
    .store_pending_o(store_pending_w),
281 27 ultra_embe
 
282
    // Insert load result into pipeline
283 37 ultra_embe
    .write_result_o(load_insert_w),
284 27 ultra_embe
 
285
    // Stall pipeline due
286 37 ultra_embe
    .stall_o(load_stall_w)
287 27 ultra_embe
);
288
 
289 37 ultra_embe
//-----------------------------------------------------------------
290 27 ultra_embe
// Operand forwarding
291 37 ultra_embe
//-----------------------------------------------------------------
292 27 ultra_embe
altor32_dfu
293
u_dfu
294
(
295
    // Input registers
296
    .ra_i(reg_ra_i),
297
    .rb_i(reg_rb_i),
298
 
299
    // Input register contents
300
    .ra_regval_i(reg_ra_value_i),
301
    .rb_regval_i(reg_rb_value_i),
302
 
303
    // Dest register (EXEC stage)
304 37 ultra_embe
    .rd_ex_i(ex_rd_q),
305 27 ultra_embe
 
306
    // Dest register (WB stage)
307
    .rd_wb_i(wb_rd_i),
308
 
309
    // Load pending / target
310 37 ultra_embe
    .load_pending_i(load_pending_w),
311
    .rd_load_i(load_rd_q),
312 27 ultra_embe
 
313
    // Multiplier status
314 40 ultra_embe
    .mult_ex_i(1'b0),
315 27 ultra_embe
 
316
    // Result (EXEC)
317 37 ultra_embe
    .result_ex_i(ex_result_w),
318 27 ultra_embe
 
319
    // Result (WB)
320
    .result_wb_i(wb_rd_value_i),
321
 
322
    // Resolved register values
323 37 ultra_embe
    .result_ra_o(ra_resolved_w),
324
    .result_rb_o(rb_resolved_w),
325 27 ultra_embe
 
326 36 ultra_embe
    // Operands required forwarding
327 37 ultra_embe
    .resolved_o(operand_resolved_w),
328 36 ultra_embe
 
329 27 ultra_embe
    // Stall due to failed resolve
330 37 ultra_embe
    .stall_o(resolve_failed_w)
331 27 ultra_embe
);
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 37 ultra_embe
    reg_ra_r             = ra_resolved_w;
374
    reg_rb_r             = rb_resolved_w;
375 27 ultra_embe
 
376 31 ultra_embe
    // Shift ammount (from register[rb])
377 37 ultra_embe
    shift_rb_r           = {26'b00,rb_resolved_w[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 37 ultra_embe
    if (~opcode_valid_i | pc_fetch_q)
465 31 ultra_embe
        execute_inst_r  = 1'b0;
466
    // Valid instruction, but load result / operand not ready
467 37 ultra_embe
    else if (resolve_failed_w | load_stall_w |
468
            (operand_resolved_w & (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 37 ultra_embe
    next_sr_r = sr_q;
491 27 ultra_embe
 
492 36 ultra_embe
    // Update SR.F
493 37 ultra_embe
    if (alu_flag_update_w)
494 39 ultra_embe
        next_sr_r[`SR_F] = compare_result_r;
495 36 ultra_embe
 
496 31 ultra_embe
    // Latch carry if updated
497 37 ultra_embe
    if (alu_carry_update_w)
498 39 ultra_embe
        next_sr_r[`SR_CY] = alu_carry_out_w;
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 44 ultra_embe
 
504
      // Clear step control (if not executing higher priority syscall/break)
505
      if (!inst_sys_w && !inst_trap_w)
506
          next_sr_r[`SR_STEP] = 1'b0;
507
 
508 31 ultra_embe
      case (1'b1)
509
      inst_mtspr_w:
510
      begin
511
          case (mxspr_uint16_r)
512
          // SR - Supervision register
513
          `SPR_REG_SR:
514
          begin
515
              next_sr_r = reg_rb_r;
516 27 ultra_embe
 
517 31 ultra_embe
              // Don't store cache flush requests
518 39 ultra_embe
              next_sr_r[`SR_ICACHE_FLUSH] = 1'b0;
519
              next_sr_r[`SR_DCACHE_FLUSH] = 1'b0;
520 31 ultra_embe
          end
521
          default:
522
            ;
523
          endcase
524
      end
525
      inst_rfe_w:
526 37 ultra_embe
          next_sr_r = esr_q;
527 31 ultra_embe
      default:
528
        ;
529
      endcase
530
    end
531
end
532 27 ultra_embe
 
533 31 ultra_embe
//-----------------------------------------------------------------
534
// Next EPC/ESR
535
//-----------------------------------------------------------------
536
reg [31:0]  next_epc_r;
537
reg [31:0]  next_esr_r;
538 27 ultra_embe
 
539 31 ultra_embe
always @ *
540
begin
541 37 ultra_embe
    next_epc_r = epc_q;
542
    next_esr_r = esr_q;
543 39 ultra_embe
    // Instruction after interrupt, update SR.F
544
    if (exc_last_q && alu_flag_update_w)
545
        next_esr_r[`SR_F] = compare_result_r;
546
 
547
    //  Instruction after interrupt, latch carry if updated
548
    if (exc_last_q && alu_carry_update_w)
549
        next_esr_r[`SR_CY] = alu_carry_out_w;
550 31 ultra_embe
 
551 39 ultra_embe
    if (execute_inst_r & ~stall_inst_r)
552 31 ultra_embe
    begin
553 39 ultra_embe
        case (1'b1)
554
        inst_mtspr_w: // l.mtspr
555
        begin
556
           case (mxspr_uint16_r)
557
               // EPCR - EPC Exception saved PC
558
               `SPR_REG_EPCR:   next_epc_r = reg_rb_r;
559 27 ultra_embe
 
560 39 ultra_embe
               // ESR - Exception saved SR
561
               `SPR_REG_ESR:    next_esr_r = reg_rb_r;
562
           endcase
563
        end
564
        default:
565
          ;
566
        endcase
567 31 ultra_embe
    end
568
end
569 27 ultra_embe
 
570 31 ultra_embe
//-----------------------------------------------------------------
571
// ALU inputs
572
//-----------------------------------------------------------------
573 27 ultra_embe
 
574 31 ultra_embe
// ALU operation selection
575
reg [3:0]  alu_func_r;
576 27 ultra_embe
 
577 31 ultra_embe
// ALU operands
578
reg [31:0] alu_input_a_r;
579
reg [31:0] alu_input_b_r;
580
reg        write_rd_r;
581 27 ultra_embe
 
582 31 ultra_embe
always @ *
583
begin
584
   alu_func_r     = `ALU_NONE;
585
   alu_input_a_r  = 32'b0;
586
   alu_input_b_r  = 32'b0;
587
   write_rd_r     = 1'b0;
588 27 ultra_embe
 
589 31 ultra_embe
   case (1'b1)
590 27 ultra_embe
 
591 31 ultra_embe
     inst_add_w: // l.add
592
     begin
593
       alu_func_r     = `ALU_ADD;
594
       alu_input_a_r  = reg_ra_r;
595
       alu_input_b_r  = reg_rb_r;
596
       write_rd_r     = 1'b1;
597
     end
598
 
599
     inst_addc_w: // l.addc
600
     begin
601
         alu_func_r     = `ALU_ADDC;
602
         alu_input_a_r  = reg_ra_r;
603
         alu_input_b_r  = reg_rb_r;
604
         write_rd_r     = 1'b1;
605
     end
606 27 ultra_embe
 
607 31 ultra_embe
     inst_and_w: // l.and
608
     begin
609
         alu_func_r     = `ALU_AND;
610
         alu_input_a_r  = reg_ra_r;
611
         alu_input_b_r  = reg_rb_r;
612
         write_rd_r     = 1'b1;
613
     end
614 27 ultra_embe
 
615 31 ultra_embe
     inst_or_w: // l.or
616
     begin
617
         alu_func_r     = `ALU_OR;
618
         alu_input_a_r  = reg_ra_r;
619
         alu_input_b_r  = reg_rb_r;
620
         write_rd_r     = 1'b1;
621
     end
622 27 ultra_embe
 
623 31 ultra_embe
     inst_sll_w: // l.sll
624
     begin
625
         alu_func_r     = `ALU_SHIFTL;
626
         alu_input_a_r  = reg_ra_r;
627
         alu_input_b_r  = shift_rb_r;
628
         write_rd_r     = 1'b1;
629
     end
630 27 ultra_embe
 
631 31 ultra_embe
     inst_sra_w: // l.sra
632
     begin
633
         alu_func_r     = `ALU_SHIRTR_ARITH;
634
         alu_input_a_r  = reg_ra_r;
635
         alu_input_b_r  = shift_rb_r;
636
         write_rd_r     = 1'b1;
637
     end
638 27 ultra_embe
 
639 31 ultra_embe
     inst_srl_w: // l.srl
640
     begin
641
         alu_func_r     = `ALU_SHIFTR;
642
         alu_input_a_r  = reg_ra_r;
643
         alu_input_b_r  = shift_rb_r;
644
         write_rd_r     = 1'b1;
645
     end
646 27 ultra_embe
 
647 31 ultra_embe
     inst_sub_w: // l.sub
648
     begin
649
         alu_func_r     = `ALU_SUB;
650
         alu_input_a_r  = reg_ra_r;
651
         alu_input_b_r  = reg_rb_r;
652
         write_rd_r     = 1'b1;
653
     end
654
 
655
     inst_xor_w: // l.xor
656
     begin
657
         alu_func_r     = `ALU_XOR;
658
         alu_input_a_r  = reg_ra_r;
659
         alu_input_b_r  = reg_rb_r;
660
         write_rd_r     = 1'b1;
661 36 ultra_embe
     end
662 31 ultra_embe
 
663
     inst_addi_w: // l.addi
664
     begin
665
         alu_func_r     = `ALU_ADD;
666
         alu_input_a_r  = reg_ra_r;
667
         alu_input_b_r  = int32_r;
668
         write_rd_r     = 1'b1;
669
     end
670
 
671
     inst_andi_w: // l.andi
672
     begin
673
         alu_func_r     = `ALU_AND;
674
         alu_input_a_r  = reg_ra_r;
675
         alu_input_b_r  = uint32_r;
676
         write_rd_r     = 1'b1;
677
     end
678
 
679
     inst_jal_w: // l.jal
680
     begin
681
         alu_input_a_r  = next_pc_r;
682
         write_rd_r     = 1'b1;
683
     end
684
 
685
     inst_jalr_w: // l.jalr
686
     begin
687
         alu_input_a_r  = next_pc_r;
688
         write_rd_r     = 1'b1;
689
     end
690
 
691
     inst_mfspr_w: // l.mfspr
692
     begin
693
        case (mxspr_uint16_r)
694
           // SR - Supervision register
695
           `SPR_REG_SR:
696 27 ultra_embe
           begin
697 31 ultra_embe
               alu_input_a_r = next_sr_r;
698
               write_rd_r    = 1'b1;
699 27 ultra_embe
           end
700
 
701 31 ultra_embe
           // EPCR - EPC Exception saved PC
702
           `SPR_REG_EPCR:
703 27 ultra_embe
           begin
704 37 ultra_embe
               alu_input_a_r  = epc_q;
705 31 ultra_embe
               write_rd_r     = 1'b1;
706 27 ultra_embe
           end
707
 
708 31 ultra_embe
           // ESR - Exception saved SR
709
           `SPR_REG_ESR:
710 27 ultra_embe
           begin
711 37 ultra_embe
               alu_input_a_r  = esr_q;
712 31 ultra_embe
               write_rd_r     = 1'b1;
713 27 ultra_embe
           end
714 31 ultra_embe
           default:
715
              ;
716
        endcase
717
     end
718 27 ultra_embe
 
719 31 ultra_embe
     inst_movhi_w: // l.movhi
720
     begin
721
         alu_input_a_r  = {uint16_r,16'h0000};
722
         write_rd_r     = 1'b1;
723
     end
724 27 ultra_embe
 
725 31 ultra_embe
     inst_ori_w: // l.ori
726
     begin
727
         alu_func_r     = `ALU_OR;
728
         alu_input_a_r  = reg_ra_r;
729
         alu_input_b_r  = uint32_r;
730
         write_rd_r     = 1'b1;
731
     end
732 27 ultra_embe
 
733 31 ultra_embe
     inst_slli_w: // l.slli
734
     begin
735
         alu_func_r     = `ALU_SHIFTL;
736
         alu_input_a_r  = reg_ra_r;
737
         alu_input_b_r  = shift_imm_r;
738
         write_rd_r     = 1'b1;
739
     end
740 27 ultra_embe
 
741 31 ultra_embe
     inst_srai_w: // l.srai
742
     begin
743
         alu_func_r     = `ALU_SHIRTR_ARITH;
744
         alu_input_a_r  = reg_ra_r;
745
         alu_input_b_r  = shift_imm_r;
746
         write_rd_r     = 1'b1;
747
     end
748 27 ultra_embe
 
749 31 ultra_embe
     inst_srli_w: // l.srli
750
     begin
751
         alu_func_r     = `ALU_SHIFTR;
752
         alu_input_a_r  = reg_ra_r;
753
         alu_input_b_r  = shift_imm_r;
754
         write_rd_r     = 1'b1;
755
     end
756 27 ultra_embe
 
757 31 ultra_embe
     // l.lbs l.lhs l.lws l.lbz l.lhz l.lwz
758
     inst_lbs_w,
759
     inst_lhs_w,
760
     inst_lws_w,
761
     inst_lbz_w,
762
     inst_lhz_w,
763
     inst_lwz_w:
764
          write_rd_r    = 1'b1;
765 27 ultra_embe
 
766 36 ultra_embe
     // l.sf*i
767
     inst_sfxxi_w:
768
     begin
769
         alu_func_r     = `ALU_COMPARE;
770
         alu_input_a_r  = reg_ra_r;
771
         alu_input_b_r  = int32_r;
772
     end
773
 
774
     // l.sf*
775
     inst_sfxx_w:
776
     begin
777
         alu_func_r     = `ALU_COMPARE;
778
         alu_input_a_r  = reg_ra_r;
779
         alu_input_b_r  = reg_rb_r;
780
     end
781
 
782 31 ultra_embe
     inst_xori_w: // l.xori
783
     begin
784
         alu_func_r     = `ALU_XOR;
785
         alu_input_a_r  = reg_ra_r;
786
         alu_input_b_r  = int32_r;
787
         write_rd_r     = 1'b1;
788
     end
789
     default:
790
        ;
791
   endcase
792
end
793 27 ultra_embe
 
794 31 ultra_embe
//-----------------------------------------------------------------
795 36 ultra_embe
// Comparisons (from ALU outputs)
796 31 ultra_embe
//-----------------------------------------------------------------
797 36 ultra_embe
reg inst_sfges_r;
798
reg inst_sfgeu_r;
799
reg inst_sfgts_r;
800
reg inst_sfgtu_r;
801
reg inst_sfles_r;
802
reg inst_sfleu_r;
803
reg inst_sflts_r;
804
reg inst_sfltu_r;
805
reg inst_sfne_r;
806
reg inst_sfges_q;
807
reg inst_sfgeu_q;
808
reg inst_sfgts_q;
809
reg inst_sfgtu_q;
810
reg inst_sfles_q;
811
reg inst_sfleu_q;
812
reg inst_sflts_q;
813
reg inst_sfltu_q;
814
reg inst_sfne_q;
815
 
816 31 ultra_embe
always @ *
817
begin
818 36 ultra_embe
    inst_sfges_r = 1'b0;
819
    inst_sfgeu_r = 1'b0;
820
    inst_sfgts_r = 1'b0;
821
    inst_sfgtu_r = 1'b0;
822
    inst_sfles_r = 1'b0;
823
    inst_sfleu_r = 1'b0;
824
    inst_sflts_r = 1'b0;
825
    inst_sfltu_r = 1'b0;
826
    inst_sfne_r  = 1'b0;
827 32 ultra_embe
 
828 36 ultra_embe
    // Valid instruction
829
    if (execute_inst_r && ~stall_inst_r)
830
    begin
831 32 ultra_embe
 
832 36 ultra_embe
        case (1'b1)
833
        inst_sfges_w:  // l.sfges
834
            inst_sfges_r = 1'b1;
835 32 ultra_embe
 
836 36 ultra_embe
        inst_sfgeu_w:  // l.sfgeu
837
            inst_sfgeu_r = 1'b1;
838 32 ultra_embe
 
839 36 ultra_embe
        inst_sfgts_w:  // l.sfgts
840
            inst_sfgts_r = 1'b1;
841 32 ultra_embe
 
842 36 ultra_embe
        inst_sfgtu_w:  // l.sfgtu
843
            inst_sfgtu_r = 1'b1;
844 32 ultra_embe
 
845 36 ultra_embe
        inst_sfles_w:  // l.sfles
846
            inst_sfles_r = 1'b1;
847 32 ultra_embe
 
848 36 ultra_embe
        inst_sfleu_w:  // l.sfleu
849
            inst_sfleu_r = 1'b1;
850 27 ultra_embe
 
851 36 ultra_embe
        inst_sflts_w:  // l.sflts
852
            inst_sflts_r = 1'b1;
853 27 ultra_embe
 
854 36 ultra_embe
        inst_sfltu_w:  // l.sfltu
855
            inst_sfltu_r = 1'b1;
856 27 ultra_embe
 
857 36 ultra_embe
        inst_sfne_w:  // l.sfne
858
            inst_sfne_r  = 1'b1;
859 27 ultra_embe
 
860 36 ultra_embe
        default:
861
            ;
862
        endcase
863
    end
864
end
865 27 ultra_embe
 
866 36 ultra_embe
always @ (posedge clk_i or posedge rst_i)
867
begin
868
   if (rst_i == 1'b1)
869
   begin
870
        inst_sfges_q <= 1'b0;
871
        inst_sfgeu_q <= 1'b0;
872
        inst_sfgts_q <= 1'b0;
873
        inst_sfgtu_q <= 1'b0;
874
        inst_sfles_q <= 1'b0;
875
        inst_sfleu_q <= 1'b0;
876
        inst_sflts_q <= 1'b0;
877
        inst_sfltu_q <= 1'b0;
878
        inst_sfne_q <= 1'b0;
879
   end
880
   else
881
   begin
882
        inst_sfges_q <= inst_sfges_r;
883
        inst_sfgeu_q <= inst_sfgeu_r;
884
        inst_sfgts_q <= inst_sfgts_r;
885
        inst_sfgtu_q <= inst_sfgtu_r;
886
        inst_sfles_q <= inst_sfles_r;
887
        inst_sfleu_q <= inst_sfleu_r;
888
        inst_sflts_q <= inst_sflts_r;
889
        inst_sfltu_q <= inst_sfltu_r;
890
        inst_sfne_q  <= inst_sfne_r;
891
   end
892
end
893 27 ultra_embe
 
894 36 ultra_embe
always @ *
895
begin
896
    case (1'b1)
897
    inst_sfges_q: // l.sfges
898
        compare_result_r = compare_gts_w | compare_equal_w;
899 27 ultra_embe
 
900 36 ultra_embe
    inst_sfgeu_q: // l.sfgeu
901
        compare_result_r = compare_gt_w | compare_equal_w;
902 27 ultra_embe
 
903 36 ultra_embe
    inst_sfgts_q: // l.sfgts
904
        compare_result_r = compare_gts_w;
905 27 ultra_embe
 
906 36 ultra_embe
    inst_sfgtu_q: // l.sfgtu
907
        compare_result_r = compare_gt_w;
908 27 ultra_embe
 
909 36 ultra_embe
    inst_sfles_q: // l.sfles
910
        compare_result_r = compare_lts_w | compare_equal_w;
911 27 ultra_embe
 
912 36 ultra_embe
    inst_sfleu_q: // l.sfleu
913
        compare_result_r = compare_lt_w | compare_equal_w;
914 27 ultra_embe
 
915 36 ultra_embe
    inst_sflts_q: // l.sflts
916
        compare_result_r = compare_lts_w;
917 27 ultra_embe
 
918 36 ultra_embe
    inst_sfltu_q: // l.sfltu
919
        compare_result_r = compare_lt_w;
920 27 ultra_embe
 
921 36 ultra_embe
    inst_sfne_q: // l.sfne
922
        compare_result_r = ~compare_equal_w;
923
 
924
    default: // l.sfeq
925
        compare_result_r = compare_equal_w;
926 31 ultra_embe
    endcase
927
end
928 27 ultra_embe
 
929 31 ultra_embe
//-----------------------------------------------------------------
930
// Load/Store operation?
931
//-----------------------------------------------------------------
932
reg         load_inst_r;
933
reg         store_inst_r;
934
reg [31:0]  mem_addr_r;
935
always @ *
936
begin
937
    load_inst_r  = inst_lbs_w | inst_lhs_w | inst_lws_w |
938
                   inst_lbz_w | inst_lhz_w | inst_lwz_w;
939
    store_inst_r = inst_sb_w  | inst_sh_w  | inst_sw_w;
940 27 ultra_embe
 
941 31 ultra_embe
    // Memory address is relative to RA
942
    mem_addr_r = reg_ra_r + (store_inst_r ? store_int32_r : int32_r);
943
end
944 27 ultra_embe
 
945 31 ultra_embe
//-----------------------------------------------------------------
946
// Branches
947
//-----------------------------------------------------------------
948
reg         branch_r;
949
reg         branch_link_r;
950
reg [31:0]  branch_target_r;
951
reg         branch_except_r;
952 27 ultra_embe
 
953 31 ultra_embe
always @ *
954
begin
955 27 ultra_embe
 
956 31 ultra_embe
    branch_r        = 1'b0;
957
    branch_link_r   = 1'b0;
958
    branch_except_r = 1'b0;
959 27 ultra_embe
 
960 31 ultra_embe
    // Default branch target is relative to current PC
961
    branch_target_r = (opcode_pc_i + {target_int26_r[29:0],2'b00});
962 27 ultra_embe
 
963 31 ultra_embe
    case (1'b1)
964
    inst_bf_w: // l.bf
965 39 ultra_embe
        branch_r      = next_sr_r[`SR_F];
966 27 ultra_embe
 
967 31 ultra_embe
    inst_bnf_w: // l.bnf
968 39 ultra_embe
        branch_r      = ~next_sr_r[`SR_F];
969 27 ultra_embe
 
970 31 ultra_embe
    inst_j_w: // l.j
971
        branch_r      = 1'b1;
972 27 ultra_embe
 
973 31 ultra_embe
    inst_jal_w: // l.jal
974
    begin
975
        // Write to REG_9_LR
976
        branch_link_r = 1'b1;
977
        branch_r      = 1'b1;
978
    end
979 27 ultra_embe
 
980 31 ultra_embe
    inst_jalr_w: // l.jalr
981
    begin
982
        // Write to REG_9_LR
983
        branch_link_r   = 1'b1;
984
        branch_r        = 1'b1;
985
        branch_target_r = reg_rb_r;
986
    end
987 27 ultra_embe
 
988 31 ultra_embe
    inst_jr_w: // l.jr
989
    begin
990
        branch_r        = 1'b1;
991
        branch_target_r = reg_rb_r;
992
    end
993 27 ultra_embe
 
994 31 ultra_embe
    inst_rfe_w: // l.rfe
995
    begin
996
        branch_r        = 1'b1;
997 37 ultra_embe
        branch_target_r = epc_q;
998 31 ultra_embe
    end
999 27 ultra_embe
 
1000 31 ultra_embe
    inst_sys_w: // l.sys
1001
    begin
1002
        branch_r        = 1'b1;
1003
        branch_except_r = 1'b1;
1004
        branch_target_r = ISR_VECTOR + `VECTOR_SYSCALL;
1005
    end
1006 27 ultra_embe
 
1007 31 ultra_embe
    inst_trap_w: // l.trap
1008
    begin
1009
        branch_r        = 1'b1;
1010
        branch_except_r = 1'b1;
1011
        branch_target_r = ISR_VECTOR + `VECTOR_TRAP;
1012
    end
1013 27 ultra_embe
 
1014 31 ultra_embe
    default:
1015
        ;
1016
    endcase
1017
end
1018
 
1019
//-----------------------------------------------------------------
1020
// Invalid instruction
1021
//-----------------------------------------------------------------
1022
reg invalid_inst_r;
1023
 
1024
always @ *
1025
begin
1026
    case (1'b1)
1027
       inst_add_w,
1028
       inst_addc_w,
1029
       inst_and_w,
1030
       inst_or_w,
1031
       inst_sll_w,
1032
       inst_sra_w,
1033
       inst_srl_w,
1034
       inst_sub_w,
1035 37 ultra_embe
       inst_xor_w,
1036 31 ultra_embe
       inst_addi_w,
1037
       inst_andi_w,
1038
       inst_bf_w,
1039
       inst_bnf_w,
1040
       inst_j_w,
1041
       inst_jal_w,
1042
       inst_jalr_w,
1043
       inst_jr_w,
1044
       inst_lbs_w,
1045
       inst_lhs_w,
1046
       inst_lws_w,
1047
       inst_lbz_w,
1048
       inst_lhz_w,
1049
       inst_lwz_w,
1050
       inst_mfspr_w,
1051
       inst_mtspr_w,
1052
       inst_movhi_w,
1053
       inst_nop_w,
1054
       inst_ori_w,
1055
       inst_rfe_w,
1056
       inst_sb_w,
1057
       inst_sh_w,
1058
       inst_sw_w,
1059
       inst_xori_w,
1060
       inst_slli_w,
1061
       inst_srai_w,
1062
       inst_srli_w,
1063
       inst_sfeq_w,
1064
       inst_sfges_w,
1065
       inst_sfgeu_w,
1066
       inst_sfgts_w,
1067
       inst_sfgtu_w,
1068
       inst_sfles_w,
1069
       inst_sfleu_w,
1070
       inst_sflts_w,
1071
       inst_sfltu_w,
1072
       inst_sfne_w,
1073
       inst_sys_w,
1074
       inst_trap_w:
1075
          invalid_inst_r = 1'b0;
1076
       default:
1077
          invalid_inst_r = 1'b1;
1078
    endcase
1079
end
1080
 
1081
//-----------------------------------------------------------------
1082
// Execute: ALU control
1083
//-----------------------------------------------------------------
1084
always @ (posedge clk_i or posedge rst_i)
1085
begin
1086
   if (rst_i == 1'b1)
1087
   begin
1088 37 ultra_embe
       ex_alu_func_q         <= `ALU_NONE;
1089
       ex_alu_a_q            <= 32'h00000000;
1090
       ex_alu_b_q            <= 32'h00000000;
1091
       ex_rd_q               <= 5'b00000;
1092 31 ultra_embe
   end
1093
   else
1094
   begin
1095
       //---------------------------------------------------------------
1096
       // Instruction not ready
1097
       //---------------------------------------------------------------
1098
       if (~execute_inst_r | stall_inst_r)
1099
       begin
1100
           // Insert load result?
1101 37 ultra_embe
           if (load_insert_w)
1102 27 ultra_embe
           begin
1103 31 ultra_embe
               // Feed load result into pipeline
1104 37 ultra_embe
               ex_alu_func_q   <= `ALU_NONE;
1105
               ex_alu_a_q      <= load_result_w;
1106
               ex_alu_b_q      <= 32'b0;
1107
               ex_rd_q         <= load_rd_q;
1108 27 ultra_embe
           end
1109 31 ultra_embe
           else
1110 27 ultra_embe
           begin
1111 31 ultra_embe
               // No ALU operation (output == input_a)
1112 37 ultra_embe
               ex_alu_func_q   <= `ALU_NONE;
1113
               ex_alu_a_q      <= 32'b0;
1114
               ex_alu_b_q      <= 32'b0;
1115
               ex_rd_q         <= 5'b0;
1116 27 ultra_embe
           end
1117 31 ultra_embe
       end
1118 27 ultra_embe
       //---------------------------------------------------------------
1119 31 ultra_embe
       // Valid instruction
1120 27 ultra_embe
       //---------------------------------------------------------------
1121 36 ultra_embe
       else
1122 31 ultra_embe
       begin
1123
           // Update ALU input flops
1124 37 ultra_embe
           ex_alu_func_q         <= alu_func_r;
1125
           ex_alu_a_q            <= alu_input_a_r;
1126
           ex_alu_b_q            <= alu_input_b_r;
1127 27 ultra_embe
 
1128 31 ultra_embe
           // Branch and link (Rd = LR/R9)
1129
           if (branch_link_r)
1130 37 ultra_embe
              ex_rd_q            <= 5'd9;
1131 31 ultra_embe
           // Instruction with register writeback
1132
           else if (write_rd_r)
1133 37 ultra_embe
              ex_rd_q            <= reg_rd_i;
1134 31 ultra_embe
           else
1135 37 ultra_embe
              ex_rd_q            <= 5'b0;
1136 27 ultra_embe
       end
1137 31 ultra_embe
   end
1138
end
1139
 
1140
//-----------------------------------------------------------------
1141
// Execute: Update executed PC / opcode
1142
//-----------------------------------------------------------------
1143
always @ (posedge clk_i or posedge rst_i)
1144
begin
1145
   if (rst_i == 1'b1)
1146
   begin
1147 37 ultra_embe
       ex_opcode_q           <= 32'h00000000;
1148
       ex_opcode_pc_q        <= 32'h00000000;
1149 31 ultra_embe
   end
1150
   else
1151
   begin
1152
       // Instruction not ready
1153
       if (~execute_inst_r | stall_inst_r)
1154 27 ultra_embe
       begin
1155 31 ultra_embe
           // Store bubble opcode
1156 37 ultra_embe
           ex_opcode_q            <= `OPCODE_INST_BUBBLE;
1157
           ex_opcode_pc_q         <= opcode_pc_i;
1158 31 ultra_embe
       end
1159
       // Valid instruction
1160 36 ultra_embe
       else
1161 27 ultra_embe
       begin
1162 31 ultra_embe
           // Store opcode
1163 37 ultra_embe
           ex_opcode_q            <= opcode_i;
1164
           ex_opcode_pc_q         <= opcode_pc_i;
1165 27 ultra_embe
 
1166 31 ultra_embe
        `ifdef CONF_CORE_TRACE
1167
           $display("%08x: Execute 0x%08x", opcode_pc_i, opcode_i);
1168
           $display(" rA[%d] = 0x%08x", reg_ra_i, reg_ra_r);
1169
           $display(" rB[%d] = 0x%08x", reg_rb_i, reg_rb_r);
1170
        `endif
1171 27 ultra_embe
       end
1172 31 ultra_embe
   end
1173
end
1174 27 ultra_embe
 
1175 31 ultra_embe
//-----------------------------------------------------------------
1176
// Execute: Branch / exceptions
1177
//-----------------------------------------------------------------
1178
always @ (posedge clk_i or posedge rst_i)
1179
begin
1180
   if (rst_i == 1'b1)
1181
   begin
1182 37 ultra_embe
       pc_branch_q          <= 32'h00000000;
1183
       pc_fetch_q           <= 1'b0;
1184 39 ultra_embe
       exc_last_q           <= 1'b0;
1185 27 ultra_embe
 
1186 31 ultra_embe
       // Status registers
1187 37 ultra_embe
       epc_q                <= 32'h00000000;
1188
       sr_q                 <= 32'h00000000;
1189
       esr_q                <= 32'h00000000;
1190 27 ultra_embe
 
1191 31 ultra_embe
       fault_o              <= 1'b0;
1192 27 ultra_embe
 
1193 44 ultra_embe
       break_q              <= 1'b0;
1194
       break_o              <= 1'b0;
1195 31 ultra_embe
   end
1196
   else
1197
   begin
1198 44 ultra_embe
      // Flop break request, clear when break interrupt executed
1199
      if (break_i)
1200
          break_q           <= 1'b1;
1201 27 ultra_embe
 
1202 31 ultra_embe
       // Reset branch request
1203 37 ultra_embe
       pc_fetch_q           <= 1'b0;
1204 39 ultra_embe
       exc_last_q           <= 1'b0;
1205 27 ultra_embe
 
1206 44 ultra_embe
       break_o              <= 1'b0;
1207
 
1208 31 ultra_embe
       // Update SR
1209 37 ultra_embe
       sr_q                 <= next_sr_r;
1210 31 ultra_embe
 
1211 39 ultra_embe
       // Update EPC / ESR which may have been updated by an 
1212
       // MTSPR write / flag update in instruction after interrupt
1213
       epc_q                <= next_epc_r;
1214
       esr_q                <= next_esr_r;
1215
 
1216 31 ultra_embe
       // Instruction ready
1217
       if (execute_inst_r & ~stall_inst_r)
1218 27 ultra_embe
       begin
1219 31 ultra_embe
           // Exception: Instruction opcode not valid / supported, invalid PC
1220
           if (invalid_inst_r || (opcode_pc_i[1:0] != 2'b00))
1221
           begin
1222
                // Save PC of next instruction
1223 37 ultra_embe
                epc_q       <= next_pc_r;
1224
                esr_q       <= next_sr_r;
1225 27 ultra_embe
 
1226 31 ultra_embe
                // Disable further interrupts
1227 37 ultra_embe
                sr_q        <= 32'b0;
1228 27 ultra_embe
 
1229 31 ultra_embe
                // Set PC to exception vector
1230
                if (invalid_inst_r)
1231 37 ultra_embe
                    pc_branch_q <= ISR_VECTOR + `VECTOR_ILLEGAL_INST;
1232 31 ultra_embe
                else
1233 37 ultra_embe
                    pc_branch_q <= ISR_VECTOR + `VECTOR_BUS_ERROR;
1234
                pc_fetch_q  <= 1'b1;
1235 39 ultra_embe
                exc_last_q  <= 1'b1;
1236 27 ultra_embe
 
1237 31 ultra_embe
                fault_o     <= 1'b1;
1238 44 ultra_embe
           end
1239 31 ultra_embe
           // Exception: Syscall / Break
1240
           else if (branch_except_r)
1241
           begin
1242
                // Save PC of next instruction
1243 37 ultra_embe
                epc_q       <= next_pc_r;
1244
                esr_q       <= next_sr_r;
1245 31 ultra_embe
 
1246 44 ultra_embe
                // Disable further interrupts / break events
1247 37 ultra_embe
                sr_q        <= 32'b0;
1248 31 ultra_embe
 
1249
                // Set PC to exception vector
1250 37 ultra_embe
                pc_branch_q <= branch_target_r;
1251 39 ultra_embe
                pc_fetch_q  <= 1'b1;
1252
                exc_last_q  <= 1'b1;
1253 44 ultra_embe
 
1254
                if (inst_trap_w)
1255
                    break_o     <= 1'b1;
1256 31 ultra_embe
 
1257
    `ifdef CONF_CORE_DEBUG
1258
               $display(" Exception 0x%08x", branch_target_r);
1259
    `endif
1260
           end
1261 44 ultra_embe
           // Single step / break request
1262
           else if ((sr_q[`SR_STEP] || break_q) && sr_q[`SR_DBGEN])
1263 31 ultra_embe
           begin
1264
                // Save PC of next instruction
1265
                if (branch_r)
1266 44 ultra_embe
                    epc_q   <= branch_target_r;
1267 31 ultra_embe
                // Next expected PC (current PC + 4)
1268
                else
1269 44 ultra_embe
                    epc_q   <= next_pc_r;
1270 31 ultra_embe
 
1271 44 ultra_embe
                // Save SR
1272 37 ultra_embe
                esr_q       <= next_sr_r;
1273 31 ultra_embe
 
1274 44 ultra_embe
                // Disable further interrupts / break events
1275 37 ultra_embe
                sr_q        <= 32'b0;
1276 44 ultra_embe
                break_q     <= 1'b0;
1277
                break_o     <= 1'b1;
1278 31 ultra_embe
 
1279 44 ultra_embe
                // Set PC to trap vector
1280
                pc_branch_q <= ISR_VECTOR + `VECTOR_TRAP;
1281 37 ultra_embe
                pc_fetch_q  <= 1'b1;
1282 39 ultra_embe
                exc_last_q  <= 1'b1;
1283 44 ultra_embe
 
1284 31 ultra_embe
    `ifdef CONF_CORE_DEBUG
1285 44 ultra_embe
               $display(" Break Event 0x%08x", ISR_VECTOR + `VECTOR_TRAP);
1286 31 ultra_embe
    `endif
1287 44 ultra_embe
           end
1288 31 ultra_embe
           // External interrupt
1289 39 ultra_embe
           else if (intr_i && next_sr_r[`SR_IEE])
1290 31 ultra_embe
           begin
1291
                // Save PC of next instruction & SR
1292
                if (branch_r)
1293 37 ultra_embe
                    epc_q <= branch_target_r;
1294 31 ultra_embe
                // Next expected PC (current PC + 4)
1295
                else
1296 37 ultra_embe
                    epc_q <= next_pc_r;
1297 31 ultra_embe
 
1298 37 ultra_embe
                esr_q       <= next_sr_r;
1299 31 ultra_embe
 
1300 44 ultra_embe
                // Disable further interrupts / break events
1301 37 ultra_embe
                sr_q        <= 32'b0;
1302 31 ultra_embe
 
1303
                // Set PC to external interrupt vector
1304 37 ultra_embe
                pc_branch_q <= ISR_VECTOR + `VECTOR_EXTINT;
1305
                pc_fetch_q  <= 1'b1;
1306 39 ultra_embe
                exc_last_q  <= 1'b1;
1307 31 ultra_embe
 
1308
    `ifdef CONF_CORE_DEBUG
1309
               $display(" External Interrupt 0x%08x", ISR_VECTOR + `VECTOR_EXTINT);
1310
    `endif
1311
           end
1312
           // Branch (l.bf, l.bnf, l.j, l.jal, l.jr, l.jalr, l.rfe)
1313
           else if (branch_r)
1314
           begin
1315
                // Perform branch
1316 37 ultra_embe
                pc_branch_q    <= branch_target_r;
1317
                pc_fetch_q     <= 1'b1;
1318 31 ultra_embe
 
1319
    `ifdef CONF_CORE_DEBUG
1320
               $display(" Branch to 0x%08x", branch_target_r);
1321
    `endif
1322
           end
1323
      end
1324
   end
1325
end
1326
 
1327
//-----------------------------------------------------------------
1328
// Execute: Memory operations
1329
//-----------------------------------------------------------------
1330
always @ (posedge clk_i or posedge rst_i)
1331
begin
1332
   if (rst_i == 1'b1)
1333
   begin
1334
       // Data memory
1335
       dmem_addr_o          <= 32'h00000000;
1336
       dmem_data_out_o      <= 32'h00000000;
1337 32 ultra_embe
       dmem_we_o            <= 1'b0;
1338
       dmem_sel_o           <= 4'b0000;
1339
       dmem_stb_o           <= 1'b0;
1340
       dmem_cyc_o           <= 1'b0;
1341 27 ultra_embe
 
1342 37 ultra_embe
       mem_load_q           <= 1'b0;
1343
       mem_store_q          <= 1'b0;
1344
       mem_access_q         <= 1'b0;
1345 31 ultra_embe
 
1346 37 ultra_embe
       load_rd_q            <= 5'b00000;
1347
       load_inst_q          <= 8'h00;
1348
       load_offset_q        <= 2'b00;
1349 31 ultra_embe
 
1350 37 ultra_embe
       d_mem_load_q         <= 1'b0;
1351 31 ultra_embe
   end
1352
   else
1353
   begin
1354
 
1355
       // If memory access accepted by slave
1356 32 ultra_embe
       if (~dmem_stall_i)
1357
           dmem_stb_o   <= 1'b0;
1358
 
1359
       if (dmem_ack_i)
1360
            dmem_cyc_o  <= 1'b0;
1361 36 ultra_embe
 
1362 37 ultra_embe
       mem_access_q     <= 1'b0;
1363
       d_mem_load_q     <= mem_access_q & mem_load_q;
1364 31 ultra_embe
 
1365
       // Pending accesses
1366 37 ultra_embe
       mem_load_q   <= load_pending_w;
1367
       mem_store_q  <= store_pending_w;
1368 31 ultra_embe
 
1369
       //---------------------------------------------------------------
1370
       // Valid instruction
1371
       //---------------------------------------------------------------
1372 36 ultra_embe
       if (execute_inst_r & ~stall_inst_r)
1373 27 ultra_embe
       begin
1374 31 ultra_embe
           // Branch and link (Rd = LR/R9)
1375
           if (branch_link_r)
1376
           begin
1377
              // Load outstanding, check if result target is being
1378
              // overwritten (to avoid WAR hazard)
1379 37 ultra_embe
              if (load_rd_q == 5'd9)
1380 31 ultra_embe
                  // Ditch load result when it arrives
1381 37 ultra_embe
                  load_rd_q     <= 5'b00000;
1382 31 ultra_embe
           end
1383
           // Instruction with register writeback
1384
           else if (write_rd_r)
1385
           begin
1386
              // Load outstanding, check if result target is being
1387
              // overwritten (to avoid WAR hazard)
1388 37 ultra_embe
              if (reg_rd_i == load_rd_q && ~load_inst_r)
1389 31 ultra_embe
                  // Ditch load result when it arrives
1390 37 ultra_embe
                  load_rd_q     <= 5'b00000;
1391 31 ultra_embe
           end
1392
 
1393
           case (1'b1)
1394
 
1395
             // l.lbs l.lhs l.lws l.lbz l.lhz l.lwz
1396
             load_inst_r:
1397
             begin
1398
                 dmem_addr_o      <= mem_addr_r;
1399
                 dmem_data_out_o  <= 32'h00000000;
1400 32 ultra_embe
                 dmem_sel_o       <= 4'b1111;
1401
                 dmem_we_o        <= 1'b0;
1402
                 dmem_stb_o       <= 1'b1;
1403
                 dmem_cyc_o       <= 1'b1;
1404 31 ultra_embe
 
1405
                 // Mark load as pending
1406 37 ultra_embe
                 mem_load_q      <= 1'b1;
1407
                 mem_access_q    <= 1'b1;
1408 31 ultra_embe
 
1409
                 // Record target register
1410 37 ultra_embe
                 load_rd_q        <= reg_rd_i;
1411
                 load_inst_q      <= inst_r;
1412
                 load_offset_q    <= mem_addr_r[1:0];
1413 31 ultra_embe
 
1414
  `ifdef CONF_CORE_DEBUG
1415
                 $display(" Load from 0x%08x to R%d", mem_addr_r, reg_rd_i);
1416
  `endif
1417
             end
1418
 
1419
             inst_sb_w: // l.sb
1420
             begin
1421
                 dmem_addr_o <= mem_addr_r;
1422 37 ultra_embe
                 mem_access_q <= 1'b1;
1423 31 ultra_embe
                 case (mem_addr_r[1:0])
1424
                     2'b00 :
1425
                     begin
1426
                         dmem_data_out_o  <= {reg_rb_r[7:0],24'h000000};
1427 32 ultra_embe
                         dmem_sel_o       <= 4'b1000;
1428
                         dmem_we_o        <= 1'b1;
1429
                         dmem_stb_o       <= 1'b1;
1430
                         dmem_cyc_o       <= 1'b1;
1431 37 ultra_embe
                         mem_store_q      <= 1'b1;
1432 31 ultra_embe
                     end
1433
                     2'b01 :
1434
                     begin
1435
                         dmem_data_out_o  <= {{8'h00,reg_rb_r[7:0]},16'h0000};
1436 32 ultra_embe
                         dmem_sel_o       <= 4'b0100;
1437
                         dmem_we_o        <= 1'b1;
1438
                         dmem_stb_o       <= 1'b1;
1439
                         dmem_cyc_o       <= 1'b1;
1440 37 ultra_embe
                         mem_store_q      <= 1'b1;
1441 31 ultra_embe
                     end
1442
                     2'b10 :
1443
                     begin
1444
                         dmem_data_out_o  <= {{16'h0000,reg_rb_r[7:0]},8'h00};
1445 32 ultra_embe
                         dmem_sel_o       <= 4'b0010;
1446
                         dmem_we_o        <= 1'b1;
1447
                         dmem_stb_o       <= 1'b1;
1448
                         dmem_cyc_o       <= 1'b1;
1449 37 ultra_embe
                         mem_store_q      <= 1'b1;
1450 31 ultra_embe
                     end
1451
                     2'b11 :
1452
                     begin
1453
                         dmem_data_out_o  <= {24'h000000,reg_rb_r[7:0]};
1454 32 ultra_embe
                         dmem_sel_o       <= 4'b0001;
1455
                         dmem_we_o        <= 1'b1;
1456
                         dmem_stb_o       <= 1'b1;
1457
                         dmem_cyc_o       <= 1'b1;
1458 37 ultra_embe
                         mem_store_q      <= 1'b1;
1459 31 ultra_embe
                     end
1460
                     default :
1461 32 ultra_embe
                        ;
1462 31 ultra_embe
                 endcase
1463
             end
1464
 
1465
            inst_sh_w: // l.sh
1466 27 ultra_embe
            begin
1467 31 ultra_embe
                 dmem_addr_o <= mem_addr_r;
1468 37 ultra_embe
                 mem_access_q <= 1'b1;
1469 31 ultra_embe
                 case (mem_addr_r[1:0])
1470
                     2'b00 :
1471
                     begin
1472
                         dmem_data_out_o  <= {reg_rb_r[15:0],16'h0000};
1473 32 ultra_embe
                         dmem_sel_o       <= 4'b1100;
1474
                         dmem_we_o        <= 1'b1;
1475
                         dmem_stb_o       <= 1'b1;
1476
                         dmem_cyc_o       <= 1'b1;
1477 37 ultra_embe
                         mem_store_q      <= 1'b1;
1478 31 ultra_embe
                     end
1479
                     2'b10 :
1480
                     begin
1481
                         dmem_data_out_o  <= {16'h0000,reg_rb_r[15:0]};
1482 32 ultra_embe
                         dmem_sel_o       <= 4'b0011;
1483
                         dmem_we_o        <= 1'b1;
1484
                         dmem_stb_o       <= 1'b1;
1485
                         dmem_cyc_o       <= 1'b1;
1486 37 ultra_embe
                         mem_store_q      <= 1'b1;
1487 31 ultra_embe
                     end
1488
                     default :
1489 32 ultra_embe
                        ;
1490 31 ultra_embe
                 endcase
1491
            end
1492 27 ultra_embe
 
1493 31 ultra_embe
            inst_sw_w: // l.sw
1494
            begin
1495
                 dmem_addr_o      <= mem_addr_r;
1496
                 dmem_data_out_o  <= reg_rb_r;
1497 32 ultra_embe
                 dmem_sel_o       <= 4'b1111;
1498
                 dmem_we_o        <= 1'b1;
1499
                 dmem_stb_o       <= 1'b1;
1500
                 dmem_cyc_o       <= 1'b1;
1501 37 ultra_embe
                 mem_access_q     <= 1'b1;
1502
                 mem_store_q      <= 1'b1;
1503 31 ultra_embe
 
1504
  `ifdef CONF_CORE_DEBUG
1505
                 $display(" Store R%d to 0x%08x = 0x%08x", reg_rb_i, {mem_addr_r[31:2],2'b00}, reg_rb_r);
1506
  `endif
1507 27 ultra_embe
            end
1508 31 ultra_embe
            default:
1509
                ;
1510
         endcase
1511
       end
1512
   end
1513
end
1514 27 ultra_embe
 
1515 31 ultra_embe
//-----------------------------------------------------------------
1516
// Execute: Misc operations
1517
//-----------------------------------------------------------------
1518
always @ (posedge clk_i or posedge rst_i)
1519
begin
1520
   if (rst_i == 1'b1)
1521
   begin
1522
       icache_flush_o       <= 1'b0;
1523
       dcache_flush_o       <= 1'b0;
1524
   end
1525
   else
1526
   begin
1527
       icache_flush_o       <= 1'b0;
1528 44 ultra_embe
       dcache_flush_o       <= 1'b0;
1529 31 ultra_embe
 
1530
       //---------------------------------------------------------------
1531
       // Valid instruction
1532
       //---------------------------------------------------------------
1533 36 ultra_embe
       if (execute_inst_r & ~stall_inst_r)
1534 31 ultra_embe
       begin
1535
          case (1'b1)
1536
          inst_mtspr_w: // l.mtspr
1537
          begin
1538
               case (mxspr_uint16_r)
1539
                   // SR - Supervision register
1540
                   `SPR_REG_SR:
1541
                   begin
1542
                       // Cache flush request?
1543 39 ultra_embe
                       icache_flush_o <= reg_rb_r[`SR_ICACHE_FLUSH];
1544
                       dcache_flush_o <= reg_rb_r[`SR_DCACHE_FLUSH];
1545 31 ultra_embe
                   end
1546
               endcase
1547
          end
1548
          default:
1549
              ;
1550
         endcase
1551 27 ultra_embe
       end
1552
   end
1553
end
1554
 
1555 31 ultra_embe
//-----------------------------------------------------------------
1556
// Execute: NOP (simulation) operations
1557
//-----------------------------------------------------------------
1558
`ifdef SIMULATION
1559
    always @ (posedge clk_i or posedge rst_i)
1560
    begin
1561
       if (rst_i == 1'b1)
1562
       begin
1563
    `ifdef SIM_EXT_PUTC
1564 37 ultra_embe
          putc_q                <= 8'b0;
1565 31 ultra_embe
    `endif
1566
       end
1567
       else
1568
       begin
1569
    `ifdef SIM_EXT_PUTC
1570 37 ultra_embe
          putc_q                <= 8'b0;
1571 31 ultra_embe
    `endif
1572
           //---------------------------------------------------------------
1573
           // Valid instruction
1574
           //---------------------------------------------------------------
1575 36 ultra_embe
           if (execute_inst_r & ~stall_inst_r)
1576 31 ultra_embe
           begin
1577
 
1578
               case (1'b1)
1579
               inst_nop_w: // l.nop
1580
                begin
1581
                    case (uint16_r)
1582
                    // NOP_PUTC
1583
                    16'h0004:
1584
                    begin
1585
      `ifdef SIM_EXT_PUTC
1586 37 ultra_embe
                      putc_q  <= reg_ra_r[7:0];
1587 31 ultra_embe
      `else
1588
                      $write("%c", reg_ra_r[7:0]);
1589
      `endif
1590
                    end
1591
                    // NOP
1592
                    16'h0000: ;
1593
                    endcase
1594
                end
1595
                default:
1596
                    ;
1597
             endcase
1598
           end
1599
       end
1600
    end
1601
`endif
1602
 
1603 27 ultra_embe
//-------------------------------------------------------------------
1604
// Assignments
1605
//-------------------------------------------------------------------
1606
 
1607 37 ultra_embe
assign branch_pc_o          = pc_branch_q;
1608
assign branch_o             = pc_fetch_q;
1609 36 ultra_embe
assign stall_o              = stall_inst_r;
1610 27 ultra_embe
 
1611 37 ultra_embe
assign opcode_o             = ex_opcode_q;
1612
assign opcode_pc_o          = ex_opcode_pc_q;
1613 27 ultra_embe
 
1614 37 ultra_embe
assign reg_rd_o             = ex_rd_q;
1615
assign reg_rd_value_o       = ex_result_w;
1616 27 ultra_embe
 
1617 40 ultra_embe
assign mult_res_o           = 64'b0;
1618 27 ultra_embe
 
1619
//-------------------------------------------------------------------
1620
// Hooks for debug
1621
//-------------------------------------------------------------------
1622
`ifdef verilator
1623
   function [31:0] get_opcode_ex;
1624
      // verilator public
1625 37 ultra_embe
      get_opcode_ex = ex_opcode_q;
1626 27 ultra_embe
   endfunction
1627
   function [31:0] get_pc_ex;
1628
      // verilator public
1629 37 ultra_embe
      get_pc_ex = ex_opcode_pc_q;
1630 27 ultra_embe
   endfunction
1631 31 ultra_embe
   function [7:0] get_putc;
1632
      // verilator public
1633
   `ifdef SIM_EXT_PUTC
1634 37 ultra_embe
      get_putc = putc_q;
1635 31 ultra_embe
   `else
1636
      get_putc = 8'b0;
1637
   `endif
1638
   endfunction
1639 32 ultra_embe
   function [0:0] get_reg_valid;
1640
      // verilator public
1641 37 ultra_embe
      get_reg_valid = ~(resolve_failed_w | load_stall_w | ~opcode_valid_i);
1642 32 ultra_embe
   endfunction
1643
   function [4:0] get_reg_ra;
1644
      // verilator public
1645
      get_reg_ra = reg_ra_i;
1646
   endfunction
1647
   function [31:0] get_reg_ra_value;
1648
      // verilator public
1649 37 ultra_embe
      get_reg_ra_value = ra_resolved_w;
1650 32 ultra_embe
   endfunction
1651
   function [4:0] get_reg_rb;
1652
      // verilator public
1653
      get_reg_rb = reg_rb_i;
1654
   endfunction
1655
   function [31:0] get_reg_rb_value;
1656
      // verilator public
1657 37 ultra_embe
      get_reg_rb_value = rb_resolved_w;
1658 32 ultra_embe
   endfunction
1659 27 ultra_embe
`endif
1660
 
1661
endmodule

powered by: WebSVN 2.1.0

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