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

Subversion Repositories altor32

[/] [altor32/] [trunk/] [rtl/] [cpu/] [altor32.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
//-----------------------------------------------------------------
39
// Includes
40
//-----------------------------------------------------------------
41
`include "altor32_defs.v"
42
 
43
//-----------------------------------------------------------------
44 32 ultra_embe
// Module - AltOR32 CPU (Pipelined Wishbone Interfaces)
45 27 ultra_embe
//-----------------------------------------------------------------
46
module cpu
47
(
48
    // General
49
    input               clk_i /*verilator public*/,
50
    input               rst_i /*verilator public*/,
51
 
52
    input               intr_i /*verilator public*/,
53
    input               nmi_i /*verilator public*/,
54
    output              fault_o /*verilator public*/,
55
    output              break_o /*verilator public*/,
56
 
57
    // Instruction memory
58
    output [31:0]       imem_addr_o /*verilator public*/,
59 32 ultra_embe
    input [31:0]        imem_dat_i /*verilator public*/,
60
    output [2:0]        imem_cti_o /*verilator public*/,
61
    output              imem_cyc_o /*verilator public*/,
62
    output              imem_stb_o /*verilator public*/,
63
    input               imem_stall_i/*verilator public*/,
64
    input               imem_ack_i/*verilator public*/,
65 27 ultra_embe
 
66
    // Data memory
67
    output [31:0]       dmem_addr_o /*verilator public*/,
68 32 ultra_embe
    output [31:0]       dmem_dat_o /*verilator public*/,
69
    input [31:0]        dmem_dat_i /*verilator public*/,
70
    output [3:0]        dmem_sel_o /*verilator public*/,
71
    output [2:0]        dmem_cti_o /*verilator public*/,
72
    output              dmem_cyc_o /*verilator public*/,
73
    output              dmem_we_o /*verilator public*/,
74
    output              dmem_stb_o /*verilator public*/,
75
    input               dmem_stall_i/*verilator public*/,
76
    input               dmem_ack_i/*verilator public*/
77 27 ultra_embe
);
78
 
79
//-----------------------------------------------------------------
80
// Params
81
//-----------------------------------------------------------------
82
parameter           BOOT_VECTOR         = 32'h00000000;
83
parameter           ISR_VECTOR          = 32'h00000000;
84
parameter           REGISTER_FILE_TYPE  = "SIMULATION";
85
parameter           ENABLE_ICACHE       = "ENABLED";
86
parameter           ENABLE_DCACHE       = "DISABLED";
87
parameter           SUPPORT_32REGS      = "ENABLED";
88 36 ultra_embe
parameter           PIPELINED_FETCH     = "ENABLED";
89 27 ultra_embe
 
90
//-----------------------------------------------------------------
91
// Registers / Wires
92
//-----------------------------------------------------------------
93
 
94 37 ultra_embe
// Instruction fetch
95
wire        fetch_rd_w;
96
wire [31:0] fetch_pc_w;
97
wire [31:0] fetch_opcode_w;
98
wire        fetch_valid_w;
99
 
100
// Decode opcode / PC / state
101
wire [31:0] dec_opcode_w;
102
wire [31:0] dec_opcode_pc_w;
103
wire        dec_opcode_valid_w;
104
 
105 27 ultra_embe
// Register number (rA)
106 37 ultra_embe
wire [4:0]  dec_ra_w;
107 27 ultra_embe
 
108
// Register number (rB)
109 37 ultra_embe
wire [4:0]  dec_rb_w;
110 27 ultra_embe
 
111
// Destination register number (pre execute stage)
112 37 ultra_embe
wire [4:0]  dec_rd_w;
113 27 ultra_embe
 
114
// Register value (rA)
115 37 ultra_embe
wire [31:0] dec_ra_val_w;
116 27 ultra_embe
 
117
// Register value (rB)
118 37 ultra_embe
wire [31:0] dec_rb_val_w;
119 27 ultra_embe
 
120 37 ultra_embe
// Destination register number (post execute stage)
121
wire [4:0]  ex_rd_w;
122 27 ultra_embe
 
123 37 ultra_embe
// Current executing instruction
124
wire [31:0] ex_opcode_w;
125 27 ultra_embe
 
126 37 ultra_embe
// Result from execute
127
wire [31:0] ex_result_w;
128
wire        ex_mult_w;
129
wire [31:0] ex_mult_res_w;
130
 
131
// Branch request
132
wire        ex_branch_w;
133
wire [31:0] ex_branch_pc_w;
134
wire        ex_stall_w;
135
 
136 27 ultra_embe
// Register writeback value
137 37 ultra_embe
wire [4:0]  wb_rd_w;
138
wire [31:0] wb_rd_val_w;
139 27 ultra_embe
 
140
// Register writeback enable
141 37 ultra_embe
wire        wb_rd_write_w;
142 27 ultra_embe
 
143 37 ultra_embe
wire [31:0] dcache_addr_w;
144
wire [31:0] dcache_data_out_w;
145
wire [31:0] dcache_data_in_w;
146
wire [3:0]  dcache_sel_w;
147
wire        dcache_we_w;
148
wire        dcache_stb_w;
149
wire        dcache_cyc_w;
150
wire        dcache_ack_w;
151
wire        dcache_stall_w;
152 27 ultra_embe
 
153 37 ultra_embe
wire        icache_flush_w;
154
wire        dcache_flush_w;
155 27 ultra_embe
 
156
//-----------------------------------------------------------------
157 37 ultra_embe
// Instruction Cache
158 27 ultra_embe
//-----------------------------------------------------------------
159
generate
160
if (ENABLE_ICACHE == "ENABLED")
161
begin : ICACHE
162
    // Instruction cache
163
    altor32_icache
164
    #(
165
        .BOOT_VECTOR(BOOT_VECTOR)
166
    )
167
    u_icache
168
    (
169
        .clk_i(clk_i),
170
        .rst_i(rst_i),
171
 
172
        // Processor interface
173 37 ultra_embe
        .rd_i(fetch_rd_w),
174
        .pc_i(fetch_pc_w),
175
        .instruction_o(fetch_opcode_w),
176
        .valid_o(fetch_valid_w),
177
        .invalidate_i(icache_flush_w),
178 27 ultra_embe
 
179
        // Instruction memory
180 32 ultra_embe
        .wbm_addr_o(imem_addr_o),
181
        .wbm_dat_i(imem_dat_i),
182
        .wbm_cti_o(imem_cti_o),
183
        .wbm_cyc_o(imem_cyc_o),
184
        .wbm_stb_o(imem_stb_o),
185
        .wbm_stall_i(imem_stall_i),
186
        .wbm_ack_i(imem_ack_i)
187 27 ultra_embe
    );
188
end
189 37 ultra_embe
//-----------------------------------------------------------------
190
// No instruction cache
191
//-----------------------------------------------------------------
192 27 ultra_embe
else
193 32 ultra_embe
begin : NO_ICACHE
194 27 ultra_embe
    altor32_noicache
195
    u_icache
196
    (
197
        .clk_i(clk_i),
198
        .rst_i(rst_i),
199
 
200
        // Processor interface
201 37 ultra_embe
        .rd_i(fetch_rd_w),
202
        .pc_i(fetch_pc_w),
203
        .instruction_o(fetch_opcode_w),
204
        .valid_o(fetch_valid_w),
205
        .invalidate_i(icache_flush_w),
206 27 ultra_embe
 
207
        // Instruction memory
208 32 ultra_embe
        .wbm_addr_o(imem_addr_o),
209
        .wbm_dat_i(imem_dat_i),
210
        .wbm_cti_o(imem_cti_o),
211
        .wbm_cyc_o(imem_cyc_o),
212
        .wbm_stb_o(imem_stb_o),
213
        .wbm_stall_i(imem_stall_i),
214
        .wbm_ack_i(imem_ack_i)
215 27 ultra_embe
    );
216
end
217
endgenerate
218
 
219 37 ultra_embe
//-----------------------------------------------------------------
220 27 ultra_embe
// Instruction Fetch
221 37 ultra_embe
//-----------------------------------------------------------------
222 27 ultra_embe
altor32_fetch
223
#(
224 36 ultra_embe
    .BOOT_VECTOR(BOOT_VECTOR),
225
    .PIPELINED_FETCH(PIPELINED_FETCH)
226 27 ultra_embe
)
227
u_fetch
228
(
229
    // General
230
    .clk_i(clk_i),
231
    .rst_i(rst_i),
232
 
233
    // Instruction memory
234 37 ultra_embe
    .pc_o(fetch_pc_w),
235
    .data_i(fetch_opcode_w),
236
    .fetch_o(fetch_rd_w),
237
    .data_valid_i(fetch_valid_w),
238 27 ultra_embe
 
239
    // Fetched opcode
240 37 ultra_embe
    .opcode_o(dec_opcode_w),
241
    .opcode_pc_o(dec_opcode_pc_w),
242
    .opcode_valid_o(dec_opcode_valid_w),
243 27 ultra_embe
 
244
    // Branch target
245 37 ultra_embe
    .branch_i(ex_branch_w),
246
    .branch_pc_i(ex_branch_pc_w),
247
    .stall_i(ex_stall_w),
248 27 ultra_embe
 
249
    // Decoded register details
250 37 ultra_embe
    .ra_o(dec_ra_w),
251
    .rb_o(dec_rb_w),
252
    .rd_o(dec_rd_w)
253 27 ultra_embe
);
254
 
255 37 ultra_embe
//-----------------------------------------------------------------
256
// [Xilinx] Register file
257
//-----------------------------------------------------------------
258 27 ultra_embe
generate
259
if (REGISTER_FILE_TYPE == "XILINX")
260 32 ultra_embe
begin : REGFILE_XIL
261 27 ultra_embe
    altor32_regfile_xil
262
    #(
263
        .SUPPORT_32REGS(SUPPORT_32REGS)
264
    )
265 37 ultra_embe
    u_regfile
266 27 ultra_embe
    (
267
        // Clocking
268
        .clk_i(clk_i),
269
        .rst_i(rst_i),
270 37 ultra_embe
        .wr_i(wb_rd_write_w),
271 27 ultra_embe
 
272
        // Tri-port
273 37 ultra_embe
        .ra_i(dec_ra_w),
274
        .rb_i(dec_rb_w),
275
        .rd_i(wb_rd_w),
276
        .reg_ra_o(dec_ra_val_w),
277
        .reg_rb_o(dec_rb_val_w),
278
        .reg_rd_i(wb_rd_val_w)
279 27 ultra_embe
    );
280
end
281 37 ultra_embe
//-----------------------------------------------------------------
282
// [Altera] Register file
283
//-----------------------------------------------------------------
284 27 ultra_embe
else if (REGISTER_FILE_TYPE == "ALTERA")
285 32 ultra_embe
begin : REGFILE_ALT
286 27 ultra_embe
    altor32_regfile_alt
287
    #(
288
        .SUPPORT_32REGS(SUPPORT_32REGS)
289
    )
290 37 ultra_embe
    u_regfile
291 27 ultra_embe
    (
292
        // Clocking
293
        .clk_i(clk_i),
294
        .rst_i(rst_i),
295 37 ultra_embe
        .wr_i(wb_rd_write_w),
296 27 ultra_embe
 
297
        // Tri-port
298 37 ultra_embe
        .ra_i(dec_ra_w),
299
        .rb_i(dec_rb_w),
300
        .rd_i(wb_rd_w),
301
        .reg_ra_o(dec_ra_val_w),
302
        .reg_rb_o(dec_rb_val_w),
303
        .reg_rd_i(wb_rd_val_w)
304 27 ultra_embe
    );
305
end
306 37 ultra_embe
//-----------------------------------------------------------------
307
// [Simulation] Register file
308
//-----------------------------------------------------------------
309 27 ultra_embe
else
310 32 ultra_embe
begin : REGFILE_SIM
311 27 ultra_embe
    altor32_regfile_sim
312
    #(
313
        .SUPPORT_32REGS(SUPPORT_32REGS)
314
    )
315 37 ultra_embe
    u_regfile
316 27 ultra_embe
    (
317
        // Clocking
318
        .clk_i(clk_i),
319
        .rst_i(rst_i),
320 37 ultra_embe
        .wr_i(wb_rd_write_w),
321 27 ultra_embe
 
322
        // Tri-port
323 37 ultra_embe
        .ra_i(dec_ra_w),
324
        .rb_i(dec_rb_w),
325
        .rd_i(wb_rd_w),
326
        .reg_ra_o(dec_ra_val_w),
327
        .reg_rb_o(dec_rb_val_w),
328
        .reg_rd_i(wb_rd_val_w)
329 27 ultra_embe
    );
330
end
331
endgenerate
332
 
333 37 ultra_embe
//-----------------------------------------------------------------
334
// Data cache
335
//-----------------------------------------------------------------
336 27 ultra_embe
generate
337
if (ENABLE_DCACHE == "ENABLED")
338 32 ultra_embe
begin : DCACHE
339 27 ultra_embe
    altor32_dcache
340
    u_dcache
341
    (
342
        .clk_i(clk_i),
343
        .rst_i(rst_i),
344
 
345 37 ultra_embe
        .flush_i(dcache_flush_w),
346 27 ultra_embe
 
347
        // Processor interface
348 37 ultra_embe
        .address_i({dcache_addr_w[31:2], 2'b00}),
349
        .data_o(dcache_data_in_w),
350
        .data_i(dcache_data_out_w),
351
        .we_i(dcache_we_w),
352
        .stb_i(dcache_stb_w),
353
        .sel_i(dcache_sel_w),
354
        .stall_o(dcache_stall_w),
355
        .ack_o(dcache_ack_w),
356 27 ultra_embe
 
357
        // Memory interface (slave)
358
        .mem_addr_o(dmem_addr_o),
359 32 ultra_embe
        .mem_data_i(dmem_dat_i),
360
        .mem_data_o(dmem_dat_o),
361
        .mem_sel_o(dmem_sel_o),
362
        .mem_we_o(dmem_we_o),
363
        .mem_stb_o(dmem_stb_o),
364
        .mem_cyc_o(dmem_cyc_o),
365
        .mem_cti_o(dmem_cti_o),
366
        .mem_stall_i(dmem_stall_i),
367 27 ultra_embe
        .mem_ack_i(dmem_ack_i)
368
    );
369
end
370 37 ultra_embe
//-----------------------------------------------------------------
371
// No data cache
372
//-----------------------------------------------------------------
373 27 ultra_embe
else
374 32 ultra_embe
begin: NO_DCACHE
375 37 ultra_embe
    assign dmem_addr_o      = {dcache_addr_w[31:2], 2'b00};
376
    assign dmem_dat_o       = dcache_data_out_w;
377
    assign dcache_data_in_w = dmem_dat_i;
378
    assign dmem_sel_o       = dcache_sel_w;
379
    assign dmem_cyc_o       = dcache_cyc_w;
380
    assign dmem_we_o        = dcache_we_w;
381
    assign dmem_stb_o       = dcache_stb_w;
382 32 ultra_embe
    assign dmem_cti_o       = 3'b111;
383 37 ultra_embe
    assign dcache_ack_w     = dmem_ack_i;
384
    assign dcache_stall_w   = dmem_stall_i;
385 27 ultra_embe
end
386
endgenerate
387
 
388 37 ultra_embe
//-----------------------------------------------------------------
389 27 ultra_embe
// Execution unit
390 37 ultra_embe
//-----------------------------------------------------------------
391 27 ultra_embe
altor32_exec
392
#(
393
    .BOOT_VECTOR(BOOT_VECTOR),
394
    .ISR_VECTOR(ISR_VECTOR)
395
)
396
u_exec
397
(
398
    // General
399
    .clk_i(clk_i),
400
    .rst_i(rst_i),
401
 
402
    .intr_i(intr_i),
403
    .nmi_i(nmi_i),
404
 
405
    // Status
406
    .fault_o(fault_o),
407
    .break_o(break_o),
408
 
409
    // Cache control
410 37 ultra_embe
    .icache_flush_o(icache_flush_w),
411
    .dcache_flush_o(dcache_flush_w),
412 27 ultra_embe
 
413
    // Branch target
414 37 ultra_embe
    .branch_o(ex_branch_w),
415
    .branch_pc_o(ex_branch_pc_w),
416
    .stall_o(ex_stall_w),
417 27 ultra_embe
 
418
    // Opcode & arguments
419 37 ultra_embe
    .opcode_i(dec_opcode_w),
420
    .opcode_pc_i(dec_opcode_pc_w),
421
    .opcode_valid_i(dec_opcode_valid_w),
422 27 ultra_embe
 
423 37 ultra_embe
    // Operands
424
    .reg_ra_i(dec_ra_w),
425
    .reg_ra_value_i(dec_ra_val_w),
426
    .reg_rb_i(dec_rb_w),
427
    .reg_rb_value_i(dec_rb_val_w),
428
    .reg_rd_i(dec_rd_w),
429 27 ultra_embe
 
430
    // Output
431 37 ultra_embe
    .opcode_o(ex_opcode_w),
432
    .opcode_pc_o(/* not used */),
433
    .reg_rd_o(ex_rd_w),
434
    .reg_rd_value_o(ex_result_w),
435
    .mult_o(ex_mult_w),
436
    .mult_res_o(ex_mult_res_w),
437 27 ultra_embe
 
438
    // Register write back bypass
439 37 ultra_embe
    .wb_rd_i(wb_rd_w),
440
    .wb_rd_value_i(wb_rd_val_w),
441 27 ultra_embe
 
442
    // Memory Interface
443 37 ultra_embe
    .dmem_addr_o(dcache_addr_w),
444
    .dmem_data_out_o(dcache_data_out_w),
445
    .dmem_data_in_i(dcache_data_in_w),
446
    .dmem_sel_o(dcache_sel_w),
447
    .dmem_we_o(dcache_we_w),
448
    .dmem_stb_o(dcache_stb_w),
449
    .dmem_cyc_o(dcache_cyc_w),
450
    .dmem_stall_i(dcache_stall_w),
451
    .dmem_ack_i(dcache_ack_w)
452 27 ultra_embe
);
453
 
454 37 ultra_embe
//-----------------------------------------------------------------
455 27 ultra_embe
// Register file writeback
456 37 ultra_embe
//-----------------------------------------------------------------
457 27 ultra_embe
altor32_writeback
458
u_wb
459
(
460
    // General
461
    .clk_i(clk_i),
462
    .rst_i(rst_i),
463
 
464
    // Opcode
465 37 ultra_embe
    .opcode_i(ex_opcode_w),
466 27 ultra_embe
 
467
    // Register target
468 37 ultra_embe
    .rd_i(ex_rd_w),
469 27 ultra_embe
 
470
    // ALU result
471 37 ultra_embe
    .alu_result_i(ex_result_w),
472 27 ultra_embe
 
473
    // Memory load result
474 37 ultra_embe
    .mem_result_i(dcache_data_in_w),
475
    .mem_offset_i(dcache_addr_w[1:0]),
476
    .mem_ready_i(dcache_ack_w),
477 27 ultra_embe
 
478
    // Multiplier result
479 37 ultra_embe
    .mult_i(ex_mult_w),
480
    .mult_result_i(ex_mult_res_w),
481 27 ultra_embe
 
482
    // Outputs
483 37 ultra_embe
    .write_enable_o(wb_rd_write_w),
484
    .write_addr_o(wb_rd_w),
485
    .write_data_o(wb_rd_val_w)
486 27 ultra_embe
);
487
 
488
//-------------------------------------------------------------------
489
// Hooks for debug
490
//-------------------------------------------------------------------
491
`ifdef verilator
492
   function [31:0] get_pc;
493
      // verilator public
494 37 ultra_embe
      get_pc = dec_opcode_pc_w;
495 27 ultra_embe
   endfunction
496
   function get_fault;
497
      // verilator public
498
      get_fault = fault_o;
499
   endfunction
500
   function get_break;
501
      // verilator public
502
      get_break = break_o;
503
   endfunction
504
`endif
505
 
506
endmodule

powered by: WebSVN 2.1.0

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