diff --git a/src/ieu/bmu/bmuctrl.sv b/src/ieu/bmu/bmuctrl.sv index 4e0f1efc..4217f643 100644 --- a/src/ieu/bmu/bmuctrl.sv +++ b/src/ieu/bmu/bmuctrl.sv @@ -63,18 +63,39 @@ module bmuctrl( // Main Instruction Decoder always_comb casez({OpD, Funct7D, Funct3D}) - // ALUSelect_zbsD - 17'b0010011_010010?_001: BMUControlsD = `BMUCTRLW'b111_0001; // bclri - 17'b0010011_010010?_101: BMUControlsD = `BMUCTRLW'b101_0001; // bexti - 17'b0010011_011010?_001: BMUControlsD = `BMUCTRLW'b100_0001; // binvi - 17'b0010011_001010?_001: BMUControlsD = `BMUCTRLW'b110_0001; // bseti - 17'b0110011_010010?_001: BMUControlsD = `BMUCTRLW'b111_0001; // bclr - 17'b0110011_010010?_101: BMUControlsD = `BMUCTRLW'b101_0001; // bext - 17'b0110011_011010?_001: BMUControlsD = `BMUCTRLW'b100_0001; // binv - 17'b0110011_001010?_001: BMUControlsD = `BMUCTRLW'b110_0001; // bset - 17'b0?1?011_0?0000?_?01: BMUControlsD = `BMUCTRLW'b001_0000; // sra, srai, srl, srli, sll, slli - 17'b0110011_0000101_???: BMUControlsD = `BMUCTRLW'b001_0010; // ZBC instruction - default: BMUControlsD = {Funct3D, {4'b0}}; // not B instruction or shift + // ALUSelect_BSelect + 17'b0010011_0100100_001: BMUControlsD = `BMUCTRLW'b111_0001; // bclri + 17'b0010011_0100101_001: if (`XLEN == 64) + BMUControlsD = `BMUCTRLW'b111_0001; // bclri (rv64) + else + BMUControlsD = `BMUCTRLW'b000_0000; // illegal instruction + 17'b0010011_0100100_101: BMUControlsD = `BMUCTRLW'b101_0001; // bexti + 17'b0010011_0100101_101: if (`XLEN == 64) + BMUControlsD = `BMUCTRLW'b101_0001; // bexti (rv64) + else + BMUControlsD = `BMUCTRLW'b000_0000; // illegal instruction + 17'b0010011_0110100_001: BMUControlsD = `BMUCTRLW'b100_0001; // binvi + 17'b0010011_0110101_001: if (`XLEN == 64) + BMUControlsD = `BMUCTRLW'b100_0001; // binvi (rv64) + else + BMUControlsD = `BMUCTRLW'b000_0000; // illegal instruction + 17'b0010011_0010100_001: BMUControlsD = `BMUCTRLW'b110_0001; // bseti + 17'b0010011_0010101_001: if (`XLEN == 64) + BMUControlsD = `BMUCTRLW'b110_0001; // bseti + else + BMUControlsD = `BMUCTRLW'b000_0000; // illegal instruction + 17'b0110011_0100100_001: BMUControlsD = `BMUCTRLW'b111_0001; // bclr + 17'b0110011_0100100_101: BMUControlsD = `BMUCTRLW'b101_0001; // bext + 17'b0110011_0110100_001: BMUControlsD = `BMUCTRLW'b100_0001; // binv + 17'b0110011_0010100_001: BMUControlsD = `BMUCTRLW'b110_0001; // bset + 17'b0?1?011_0?0000?_?01: BMUControlsD = `BMUCTRLW'b001_0000; // sra, srai, srl, srli, sll, slli + 17'b0110011_0000101_0??: BMUControlsD = `BMUCTRLW'b000_0010; // ZBC instruction + 17'b0110011_0010000_?01: BMUControlsD = `BMUCTRLW'b001_1000; // slli.uw + 17'b0110011_0010000_010: BMUControlsD = `BMUCTRLW'b000_1000; // sh1add + 17'b0110011_0010000_100: BMUControlsD = `BMUCTRLW'b000_1000; // sh2add + 17'b0110011_0010000_110: BMUControlsD = `BMUCTRLW'b000_1000; // sh3add + 17'b0110011_0000100_000: BMUControlsD = `BMUCTRLW'b000_1000; // sh3add + default: BMUControlsD = {Funct3D, {4'b0}}; // not B instruction or shift endcase // Unpack Control Signals