|
|
@@ -23,7 +23,9 @@ class InstructionDecode extends MultiIOModule { |
|
|
*/ |
|
|
*/ |
|
|
val PC = Input(UInt(32.W)) |
|
|
val PC = Input(UInt(32.W)) |
|
|
val instruction = Input(new Instruction) |
|
|
val instruction = Input(new Instruction) |
|
|
val regWriteData = Input(UInt(32.W)) |
|
|
|
|
|
|
|
|
val writeEnable = Input(UInt(32.W)) |
|
|
|
|
|
val writeAddr = Input(UInt(32.W)) |
|
|
|
|
|
val writeData = Input(UInt(32.W)) |
|
|
|
|
|
|
|
|
val controlSignals = Output(new ControlSignals) |
|
|
val controlSignals = Output(new ControlSignals) |
|
|
val data1 = Output(UInt(32.W)) |
|
|
val data1 = Output(UInt(32.W)) |
|
|
@@ -40,17 +42,6 @@ class InstructionDecode extends MultiIOModule { |
|
|
val ALUop = RegInit(UInt(4.W), 0.U) |
|
|
val ALUop = RegInit(UInt(4.W), 0.U) |
|
|
val controlSignals = Reg(new ControlSignals) |
|
|
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 |
|
|
* Setup. You should not change this code |
|
|
@@ -67,9 +58,9 @@ class InstructionDecode extends MultiIOModule { |
|
|
|
|
|
|
|
|
registers.io.readAddress1 := io.instruction.registerRs1 |
|
|
registers.io.readAddress1 := io.instruction.registerRs1 |
|
|
registers.io.readAddress2 := io.instruction.registerRs2 |
|
|
registers.io.readAddress2 := io.instruction.registerRs2 |
|
|
registers.io.writeEnable := regInput2.writeEnable |
|
|
|
|
|
registers.io.writeAddress := regInput2.writeAddress |
|
|
|
|
|
registers.io.writeData := io.regWriteData |
|
|
|
|
|
|
|
|
registers.io.writeEnable := io.writeEnable |
|
|
|
|
|
registers.io.writeAddress := io.writeAddr |
|
|
|
|
|
registers.io.writeData := io.writeData |
|
|
|
|
|
|
|
|
ALUop := decoder.ALUop |
|
|
ALUop := decoder.ALUop |
|
|
io.ALUop := ALUop |
|
|
io.ALUop := ALUop |
|
|
@@ -79,12 +70,6 @@ class InstructionDecode extends MultiIOModule { |
|
|
io.data1 := data1 |
|
|
io.data1 := data1 |
|
|
io.data2 := data2 |
|
|
io.data2 := data2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
regInput0.writeEnable := decoder.controlSignals.regWrite |
|
|
|
|
|
regInput0.writeAddress := io.instruction.registerRd |
|
|
|
|
|
regInput1 := regInput0 |
|
|
|
|
|
regInput2 := regInput1 |
|
|
|
|
|
|
|
|
|
|
|
switch (decoder.op1Select) { |
|
|
switch (decoder.op1Select) { |
|
|
is (Op1Select.rs1) { |
|
|
is (Op1Select.rs1) { |
|
|
data1 := registers.io.readData1 |
|
|
data1 := registers.io.readData1 |
|
|
|