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

Subversion Repositories altor32

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

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

powered by: WebSVN 2.1.0

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