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

Subversion Repositories altor32

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

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

powered by: WebSVN 2.1.0

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