📄 or1200_sprs.v
字号:
//// Decide if it is debug unit access//assign du_access = du_read | du_write;//// Generate sprs opcode//assign sprs_op = du_write ? `OR1200_ALUOP_MTSR : du_read ? `OR1200_ALUOP_MFSR : alu_op;//// Generate SPR address from base address and offset// OR from debug unit address//assign spr_addr = du_access ? du_addr : addrbase | {16'h0000, addrofs};//// SPR is written by debug unit or by l.mtspr//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 du_dat_cpu = du_write ? du_dat_du : du_read ? to_wbmux : dat_i;//// Write into SPRs when l.mtspr//assign spr_we = du_write | write_spr;//// Qualify chip selects//assign spr_cs = unqualified_cs & {32{read_spr | write_spr}};//// Decoding of groups//always @(spr_addr) case (spr_addr[`OR1200_SPR_GROUP_BITS]) // synopsys parallel_case `OR1200_SPR_GROUP_WIDTH'd00: unqualified_cs = 32'b00000000_00000000_00000000_00000001; `OR1200_SPR_GROUP_WIDTH'd01: unqualified_cs = 32'b00000000_00000000_00000000_00000010; `OR1200_SPR_GROUP_WIDTH'd02: unqualified_cs = 32'b00000000_00000000_00000000_00000100; `OR1200_SPR_GROUP_WIDTH'd03: unqualified_cs = 32'b00000000_00000000_00000000_00001000; `OR1200_SPR_GROUP_WIDTH'd04: unqualified_cs = 32'b00000000_00000000_00000000_00010000; `OR1200_SPR_GROUP_WIDTH'd05: unqualified_cs = 32'b00000000_00000000_00000000_00100000; `OR1200_SPR_GROUP_WIDTH'd06: unqualified_cs = 32'b00000000_00000000_00000000_01000000; `OR1200_SPR_GROUP_WIDTH'd07: unqualified_cs = 32'b00000000_00000000_00000000_10000000; `OR1200_SPR_GROUP_WIDTH'd08: unqualified_cs = 32'b00000000_00000000_00000001_00000000; `OR1200_SPR_GROUP_WIDTH'd09: unqualified_cs = 32'b00000000_00000000_00000010_00000000; `OR1200_SPR_GROUP_WIDTH'd10: unqualified_cs = 32'b00000000_00000000_00000100_00000000; `OR1200_SPR_GROUP_WIDTH'd11: unqualified_cs = 32'b00000000_00000000_00001000_00000000; `OR1200_SPR_GROUP_WIDTH'd12: unqualified_cs = 32'b00000000_00000000_00010000_00000000; `OR1200_SPR_GROUP_WIDTH'd13: unqualified_cs = 32'b00000000_00000000_00100000_00000000; `OR1200_SPR_GROUP_WIDTH'd14: unqualified_cs = 32'b00000000_00000000_01000000_00000000; `OR1200_SPR_GROUP_WIDTH'd15: unqualified_cs = 32'b00000000_00000000_10000000_00000000; `OR1200_SPR_GROUP_WIDTH'd16: unqualified_cs = 32'b00000000_00000001_00000000_00000000; `OR1200_SPR_GROUP_WIDTH'd17: unqualified_cs = 32'b00000000_00000010_00000000_00000000; `OR1200_SPR_GROUP_WIDTH'd18: unqualified_cs = 32'b00000000_00000100_00000000_00000000; `OR1200_SPR_GROUP_WIDTH'd19: unqualified_cs = 32'b00000000_00001000_00000000_00000000; `OR1200_SPR_GROUP_WIDTH'd20: unqualified_cs = 32'b00000000_00010000_00000000_00000000; `OR1200_SPR_GROUP_WIDTH'd21: unqualified_cs = 32'b00000000_00100000_00000000_00000000; `OR1200_SPR_GROUP_WIDTH'd22: unqualified_cs = 32'b00000000_01000000_00000000_00000000; `OR1200_SPR_GROUP_WIDTH'd23: unqualified_cs = 32'b00000000_10000000_00000000_00000000; `OR1200_SPR_GROUP_WIDTH'd24: unqualified_cs = 32'b00000001_00000000_00000000_00000000; `OR1200_SPR_GROUP_WIDTH'd25: unqualified_cs = 32'b00000010_00000000_00000000_00000000; `OR1200_SPR_GROUP_WIDTH'd26: unqualified_cs = 32'b00000100_00000000_00000000_00000000; `OR1200_SPR_GROUP_WIDTH'd27: unqualified_cs = 32'b00001000_00000000_00000000_00000000; `OR1200_SPR_GROUP_WIDTH'd28: unqualified_cs = 32'b00010000_00000000_00000000_00000000; `OR1200_SPR_GROUP_WIDTH'd29: unqualified_cs = 32'b00100000_00000000_00000000_00000000; `OR1200_SPR_GROUP_WIDTH'd30: unqualified_cs = 32'b01000000_00000000_00000000_00000000; `OR1200_SPR_GROUP_WIDTH'd31: unqualified_cs = 32'b10000000_00000000_00000000_00000000; endcase//// SPRs System Group////// What to write into SR//assign to_sr[`OR1200_SR_FO:`OR1200_SR_OV] = (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//assign cfgr_sel = (spr_cs[`OR1200_SPR_GROUP_SYS] && (spr_addr[10:4] == `OR1200_SPR_CFGR));assign rf_sel = (spr_cs[`OR1200_SPR_GROUP_SYS] && (spr_addr[10:5] == `OR1200_SPR_RF));assign npc_sel = (spr_cs[`OR1200_SPR_GROUP_SYS] && (spr_addr[10:0] == `OR1200_SPR_NPC));assign ppc_sel = (spr_cs[`OR1200_SPR_GROUP_SYS] && (spr_addr[10:0] == `OR1200_SPR_PPC));assign sr_sel = (spr_cs[`OR1200_SPR_GROUP_SYS] && (spr_addr[10:0] == `OR1200_SPR_SR));assign epcr_sel = (spr_cs[`OR1200_SPR_GROUP_SYS] && (spr_addr[10:0] == `OR1200_SPR_EPCR));assign eear_sel = (spr_cs[`OR1200_SPR_GROUP_SYS] && (spr_addr[10:0] == `OR1200_SPR_EEAR));assign esr_sel = (spr_cs[`OR1200_SPR_GROUP_SYS] && (spr_addr[10:0] == `OR1200_SPR_ESR));//// Write enables for system SPRs//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 epcr_we = (write_spr && epcr_sel);assign eear_we = (write_spr && eear_sel);assign esr_we = (write_spr && esr_sel);//// Output from system SPRs//assign sys_data = (spr_dat_cfgr & {32{read_spr & cfgr_sel}}) | (spr_dat_rf & {32{read_spr & rf_sel}}) | (spr_dat_npc & {32{read_spr & npc_sel}}) | (spr_dat_ppc & {32{read_spr & ppc_sel}}) | ({{32-`OR1200_SR_WIDTH{1'b0}},sr} & {32{read_spr & sr_sel}}) | (epcr & {32{read_spr & epcr_sel}}) | (eear & {32{read_spr & eear_sel}}) | ({{32-`OR1200_SR_WIDTH{1'b0}},esr} & {32{read_spr & esr_sel}});//// Flag alias//assign flag = sr[`OR1200_SR_F];//// Carry alias//assign carry = sr[`OR1200_SR_CY];//// Supervision register//always @(posedge clk or posedge rst) if (rst) sr <= #1 {1'b1, {`OR1200_SR_WIDTH-2{1'b0}}, 1'b1}; else if (except_started) begin sr[`OR1200_SR_SM] <= #1 1'b1; sr[`OR1200_SR_TEE] <= #1 1'b0; sr[`OR1200_SR_IEE] <= #1 1'b0; sr[`OR1200_SR_DME] <= #1 1'b0; sr[`OR1200_SR_IME] <= #1 1'b0; end else if (sr_we) sr <= #1 to_sr[`OR1200_SR_WIDTH-1:0];//// MTSPR/MFSPR interface//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 case (sprs_op) // synopsys parallel_case `OR1200_ALUOP_MTSR : begin write_spr = 1'b1; read_spr = 1'b0; to_wbmux = 32'b0; end `OR1200_ALUOP_MFSR : begin casex (spr_addr[`OR1200_SPR_GROUP_BITS]) // synopsys parallel_case `OR1200_SPR_GROUP_TT: to_wbmux = spr_dat_tt; `OR1200_SPR_GROUP_PIC: to_wbmux = spr_dat_pic; `OR1200_SPR_GROUP_PM: to_wbmux = spr_dat_pm; `OR1200_SPR_GROUP_DMMU: to_wbmux = spr_dat_dmmu; `OR1200_SPR_GROUP_IMMU: to_wbmux = spr_dat_immu; `OR1200_SPR_GROUP_MAC: to_wbmux = spr_dat_mac; `OR1200_SPR_GROUP_DU: to_wbmux = spr_dat_du; `OR1200_SPR_GROUP_SYS: to_wbmux = sys_data; default: to_wbmux = 32'b0; endcase write_spr = 1'b0; read_spr = 1'b1; end default : begin write_spr = 1'b0; read_spr = 1'b0; to_wbmux = 32'b0; end endcaseendendmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -