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

Subversion Repositories altor32

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

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 31 ultra_embe
// SIM PUTC
202
`ifdef SIM_EXT_PUTC
203 37 ultra_embe
    reg [7:0] putc_q;
204 31 ultra_embe
`endif
205
 
206 27 ultra_embe
//-----------------------------------------------------------------
207 37 ultra_embe
// ALU
208 27 ultra_embe
//-----------------------------------------------------------------
209
altor32_alu alu
210
(
211
    // ALU operation select
212 37 ultra_embe
    .op_i(ex_alu_func_q),
213 27 ultra_embe
 
214
    // Operands
215 37 ultra_embe
    .a_i(ex_alu_a_q),
216
    .b_i(ex_alu_b_q),
217
    .c_i(sr_q[`OR32_SR_CY]),
218 27 ultra_embe
 
219
    // Result
220 37 ultra_embe
    .p_o(ex_result_w),
221 27 ultra_embe
 
222
    // Carry
223 37 ultra_embe
    .c_o(alu_carry_out_w),
224
    .c_update_o(alu_carry_update_w),
225 36 ultra_embe
 
226
    // Comparisons
227
    .equal_o(compare_equal_w),
228
    .greater_than_signed_o(compare_gts_w),
229
    .greater_than_o(compare_gt_w),
230
    .less_than_signed_o(compare_lts_w),
231
    .less_than_o(compare_lt_w),
232 37 ultra_embe
    .flag_update_o(alu_flag_update_w)
233 27 ultra_embe
);
234
 
235 37 ultra_embe
//-----------------------------------------------------------------
236 27 ultra_embe
// Load result forwarding
237 37 ultra_embe
//-----------------------------------------------------------------
238 27 ultra_embe
altor32_lfu
239
u_lfu
240
(
241
    // Opcode
242 37 ultra_embe
    .opcode_i(load_inst_q),
243 27 ultra_embe
 
244
    // Memory load result
245
    .mem_result_i(dmem_data_in_i),
246 37 ultra_embe
    .mem_offset_i(load_offset_q),
247 27 ultra_embe
 
248
    // Result
249 37 ultra_embe
    .load_result_o(load_result_w),
250
    .load_insn_o(load_inst_w)
251 27 ultra_embe
);
252
 
253 37 ultra_embe
//-----------------------------------------------------------------
254 27 ultra_embe
// Load / store pending logic
255 37 ultra_embe
//-----------------------------------------------------------------
256 27 ultra_embe
altor32_lsu
257
u_lsu
258
(
259
    // Current instruction
260 37 ultra_embe
    .opcode_valid_i(opcode_valid_i & ~pc_fetch_q),
261 27 ultra_embe
    .opcode_i({2'b00,opcode_i[31:26]}),
262
 
263
    // Load / Store pending
264 37 ultra_embe
    .load_pending_i(mem_load_q),
265
    .store_pending_i(mem_store_q),
266 27 ultra_embe
 
267
    // Load dest register
268 37 ultra_embe
    .rd_load_i(load_rd_q),
269 27 ultra_embe
 
270
    // Load insn in WB stage
271 37 ultra_embe
    .load_wb_i(d_mem_load_q),
272 27 ultra_embe
 
273
    // Memory status
274 37 ultra_embe
    .mem_access_i(mem_access_q),
275 27 ultra_embe
    .mem_ack_i(dmem_ack_i),
276
 
277
    // Load / store still pending
278 37 ultra_embe
    .load_pending_o(load_pending_w),
279
    .store_pending_o(store_pending_w),
280 27 ultra_embe
 
281
    // Insert load result into pipeline
282 37 ultra_embe
    .write_result_o(load_insert_w),
283 27 ultra_embe
 
284
    // Stall pipeline due
285 37 ultra_embe
    .stall_o(load_stall_w)
286 27 ultra_embe
);
287
 
288 37 ultra_embe
//-----------------------------------------------------------------
289 27 ultra_embe
// Operand forwarding
290 37 ultra_embe
//-----------------------------------------------------------------
291 27 ultra_embe
altor32_dfu
292
u_dfu
293
(
294
    // Input registers
295
    .ra_i(reg_ra_i),
296
    .rb_i(reg_rb_i),
297
 
298
    // Input register contents
299
    .ra_regval_i(reg_ra_value_i),
300
    .rb_regval_i(reg_rb_value_i),
301
 
302
    // Dest register (EXEC stage)
303 37 ultra_embe
    .rd_ex_i(ex_rd_q),
304 27 ultra_embe
 
305
    // Dest register (WB stage)
306
    .rd_wb_i(wb_rd_i),
307
 
308
    // Load pending / target
309 37 ultra_embe
    .load_pending_i(load_pending_w),
310
    .rd_load_i(load_rd_q),
311 27 ultra_embe
 
312
    // Multiplier status
313
    .mult_lo_ex_i(1'b0),
314
    .mult_hi_ex_i(1'b0),
315
    .mult_lo_wb_i(1'b0),
316
    .mult_hi_wb_i(1'b0),
317
 
318
    // Multiplier result
319
    .result_mult_i(64'b0),
320
 
321
    // Result (EXEC)
322 37 ultra_embe
    .result_ex_i(ex_result_w),
323 27 ultra_embe
 
324
    // Result (WB)
325
    .result_wb_i(wb_rd_value_i),
326
 
327
    // Resolved register values
328 37 ultra_embe
    .result_ra_o(ra_resolved_w),
329
    .result_rb_o(rb_resolved_w),
330 27 ultra_embe
 
331 36 ultra_embe
    // Operands required forwarding
332 37 ultra_embe
    .resolved_o(operand_resolved_w),
333 36 ultra_embe
 
334 27 ultra_embe
    // Stall due to failed resolve
335 37 ultra_embe
    .stall_o(resolve_failed_w)
336 27 ultra_embe
);
337
 
338 31 ultra_embe
//-----------------------------------------------------------------
339
// Opcode decode
340
//-----------------------------------------------------------------
341
reg [7:0]  inst_r;
342
reg [7:0]  alu_op_r;
343
reg [1:0]  shift_op_r;
344
reg [15:0] sfxx_op_r;
345
reg [15:0] uint16_r;
346
reg [31:0] uint32_r;
347
reg [31:0] int32_r;
348
reg [31:0] store_int32_r;
349
reg [15:0] mxspr_uint16_r;
350
reg [31:0] target_int26_r;
351
reg [31:0] reg_ra_r;
352
reg [31:0] reg_rb_r;
353
reg [31:0] shift_rb_r;
354
reg [31:0] shift_imm_r;
355 27 ultra_embe
 
356 31 ultra_embe
always @ *
357 27 ultra_embe
begin
358 31 ultra_embe
    // Instruction
359
    inst_r               = {2'b00,opcode_i[31:26]};
360 27 ultra_embe
 
361 31 ultra_embe
    // Sub instructions
362
    alu_op_r             = {opcode_i[9:6],opcode_i[3:0]};
363 36 ultra_embe
    sfxx_op_r            = {5'b00,opcode_i[31:21]} & `INST_OR32_SFMASK;
364 31 ultra_embe
    shift_op_r           = opcode_i[7:6];
365 27 ultra_embe
 
366 31 ultra_embe
    // Branch target
367
    target_int26_r       = sign_extend_imm26(opcode_i[25:0]);
368 27 ultra_embe
 
369 31 ultra_embe
    // Store immediate
370
    store_int32_r        = sign_extend_imm16({opcode_i[25:21],opcode_i[10:0]});
371 27 ultra_embe
 
372 31 ultra_embe
    // Signed & unsigned imm -> 32-bits
373
    uint16_r             = opcode_i[15:0];
374
    int32_r              = sign_extend_imm16(opcode_i[15:0]);
375
    uint32_r             = extend_imm16(opcode_i[15:0]);
376 27 ultra_embe
 
377 31 ultra_embe
    // Register values [ra/rb]
378 37 ultra_embe
    reg_ra_r             = ra_resolved_w;
379
    reg_rb_r             = rb_resolved_w;
380 27 ultra_embe
 
381 31 ultra_embe
    // Shift ammount (from register[rb])
382 37 ultra_embe
    shift_rb_r           = {26'b00,rb_resolved_w[5:0]};
383 27 ultra_embe
 
384 31 ultra_embe
    // Shift ammount (from immediate)
385
    shift_imm_r          = {26'b00,opcode_i[5:0]};
386 27 ultra_embe
 
387 31 ultra_embe
    // MTSPR/MFSPR operand
388 36 ultra_embe
    // NOTE: Use unresolved register value and stall pipeline if required.
389
    // This is to improve timing.
390
    mxspr_uint16_r       = (reg_ra_value_i[15:0] | {5'b00000,opcode_i[10:0]});
391 31 ultra_embe
end
392 27 ultra_embe
 
393 31 ultra_embe
//-----------------------------------------------------------------
394
// Instruction Decode
395
//-----------------------------------------------------------------
396
wire inst_add_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_ADD);  // l.add
397
wire inst_addc_w    = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_ADDC); // l.addc
398
wire inst_and_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_AND);  // l.and
399
wire inst_or_w      = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_OR);   // l.or
400
wire inst_sll_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_SLL);  // l.sll
401
wire inst_sra_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_SRA);  // l.sra
402
wire inst_srl_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_SRL);  // l.srl
403
wire inst_sub_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_SUB);  // l.sub
404
wire inst_xor_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_XOR);  // l.xor
405 36 ultra_embe
wire inst_mul_w     = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_MUL);  // l.mul
406
wire inst_mulu_w    = (inst_r == `INST_OR32_ALU) & (alu_op_r == `INST_OR32_MULU); // l.mulu
407 27 ultra_embe
 
