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

Subversion Repositories altor32

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

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
//                            V2.0
5
//                     Ultra-Embedded.com
6
//                   Copyright 2011 - 2013
7
//
8
//               Email: admin@ultra-embedded.com
9
//
10
//                       License: LGPL
11
//-----------------------------------------------------------------
12
//
13
// Copyright (C) 2011 - 2013 Ultra-Embedded.com
14
//
15
// This source file may be used and distributed without         
16
// restriction provided that this copyright statement is not    
17
// removed from the file and that any derivative work contains  
18
// the original copyright notice and the associated disclaimer. 
19
//
20
// This source file is free software; you can redistribute it   
21
// and/or modify it under the terms of the GNU Lesser General   
22
// Public License as published by the Free Software Foundation; 
23
// either version 2.1 of the License, or (at your option) any   
24
// later version.
25
//
26
// This source is distributed in the hope that it will be       
27
// useful, but WITHOUT ANY WARRANTY; without even the implied   
28
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      
29
// PURPOSE.  See the GNU Lesser General Public License for more 
30
// details.
31
//
32
// You should have received a copy of the GNU Lesser General    
33
// Public License along with this source; if not, write to the 
34
// Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
35
// Boston, MA  02111-1307  USA
36
//-----------------------------------------------------------------
37
 
38
//`define CONF_CORE_DEBUG
39
//`define CONF_CORE_DEBUG_BUBBLE
40
//`define CONF_CORE_TRACE
41
//`define CONF_CORE_FAULT_ON_OPCODE0
42
 
43
//-----------------------------------------------------------------
44
// Includes
45
//-----------------------------------------------------------------
46
`include "altor32_defs.v"
47
 
48
//-----------------------------------------------------------------
49
// Module - Instruction Execute
50
//-----------------------------------------------------------------
51
module altor32_exec
52
(
53
    // General
54
    input               clk_i /*verilator public*/,
55
    input               rst_i /*verilator public*/,
56
 
57
    // Maskable interrupt    
58
    input               intr_i /*verilator public*/,
59
 
60
    // Unmaskable interrupt
61
    input               nmi_i /*verilator public*/,
62
 
63
    // Fault
64
    output reg          fault_o /*verilator public*/,
65
 
66
    // Breakpoint / Trap
67
    output reg          break_o /*verilator public*/,
68
 
69
    // Cache control
70
    output reg          icache_flush_o /*verilator public*/,
71
    output reg          dcache_flush_o /*verilator public*/,
72
 
73
    // Branch
74
    output              branch_o /*verilator public*/,
75
    output [31:0]       branch_pc_o /*verilator public*/,
76
    output              stall_o /*verilator public*/,
77
 
78
    // Opcode & arguments
79
    input [31:0]        opcode_i /*verilator public*/,
80
    input [31:0]        opcode_pc_i /*verilator public*/,
81
    input               opcode_valid_i /*verilator public*/,
82
 
83
    // Reg A
84
    input [4:0]         reg_ra_i /*verilator public*/,
85
    input [31:0]        reg_ra_value_i /*verilator public*/,
86
 
87
    // Reg B
88
    input [4:0]         reg_rb_i /*verilator public*/,
89
    input [31:0]        reg_rb_value_i /*verilator public*/,
90
 
91
    // Reg D
92
    input [4:0]         reg_rd_i /*verilator public*/,
93
 
94
    // Output
95
    output [31:0]       opcode_o /*verilator public*/,
96
    output [4:0]        reg_rd_o /*verilator public*/,
97
    output [31:0]       reg_rd_value_o /*verilator public*/,
98
    output              mult_o /*verilator public*/,
99
    output [31:0]       mult_res_o /*verilator public*/,
100
 
101
    // Register write back bypass
102
    input [4:0]         wb_rd_i /*verilator public*/,
103
    input [31:0]        wb_rd_value_i /*verilator public*/,
104
 
105
    // Memory Interface
106
    output reg [31:0]   dmem_addr_o /*verilator public*/,
107
    output reg [31:0]   dmem_data_out_o /*verilator public*/,
108
    input [31:0]        dmem_data_in_i /*verilator public*/,
109
    output reg [3:0]    dmem_wr_o /*verilator public*/,
110
    output reg          dmem_rd_o /*verilator public*/,
111
    input               dmem_accept_i /*verilator public*/,
112
    input               dmem_ack_i /*verilator public*/
113
);
114
 
115
//-----------------------------------------------------------------
116
// Params
117
//-----------------------------------------------------------------
118
parameter           BOOT_VECTOR         = 32'h00000000;
119
parameter           ISR_VECTOR          = 32'h00000000;
120
 
121
//-----------------------------------------------------------------
122
// Registers
123
//-----------------------------------------------------------------
124
 
125
// Branch PC
126
reg [31:0] r_pc_branch;
127
reg        r_pc_fetch;
128
reg        r_stall;
129
 
130
// Exception saved program counter
131
reg [31:0] r_epc;
132
 
133
// Supervisor register
134
reg [31:0] r_sr;
135
 
136
// Exception saved supervisor register
137
reg [31:0] r_esr;
138
 
139
// Destination register number (post execute stage)
140
reg [4:0] r_e_rd;
141
 
142
// Current opcode (PC for debug)
143
reg [31:0] r_e_opcode;
144
reg [31:0] r_e_opcode_pc;
145
 
146
// ALU input A
147
reg [31:0] r_e_alu_a;
148
 
149
// ALU input B
150
reg [31:0] r_e_alu_b;
151
 
152
// ALU output
153
wire [31:0] r_e_result;
154
 
155
// Resolved RA/RB register contents
156
wire [31:0] ra_value_resolved;
157
wire [31:0] rb_value_resolved;
158
wire        resolve_failed;
159
 
160
// ALU Carry
161
wire alu_carry_out;
162
wire alu_carry_update;
163
 
164
// ALU operation selection
165
reg [3:0] r_e_alu_func;
166
 
167
// Load instruction details
168
reg [4:0] r_load_rd;
169
reg [7:0] r_load_inst;
170
reg [1:0] r_load_offset;
171
 
172
// Load forwarding
173
wire         load_insn;
174
wire [31:0]  load_result;
175
 
176
// Memory access?
177
reg r_mem_load;
178
reg r_mem_store;
179
reg r_mem_access;
180
 
181
wire load_pending;
182
wire store_pending;
183
wire load_insert;
184
wire load_stall;
185
 
186
reg d_mem_load;
187
 
188
// Delayed NMI
189
reg r_nmi;
190
 
191
//-----------------------------------------------------------------
192
// Instantiation
193
//-----------------------------------------------------------------
194
 
195
// ALU
196
altor32_alu alu
197
(
198
    // ALU operation select
199
    .op_i(r_e_alu_func),
200
 
201
    // Operands
202
    .a_i(r_e_alu_a),
203
    .b_i(r_e_alu_b),
204
    .c_i(r_sr[`OR32_SR_CY]),
