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
|