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

Subversion Repositories or1k

[/] [or1k/] [tags/] [rel_18/] [or1200/] [rtl/] [verilog/] [or1200_sprs.v] - Diff between revs 1011 and 1032

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 1011 Rev 1032
Line 42... Line 42...
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// CVS Revision History
// CVS Revision History
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.8  2002/08/28 01:44:25  lampret
 
// Removed some commented RTL. Fixed SR/ESR flag bug.
 
//
// Revision 1.7  2002/03/29 15:16:56  lampret
// Revision 1.7  2002/03/29 15:16:56  lampret
// Some of the warnings fixed.
// Some of the warnings fixed.
//
//
// Revision 1.6  2002/03/11 01:26:57  lampret
// Revision 1.6  2002/03/11 01:26:57  lampret
// Changed generation of SPR address. Now it is ORed from base and offset instead of a sum.
// Changed generation of SPR address. Now it is ORed from base and offset instead of a sum.
Line 102... Line 105...
module or1200_sprs(
module or1200_sprs(
                // Clk & Rst
                // Clk & Rst
                clk, rst,
                clk, rst,
 
 
                // Internal CPU interface
                // Internal CPU interface
                flagforw, flag_we, flag, addrbase, addrofs, dat_i, alu_op, branch_op,
                flagforw, flag_we, flag, cyforw, cy_we, carry,
 
                addrbase, addrofs, dat_i, alu_op, branch_op,
                epcr, eear, esr, except_started,
                epcr, eear, esr, except_started,
                to_wbmux, epcr_we, eear_we, esr_we, pc_we, sr_we, to_sr, sr,
                to_wbmux, epcr_we, eear_we, esr_we, pc_we, sr_we, to_sr, sr,
                spr_dat_cfgr, spr_dat_rf, spr_dat_npc, spr_dat_ppc, spr_dat_mac,
                spr_dat_cfgr, spr_dat_rf, spr_dat_npc, spr_dat_ppc, spr_dat_mac,
 
 
                // From/to other RISC units
                // From/to other RISC units
Line 128... Line 132...
//
//
// Internal CPU interface
// Internal CPU interface
//
//
input                           clk;            // Clock
input                           clk;            // Clock
input                           rst;            // Reset
input                           rst;            // Reset
output                          flag;           // SR[F]
 
input                           flagforw;       // From ALU
input                           flagforw;       // From ALU
input                           flag_we;        // From ALU
input                           flag_we;        // From ALU
 
output                          flag;           // SR[F]
 
input                           cyforw;         // From ALU
 
input                           cy_we;          // From ALU
 
output                          carry;          // SR[CY]
input   [width-1:0]              addrbase;       // SPR base address
input   [width-1:0]              addrbase;       // SPR base address
input   [15:0]                   addrofs;        // SPR offset
input   [15:0]                   addrofs;        // SPR offset
input   [width-1:0]              dat_i;          // SPR write data
input   [width-1:0]              dat_i;          // SPR write data
input   [`OR1200_ALUOP_WIDTH-1:0]        alu_op;         // ALU operation
input   [`OR1200_ALUOP_WIDTH-1:0]        alu_op;         // ALU operation
input   [`OR1200_BRANCHOP_WIDTH-1:0]     branch_op;      // Branch operation
input   [`OR1200_BRANCHOP_WIDTH-1:0]     branch_op;      // Branch operation
Line 282... Line 289...
//
//
 
 
//
//
// What to write into SR
// What to write into SR
//
//
assign to_sr = (branch_op == `OR1200_BRANCHOP_RFE) ? esr :
assign to_sr[`OR1200_SR_FO:`OR1200_SR_OV] =
                flag_we ? {sr[`OR1200_SR_FO:`OR1200_SR_CY], flagforw, sr[`OR1200_SR_CE:`OR1200_SR_SM]} : {1'b1, spr_dat_o[`OR1200_SR_WIDTH-2:0]};
                (branch_op == `OR1200_BRANCHOP_RFE) ? esr[`OR1200_SR_FO:`OR1200_SR_OV] :
 
                (write_spr && sr_sel) ? {1'b1, spr_dat_o[`OR1200_SR_FO-1:`OR1200_SR_OV]}:
 
                sr[`OR1200_SR_FO:`OR1200_SR_OV];
 
assign to_sr[`OR1200_SR_CY] =
 
                (branch_op == `OR1200_BRANCHOP_RFE) ? esr[`OR1200_SR_CY] :
 
                cy_we ? cyforw :
 
                (write_spr && sr_sel) ? spr_dat_o[`OR1200_SR_CY] :
 
                sr[`OR1200_SR_CY];
 
assign to_sr[`OR1200_SR_F] =
 
                (branch_op == `OR1200_BRANCHOP_RFE) ? esr[`OR1200_SR_F] :
 
                flag_we ? flagforw :
 
                (write_spr && sr_sel) ? spr_dat_o[`OR1200_SR_F] :
 
                sr[`OR1200_SR_F];
 
assign to_sr[`OR1200_SR_CE:`OR1200_SR_SM] =
 
                (branch_op == `OR1200_BRANCHOP_RFE) ? esr[`OR1200_SR_CE:`OR1200_SR_SM] :
 
                (write_spr && sr_sel) ? spr_dat_o[`OR1200_SR_CE:`OR1200_SR_SM]:
 
                sr[`OR1200_SR_CE:`OR1200_SR_SM];
 
 
//
//
// Selects for system SPRs
// Selects for system SPRs
//
//
assign cfgr_sel = (spr_cs[`OR1200_SPR_GROUP_SYS] && (spr_addr[10:4] == `OR1200_SPR_CFGR));
assign cfgr_sel = (spr_cs[`OR1200_SPR_GROUP_SYS] && (spr_addr[10:4] == `OR1200_SPR_CFGR));
Line 300... Line 323...
assign esr_sel = (spr_cs[`OR1200_SPR_GROUP_SYS] && (spr_addr[10:0] == `OR1200_SPR_ESR));
assign esr_sel = (spr_cs[`OR1200_SPR_GROUP_SYS] && (spr_addr[10:0] == `OR1200_SPR_ESR));
 
 
//
//
// Write enables for system SPRs
// Write enables for system SPRs
//
//
assign sr_we = (write_spr && sr_sel) | (branch_op == `OR1200_BRANCHOP_RFE) | flag_we;
assign sr_we = (write_spr && sr_sel) | (branch_op == `OR1200_BRANCHOP_RFE) | flag_we | cy_we;
assign pc_we = (write_spr && (npc_sel | ppc_sel));
assign pc_we = (write_spr && (npc_sel | ppc_sel));
assign epcr_we = (write_spr && epcr_sel);
assign epcr_we = (write_spr && epcr_sel);
assign eear_we = (write_spr && eear_sel);
assign eear_we = (write_spr && eear_sel);
assign esr_we = (write_spr && esr_sel);
assign esr_we = (write_spr && esr_sel);
 
 
Line 324... Line 347...
// Flag alias
// Flag alias
//
//
assign flag = sr[`OR1200_SR_F];
assign flag = sr[`OR1200_SR_F];
 
 
//
//
 
// Carry alias
 
//
 
assign carry = sr[`OR1200_SR_CY];
 
 
 
//
// Supervision register
// Supervision register
//
//
always @(posedge clk or posedge rst)
always @(posedge clk or posedge rst)
        if (rst)
        if (rst)
                sr <= #1 {1'b1, {`OR1200_SR_WIDTH-2{1'b0}}, 1'b1};
                sr <= #1 {1'b1, {`OR1200_SR_WIDTH-2{1'b0}}, 1'b1};

powered by: WebSVN 2.1.0

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