408 31 ultra_embe
wire inst_addi_w    = (inst_r == `INST_OR32_ADDI);  // l.addi
409
wire inst_andi_w    = (inst_r == `INST_OR32_ANDI);  // l.andi
410
wire inst_bf_w      = (inst_r == `INST_OR32_BF);    // l.bf
411
wire inst_bnf_w     = (inst_r == `INST_OR32_BNF);   // l.bnf
412
wire inst_j_w       = (inst_r == `INST_OR32_J);     // l.j
413
wire inst_jal_w     = (inst_r == `INST_OR32_JAL);   // l.jal
414
wire inst_jalr_w    = (inst_r == `INST_OR32_JALR);  // l.jalr
415
wire inst_jr_w      = (inst_r == `INST_OR32_JR);    // l.jr
416
wire inst_lbs_w     = (inst_r == `INST_OR32_LBS);   // l.lbs
417
wire inst_lhs_w     = (inst_r == `INST_OR32_LHS);   // l.lhs
418
wire inst_lws_w     = (inst_r == `INST_OR32_LWS);   // l.lws
419
wire inst_lbz_w     = (inst_r == `INST_OR32_LBZ);   // l.lbz
420
wire inst_lhz_w     = (inst_r == `INST_OR32_LHZ);   // l.lhz
421
wire inst_lwz_w     = (inst_r == `INST_OR32_LWZ);   // l.lwz
422
wire inst_mfspr_w   = (inst_r == `INST_OR32_MFSPR); // l.mfspr
423
wire inst_mtspr_w   = (inst_r == `INST_OR32_MTSPR); // l.mtspr
424
wire inst_movhi_w   = (inst_r == `INST_OR32_MOVHI); // l.movhi
425
wire inst_nop_w     = (inst_r == `INST_OR32_NOP);   // l.nop
426
wire inst_ori_w     = (inst_r == `INST_OR32_ORI);   // l.ori
427
wire inst_rfe_w     = (inst_r == `INST_OR32_RFE);   // l.rfe
428 27 ultra_embe
 
