diff --git a/hdl/hazard3_csr.v b/hdl/hazard3_csr.v index 48cb924..3965cbc 100644 --- a/hdl/hazard3_csr.v +++ b/hdl/hazard3_csr.v @@ -435,7 +435,7 @@ end // preemption level: this masking helps avoid re-taking IRQs in frames that you // have preempted. -assign meipa = {{MAX_IRQS{1'b0}}, irq_r} | meifa; +assign meipa = {{MAX_IRQS-NUM_IRQS{1'b0}}, irq_r} | meifa; reg [NUM_IRQS-1:0] eirq_active_above_preempt; reg [NUM_IRQS-1:0] eirq_active_above_ppreempt; diff --git a/hdl/hazard3_instr_decompress.v b/hdl/hazard3_instr_decompress.v index 014e5d8..d2f3902 100644 --- a/hdl/hazard3_instr_decompress.v +++ b/hdl/hazard3_instr_decompress.v @@ -84,22 +84,22 @@ end else begin: instr_decompress casez (instr_in[15:0]) 16'h0: invalid = 1'b1; RV_C_ADDI4SPN: instr_out = RV_NOZ_ADDI | rfmt_rd(rd_s) | rfmt_rs1(5'h2) - | ({instr_in[10:7], instr_in[12:11], instr_in[5], instr_in[6], 2'b00} << 20); + | {2'h0, instr_in[10:7], instr_in[12:11], instr_in[5], instr_in[6], 2'b00, 20'h00000}; RV_C_LW: instr_out = RV_NOZ_LW | rfmt_rd(rd_s) | rfmt_rs1(rs1_s) - | ({instr_in[5], instr_in[12:10], instr_in[6], 2'b00} << 20); + | {6'h00, instr_in[5], instr_in[12:10], instr_in[6], 2'b00, 20'h00000}; RV_C_SW: instr_out = RV_NOZ_SW | rfmt_rs2(rs2_s) | rfmt_rs1(rs1_s) - | ({instr_in[11:10], instr_in[6], 2'b00} << 7) | ({instr_in[5], instr_in[12]} << 25); + | {5'h00, instr_in[5], instr_in[12], 13'h000, instr_in[11:10], instr_in[6], 2'b00, 7'h00}; RV_C_ADDI: instr_out = RV_NOZ_ADDI | rfmt_rd(rd_l) | rfmt_rs1(rs1_l) | imm_ci; RV_C_JAL: instr_out = RV_NOZ_JAL | rfmt_rd(5'h1) | imm_cj; RV_C_J: instr_out = RV_NOZ_JAL | rfmt_rd(5'h0) | imm_cj; RV_C_LI: instr_out = RV_NOZ_ADDI | rfmt_rd(rd_l) | imm_ci; RV_C_LUI: begin if (rd_l == 5'h2) begin - // addi6sp + // addi16sp instr_out = RV_NOZ_ADDI | rfmt_rd(5'h2) | rfmt_rs1(5'h2) | - ({{3{instr_in[12]}}, instr_in[4:3], instr_in[5], instr_in[2], instr_in[6]} << 24); + {{3{instr_in[12]}}, instr_in[4:3], instr_in[5], instr_in[2], instr_in[6], 24'h000000}; end else begin - instr_out = RV_NOZ_LUI | rfmt_rd(rd_l) | ({{15{instr_in[12]}}, instr_in[6:2]} << 12); + instr_out = RV_NOZ_LUI | rfmt_rd(rd_l) | {{15{instr_in[12]}}, instr_in[6:2], 12'h000}; end invalid = ~|{instr_in[12], instr_in[6:2]}; // RESERVED if imm == 0 end @@ -129,12 +129,12 @@ end else begin: instr_decompress end end RV_C_LWSP: begin - instr_out = RV_NOZ_LW | rfmt_rd(rd_l) | rfmt_rs1(5'h2) - | ({instr_in[3:2], instr_in[12], instr_in[6:4], 2'b00} << 20); + instr_out = RV_NOZ_LW | rfmt_rd(rd_l) | rfmt_rs1(5'h2) | + {4'h0, instr_in[3:2], instr_in[12], instr_in[6:4], 2'b00, 20'h00000}; invalid = ~|rd_l; // RESERVED end RV_C_SWSP: instr_out = RV_NOZ_SW | rfmt_rs2(rs2_l) | rfmt_rs1(5'h2) - | ({instr_in[11:9], 2'b00} << 7) | ({instr_in[8:7], instr_in[12]} << 25); + | {4'h0, instr_in[8:7], instr_in[12], 13'h0000, instr_in[11:9], 2'b00, 7'h00}; RV_C_BEQZ: instr_out = RV_NOZ_BEQ | rfmt_rs1(rs1_s) | imm_cb; RV_C_BNEZ: instr_out = RV_NOZ_BNE | rfmt_rs1(rs1_s) | imm_cb; default: invalid = 1'b1;