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};
|