429 31 ultra_embe
wire inst_sb_w      = (inst_r == `INST_OR32_SB);    // l.sb
430
wire inst_sh_w      = (inst_r == `INST_OR32_SH);    // l.sh
431
wire inst_sw_w      = (inst_r == `INST_OR32_SW);    // l.sw
432 27 ultra_embe
 
433 31 ultra_embe
wire inst_slli_w    = (inst_r == `INST_OR32_SHIFTI) & (shift_op_r == `INST_OR32_SLLI);  // l.slli
434
wire inst_srai_w    = (inst_r == `INST_OR32_SHIFTI) & (shift_op_r == `INST_OR32_SRAI);  // l.srai
435
wire inst_srli_w    = (inst_r == `INST_OR32_SHIFTI) & (shift_op_r == `INST_OR32_SRLI);  // l.srli
436 27 ultra_embe
 
437 31 ultra_embe
wire inst_xori_w    = (inst_r == `INST_OR32_XORI);   // l.xori
438 27 ultra_embe
 
439 31 ultra_embe
wire inst_sfxx_w    = (inst_r == `INST_OR32_SFXX);
440
wire inst_sfxxi_w   = (inst_r == `INST_OR32_SFXXI);
441 27 ultra_embe
 
442 36 ultra_embe
wire inst_sfeq_w    = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFEQ);   // l.sfeq
443
wire inst_sfges_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFGES);  // l.sfges
444 27 ultra_embe
 
445 36 ultra_embe
wire inst_sfgeu_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFGEU);  // l.sfgeu
446
wire inst_sfgts_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFGTS);  // l.sfgts
447
wire inst_sfgtu_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFGTU);  // l.sfgtu
448
wire inst_sfles_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFLES);  // l.sfles
449
wire inst_sfleu_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFLEU);  // l.sfleu
450
wire inst_sflts_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFLTS);  // l.sflts
451
wire inst_sfltu_w   = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFLTU);  // l.sfltu
452
wire inst_sfne_w    = (inst_sfxx_w || inst_sfxxi_w) & (sfxx_op_r == `INST_OR32_SFNE);   // l.sfne
453 27 ultra_embe
 
454 31 ultra_embe
wire inst_sys_w     = (inst_r == `INST_OR32_MISC) & (opcode_i[31:24] == `INST_OR32_SYS);  // l.sys
455
wire inst_trap_w    = (inst_r == `INST_OR32_MISC) & (opcode_i[31:24] == `INST_OR32_TRAP); // l.trap
456 27 ultra_embe
 
457 31 ultra_embe
//-----------------------------------------------------------------
458
// Stall / Execute
459
//-----------------------------------------------------------------
460
reg execute_inst_r;
461
reg stall_inst_r;
462 27 ultra_embe
 
463 31 ultra_embe
always @ *
464
begin
465
    execute_inst_r  = 1'b1;
466
    stall_inst_r    = 1'b0;
467 27 ultra_embe
 
468 31 ultra_embe
    // No opcode ready or branch delay slot
469 37 ultra_embe
    if (~opcode_valid_i | pc_fetch_q)
470 31 ultra_embe
        execute_inst_r  = 1'b0;
471
    // Valid instruction, but load result / operand not ready
472 37 ultra_embe
    else if (resolve_failed_w | load_stall_w |
473
            (operand_resolved_w & (inst_mfspr_w | inst_mtspr_w)))
474 31 ultra_embe
        stall_inst_r    = 1'b1;
475
end
476 27 ultra_embe
 
477 31 ultra_embe
//-----------------------------------------------------------------
478
// Next PC
479
//-----------------------------------------------------------------
480
reg [31:0]  next_pc_r;
481 27 ultra_embe
 
482 31 ultra_embe
always @ *
483
begin
484
    // Next expected PC (current PC + 4)
485
    next_pc_r  = (opcode_pc_i + 4);
486
end
487 27 ultra_embe
 
488 31 ultra_embe
//-----------------------------------------------------------------
489
// Next SR
490
//-----------------------------------------------------------------
491
reg [31:0]  next_sr_r;
492
reg         compare_result_r;
493
always @ *
494
begin
495 37 ultra_embe
    next_sr_r = sr_q;
496 27 ultra_embe
 
497 36 ultra_embe
    // Update SR.F
498 37 ultra_embe
    if (alu_flag_update_w)
499 36 ultra_embe
        next_sr_r[`OR32_SR_F] = compare_result_r;
500
 
501 31 ultra_embe
    // Latch carry if updated
502 37 ultra_embe
    if (alu_carry_update_w)