205
 
206
    // Result
207
    .p_o(r_e_result),
208
 
209
    // Carry
210
    .c_o(alu_carry_out),
211
    .c_update_o(alu_carry_update)
212
);
213
 
214
// Load result forwarding
215
altor32_lfu
216
u_lfu
217
(
218
    // Opcode
219
    .opcode_i(r_load_inst),
220
 
221
    // Memory load result
222
    .mem_result_i(dmem_data_in_i),
223
    .mem_offset_i(r_load_offset),
224
 
225
    // Result
226
    .load_result_o(load_result),
227
    .load_insn_o(load_insn)
228
);
229
 
230
// Load / store pending logic
231
altor32_lsu
232
u_lsu
233
(
234
    // Current instruction
235
    .opcode_valid_i(opcode_valid_i & ~r_pc_fetch),
236
    .opcode_i({2'b00,opcode_i[31:26]}),
237
 
238
    // Load / Store pending
239
    .load_pending_i(r_mem_load),
240
    .store_pending_i(r_mem_store),
241
 
242
    // Load dest register
243
    .rd_load_i(r_load_rd),
244
 
245
    // Load insn in WB stage
246
    .load_wb_i(d_mem_load),
247
 
248
    // Memory status
249
    .mem_access_i(r_mem_access),
250
    .mem_ack_i(dmem_ack_i),
251
 
252
    // Load / store still pending
253
    .load_pending_o(load_pending),
254
    .store_pending_o(store_pending),
255
 
256
    // Insert load result into pipeline
257
    .write_result_o(load_insert),
258
 
259
    // Stall pipeline due
260
    .stall_o(load_stall)
261
);
262
 
263
// Operand forwarding
264
altor32_dfu
265
u_dfu
266
(
267
    // Input registers
268
    .ra_i(reg_ra_i),
269
    .rb_i(reg_rb_i),
270
 
271
    // Input register contents
272
    .ra_regval_i(reg_ra_value_i),
273
    .rb_regval_i(reg_rb_value_i),
274
 
275
    // Dest register (EXEC stage)
276
    .rd_ex_i(r_e_rd),
277
 
278
    // Dest register (WB stage)
279
    .rd_wb_i(wb_rd_i),
280
 
281
    // Load pending / target
282
    .load_pending_i(load_pending),
283
    .rd_load_i(r_load_rd),
284
 
285
    // Multiplier status
286
    .mult_lo_ex_i(1'b0),
287
    .mult_hi_ex_i(1'b0),
288
    .mult_lo_wb_i(1'b0),
289
    .mult_hi_wb_i(1'b0),
290
 
291
    // Multiplier result
292
    .result_mult_i(64'b0),
293
 
294
    // Result (EXEC)
295
    .result_ex_i(r_e_result),
296
 
297
    // Result (WB)
298
    .result_wb_i(wb_rd_value_i),
299
 
300
    // Resolved register values
301
    .result_ra_o(ra_value_resolved),
302
    .result_rb_o(rb_value_resolved),
303
 
304
    // Stall due to failed resolve
305
    .stall_o(resolve_failed)
306
);
307
 
308
//-------------------------------------------------------------------
309
// Execute: Execute opcode
310
//-------------------------------------------------------------------
311
 
312
// Execute stage blocking assignment vars
313
reg [7:0] v_inst;
314
reg [4:0] v_rd;
315
reg [7:0] v_alu_op;
316
reg [1:0] v_shift_op;
317
reg [15:0] v_sfxx_op;
318
reg [15:0] v_imm;
319
reg [31:0] v_imm_uint32;
320
reg [31:0] v_imm_int32;
321
reg [31:0] v_store_imm;
322
reg [15:0] v_mxspr_imm;
323
reg [31:0] v_target;
324
reg [31:0] v_reg_ra;
325
reg [31:0] v_reg_rb;
326
reg [31:0] v_pc;
327
reg [31:0] v_offset;
328
reg [31:0] v_shift_val;
329
reg [31:0] v_shift_imm;
330
reg [31:0] v_vector;
331
reg [31:0] v_sr;
332
reg [31:0] v_mem_addr;
333
reg [31:0] v_mem_data_in;
334
reg v_exception;
335
reg v_branch;
336
reg v_jmp;
337
reg v_write_rd;
338
reg v_store_pending;
339
reg v_load_pending;
340
reg v_inst_load;
341
reg v_inst_store;
342
reg v_stall;
343
reg v_no_intr;
344
reg v_opcode_valid;
345
reg v_check_load_rd;
346
 
347
always @ (posedge clk_i or posedge rst_i)
348
begin
349
   if (rst_i == 1'b1)
350
   begin
351
       r_pc_branch          <= 32'h00000000;
352
       r_pc_fetch           <= 1'b0;
353
       r_stall              <= 1'b0;
354
 
355
       // Status registers
356
       r_epc                <= 32'h00000000;
357
       r_sr                 <= 32'h00000000;
358
       r_esr                <= 32'h00000000;
359
 
360
       r_e_rd               <= 5'b00000;
361
 
362
       // Default to no ALU operation
363
       r_e_alu_func         <= `ALU_NONE;
364
       r_e_alu_a            <= 32'h00000000;
365
       r_e_alu_b            <= 32'h00000000;
366
 
367
       r_e_opcode           <= 32'h00000000;
368
       r_e_opcode_pc        <= 32'h00000000;
369
 
370
       // Data memory
371
       dmem_addr_o          <= 32'h00000000;
372
       dmem_data_out_o      <= 32'h00000000;
373
       dmem_rd_o            <= 1'b0;
374
       dmem_wr_o            <= 4'b0000;
375
 
376
       fault_o              <= 1'b0;
377
       break_o              <= 1'b0;
378
 
379
       r_nmi                <= 1'b0;
380
 
381
       icache_flush_o       <= 1'b0;
382
       dcache_flush_o       <= 1'b0;
383
 
384
       r_mem_load           <= 1'b0;
385
       r_mem_store          <= 1'b0;
386
       r_mem_access         <= 1'b0;
387
 
388
       r_load_rd            <= 5'b00000;
389
       r_load_inst          <= 8'h00;
390
       r_load_offset        <= 2'b00;
391
 
392
       d_mem_load           <= 1'b0;
393
   end
394
   else
395
   begin
396
 
397
       // If memory access accepted by slave
398
       if (dmem_accept_i)
399
       begin
400
           dmem_rd_o            <= 1'b0;
401
           dmem_wr_o            <= 4'b0000;
402
       end
403
 
404
       r_mem_access         <= 1'b0;
405
       break_o              <= 1'b0;
406
       icache_flush_o       <= 1'b0;
407
       dcache_flush_o       <= 1'b0;
408
 
409
      // Record NMI in-case it can't be processed this cycle
410
      if (nmi_i)
411
          r_nmi <= 1'b1;
412
 
413
       // Reset branch request
414
       r_pc_fetch           <= 1'b0;
415
 
416
       v_exception          = 1'b0;
417
       v_vector             = 32'h00000000;
418
       v_branch             = 1'b0;
419
       v_jmp                = 1'b0;
420
       v_write_rd           = 1'b0;
421
       v_sr                 = r_sr;
422
       v_stall              = 1'b0;
423
       v_no_intr            = 1'b0;
424
 
425
       d_mem_load          <= r_mem_access & r_mem_load;
426
 
427
       //---------------------------------------------------------------
428
       // Opcode
429
       //---------------------------------------------------------------   
430
 
431
       // Instruction not ready
432
       if (!opcode_valid_i)
433
       begin
434
            v_opcode_valid  = 1'b0;
435
 
436
`ifdef CONF_CORE_DEBUG_BUBBLE
437
            $display("%08x: Execute - Instruction not ready", opcode_pc_i);
438
`endif
439
       end
440
       // Branch request, always drop the next instruction
441
       else if (r_pc_fetch)
442
       begin
443
            v_opcode_valid    = 1'b0;
444
 
445
`ifdef CONF_CORE_DEBUG
446
            $display("%08x: Exec - Branch pending, skip instruction (%x)", opcode_pc_i, opcode_i);
447
`endif
448
       end
449
       // Valid instruction ready     
450
       else
451
       begin
452
            v_mem_data_in   = opcode_i;
453
            v_opcode_valid  = 1'b1;
454
 
455
`ifdef CONF_CORE_FAULT_ON_OPCODE0
456
            // This is a valid opcode (branch to same instruction), 
457
            // but rare and useful for catching pipeline errors
458
            if (v_mem_data_in == 32'h00000000)
459
                fault_o <= 1'b1;
460
`endif
461
       end
462
 
463
       //---------------------------------------------------------------
464
       // Decode opcode
465
       //---------------------------------------------------------------          
466
       v_alu_op             = {v_mem_data_in[9:6],v_mem_data_in[3:0]};
467
       v_sfxx_op            = {5'b00,v_mem_data_in[31:21]};
468
       v_shift_op           = v_mem_data_in[7:6];
469
       v_target             = sign_extend_imm26(v_mem_data_in[25:0]);
470
       v_store_imm          = sign_extend_imm16({v_mem_data_in[25:21],v_mem_data_in[10:0]});
471
 
472
       // Signed & unsigned imm -> 32-bits
473
       v_imm                = v_mem_data_in[15:0];
474
       v_imm_int32          = sign_extend_imm16(v_imm);
475
       v_imm_uint32         = extend_imm16(v_imm);
476
 
477
       // Load register[ra]
478
       v_reg_ra             = ra_value_resolved;
479
 
480
       // Load register[rb]
481
       v_reg_rb             = rb_value_resolved;
482
 
483
       // Default to no ALU operation (output == input_a)
484
       r_e_alu_func         <= `ALU_NONE;
485
       r_e_alu_a            <= 32'h00000000;
486
 
487
       // Default target is R[d]
488
       v_rd                 = reg_rd_i;
489
 
490
       //---------------------------------------------------------------
491
       // Outstanding memory access
492
       //--------------------------------------------------------------- 
493
 
494
       // Pending accesses
495
       v_load_pending   = load_pending;
496
       v_store_pending  = store_pending;
497
       v_check_load_rd  = 1'b1;
498
 
499
       // Stall pipeline due to load / store
500
       if (v_opcode_valid & load_stall)
501
       begin
502
           v_stall        = 1'b1;
503
           v_opcode_valid = 1'b0;
504
       end
505
 
506
       // Insert load result into pipeline?
507
       if (load_insert)
508
       begin
509
           // Feed load result into pipeline
510
           r_e_alu_func         <= `ALU_NONE;
511
           r_e_alu_a            <= load_result;
512
           v_rd                  = r_load_rd;
513
           v_write_rd            = 1'b1;
514
       end
515
 
516
       //---------------------------------------------------------------
517
       // Invalid PC detection
518
       //---------------------------------------------------------------
519
 
520
       // Detect incorrect program counter and cause FAULT
521
       if (opcode_valid_i && (opcode_pc_i[1:0] != 2'b00))
522
       begin
523
            fault_o        <= 1'b1;
524
            v_opcode_valid  = 1'b0;
525
            v_exception     = 1'b1;
526
            v_vector        = ISR_VECTOR + `VECTOR_BUS_ERROR;
527
       end
528
 
529
       //---------------------------------------------------------------
530
       // Failed operand resolve?
531
       //---------------------------------------------------------------
532
       if (opcode_valid_i & resolve_failed)
533
       begin
534
`ifdef CONF_CORE_DEBUG
535
            $display("%08x: Operand resolve failed RA=%d, RB=%d", opcode_pc_i, reg_ra_i, reg_rb_i);
536
`endif
537
            // Stall!
538
            v_opcode_valid  = 1'b0;
539
            v_stall         = 1'b1;
540
       end
541
 
542
       //---------------------------------------------------------------
543
       // Final instruction decoding
544
       //--------------------------------------------------------------- 
545
 
546
       // Insert bubble into the pipeline?
547
       if (!v_opcode_valid)
548
       begin
549
            v_mem_data_in   = `OPCODE_INST_BUBBLE;
550
            v_check_load_rd = 1'b0;
551
       end
552
 
553
       // Store opcode (after possible bubble generation)
554
       r_e_opcode            <= v_mem_data_in;
555
       r_e_opcode_pc         <= opcode_pc_i;
556
 
557
       // Decode instruction
558
       v_inst               = {2'b00,v_mem_data_in[31:26]};
559
 
560
       // Shift ammount (from register[rb])
561
       v_shift_val          = {26'b00,v_reg_rb[5:0]};
562
 
563
       // Shift ammount (from immediate)
564
       v_shift_imm          = {26'b00,v_imm[5:0]};
565
 
566
       // MTSPR/MFSPR operand
567
       v_mxspr_imm          =  (v_reg_ra[15:0] | {5'b00000,v_mem_data_in[10:0]});
568
 
569
       // Next expected PC (current PC + 4)
570
       v_pc                 = (opcode_pc_i + 4);
571
 
572
       // Latch carry if updated
573
       if (alu_carry_update)
574
            v_sr[`OR32_SR_CY] = alu_carry_out;
575
 
576
`ifdef CONF_CORE_TRACE
577
       if (v_opcode_valid)
578
       begin
579
            $display("%08x: Execute 0x%08x", opcode_pc_i, v_mem_data_in);
580
            $display(" rA[%d] = 0x%08x", reg_ra_i, v_reg_ra);
581
            $display(" rB[%d] = 0x%08x", reg_rb_i, v_reg_rb);
582
       end
583
`endif
584
 
585
       //---------------------------------------------------------------
586
       // Execute instruction
587
       //---------------------------------------------------------------
588
       case (v_inst)
589
           `INST_OR32_BUBBLE :
590
           begin
591
                // Do not allow external interrupts whilst executing a bubble
592
                // as this will result in pipeline issues.
593
                v_no_intr = 1'b1;
594
           end
595
           `INST_OR32_ALU :
596
           begin
597
               case (v_alu_op)
598
                   `INST_OR32_ADD: // l.add
599
                   begin
600
                       r_e_alu_func <= `ALU_ADD;
601
                       r_e_alu_a <= v_reg_ra;
602
                       r_e_alu_b <= v_reg_rb;
603
                       v_write_rd = 1'b1;
604
                   end
605
 
606
                   `INST_OR32_ADDC: // l.addc
607
                   begin
608
                       r_e_alu_func <= `ALU_ADDC;
609
                       r_e_alu_a <= v_reg_ra;
610
                       r_e_alu_b <= v_reg_rb;
611
                       v_write_rd = 1'b1;
612
                   end
613
 
614
                   `INST_OR32_AND: // l.and
615
                   begin
616
                       r_e_alu_func <= `ALU_AND;
617
                       r_e_alu_a <= v_reg_ra;
618
                       r_e_alu_b <= v_reg_rb;
619
                       v_write_rd = 1'b1;
620
                   end
621
 
622
                   `INST_OR32_OR: // l.or
623
                   begin
624
                       r_e_alu_func <= `ALU_OR;
625
                       r_e_alu_a <= v_reg_ra;
626
                       r_e_alu_b <= v_reg_rb;
627
                       v_write_rd = 1'b1;
628
                   end
629
 
630
                   `INST_OR32_SLL: // l.sll
631
                   begin
632
                       r_e_alu_func <= `ALU_SHIFTL;
633
                       r_e_alu_a <= v_reg_ra;
634
                       r_e_alu_b <= v_shift_val;
635
                       v_write_rd = 1'b1;
636
                   end
637
 
638
                   `INST_OR32_SRA: // l.sra
639
                   begin
640
                       r_e_alu_func <= `ALU_SHIRTR_ARITH;
641
                       r_e_alu_a <= v_reg_ra;
642
                       r_e_alu_b <= v_shift_val;
643
                       v_write_rd = 1'b1;
644
                   end
645
 
646
                   `INST_OR32_SRL: // l.srl
647
                   begin
648
                       r_e_alu_func <= `ALU_SHIFTR;
649
                       r_e_alu_a <= v_reg_ra;
650
                       r_e_alu_b <= v_shift_val;
651
                       v_write_rd = 1'b1;
652
                   end
653
 
654
                   `INST_OR32_SUB: // l.sub
655
                   begin
656
                       r_e_alu_func <= `ALU_SUB;
657
                       r_e_alu_a <= v_reg_ra;
658
                       r_e_alu_b <= v_reg_rb;
659
                       v_write_rd = 1'b1;
660
                   end
661
 
662
                   `INST_OR32_XOR: // l.xor
663
                   begin
664
                       r_e_alu_func <= `ALU_XOR;
665
                       r_e_alu_a <= v_reg_ra;
666
                       r_e_alu_b <= v_reg_rb;
667
                       v_write_rd = 1'b1;
668
                   end
669
 
670
                   default:
671
                   begin
672
                       fault_o <= 1'b1;
673
                       v_exception = 1'b1;
674
                       v_vector = ISR_VECTOR + `VECTOR_ILLEGAL_INST;
675
                   end
676
               endcase
677
           end
678
 
679
           `INST_OR32_ADDI: // l.addi
680
           begin
681
               r_e_alu_func <= `ALU_ADD;
682
               r_e_alu_a <= v_reg_ra;
683
               r_e_alu_b <= v_imm_int32;
684
               v_write_rd = 1'b1;
685
           end
686
 
687
           `INST_OR32_ANDI: // l.andi
688
           begin
689
               r_e_alu_func <= `ALU_AND;
690
               r_e_alu_a <= v_reg_ra;
691
               r_e_alu_b <= v_imm_uint32;
692
               v_write_rd = 1'b1;
693
           end
694
 
695
           `INST_OR32_BF: // l.bf
696
           begin
697
               if (v_sr[`OR32_SR_F] == 1'b1)
698
                    v_branch = 1'b1;
699
           end
700
 
701
           `INST_OR32_BNF: // l.bnf
702
           begin
703
               if (v_sr[`OR32_SR_F] == 1'b0)
704
                    v_branch = 1'b1;
705
           end
706
 
707
           `INST_OR32_J: // l.j
708
           begin
709
               v_branch = 1'b1;
710
           end
711
 
712
           `INST_OR32_JAL: // l.jal
713
           begin
714
               r_e_alu_a <= v_pc;
715
               v_write_rd = 1'b1;
716
               v_rd       = 5'b01001; // Write to REG_9_LR
717
`ifdef CONF_CORE_DEBUG
718
               $display(" Save 0x%x to LR", v_pc);
719
`endif
720
               v_branch = 1'b1;
721
           end
722
 
723
          `INST_OR32_JALR: // l.jalr
724
           begin
725
               r_e_alu_a <= v_pc;
726
               v_write_rd = 1'b1;
727
               v_rd       = 5'b01001; // Write to REG_9_LR
728
`ifdef CONF_CORE_DEBUG
729
               $display(" Save 0x%x to LR", v_pc);
730
`endif
731
               v_pc = v_reg_rb;
732
               v_jmp = 1;
733
           end
734
 
735
          `INST_OR32_JR: // l.jr
736
           begin
737
               v_pc = v_reg_rb;
738
               v_jmp = 1;
739
           end
740
 
741
           // l.lbs l.lhs l.lws l.lbz l.lhz l.lwz
742
           `INST_OR32_LBS, `INST_OR32_LHS, `INST_OR32_LWS, `INST_OR32_LBZ, `INST_OR32_LHZ, `INST_OR32_LWZ :
743
           begin
744
               v_mem_addr = (v_reg_ra + v_imm_int32);
745
               dmem_addr_o <= v_mem_addr;
746
               dmem_data_out_o <= 32'h00000000;
747
               dmem_rd_o <= 1'b1;
748
 
749
               // Writeback if load result ready
750
               v_write_rd = 1'b1;
751
               v_check_load_rd = 1'b0;
752
 
753
               // Mark load as pending
754
               v_load_pending   = 1'b1;
755
               r_mem_access    <= 1'b1;
756
 
757
               // Record target register
758
               r_load_rd    <= reg_rd_i;
759
               r_load_inst  <= v_inst;
760
               r_load_offset<= v_mem_addr[1:0];
761
 
762
`ifdef CONF_CORE_DEBUG
763
               $display(" Load from 0x%08x to R%d", v_mem_addr, reg_rd_i);
764
`endif
765
                // Detect bad load address & fault (ignore bit 31)
766
                if (v_mem_addr[30:28] != 3'h1)
767
                begin
768
                    v_load_pending  = 1'b0;
769
                    dmem_rd_o      <= 1'b0;
770
                    r_mem_access   <= 1'b0;
771
                    fault_o        <= 1'b1;
772
                    v_exception     = 1'b1;
773
                    v_vector        = ISR_VECTOR + `VECTOR_BUS_ERROR;
774
                end
775
           end
776
 
777
          `INST_OR32_MFSPR: // l.mfspr
778
          begin
779
               case (v_mxspr_imm)
780
                   // SR - Supervision register
781
                   `SPR_REG_SR:
782
                   begin
783
                       r_e_alu_a <= v_sr;
784
                       v_write_rd = 1'b1;
785
                   end
786
 
787
                   // EPCR - EPC Exception saved PC
788
                   `SPR_REG_EPCR:
789
                   begin
790
                       r_e_alu_a <= r_epc;
791
                       v_write_rd = 1'b1;
792
                   end
793
 
794
                   // ESR - Exception saved SR
795
                   `SPR_REG_ESR:
796
                   begin
797
                       r_e_alu_a <= r_esr;
798
                       v_write_rd = 1'b1;
799
                   end
800
 
801
                   default:
802
                   begin
803
                       fault_o <= 1'b1;
804
                       v_exception = 1'b1;
805
                       v_vector = ISR_VECTOR + `VECTOR_ILLEGAL_INST;
806
                   end
807
               endcase
808
           end
809
 
810
          `INST_OR32_MTSPR: // l.mtspr
811
          begin
812
               case (v_mxspr_imm)
813
                   // SR - Supervision register
814
                   `SPR_REG_SR:
815
                   begin
816
                       v_sr = v_reg_rb;
817
 
818
                       // Cache flush request?
819
                       icache_flush_o <= v_reg_rb[`OR32_SR_ICACHE_FLUSH];
820
                       dcache_flush_o <= v_reg_rb[`OR32_SR_DCACHE_FLUSH];
821
 
822
                       // Don't store cache flush requests
823
                       v_sr[`OR32_SR_ICACHE_FLUSH] = 1'b0;
824
                       v_sr[`OR32_SR_DCACHE_FLUSH] = 1'b0;
825
                   end
826
 
827
                   // EPCR - EPC Exception saved PC
828
                   `SPR_REG_EPCR:
829
                   begin
830
                       r_epc <= v_reg_rb;
831
                   end
832
 
833
                   // ESR - Exception saved SR
834
                   `SPR_REG_ESR:
835
                   begin
836
                       r_esr <= v_reg_rb;
837
                   end
838
 
839
                   default:
840
                   begin
841
                       fault_o <= 1'b1;
842
                       v_exception = 1'b1;
843
                       v_vector = ISR_VECTOR + `VECTOR_ILLEGAL_INST;
844
                   end
845
               endcase
846
           end
847
 
848
           `INST_OR32_MOVHI: // l.movhi
849
           begin
850
               r_e_alu_a <= {v_imm,16'h0000};
851
               v_write_rd = 1'b1;
852
           end
853
 
854
           `INST_OR32_NOP: // l.nop
855
           begin
856
              `ifdef SIMULATION
857
              case (v_imm)
858
              // NOP_PUTC
859
              16'h0004:  $write("%c", v_reg_ra[7:0]);
860
              // NOP
861
              16'h0000: ;
862
              endcase
863
              `endif
864
           end
865
 
866
           `INST_OR32_ORI: // l.ori
867
           begin
868
               r_e_alu_func <= `ALU_OR;
869
               r_e_alu_a <= v_reg_ra;
870
               r_e_alu_b <= v_imm_uint32;
871
               v_write_rd = 1'b1;
872
           end
873
 
874
           `INST_OR32_RFE: // l.rfe
875
           begin
876
                v_pc      = r_epc;
877
                v_sr      = r_esr;
878
                v_jmp     = 1;
879
           end
880
 
881
          `INST_OR32_SHIFTI :
882
          begin
883
               case (v_shift_op)
884
                   `INST_OR32_SLLI: // l.slli
885
                   begin
886
                       r_e_alu_func <= `ALU_SHIFTL;
887
                       r_e_alu_a <= v_reg_ra;
888
                       r_e_alu_b <= v_shift_imm;
889
                       v_write_rd = 1'b1;
890
                   end
891
 
892
                   `INST_OR32_SRAI: // l.srai
893
                   begin
894
                       r_e_alu_func <= `ALU_SHIRTR_ARITH;
895
                       r_e_alu_a <= v_reg_ra;
896
                       r_e_alu_b <= v_shift_imm;
897
                       v_write_rd = 1'b1;
898
                   end
899
 
900
                   `INST_OR32_SRLI: // l.srli
901
                     begin
902
                       r_e_alu_func <= `ALU_SHIFTR;
903
                       r_e_alu_a <= v_reg_ra;
904
                       r_e_alu_b <= v_shift_imm;
905
                       v_write_rd = 1'b1;
906
                   end
907
 
908
                   default:
909
                   begin
910
                       fault_o <= 1'b1;
911
                       v_exception = 1'b1;
912
                       v_vector = ISR_VECTOR + `VECTOR_ILLEGAL_INST;
913
                   end
914
               endcase
915
           end
916
 
917
           `INST_OR32_SB:
918
           begin
919
               v_mem_addr = (v_reg_ra + v_store_imm);
920
               dmem_addr_o <= v_mem_addr;
921
               r_mem_access <= 1'b1;
922
               case (v_mem_addr[1:0])
923
                   2'b00 :
924
                   begin
925
                       dmem_data_out_o <= {v_reg_rb[7:0],24'h000000};
926
                       dmem_wr_o <= 4'b1000;
927
                       v_store_pending  = 1'b1;
928
                   end
929
                   2'b01 :
930
                   begin
931
                       dmem_data_out_o <= {{8'h00,v_reg_rb[7:0]},16'h0000};
932
                       dmem_wr_o <= 4'b0100;
933
                       v_store_pending  = 1'b1;
934
                   end
935
                   2'b10 :
936
                   begin
937
                       dmem_data_out_o <= {{16'h0000,v_reg_rb[7:0]},8'h00};
938
                       dmem_wr_o <= 4'b0010;
939
                       v_store_pending  = 1'b1;
940
                   end
941
                   2'b11 :
942
                   begin
943
                       dmem_data_out_o <= {24'h000000,v_reg_rb[7:0]};
944
                       dmem_wr_o <= 4'b0001;
945
                       v_store_pending  = 1'b1;
946
                   end
947
                   default :
948
                   begin
949
                       dmem_data_out_o <= 32'h00000000;
950
                       dmem_wr_o <= 4'b0000;
951
                   end
952
               endcase
953
           end
954
 
955
          `INST_OR32_SFXX, `INST_OR32_SFXXI:
956
          begin
957
               case (v_sfxx_op)
958
                   `INST_OR32_SFEQ: // l.sfeq
959
                   begin
960
                        if (v_reg_ra == v_reg_rb)
961
                            v_sr[`OR32_SR_F] = 1'b1;
962
                        else
963
                            v_sr[`OR32_SR_F] = 1'b0;
964
                   end
965
 
966
                   `INST_OR32_SFEQI: // l.sfeqi
967
                   begin
968
                        if (v_reg_ra == v_imm_int32)
969
                            v_sr[`OR32_SR_F] = 1'b1;
970
                        else
971
                            v_sr[`OR32_SR_F] = 1'b0;
972
                   end
973
 
974
                   `INST_OR32_SFGES: // l.sfges
975
                   begin
976
                        if (greater_than_equal_signed(v_reg_ra, v_reg_rb) == 1'b1)
977
                            v_sr[`OR32_SR_F] = 1'b1;
978
                        else
979
                            v_sr[`OR32_SR_F] = 1'b0;
980
                   end
981
 
982
                   `INST_OR32_SFGESI: // l.sfgesi
983
                   begin
984
                        if (greater_than_equal_signed(v_reg_ra, v_imm_int32) == 1'b1)
985
                            v_sr[`OR32_SR_F] = 1'b1;
986
                        else
987
                            v_sr[`OR32_SR_F] = 1'b0;
988
                   end
989
 
990
                   `INST_OR32_SFGEU: // l.sfgeu
991
                   begin
992
                        if (v_reg_ra >= v_reg_rb)
993
                            v_sr[`OR32_SR_F] = 1'b1;
994
                        else
995
                            v_sr[`OR32_SR_F] = 1'b0;
996
                   end
997
 
998
                   `INST_OR32_SFGEUI: // l.sfgeui
999
                   begin
1000
                        if (v_reg_ra >= v_imm_int32)
1001
                            v_sr[`OR32_SR_F] = 1'b1;
1002
                        else
1003
                            v_sr[`OR32_SR_F] = 1'b0;
1004
                   end
1005
 
1006
                   `INST_OR32_SFGTS: // l.sfgts
1007
                   begin
1008
                        if (greater_than_signed(v_reg_ra, v_reg_rb) == 1'b1)
1009
                            v_sr[`OR32_SR_F] = 1'b1;
1010
                        else
1011
                            v_sr[`OR32_SR_F] = 1'b0;
1012
                   end
1013
 
1014
                   `INST_OR32_SFGTSI: // l.sfgtsi
1015
                   begin
1016
                        if (greater_than_signed(v_reg_ra, v_imm_int32) == 1'b1)
1017
                            v_sr[`OR32_SR_F] = 1'b1;
1018
                        else
1019
                            v_sr[`OR32_SR_F] = 1'b0;
1020
                   end
1021
 
1022
                   `INST_OR32_SFGTU: // l.sfgtu
1023
                   begin
1024
                        if (v_reg_ra > v_reg_rb)
1025
                            v_sr[`OR32_SR_F] = 1'b1;
1026
                        else
1027
                            v_sr[`OR32_SR_F] = 1'b0;
1028
                   end
1029
 
1030
                   `INST_OR32_SFGTUI: // l.sfgtui
1031
                   begin
1032
                        if (v_reg_ra > v_imm_int32)
1033
                            v_sr[`OR32_SR_F] = 1'b1;
1034
                        else
1035
                            v_sr[`OR32_SR_F] = 1'b0;
1036
                   end
1037
 
1038
                   `INST_OR32_SFLES: // l.sfles
1039
                   begin
1040
                        if (less_than_equal_signed(v_reg_ra, v_reg_rb) == 1'b1)
1041
                            v_sr[`OR32_SR_F] = 1'b1;
1042
                        else
1043
                            v_sr[`OR32_SR_F] = 1'b0;
1044
                   end
1045
 
1046
                   `INST_OR32_SFLESI: // l.sflesi
1047
                   begin
1048
                        if (less_than_equal_signed(v_reg_ra, v_imm_int32) == 1'b1)
1049
                            v_sr[`OR32_SR_F] = 1'b1;
1050
                        else
1051
                            v_sr[`OR32_SR_F] = 1'b0;
1052
                   end
1053
 
1054
                   `INST_OR32_SFLEU: // l.sfleu
1055
                   begin
1056
                        if (v_reg_ra <= v_reg_rb)
1057
                            v_sr[`OR32_SR_F] = 1'b1;
1058
                        else
1059
                            v_sr[`OR32_SR_F] = 1'b0;
1060
                   end
1061
 
1062
                   `INST_OR32_SFLEUI: // l.sfleui
1063
                   begin
1064
                        if (v_reg_ra <= v_imm_int32)
1065
                            v_sr[`OR32_SR_F] = 1'b1;
1066
                        else
1067
                            v_sr[`OR32_SR_F] = 1'b0;
1068
                   end
1069
 
1070
                   `INST_OR32_SFLTS: // l.sflts
1071
                   begin
1072
                        if (less_than_signed(v_reg_ra, v_reg_rb) == 1'b1)
1073
                            v_sr[`OR32_SR_F] = 1'b1;
1074
                        else
1075
                            v_sr[`OR32_SR_F] = 1'b0;
1076
                   end
1077
 
1078
                   `INST_OR32_SFLTSI: // l.sfltsi
1079
                   begin
1080
                        if (less_than_signed(v_reg_ra, v_imm_int32) == 1'b1)
1081
                            v_sr[`OR32_SR_F] = 1'b1;
1082
                        else
1083
                            v_sr[`OR32_SR_F] = 1'b0;
1084
                   end
1085
 
1086
                   `INST_OR32_SFLTU: // l.sfltu
1087
                   begin
1088
                        if (v_reg_ra < v_reg_rb)
1089
                            v_sr[`OR32_SR_F] = 1'b1;
1090
                        else
1091
                            v_sr[`OR32_SR_F] = 1'b0;
1092
                   end
1093
 
1094
                   `INST_OR32_SFLTUI: // l.sfltui
1095
                   begin
1096
                        if (v_reg_ra < v_imm_int32)
1097
                            v_sr[`OR32_SR_F] = 1'b1;
1098
                        else
1099
                            v_sr[`OR32_SR_F] = 1'b0;
1100
                   end
1101
 
1102
                   `INST_OR32_SFNE: // l.sfne
1103
                   begin
1104
                        if (v_reg_ra != v_reg_rb)
1105
                            v_sr[`OR32_SR_F] = 1'b1;
1106
                        else
1107
                            v_sr[`OR32_SR_F] = 1'b0;
1108
                   end
1109
 
1110
                   `INST_OR32_SFNEI: // l.sfnei
1111
                   begin
1112
                        if (v_reg_ra != v_imm_int32)
1113
                            v_sr[`OR32_SR_F] = 1'b1;
1114
                        else
1115
                            v_sr[`OR32_SR_F] = 1'b0;
1116
                   end
1117
 
1118
                   default:
1119
                   begin
1120
                       fault_o <= 1'b1;
1121
                       v_exception = 1'b1;
1122
                       v_vector = ISR_VECTOR + `VECTOR_ILLEGAL_INST;
1123
                   end
1124
               endcase
1125
           end
1126
 
1127
           `INST_OR32_SH: // l.sh
1128
           begin
1129
               v_mem_addr = (v_reg_ra + v_store_imm);
1130
               dmem_addr_o <= v_mem_addr;
1131
               r_mem_access <= 1'b1;
1132
               case (v_mem_addr[1:0])
1133
                   2'b00 :
1134
                   begin
1135
                       dmem_data_out_o <= {v_reg_rb[15:0],16'h0000};
1136
                       dmem_wr_o <= 4'b1100;
1137
                       v_store_pending  = 1'b1;
1138
                   end
1139
                   2'b10 :
1140
                   begin
1141
                       dmem_data_out_o <= {16'h0000,v_reg_rb[15:0]};
1142
                       dmem_wr_o <= 4'b0011;
1143
                       v_store_pending  = 1'b1;
1144
                   end
1145
                   default :
1146
                   begin
1147
                       dmem_data_out_o <= 32'h00000000;
1148
                       dmem_wr_o <= 4'b0000;
1149
                   end
1150
               endcase
1151
           end
1152
 
1153
           `INST_OR32_SW: // l.sw
1154
           begin
1155
               v_mem_addr = (v_reg_ra + v_store_imm);
1156
               dmem_addr_o <= v_mem_addr;
1157
               dmem_data_out_o <= v_reg_rb;
1158
               dmem_wr_o <= 4'b1111;
1159
               r_mem_access <= 1'b1;
1160
               v_store_pending  = 1'b1;
1161
 
1162
`ifdef CONF_CORE_DEBUG
1163
               $display(" Store R%d to 0x%08x = 0x%08x", reg_rb_i, {v_mem_addr[31:2],2'b00}, v_reg_rb);
1164
`endif
1165
           end
1166
 
1167
          `INST_OR32_MISC:
1168
          begin
1169
               case (v_mem_data_in[31:24])
1170
                   `INST_OR32_SYS: // l.sys
1171
                   begin
1172
                       v_exception = 1'b1;
1173
                       v_vector = ISR_VECTOR + `VECTOR_SYSCALL;
1174
                   end
1175
 
1176
                   `INST_OR32_TRAP: // l.trap
1177
                   begin
1178
                       v_exception = 1'b1;
1179
                       v_vector = ISR_VECTOR + `VECTOR_TRAP;
1180
                       break_o <= 1'b1;
1181
                   end
1182
 
1183
                   default :
1184
                   begin
1185
                       fault_o <= 1'b1;
1186
                       v_exception = 1'b1;
1187
                       v_vector = ISR_VECTOR + `VECTOR_ILLEGAL_INST;
1188
                   end
1189
               endcase
1190
           end
1191
 
1192
           `INST_OR32_XORI: // l.xori
1193
           begin
1194
               r_e_alu_func <= `ALU_XOR;
1195
               r_e_alu_a <= v_reg_ra;
1196
               r_e_alu_b <= v_imm_int32;
1197
               v_write_rd = 1'b1;
1198
           end
1199
 
1200
           default :
1201
           begin
1202
               fault_o <= 1'b1;
1203
               v_exception = 1'b1;
1204
               v_vector = ISR_VECTOR + `VECTOR_ILLEGAL_INST;
1205
           end
1206
       endcase
1207
 
1208
       //---------------------------------------------------------------
1209
       // Branch logic
1210
       //---------------------------------------------------------------
1211
 
1212
       // If relative branch, calculate target before possible interrupt/exception
1213
       if (v_branch == 1'b1)
1214
       begin
1215
           v_offset = {v_target[29:0],2'b00};
1216
           v_pc     = (opcode_pc_i + v_offset);
1217
       end
1218
 
1219
       // Pipeline stall due to load result not ready
1220
       if (v_stall == 1'b1)
1221
       begin
1222
            // No exceptions whilst stalled
1223
       end
1224
       // Exception (Fault/Syscall/Break)
1225
       else if (v_exception == 1'b1)
1226
       begin
1227
            // Save PC of next instruction
1228
            r_epc       <= v_pc;
1229
 
1230
            // Disable further interrupts
1231
            r_esr       <= v_sr;
1232
            v_sr         = 0;
1233
 
1234
            // Set PC to exception vector
1235
            v_pc         = v_vector;
1236
            r_pc_branch <= v_pc;
1237
            r_pc_fetch  <= 1'b1;
1238
 
1239
`ifdef CONF_CORE_DEBUG
1240
           $display(" Exception 0x%08x", v_vector);
1241
`endif
1242
       end
1243
       // Non-maskable interrupt
1244
       else if (nmi_i | r_nmi)
1245
       begin
1246
            r_nmi       <= 1'b0;
1247
 
1248
            // Save PC of next instruction
1249
            r_epc       <= v_pc;
1250
 
1251
            // Disable further interrupts
1252
            r_esr       <= v_sr;
1253
            v_sr         = 0;
1254
 
1255
            // Set PC to exception vector
1256
            v_pc         = ISR_VECTOR + `VECTOR_NMI;
1257
            r_pc_branch <= v_pc;
1258
            r_pc_fetch  <= 1'b1;
1259
 
1260
`ifdef CONF_CORE_DEBUG
1261
           $display(" NMI 0x%08x", v_pc);
1262
`endif
1263
       end
1264
       // External interrupt
1265
       else if (v_no_intr == 1'b0 &&
1266
                ((intr_i && v_sr[`OR32_SR_IEE])))
1267
       begin
1268
            // Save PC of next instruction & SR
1269
            r_epc       <= v_pc;
1270
 
1271
            // Disable further interrupts
1272
            r_esr       <= v_sr;
1273
            v_sr         = 0;
1274
 
1275
            // Set PC to external interrupt vector
1276
            v_pc    = ISR_VECTOR + `VECTOR_EXTINT;
1277
 
1278
            r_pc_branch <= v_pc;
1279
            r_pc_fetch  <= 1'b1;
1280
 
1281
`ifdef CONF_CORE_DEBUG
1282
           $display(" External Interrupt 0x%08x", v_pc);
1283
`endif
1284
       end
1285
       // Handle relative branches (l.bf, l.bnf, l.j, l.jal)
1286
       else if (v_branch == 1'b1)
1287
       begin
1288
            // Perform branch (already in v_pc)
1289
            r_pc_branch    <= v_pc;
1290
            r_pc_fetch     <= 1'b1;
1291
 
1292
`ifdef CONF_CORE_DEBUG
1293
           $display(" Branch to 0x%08x", v_pc);
1294
`endif
1295
       end
1296
       // Handle absolute jumps (l.jr, l.jalr, l.rfe)
1297
       else if (v_jmp == 1'b1)
1298
       begin
1299
            // Perform branch
1300
            r_pc_branch    <= v_pc;
1301
            r_pc_fetch     <= 1'b1;
1302
 
1303
`ifdef CONF_CORE_DEBUG
1304
           $display(" Jump to 0x%08x", v_pc);
1305
`endif
1306
       end
1307
 
1308
 
1309
       // Update other registers with variable values
1310
       r_stall      <= v_stall;
1311
       r_sr         <= v_sr;
1312
 
1313
       // Memory access?
1314
       r_mem_load <= v_load_pending;
1315
       r_mem_store<= v_store_pending;
1316
 
1317
       // No writeback required?
1318
       if (v_write_rd == 1'b0)
1319
       begin
1320
           // Target register is R0 which is read-only
1321
           r_e_rd <= 5'b00000;
1322
       end
1323
       // Writeback required
1324
       else
1325
       begin
1326
            // Load outstanding, check if result target is being
1327
            // overwritten (to avoid WAR hazard)
1328
            if (v_check_load_rd && v_rd == r_load_rd)
1329
            begin
1330
            `ifdef CONF_CORE_DEBUG
1331
                if (v_rd != 5'b0)
1332
                    $display("%08x: Load target overwrite, clear target (R%d)", opcode_pc_i, r_load_rd);
1333
            `endif
1334
 
1335
                // Ditch load result when it arrives
1336
                r_load_rd <= 5'b00000;
1337
            end
1338
 
1339
            // Target Rd
1340
            r_e_rd <= v_rd;
1341
       end
1342
   end
1343
end
1344
 
1345
//-------------------------------------------------------------------
1346
// Assignments
1347
//-------------------------------------------------------------------
1348
 
1349
assign branch_pc_o          = r_pc_branch;
1350
assign branch_o             = r_pc_fetch;
1351
assign stall_o              = r_stall;
1352
 
1353
assign opcode_o             = r_e_opcode;
1354
 
1355
assign reg_rd_o             = r_e_rd;
1356
assign reg_rd_value_o       = r_e_result;
1357
 
1358
assign mult_o               = 1'b0;
1359
assign mult_res_o           = 32'b0;
1360
 
1361
`include "altor32_funcs.v"
1362
 
1363
//-------------------------------------------------------------------
1364
// Hooks for debug
1365
//-------------------------------------------------------------------
1366
`ifdef verilator
1367
   function [31:0] get_opcode_ex;
1368
      // verilator public
1369
      get_opcode_ex = r_e_opcode;
1370
   endfunction
1371
   function [31:0] get_pc_ex;
1372
      // verilator public
1373
      get_pc_ex = r_e_opcode_pc;
1374
   endfunction
1375
`endif
1376
 
1377
endmodule

powered by: WebSVN 2.1.0

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