URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [branches/] [mp3_stable/] [or1200/] [rtl/] [verilog/] [cpu.v] - Rev 168
Go to most recent revision | Compare with Previous | Blame | View Log
////////////////////////////////////////////////////////////////////// //// //// //// OR1200's CPU //// //// //// //// This file is part of the OpenRISC 1200 project //// //// http://www.opencores.org/cores/or1k/ //// //// //// //// Description //// //// Instantiation of internal CPU blocks. IFETCH, SPRS, FRZ, //// //// ALU, EXCEPT, ID, WBMUX, OPERANDMUX, RF etc. //// //// //// //// To Do: //// //// - make it smaller and faster //// //// //// //// Author(s): //// //// - Damjan Lampret, lampret@opencores.org //// //// //// ////////////////////////////////////////////////////////////////////// //// //// //// Copyright (C) 2000 Authors and OPENCORES.ORG //// //// //// //// This source file may be used and distributed without //// //// restriction provided that this copyright statement is not //// //// removed from the file and that any derivative work contains //// //// the original copyright notice and the associated disclaimer. //// //// //// //// This source file is free software; you can redistribute it //// //// and/or modify it under the terms of the GNU Lesser General //// //// Public License as published by the Free Software Foundation; //// //// either version 2.1 of the License, or (at your option) any //// //// later version. //// //// //// //// This source is distributed in the hope that it will be //// //// useful, but WITHOUT ANY WARRANTY; without even the implied //// //// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// //// PURPOSE. See the GNU Lesser General Public License for more //// //// details. //// //// //// //// You should have received a copy of the GNU Lesser General //// //// Public License along with this source; if not, download it //// //// from http://www.opencores.org/lgpl.shtml //// //// //// ////////////////////////////////////////////////////////////////////// // // CVS Revision History // // $Log: not supported by cvs2svn $ // Revision 1.1 2001/07/20 00:46:03 lampret // Development version of RTL. Libraries are missing. // // `include "timescale.v" `include "defines.v" module cpu( // Clk & Rst clk, rst, // Insn interface ic_insn, ic_pcaddr, ic_stall, // Trace port tp_dir_in, tp_sel, tp_in, tp_out, // Data interface dclsu_stall, dclsu_addr, dclsu_datain, dclsu_dataout, dclsu_lsuop, dc_en, // Interrupt exceptions int_high, int_low, // SPR interface spr_addr, spr_dataout, spr_dat_pic, spr_dat_tt, spr_dat_pm, spr_cs, spr_we, // Trace port tp2w, tp3w ); parameter dw = `OPERAND_WIDTH; parameter aw = `REGFILE_ADDR_WIDTH; // // I/O ports // // // Clk & Rst // input clk; input rst; // // Insn (IC) interface // input [31:0] ic_insn; output [31:0] ic_pcaddr; input ic_stall; // // Trace // input tp_dir_in; input [1:0] tp_sel; input [31:0] tp_in; output [31:0] tp_out; output [`TP2W_WIDTH-1:0] tp2w; output [`TP3W_WIDTH-1:0] tp3w; // // Data (DC) interface // input dclsu_stall; output [31:0] dclsu_addr; input [31:0] dclsu_datain; output [31:0] dclsu_dataout; output [`LSUOP_WIDTH-1:0] dclsu_lsuop; output dc_en; // // SPR interface // input [dw-1:0] spr_dat_pic; input [dw-1:0] spr_dat_tt; input [dw-1:0] spr_dat_pm; output [dw-1:0] spr_addr; output [dw-1:0] spr_dataout; output [31:0] spr_cs; output spr_we; // // Interrupt exceptions // input int_high; input int_low; // // Internal wires // wire [31:0] insn; wire [31:0] if_pc; wire [31:2] lr_sav; wire [aw-1:0] rf_addrw; wire [aw-1:0] rf_addra; wire [aw-1:0] rf_addrb; wire [dw-1:0] simm; wire [dw-1:2] branch_addrofs; wire [`ALUOP_WIDTH-1:0] alu_op; wire [`SHROTOP_WIDTH-1:0] shrot_op; wire [`COMPOP_WIDTH-1:0] comp_op; wire [`BRANCHOP_WIDTH-1:0] branch_op; wire [`LSUOP_WIDTH-1:0] lsu_op; wire pipeline_freeze; wire [`SEL_WIDTH-1:0] sel_a; wire [`SEL_WIDTH-1:0] sel_b; wire [`RFWBOP_WIDTH-1:0] rfwb_op; wire [dw-1:0] rf_dataw; wire [dw-1:0] rf_dataa; wire [dw-1:0] rf_datab; wire [dw-1:0] muxed_b; wire [dw-1:0] wb_forw; wire wbforw_valid; wire [dw-1:0] operand_a; wire [dw-1:0] operand_b; wire [dw-1:0] alu_dataout; wire [dw-1:0] lsu_dataout; wire [dw-1:0] sprs_dataout; wire [31:0] lsu_addrofs; wire [`MULTICYCLE_WIDTH-1:0] multicycle; wire [`EXCEPT_WIDTH-1:0] except_type; wire except_flushpipe; wire branch_taken; wire flag; wire lsu_stall; wire branch_stall; wire epcr_we; wire eear_we; wire esr_we; wire [31:0] epcr; wire [31:0] eear; wire [`SR_WIDTH-1:0] esr; wire [`SR_WIDTH-1:0] sr; wire except_start; wire except_started; wire [31:0] wb_pc; wire [31:0] wb_insn; wire [31:0] tp_insn; wire tp_wr_insn; wire [15:0] spr_addrimm; wire sig_syscall; // // Trace port // wire [31:0] rfa_tqa; wire [31:0] rfb_tqa; wire [`TP1R_WIDTH-1:0] rfa_tmuxed; wire [`TP1R_WIDTH-1:0] rfb_tmuxed; wire [`TP1W_WIDTH-1:0] tp1w; // // Data cache enable // assign dc_en = sr[`SR_DCE]; // // Instantiation of exception block // except except( .clk(clk), .rst(rst), .sig_dtlbmiss(1'b0), .sig_dmmufault(1'b0), .sig_inthigh(int_high), .sig_syscall(sig_syscall), .sig_itlbmiss(1'b0), .sig_immufault(1'b0), .sig_intlow(int_low), .branch_taken(branch_taken), .pipeline_freeze(pipeline_freeze), .ic_stall(ic_stall), .if_pc(if_pc), .lr_sav(lr_sav), .except_flushpipe(except_flushpipe), .except_type(except_type), .except_start(except_start), .except_started(except_started), .wb_pc(wb_pc), .datain(operand_b), .epcr_we(epcr_we), .eear_we(eear_we), .esr_we(esr_we), .epcr(epcr), .eear(eear), .esr(esr), .lsu_addr(dclsu_addr), .sr(sr) ); // // Instantiation of instruction fetch block // ifetch ifetch( .clk(clk), .rst(rst), .ic_insn(ic_insn), .ic_pcaddr(ic_pcaddr), .ic_stall(ic_stall), .tp_insn(tp_insn), .tp_wr_insn(tp_wr_insn), .pipeline_freeze(pipeline_freeze), .if_insn(insn), .if_pc(if_pc), .branch_op(branch_op), .except_type(except_type), .except_start(except_start), .branch_addrofs(branch_addrofs), .lr_restor(operand_b), .flag(flag), .taken(branch_taken), .binsn_addr(lr_sav), .epcr(epcr) ); // // Instantiation of instruction decode/control logic // id id( .clk(clk), .rst(rst), .pipeline_freeze(pipeline_freeze), .except_flushpipe(except_flushpipe), .if_insn(insn), .branch_op(branch_op), .rf_addra(rf_addra), .rf_addrb(rf_addrb), .alu_op(alu_op), .shrot_op(shrot_op), .comp_op(comp_op), .rf_addrw(rf_addrw), .rfwb_op(rfwb_op), .wb_insn(wb_insn), .simm(simm), .branch_addrofs(branch_addrofs), .lsu_addrofs(lsu_addrofs), .sel_a(sel_a), .sel_b(sel_b), .lsu_op(lsu_op), .multicycle(multicycle), .branch_stall(branch_stall), .spr_addrimm(spr_addrimm), .wbforw_valid(wbforw_valid), .sig_syscall(sig_syscall) ); // // Instantiation of write-back muxes // wbmux wbmux( .clk(clk), .rst(rst), .pipeline_freeze(pipeline_freeze), .rfwb_op(rfwb_op), .muxin_a(alu_dataout), .muxin_b(lsu_dataout), .muxin_c(sprs_dataout), .muxin_d({lr_sav, 2'b0}), .muxout(rf_dataw), .muxreg(wb_forw), .muxreg_valid(wbforw_valid) ); // // Instantiation of register file // rf rf( .clk(clk), .rst(rst), .addrw(rf_addrw), .dataw(rf_dataw), .pipeline_freeze(pipeline_freeze), .we(rfwb_op[0]), .addra(rf_addra), .dataa(rf_dataa), .addrb(rf_addrb), .datab(rf_datab), .rfa_tqa(rfa_tqa), .rfb_tqa(rfb_tqa), .rfa_tmuxed(rfa_tmuxed), .rfb_tmuxed(rfb_tmuxed), .tp1w(tp1w) ); // // Instantiation of operand muxes // operandmuxes operandmuxes( .clk(clk), .rst(rst), .pipeline_freeze(pipeline_freeze), .rf_dataa(rf_dataa), .rf_datab(rf_datab), .ex_forw(rf_dataw), .wb_forw(wb_forw), .simm(simm), .sel_a(sel_a), .sel_b(sel_b), .operand_a(operand_a), .operand_b(operand_b), .muxed_b(muxed_b) ); // // Instantiation of CPU's ALU // alu alu( .clk(clk), .rst(rst), .a(operand_a), .b(operand_b), .alu_op(alu_op), .shrot_op(shrot_op), .comp_op(comp_op), .result(alu_dataout), .flag(flag) ); // // Instantiation of CPU's SPRS block // sprs sprs( .clk(clk), .rst(rst), .addrbase(operand_a), .addrofs(spr_addrimm), .dat_i(operand_b), .alu_op(alu_op), .flag(flag), .to_wbmux(sprs_dataout), .spr_addr(spr_addr), .spr_dat_pic(spr_dat_pic), .spr_dat_tt(spr_dat_tt), .spr_dat_pm(spr_dat_pm), .spr_dataout(spr_dataout), .spr_cs(spr_cs), .spr_we(spr_we), .epcr_we(epcr_we), .eear_we(eear_we), .esr_we(esr_we), .epcr(epcr), .eear(eear), .esr(esr), .except_start(except_start), .except_started(except_started), .sr(sr), .branch_op(branch_op) ); // // Instantiation of load/store unit // lsu lsu( .clk(clk), .rst(rst), .addrbase(operand_a), .addrofs(lsu_addrofs), .lsu_op(lsu_op), .lsu_datain(operand_b), .lsu_dataout(lsu_dataout), .lsu_stall(lsu_stall), .dc_stall(dclsu_stall), .dc_addr(dclsu_addr), .dc_datain(dclsu_datain), .dc_dataout(dclsu_dataout), .dc_lsuop(dclsu_lsuop) ); // // Instantiation of freeze logic // frz_logic frz_logic( .clk(clk), .rst(rst), .multicycle(multicycle), .except_flushpipe(except_flushpipe), .lsu_stall(lsu_stall), .ic_stall(ic_stall), .branch_stall(branch_stall), .pipeline_freeze(pipeline_freeze) ); // // Instantiation of Trace port // traceport traceport( // Trace port connection to outside world .tp_dir_in(tp_dir_in), .tp_sel(tp_sel), .tp_in(tp_in), .tp_out(tp_out), // Trace sources coming from RISC core .rst(rst), .rfa_tqa(rfa_tqa), .rfb_tqa(rfb_tqa), .rfa_tmuxed(rfa_tmuxed), .rfb_tmuxed(rfb_tmuxed), .wb_pc(wb_pc), .wb_insn(wb_insn), .wb_forw(wb_forw), // To RISC core .wr_insn(tp_wr_insn), .insn(tp_insn), .tp1w(tp1w), .tp2w(tp2w), .tp3w(tp3w) ); endmodule
Go to most recent revision | Compare with Previous | Blame | View Log