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

Subversion Repositories or1k

[/] [or1k/] [tags/] [rel_10/] [or1200/] [rtl/] [verilog/] [or1200_sprs.v] - Diff between revs 610 and 636

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

Rev 610 Rev 636
Line 42... Line 42...
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// CVS Revision History
// CVS Revision History
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.4  2002/01/23 07:52:36  lampret
 
// Changed default reset values for SR and ESR to match or1ksim's. Fixed flop model in or1200_dpram_32x32 when OR1200_XILINX_RAM32X1D is defined.
 
//
// Revision 1.3  2002/01/19 09:27:49  lampret
// Revision 1.3  2002/01/19 09:27:49  lampret
// SR[TEE] should be zero after reset.
// SR[TEE] should be zero after reset.
//
//
// Revision 1.2  2002/01/18 07:56:00  lampret
// Revision 1.2  2002/01/18 07:56:00  lampret
// No more low/high priority interrupts (PICPR removed). Added tick timer exception. Added exception prefix (SR[EPH]). Fixed single-step bug whenreading NPC.
// No more low/high priority interrupts (PICPR removed). Added tick timer exception. Added exception prefix (SR[EPH]). Fixed single-step bug whenreading NPC.
Line 98... Line 101...
                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
                spr_dat_pic, spr_dat_tt, spr_dat_pm,
                spr_dat_pic, spr_dat_tt, spr_dat_pm,
                spr_dat_dmmu, spr_dat_immu, spr_dat_du,
                spr_dat_dmmu, spr_dat_immu, spr_dat_du,
                spr_addr, spr_dataout, spr_cs, spr_we,
                spr_addr, spr_dat_o, spr_cs, spr_we,
 
 
                du_addr, du_dat_du, du_read,
                du_addr, du_dat_du, du_read,
                du_write
                du_write, du_dat_cpu
 
 
);
);
 
 
parameter width = `OR1200_OPERAND_WIDTH;
parameter width = `OR1200_OPERAND_WIDTH;
 
 
Line 151... Line 154...
input   [31:0]                   spr_dat_pm;     // Data from PM
input   [31:0]                   spr_dat_pm;     // Data from PM
input   [31:0]                   spr_dat_dmmu;   // Data from DMMU
input   [31:0]                   spr_dat_dmmu;   // Data from DMMU
input   [31:0]                   spr_dat_immu;   // Data from IMMU
input   [31:0]                   spr_dat_immu;   // Data from IMMU
input   [31:0]                   spr_dat_du;     // Data from DU
input   [31:0]                   spr_dat_du;     // Data from DU
output  [31:0]                   spr_addr;       // SPR Address
output  [31:0]                   spr_addr;       // SPR Address
output  [31:0]                   spr_dataout;    // Data to unit
output  [31:0]                   spr_dat_o;      // Data to unit
output  [31:0]                   spr_cs;         // Unit select
output  [31:0]                   spr_cs;         // Unit select
output                          spr_we;         // SPR write enable
output                          spr_we;         // SPR write enable
 
 
//
//
// To/from Debug Unit
// To/from Debug Unit
//
//
input   [width-1:0]              du_addr;        // Address
input   [width-1:0]              du_addr;        // Address
input   [width-1:0]              du_dat_du;      // Data from DU to SPRS
input   [width-1:0]              du_dat_du;      // Data from DU to SPRS
input                           du_read;        // Read qualifier
input                           du_read;        // Read qualifier
input                           du_write;       // Write qualifier
input                           du_write;       // Write qualifier
 
output  [width-1:0]              du_dat_cpu;     // Data from SPRS to DU
 
 
//
//
// Internal regs & wires
// Internal regs & wires
//
//
reg     [`OR1200_SR_WIDTH-1:0]           sr;             // SR
reg     [`OR1200_SR_WIDTH-1:0]           sr;             // SR
Line 202... Line 206...
// OR from debug unit address
// OR from debug unit address
//
//
assign spr_addr = du_access ? du_addr : addrbase + {16'h0000, addrofs};
assign spr_addr = du_access ? du_addr : addrbase + {16'h0000, addrofs};
 
 
//
//
// SPR is written with dat_i from l.mtspr
// SPR is written by debug unit or by l.mtspr
// OR by debug unit
//
 
assign spr_dat_o = du_write ? du_dat_du : dat_i;
 
 
 
//
 
// debug unit data input:
 
//  - write into debug unit SPRs by debug unit itself
 
//  - read of SPRS by debug unit
 
//  - write into debug unit SPRs by l.mtspr
//
//
assign spr_dataout = du_write ? du_dat_du : du_read ? to_wbmux : dat_i;
assign du_dat_cpu = du_write ? du_dat_du : du_read ? to_wbmux : dat_i;
 
 
//
//
// Write into SPRs when l.mtspr
// Write into SPRs when l.mtspr
//
//
assign spr_we = du_write | write_spr;
assign spr_we = du_write | write_spr;
Line 263... Line 274...
//
//
 
 
//
//
// What to write into SR
// What to write into SR
//
//
assign to_sr = (branch_op == `OR1200_BRANCHOP_RFE) ? esr : {1'b1, spr_dataout[`OR1200_SR_WIDTH-2:0]};
assign to_sr = (branch_op == `OR1200_BRANCHOP_RFE) ? esr : {1'b1, spr_dat_o[`OR1200_SR_WIDTH-2:0]};
 
 
//
//
// 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 324... Line 335...
                sr[`OR1200_SR_F] <= #1 flagforw;
                sr[`OR1200_SR_F] <= #1 flagforw;
 
 
//
//
// MTSPR/MFSPR interface
// MTSPR/MFSPR interface
//
//
always @(sprs_op or spr_addr or spr_dataout or sys_data or spr_dat_mac or spr_dat_pic or spr_dat_pm or
always @(sprs_op or spr_addr or sys_data or spr_dat_mac or spr_dat_pic or spr_dat_pm or
        spr_dat_dmmu or spr_dat_immu or spr_dat_du or spr_dat_tt) begin
        spr_dat_dmmu or spr_dat_immu or spr_dat_du or spr_dat_tt) begin
        case (sprs_op)  // synopsys full_case parallel_case
        case (sprs_op)  // synopsys full_case parallel_case
                `OR1200_ALUOP_MTSR : begin
                `OR1200_ALUOP_MTSR : begin
`ifdef OR1200_VERBOSE
 
// synopsys translate_off
 
                        $display("%t: SPRS: mtspr (%h) <- %h", $time, spr_addr, spr_dataout);
 
// synopsys translate_on
 
`endif
 
                        write_spr = 1'b1;
                        write_spr = 1'b1;
                        read_spr = 1'b0;
                        read_spr = 1'b0;
                        to_wbmux = 32'b0;
                        to_wbmux = 32'b0;
                end
                end
                `OR1200_ALUOP_MFSR : begin
                `OR1200_ALUOP_MFSR : begin

powered by: WebSVN 2.1.0

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