503
        next_sr_r[`OR32_SR_CY] = alu_carry_out_w;
504 27 ultra_embe
 
505 31 ultra_embe
    // If valid instruction, check if SR needs updating
506
    if (execute_inst_r & ~stall_inst_r)
507
    begin
508
      case (1'b1)
509
      inst_mtspr_w:
510
      begin
511
          case (mxspr_uint16_r)
512
          // SR - Supervision register
513
          `SPR_REG_SR:
514
          begin
515
              next_sr_r = reg_rb_r;
516 27 ultra_embe
 
517 31 ultra_embe
              // Don't store cache flush requests
518
              next_sr_r[`OR32_SR_ICACHE_FLUSH] = 1'b0;
519
              next_sr_r[`OR32_SR_DCACHE_FLUSH] = 1'b0;
520
          end
521
          default:
522
            ;
523
          endcase
524
      end
525
      inst_rfe_w:
526 37 ultra_embe
          next_sr_r = esr_q;
527 31 ultra_embe
      default:
528
        ;
529
      endcase
530
    end
531
end
532 27 ultra_embe
 
533 31 ultra_embe
//-----------------------------------------------------------------
534
// Next EPC/ESR
535
//-----------------------------------------------------------------
536
reg [31:0]  next_epc_r;
537
reg [31:0]  next_esr_r;
538 27 ultra_embe
 
539 31 ultra_embe
always @ *
540
begin
541 37 ultra_embe
    next_epc_r = epc_q;
542
    next_esr_r = esr_q;
543 31 ultra_embe
 
544
    case (1'b1)
545
    inst_mtspr_w: // l.mtspr
546
    begin
547
       case (mxspr_uint16_r)
548
           // EPCR - EPC Exception saved PC
549
           `SPR_REG_EPCR:   next_epc_r = reg_rb_r;
550 27 ultra_embe
 
551 31 ultra_embe
           // ESR - Exception saved SR
552
           `SPR_REG_ESR:    next_esr_r = reg_rb_r;
553
       endcase
554
    end
555
    default:
556
      ;
557
    endcase
558
end
559 27 ultra_embe
 
560 31 ultra_embe
//-----------------------------------------------------------------
561
// ALU inputs
562
//-----------------------------------------------------------------
563 27 ultra_embe
 
564 31 ultra_embe
// ALU operation selection
565
reg [3:0]  alu_func_r;
566 27 ultra_embe
 
567 31 ultra_embe
// ALU operands
568
reg [31:0] alu_input_a_r;
569
reg [31:0] alu_input_b_r;
570
reg        write_rd_r;
571 27 ultra_embe
 
572 31 ultra_embe
always @ *
573
begin
574
   alu_func_r     = `ALU_NONE;
575
   alu_input_a_r  = 32'b0;
576
   alu_input_b_r  = 32'b0;
577
   write_rd_r     = 1'b0;
578 27 ultra_embe
 
579 31 ultra_embe
   case (1'b1)
580 27 ultra_embe
 
581 31 ultra_embe
     inst_add_w: // l.add
582
     begin
583
       alu_func_r     = `ALU_ADD;
584
       alu_input_a_r  = reg_ra_r;
585
       alu_input_b_r  = reg_rb_r;
586
       write_rd_r     = 1'b1;
587
     end
588
 
589
     inst_addc_w: // l.addc
590
     begin
591
         alu_func_r     = `ALU_ADDC;
592
         alu_input_a_r  = reg_ra_r;
593
         alu_input_b_r  = reg_rb_r;
594
         write_rd_r     = 1'b1;
595
     end
596 27 ultra_embe
 
597 31 ultra_embe
     inst_and_w: // l.and
598
     begin
599
         alu_func_r     = `ALU_AND;
600
         alu_input_a_r  = reg_ra_r;
601
         alu_input_b_r  = reg_rb_r;
602
         write_rd_r     = 1'b1;
603
     end
604 27 ultra_embe
 
605 31 ultra_embe
     inst_or_w: // l.or
606
     begin
607
         alu_func_r     = `ALU_OR;
608
         alu_input_a_r  = reg_ra_r;
609
         alu_input_b_r  = reg_rb_r;
610
         write_rd_r     = 1'b1;
611
     end
612 27 ultra_embe
 
613 31 ultra_embe
     inst_sll_w: // l.sll
614
     begin
615
         alu_func_r     = `ALU_SHIFTL;
616
         alu_input_a_r  = reg_ra_r;
617
         alu_input_b_r  = shift_rb_r;
618
         write_rd_r     = 1'b1;
619
     end
620 27 ultra_embe
 
621 31 ultra_embe
     inst_sra_w: // l.sra
622
     begin
623
         alu_func_r     = `ALU_SHIRTR_ARITH;
624
         alu_input_a_r  = reg_ra_r;
625
         alu_input_b_r  = shift_rb_r;
626
         write_rd_r     = 1'b1;
627
     end
628 27 ultra_embe
 
629 31 ultra_embe
     inst_srl_w: // l.srl
630
     begin
631
         alu_func_r     = `ALU_SHIFTR;
632
         alu_input_a_r  = reg_ra_r;
633
         alu_input_b_r  = shift_rb_r;
634
         write_rd_r     = 1'b1;
635
     end
636 27 ultra_embe
 
637 31 ultra_embe
     inst_sub_w: // l.sub
638
     begin
639
         alu_func_r     = `ALU_SUB;
640
         alu_input_a_r  = reg_ra_r;
641
         alu_input_b_r  = reg_rb_r;
642
         write_rd_r     = 1'b1;
643
     end
644
 
645
     inst_xor_w: // l.xor
646
     begin
647
         alu_func_r     = `ALU_XOR;
648
         alu_input_a_r  = reg_ra_r;
649
         alu_input_b_r  = reg_rb_r;
650
         write_rd_r     = 1'b1;
651 36 ultra_embe
     end
652 31 ultra_embe
 
653 36 ultra_embe
     inst_mul_w,   // l.mul
654
     inst_mulu_w:  // l.mulu
655
     begin
656
         write_rd_r     = 1'b1;
657
     end
658
 
659 31 ultra_embe
     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 36 ultra_embe
        branch_r      = next_sr_r[`OR32_SR_F];
962 27 ultra_embe
 
963 31 ultra_embe
    inst_bnf_w: // l.bnf
964 36 ultra_embe
        branch_r      = ~next_sr_r[`OR32_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 27 ultra_embe
 
1181 31 ultra_embe
       // Status registers
1182 37 ultra_embe
       epc_q                <= 32'h00000000;
1183
       sr_q                 <= 32'h00000000;
1184
       esr_q                <= 32'h00000000;
1185 27 ultra_embe
 
1186 31 ultra_embe
       fault_o              <= 1'b0;
1187 27 ultra_embe
 
1188 37 ultra_embe
       nmi_q                <= 1'b0;
1189 31 ultra_embe
   end
1190
   else
1191
   begin
1192
      // Record NMI in-case it can't be processed this cycle
1193
      if (nmi_i)
1194 37 ultra_embe
          nmi_q             <= 1'b1;
1195 27 ultra_embe
 
1196 31 ultra_embe
       // Reset branch request
1197 37 ultra_embe
       pc_fetch_q           <= 1'b0;
1198 27 ultra_embe
 
1199 31 ultra_embe
       // Update SR
1200 37 ultra_embe
       sr_q                 <= next_sr_r;
1201 31 ultra_embe
 
1202
       // Instruction ready
1203
       if (execute_inst_r & ~stall_inst_r)
1204 27 ultra_embe
       begin
1205 31 ultra_embe
           // Exception: Instruction opcode not valid / supported, invalid PC
1206
           if (invalid_inst_r || (opcode_pc_i[1:0] != 2'b00))
1207
           begin
1208
                // Save PC of next instruction
1209 37 ultra_embe
                epc_q       <= next_pc_r;
1210
                esr_q       <= next_sr_r;
1211 27 ultra_embe
 
1212 31 ultra_embe
                // Disable further interrupts
1213 37 ultra_embe
                sr_q        <= 32'b0;
1214 27 ultra_embe
 
1215 31 ultra_embe
                // Set PC to exception vector
1216
                if (invalid_inst_r)
1217 37 ultra_embe
                    pc_branch_q <= ISR_VECTOR + `VECTOR_ILLEGAL_INST;
1218 31 ultra_embe
                else
1219 37 ultra_embe
                    pc_branch_q <= ISR_VECTOR + `VECTOR_BUS_ERROR;
1220
                pc_fetch_q  <= 1'b1;
1221 27 ultra_embe
 
1222 31 ultra_embe
                fault_o     <= 1'b1;
1223
           end
1224
           // Exception: Syscall / Break
1225
           else if (branch_except_r)
1226
           begin
1227
                // Save PC of next instruction
1228 37 ultra_embe
                epc_q       <= next_pc_r;
1229
                esr_q       <= next_sr_r;
1230 31 ultra_embe
 
1231
                // Disable further interrupts
1232 37 ultra_embe
                sr_q        <= 32'b0;
1233 31 ultra_embe
 
1234
                // Set PC to exception vector
1235 37 ultra_embe
                pc_branch_q <= branch_target_r;
1236
                pc_fetch_q  <= 1'b1;
1237 31 ultra_embe
 
1238
    `ifdef CONF_CORE_DEBUG
1239
               $display(" Exception 0x%08x", branch_target_r);
1240
    `endif
1241
           end
1242
           // Non-maskable interrupt
1243 37 ultra_embe
           else if (nmi_i | nmi_q)
1244 31 ultra_embe
           begin
1245 37 ultra_embe
                nmi_q       <= 1'b0;
1246 31 ultra_embe
 
1247
                // Save PC of next instruction
1248
                if (branch_r)
1249 37 ultra_embe
                    epc_q <= branch_target_r;
1250 31 ultra_embe
                // Next expected PC (current PC + 4)
1251
                else
1252 37 ultra_embe
                    epc_q <= next_pc_r;
1253 31 ultra_embe
 
1254 37 ultra_embe
                esr_q       <= next_sr_r;
1255 31 ultra_embe
 
1256
                // Disable further interrupts
1257 37 ultra_embe
                sr_q        <= 32'b0;
1258 31 ultra_embe
 
1259
                // Set PC to exception vector
1260 37 ultra_embe
                pc_branch_q <= ISR_VECTOR + `VECTOR_NMI;
1261
                pc_fetch_q  <= 1'b1;
1262 31 ultra_embe
 
1263
    `ifdef CONF_CORE_DEBUG
1264
               $display(" NMI 0x%08x", ISR_VECTOR + `VECTOR_NMI);
1265
    `endif
1266
           end
1267
           // External interrupt
1268
           else if (intr_i && next_sr_r[`OR32_SR_IEE])
1269
           begin
1270
                // Save PC of next instruction & SR
1271
                if (branch_r)
1272 37 ultra_embe
                    epc_q <= branch_target_r;
1273 31 ultra_embe
                // Next expected PC (current PC + 4)
1274
                else
1275 37 ultra_embe
                    epc_q <= next_pc_r;
1276 31 ultra_embe
 
1277 37 ultra_embe
                esr_q       <= next_sr_r;
1278 31 ultra_embe
 
1279
                // Disable further interrupts
1280 37 ultra_embe
                sr_q        <= 32'b0;
1281 31 ultra_embe
 
1282
                // Set PC to external interrupt vector
1283 37 ultra_embe
                pc_branch_q <= ISR_VECTOR + `VECTOR_EXTINT;
1284
                pc_fetch_q  <= 1'b1;
1285 31 ultra_embe
 
1286
    `ifdef CONF_CORE_DEBUG
1287
               $display(" External Interrupt 0x%08x", ISR_VECTOR + `VECTOR_EXTINT);
1288
    `endif
1289
           end
1290
           // Branch (l.bf, l.bnf, l.j, l.jal, l.jr, l.jalr, l.rfe)
1291
           else if (branch_r)
1292
           begin
1293
                // Perform branch
1294 37 ultra_embe
                pc_branch_q    <= branch_target_r;
1295
                pc_fetch_q     <= 1'b1;
1296 31 ultra_embe
 
1297
    `ifdef CONF_CORE_DEBUG
1298
               $display(" Branch to 0x%08x", branch_target_r);
1299
    `endif
1300
           end
1301
           // Non branch
1302
           else
1303
           begin
1304
                // Update EPC / ESR which may have been updated
1305
                // by an MTSPR write
1306 37 ultra_embe
                epc_q          <= next_epc_r;
1307
                esr_q          <= next_esr_r;
1308 31 ultra_embe
           end
1309
      end
1310
   end
1311
end
1312
 
1313
//-----------------------------------------------------------------
1314
// Execute: Memory operations
1315
//-----------------------------------------------------------------
1316
always @ (posedge clk_i or posedge rst_i)
1317
begin
1318
   if (rst_i == 1'b1)
1319
   begin
1320
       // Data memory
1321
       dmem_addr_o          <= 32'h00000000;
1322
       dmem_data_out_o      <= 32'h00000000;
1323 32 ultra_embe
       dmem_we_o            <= 1'b0;
1324
       dmem_sel_o           <= 4'b0000;
1325
       dmem_stb_o           <= 1'b0;
1326
       dmem_cyc_o           <= 1'b0;
1327 27 ultra_embe
 
1328 37 ultra_embe
       mem_load_q           <= 1'b0;
1329
       mem_store_q          <= 1'b0;
1330
       mem_access_q         <= 1'b0;
1331 31 ultra_embe
 
1332 37 ultra_embe
       load_rd_q            <= 5'b00000;
1333
       load_inst_q          <= 8'h00;
1334
       load_offset_q        <= 2'b00;
1335 31 ultra_embe
 
1336 37 ultra_embe
       d_mem_load_q         <= 1'b0;
1337 31 ultra_embe
   end
1338
   else
1339
   begin
1340
 
1341
       // If memory access accepted by slave
1342 32 ultra_embe
       if (~dmem_stall_i)
1343
           dmem_stb_o   <= 1'b0;
1344
 
1345
       if (dmem_ack_i)
1346
            dmem_cyc_o  <= 1'b0;
1347 36 ultra_embe
 
1348 37 ultra_embe
       mem_access_q     <= 1'b0;
1349
       d_mem_load_q     <= mem_access_q & mem_load_q;
1350 31 ultra_embe
 
1351
       // Pending accesses
1352 37 ultra_embe
       mem_load_q   <= load_pending_w;
1353
       mem_store_q  <= store_pending_w;
1354 31 ultra_embe
 
1355
       //---------------------------------------------------------------
1356
       // Valid instruction
1357
       //---------------------------------------------------------------
1358 36 ultra_embe
       if (execute_inst_r & ~stall_inst_r)
1359 27 ultra_embe
       begin
1360 31 ultra_embe
           // Branch and link (Rd = LR/R9)
1361
           if (branch_link_r)
1362
           begin
1363
              // Load outstanding, check if result target is being
1364
              // overwritten (to avoid WAR hazard)
1365 37 ultra_embe
              if (load_rd_q == 5'd9)
1366 31 ultra_embe
                  // Ditch load result when it arrives
1367 37 ultra_embe
                  load_rd_q     <= 5'b00000;
1368 31 ultra_embe
           end
1369
           // Instruction with register writeback
1370
           else if (write_rd_r)
1371
           begin
1372
              // Load outstanding, check if result target is being
1373
              // overwritten (to avoid WAR hazard)
1374 37 ultra_embe
              if (reg_rd_i == load_rd_q && ~load_inst_r)
1375 31 ultra_embe
                  // Ditch load result when it arrives
1376 37 ultra_embe
                  load_rd_q     <= 5'b00000;
1377 31 ultra_embe
           end
1378
 
1379
           case (1'b1)
1380
 
1381
             // l.lbs l.lhs l.lws l.lbz l.lhz l.lwz
1382
             load_inst_r:
1383
             begin
1384
                 dmem_addr_o      <= mem_addr_r;
1385
                 dmem_data_out_o  <= 32'h00000000;
1386 32 ultra_embe
                 dmem_sel_o       <= 4'b1111;
1387
                 dmem_we_o        <= 1'b0;
1388
                 dmem_stb_o       <= 1'b1;
1389
                 dmem_cyc_o       <= 1'b1;
1390 31 ultra_embe
 
1391
                 // Mark load as pending
1392 37 ultra_embe
                 mem_load_q      <= 1'b1;
1393
                 mem_access_q    <= 1'b1;
1394 31 ultra_embe
 
1395
                 // Record target register
1396 37 ultra_embe
                 load_rd_q        <= reg_rd_i;
1397
                 load_inst_q      <= inst_r;
1398
                 load_offset_q    <= mem_addr_r[1:0];
1399 31 ultra_embe
 
1400
  `ifdef CONF_CORE_DEBUG
1401
                 $display(" Load from 0x%08x to R%d", mem_addr_r, reg_rd_i);
1402
  `endif
1403
             end
1404
 
1405
             inst_sb_w: // l.sb
1406
             begin
1407
                 dmem_addr_o <= mem_addr_r;
1408 37 ultra_embe
                 mem_access_q <= 1'b1;
1409 31 ultra_embe
                 case (mem_addr_r[1:0])
1410
                     2'b00 :
1411
                     begin
1412
                         dmem_data_out_o  <= {reg_rb_r[7:0],24'h000000};
1413 32 ultra_embe
                         dmem_sel_o       <= 4'b1000;
1414
                         dmem_we_o        <= 1'b1;
1415
                         dmem_stb_o       <= 1'b1;
1416
                         dmem_cyc_o       <= 1'b1;
1417 37 ultra_embe
                         mem_store_q      <= 1'b1;
1418 31 ultra_embe
                     end
1419
                     2'b01 :
1420
                     begin
1421
                         dmem_data_out_o  <= {{8'h00,reg_rb_r[7:0]},16'h0000};
1422 32 ultra_embe
                         dmem_sel_o       <= 4'b0100;
1423
                         dmem_we_o        <= 1'b1;
1424
                         dmem_stb_o       <= 1'b1;
1425
                         dmem_cyc_o       <= 1'b1;
1426 37 ultra_embe
                         mem_store_q      <= 1'b1;
1427 31 ultra_embe
                     end
1428
                     2'b10 :
1429
                     begin
1430
                         dmem_data_out_o  <= {{16'h0000,reg_rb_r[7:0]},8'h00};
1431 32 ultra_embe
                         dmem_sel_o       <= 4'b0010;
1432
                         dmem_we_o        <= 1'b1;
1433
                         dmem_stb_o       <= 1'b1;
1434
                         dmem_cyc_o       <= 1'b1;
1435 37 ultra_embe
                         mem_store_q      <= 1'b1;
1436 31 ultra_embe
                     end
1437
                     2'b11 :
1438
                     begin
1439
                         dmem_data_out_o  <= {24'h000000,reg_rb_r[7:0]};
1440 32 ultra_embe
                         dmem_sel_o       <= 4'b0001;
1441
                         dmem_we_o        <= 1'b1;
1442
                         dmem_stb_o       <= 1'b1;
1443
                         dmem_cyc_o       <= 1'b1;
1444 37 ultra_embe
                         mem_store_q      <= 1'b1;
1445 31 ultra_embe
                     end
1446
                     default :
1447 32 ultra_embe
                        ;
1448 31 ultra_embe
                 endcase
1449
             end
1450
 
1451
            inst_sh_w: // l.sh
1452 27 ultra_embe
            begin
1453 31 ultra_embe
                 dmem_addr_o <= mem_addr_r;
1454 37 ultra_embe
                 mem_access_q <= 1'b1;
1455 31 ultra_embe
                 case (mem_addr_r[1:0])
1456
                     2'b00 :
1457
                     begin
1458
                         dmem_data_out_o  <= {reg_rb_r[15:0],16'h0000};
1459 32 ultra_embe
                         dmem_sel_o       <= 4'b1100;
1460
                         dmem_we_o        <= 1'b1;
1461
                         dmem_stb_o       <= 1'b1;
1462
                         dmem_cyc_o       <= 1'b1;
1463 37 ultra_embe
                         mem_store_q      <= 1'b1;
1464 31 ultra_embe
                     end
1465
                     2'b10 :
1466
                     begin
1467
                         dmem_data_out_o  <= {16'h0000,reg_rb_r[15:0]};
1468 32 ultra_embe
                         dmem_sel_o       <= 4'b0011;
1469
                         dmem_we_o        <= 1'b1;
1470
                         dmem_stb_o       <= 1'b1;
1471
                         dmem_cyc_o       <= 1'b1;
1472 37 ultra_embe
                         mem_store_q      <= 1'b1;
1473 31 ultra_embe
                     end
1474
                     default :
1475 32 ultra_embe
                        ;
1476 31 ultra_embe
                 endcase
1477
            end
1478 27 ultra_embe
 
1479 31 ultra_embe
            inst_sw_w: // l.sw
1480
            begin
1481
                 dmem_addr_o      <= mem_addr_r;
1482
                 dmem_data_out_o  <= reg_rb_r;
1483 32 ultra_embe
                 dmem_sel_o       <= 4'b1111;
1484
                 dmem_we_o        <= 1'b1;
1485
                 dmem_stb_o       <= 1'b1;
1486
                 dmem_cyc_o       <= 1'b1;
1487 37 ultra_embe
                 mem_access_q     <= 1'b1;
1488
                 mem_store_q      <= 1'b1;
1489 31 ultra_embe
 
1490
  `ifdef CONF_CORE_DEBUG
1491
                 $display(" Store R%d to 0x%08x = 0x%08x", reg_rb_i, {mem_addr_r[31:2],2'b00}, reg_rb_r);
1492
  `endif
1493 27 ultra_embe
            end
1494 31 ultra_embe
            default:
1495
                ;
1496
         endcase
1497
       end
1498
   end
1499
end
1500 27 ultra_embe
 
1501 31 ultra_embe
//-----------------------------------------------------------------
1502
// Execute: Misc operations
1503
//-----------------------------------------------------------------
1504
always @ (posedge clk_i or posedge rst_i)
1505
begin
1506
   if (rst_i == 1'b1)
1507
   begin
1508
       break_o              <= 1'b0;
1509
       icache_flush_o       <= 1'b0;
1510
       dcache_flush_o       <= 1'b0;
1511
   end
1512
   else
1513
   begin
1514
       break_o              <= 1'b0;
1515
       icache_flush_o       <= 1'b0;
1516
       dcache_flush_o       <= 1'b0;
1517
 
1518
       //---------------------------------------------------------------
1519
       // Valid instruction
1520
       //---------------------------------------------------------------
1521 36 ultra_embe
       if (execute_inst_r & ~stall_inst_r)
1522 31 ultra_embe
       begin
1523
          case (1'b1)
1524
          inst_mtspr_w: // l.mtspr
1525
          begin
1526
               case (mxspr_uint16_r)
1527
                   // SR - Supervision register
1528
                   `SPR_REG_SR:
1529
                   begin
1530
                       // Cache flush request?
1531
                       icache_flush_o <= reg_rb_r[`OR32_SR_ICACHE_FLUSH];
1532
                       dcache_flush_o <= reg_rb_r[`OR32_SR_DCACHE_FLUSH];
1533
                   end
1534
               endcase
1535
          end
1536
 
1537
          inst_trap_w: // l.trap
1538
              break_o <= 1'b1;
1539
          default:
1540
              ;
1541
         endcase
1542 27 ultra_embe
       end
1543
   end
1544
end
1545
 
1546 31 ultra_embe
//-----------------------------------------------------------------
1547
// Execute: NOP (simulation) operations
1548
//-----------------------------------------------------------------
1549
`ifdef SIMULATION
1550
    always @ (posedge clk_i or posedge rst_i)
1551
    begin
1552
       if (rst_i == 1'b1)
1553
       begin
1554
    `ifdef SIM_EXT_PUTC
1555 37 ultra_embe
          putc_q                <= 8'b0;
1556 31 ultra_embe
    `endif
1557
       end
1558
       else
1559
       begin
1560
    `ifdef SIM_EXT_PUTC
1561 37 ultra_embe
          putc_q                <= 8'b0;
1562 31 ultra_embe
    `endif
1563
           //---------------------------------------------------------------
1564
           // Valid instruction
1565
           //---------------------------------------------------------------
1566 36 ultra_embe
           if (execute_inst_r & ~stall_inst_r)
1567 31 ultra_embe
           begin
1568
 
1569
               case (1'b1)
1570
               inst_nop_w: // l.nop
1571
                begin
1572
                    case (uint16_r)
1573
                    // NOP_PUTC
1574
                    16'h0004:
1575
                    begin
1576
      `ifdef SIM_EXT_PUTC
1577 37 ultra_embe
                      putc_q  <= reg_ra_r[7:0];
1578 31 ultra_embe
      `else
1579
                      $write("%c", reg_ra_r[7:0]);
1580
      `endif
1581
                    end
1582
                    // NOP
1583
                    16'h0000: ;
1584
                    endcase
1585
                end
1586
                default:
1587
                    ;
1588
             endcase
1589
           end
1590
       end
1591
    end
1592
`endif
1593
 
1594 27 ultra_embe
//-------------------------------------------------------------------
1595
// Assignments
1596
//-------------------------------------------------------------------
1597
 
1598 37 ultra_embe
assign branch_pc_o          = pc_branch_q;
1599
assign branch_o             = pc_fetch_q;
1600 36 ultra_embe
assign stall_o              = stall_inst_r;
1601 27 ultra_embe
 
1602 37 ultra_embe
assign opcode_o             = ex_opcode_q;
1603
assign opcode_pc_o          = ex_opcode_pc_q;
1604 27 ultra_embe
 
1605 37 ultra_embe
assign reg_rd_o             = ex_rd_q;
1606
assign reg_rd_value_o       = ex_result_w;
1607 27 ultra_embe
 
1608
assign mult_o               = 1'b0;
1609
assign mult_res_o           = 32'b0;
1610
 
1611
//-------------------------------------------------------------------
1612
// Hooks for debug
1613
//-------------------------------------------------------------------
1614
`ifdef verilator
1615
   function [31:0] get_opcode_ex;
1616
      // verilator public
1617 37 ultra_embe
      get_opcode_ex = ex_opcode_q;
1618 27 ultra_embe
   endfunction
1619
   function [31:0] get_pc_ex;
1620
      // verilator public
1621 37 ultra_embe
      get_pc_ex = ex_opcode_pc_q;
1622 27 ultra_embe
   endfunction
1623 31 ultra_embe
   function [7:0] get_putc;
1624
      // verilator public
1625
   `ifdef SIM_EXT_PUTC
1626 37 ultra_embe
      get_putc = putc_q;
1627 31 ultra_embe
   `else
1628
      get_putc = 8'b0;
1629
   `endif
1630
   endfunction
1631 32 ultra_embe
   function [0:0] get_reg_valid;
1632
      // verilator public
1633 37 ultra_embe
      get_reg_valid = ~(resolve_failed_w | load_stall_w | ~opcode_valid_i);
1634 32 ultra_embe
   endfunction
1635
   function [4:0] get_reg_ra;
1636
      // verilator public
1637
      get_reg_ra = reg_ra_i;
1638
   endfunction
1639
   function [31:0] get_reg_ra_value;
1640
      // verilator public
1641 37 ultra_embe
      get_reg_ra_value = ra_resolved_w;
1642 32 ultra_embe
   endfunction
1643
   function [4:0] get_reg_rb;
1644
      // verilator public
1645
      get_reg_rb = reg_rb_i;
1646
   endfunction
1647
   function [31:0] get_reg_rb_value;
1648
      // verilator public
1649 37 ultra_embe
      get_reg_rb_value = rb_resolved_w;
1650 32 ultra_embe
   endfunction
1651 27 ultra_embe
`endif
1652
 
1653
endmodule

powered by: WebSVN 2.1.0

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