|
|
|
@@ -35,6 +35,22 @@ class InstructionDecode extends MultiIOModule { |
|
|
|
val registers = Module(new Registers) |
|
|
|
val decoder = Module(new Decoder).io |
|
|
|
|
|
|
|
val data1 = RegInit(UInt(32.W), 0.U) |
|
|
|
val data2 = RegInit(UInt(32.W), 0.U) |
|
|
|
val ALUop = RegInit(UInt(4.W), 0.U) |
|
|
|
val controlSignals = Reg(new ControlSignals) |
|
|
|
|
|
|
|
// The data will be written back in 4 cycles, |
|
|
|
// so we move the data between registers while we wait |
|
|
|
class RegInput extends Bundle { |
|
|
|
val writeEnable = Bool() |
|
|
|
val writeAddress = UInt(32.W) |
|
|
|
} |
|
|
|
|
|
|
|
val regInput0 = Reg(new RegInput) |
|
|
|
val regInput1 = Reg(new RegInput) |
|
|
|
val regInput2 = Reg(new RegInput) |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Setup. You should not change this code |
|
|
|
@@ -51,27 +67,36 @@ class InstructionDecode extends MultiIOModule { |
|
|
|
|
|
|
|
registers.io.readAddress1 := io.instruction.registerRs1 |
|
|
|
registers.io.readAddress2 := io.instruction.registerRs2 |
|
|
|
registers.io.writeEnable := decoder.controlSignals.regWrite |
|
|
|
registers.io.writeAddress := io.instruction.registerRd |
|
|
|
registers.io.writeEnable := regInput2.writeEnable |
|
|
|
registers.io.writeAddress := regInput2.writeAddress |
|
|
|
registers.io.writeData := io.regWriteData |
|
|
|
|
|
|
|
io.controlSignals := decoder.controlSignals |
|
|
|
io.ALUop := decoder.ALUop |
|
|
|
io.data1 := 0.U |
|
|
|
io.data2 := 0.U |
|
|
|
ALUop := decoder.ALUop |
|
|
|
io.ALUop := ALUop |
|
|
|
controlSignals := decoder.controlSignals |
|
|
|
io.controlSignals := controlSignals |
|
|
|
|
|
|
|
io.data1 := data1 |
|
|
|
io.data2 := data2 |
|
|
|
|
|
|
|
|
|
|
|
regInput0.writeEnable := decoder.controlSignals.regWrite |
|
|
|
regInput0.writeAddress := io.instruction.registerRd |
|
|
|
regInput1 := regInput0 |
|
|
|
regInput2 := regInput1 |
|
|
|
|
|
|
|
switch (decoder.op1Select) { |
|
|
|
is (Op1Select.rs1) { |
|
|
|
io.data1 := registers.io.readData1 |
|
|
|
data1 := registers.io.readData1 |
|
|
|
} |
|
|
|
is (Op1Select.PC) { |
|
|
|
io.data1 := io.PC |
|
|
|
data1 := io.PC |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
switch (decoder.op2Select) { |
|
|
|
is (Op2Select.rs2) { |
|
|
|
io.data2 := registers.io.readData2 |
|
|
|
data2 := registers.io.readData2 |
|
|
|
} |
|
|
|
is (Op2Select.imm) { |
|
|
|
val immTypeMap = Array( |
|
|
|
@@ -83,7 +108,7 @@ class InstructionDecode extends MultiIOModule { |
|
|
|
ImmFormat.SHAMT -> 0.S, // TODO: Implement SHAMT |
|
|
|
) |
|
|
|
|
|
|
|
io.data2 := MuxLookup( |
|
|
|
data2 := MuxLookup( |
|
|
|
decoder.immType, |
|
|
|
0.S, |
|
|
|
immTypeMap, |
|
|
|
|