|
|
@@ -78,7 +78,7 @@ class CPU extends MultiIOModule { |
|
|
|
|
|
|
|
|
// Stage 1 |
|
|
// Stage 1 |
|
|
IFBarrier.in := IF.io |
|
|
IFBarrier.in := IF.io |
|
|
IF.io.addr := IFBarrier.out.next |
|
|
|
|
|
|
|
|
IF.io.addr := IFBarrier.out.PC + 4.U |
|
|
|
|
|
|
|
|
// Stage 2 |
|
|
// Stage 2 |
|
|
ID.io.instruction := IFBarrier.out.instruction |
|
|
ID.io.instruction := IFBarrier.out.instruction |
|
|
@@ -147,7 +147,9 @@ class CPU extends MultiIOModule { |
|
|
rs2 := IDBarrier.out.reg2 |
|
|
rs2 := IDBarrier.out.reg2 |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//printf(p"0x${Hexadecimal(IF.io.PC)}: Reg write: ${MEMBarrier.out.controlSignals.regWrite}, ExToR1: $exToRs1, MEMToR1: $memToRs1, wbToR1: $wbToRs1, R1: $rs1, EX: ${EXBarrier.out.result}, MEM: ${MEMBarrier.out.dataOut}, WB: ${WBBarrier.out.writeback}}\n") |
|
|
|
|
|
|
|
|
//printf(p"0x${Hexadecimal(IFBarrier.out.PC)}: next: ${Hexadecimal(IF.io.addr)} freeze: $freeze, ID imm: ${IDBarrier.out.imm}, ID PC: ${IDBarrier.out.PC}, EX result: ${EXBarrier.out.result}\n") |
|
|
|
|
|
|
|
|
|
|
|
//printf(p"0x${Hexadecimal(IF.io.PC)}: Reg write: ${MEMBarrier.out.controlSignals.regWrite}, ExToR1: $exToRs1, MEMToR1: $memToRs1, wbToR1: $wbToRs1, R1: $rs1, ID: ${IDBarrier.out.imm.asUInt} EX: ${EXBarrier.out.result}, MEM: $writeback, WB: ${WBBarrier.out.writeback}}\n") |
|
|
|
|
|
|
|
|
//printf(p"0x${Hexadecimal(IF.io.PC)}: Next: 0x${Hexadecimal(IFBarrier.out.next)}, freeze: $freeze, IF: ${IFBarrier.out.instruction}, ID: ${IDBarrier.out.instruction}, EX: ${EXBarrier.out.instruction}, MEM: ${MEMBarrier.out.instruction}\n") |
|
|
//printf(p"0x${Hexadecimal(IF.io.PC)}: Next: 0x${Hexadecimal(IFBarrier.out.next)}, freeze: $freeze, IF: ${IFBarrier.out.instruction}, ID: ${IDBarrier.out.instruction}, EX: ${EXBarrier.out.instruction}, MEM: ${MEMBarrier.out.instruction}\n") |
|
|
|
|
|
|
|
|
@@ -172,18 +174,22 @@ class CPU extends MultiIOModule { |
|
|
MEM.io.writeEnable := EXBarrier.out.controlSignals.memWrite |
|
|
MEM.io.writeEnable := EXBarrier.out.controlSignals.memWrite |
|
|
MEM.io.dataAddress := EXBarrier.out.result |
|
|
MEM.io.dataAddress := EXBarrier.out.result |
|
|
|
|
|
|
|
|
when (EXBarrier.out.branch) { |
|
|
|
|
|
//IF.io.addr := EXBarrier.out.result |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
MEMBarrier.in.PC := EXBarrier.out.PC |
|
|
MEMBarrier.in.PC := EXBarrier.out.PC |
|
|
MEMBarrier.in.instruction := EXBarrier.out.instruction |
|
|
MEMBarrier.in.instruction := EXBarrier.out.instruction |
|
|
MEMBarrier.in.controlSignals := EXBarrier.out.controlSignals |
|
|
MEMBarrier.in.controlSignals := EXBarrier.out.controlSignals |
|
|
MEMBarrier.in.result := EXBarrier.out.result |
|
|
MEMBarrier.in.result := EXBarrier.out.result |
|
|
|
|
|
MEMBarrier.in.branch := EXBarrier.out.branch |
|
|
MEMBarrier.in.dataOut := MEM.io.dataOut |
|
|
MEMBarrier.in.dataOut := MEM.io.dataOut |
|
|
|
|
|
|
|
|
// Stage 5 |
|
|
// Stage 5 |
|
|
when (freeze) { |
|
|
|
|
|
|
|
|
when (EXBarrier.out.branch) { |
|
|
|
|
|
IF.io.addr := EXBarrier.out.result |
|
|
|
|
|
//printf(p"Jumping to ${EXBarrier.out.result}\n") |
|
|
|
|
|
IDBarrier.clear := true.B |
|
|
|
|
|
EXBarrier.clear := true.B |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
when (false.B && freeze) { |
|
|
ID.io.writeEnable := false.B |
|
|
ID.io.writeEnable := false.B |
|
|
ID.io.writeAddr := 0.U |
|
|
ID.io.writeAddr := 0.U |
|
|
ID.io.writeData := 0.U |
|
|
ID.io.writeData := 0.U |
|
|
@@ -198,13 +204,11 @@ class CPU extends MultiIOModule { |
|
|
WBBarrier.in.controlSignals := MEMBarrier.out.controlSignals |
|
|
WBBarrier.in.controlSignals := MEMBarrier.out.controlSignals |
|
|
WBBarrier.in.writeback := writeback |
|
|
WBBarrier.in.writeback := writeback |
|
|
|
|
|
|
|
|
writeback := MEMBarrier.out.result |
|
|
|
|
|
|
|
|
|
|
|
when (MEMBarrier.out.controlSignals.memToReg) { |
|
|
when (MEMBarrier.out.controlSignals.memToReg) { |
|
|
writeback := MEMBarrier.out.dataOut |
|
|
writeback := MEMBarrier.out.dataOut |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
when (MEMBarrier.out.controlSignals.jump) { |
|
|
|
|
|
|
|
|
}.elsewhen (MEMBarrier.out.controlSignals.jump) { |
|
|
writeback := MEMBarrier.out.PC + 4.U |
|
|
writeback := MEMBarrier.out.PC + 4.U |
|
|
|
|
|
}.otherwise { |
|
|
|
|
|
writeback := MEMBarrier.out.result |
|
|
} |
|
|
} |
|
|
} |
|
|
} |