修改bru,去除分支预测
This commit is contained in:
parent
e6decd7c82
commit
f43763b32c
|
@ -0,0 +1,44 @@
|
||||||
|
package cpu.pipeline.execute
|
||||||
|
|
||||||
|
import chisel3._
|
||||||
|
import chisel3.util._
|
||||||
|
import cpu.defines._
|
||||||
|
import cpu.defines.Const._
|
||||||
|
|
||||||
|
class Bru extends Module {
|
||||||
|
val io = IO(new Bundle {
|
||||||
|
val in = new Bundle {
|
||||||
|
val pc = Input(UInt(XLEN.W))
|
||||||
|
val info = Input(new Info())
|
||||||
|
val src_info = Input(new SrcInfo())
|
||||||
|
}
|
||||||
|
val out = new Bundle {
|
||||||
|
val branch = Output(Bool())
|
||||||
|
val target = Output(UInt(XLEN.W))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
val valid =
|
||||||
|
io.in.info.fusel === FuType.bru && io.in.info.valid
|
||||||
|
val src1 = io.in.src_info.src1_data
|
||||||
|
val src2 = io.in.src_info.src2_data
|
||||||
|
val op = io.in.info.op
|
||||||
|
val is_sub = !BRUOpType.isAdd(op)
|
||||||
|
val adder = (src1 +& (src2 ^ Fill(XLEN, is_sub))) + is_sub
|
||||||
|
val xor = src1 ^ src2
|
||||||
|
val sltu = !adder(XLEN)
|
||||||
|
val slt = xor(XLEN - 1) ^ sltu
|
||||||
|
val table = List(
|
||||||
|
BRUOpType.getBranchType(BRUOpType.beq) -> !xor.orR,
|
||||||
|
BRUOpType.getBranchType(BRUOpType.blt) -> slt,
|
||||||
|
BRUOpType.getBranchType(BRUOpType.bltu) -> sltu
|
||||||
|
)
|
||||||
|
io.out.branch := valid &
|
||||||
|
(LookupTree(BRUOpType.getBranchType(op), table) ^ BRUOpType.isBranchInvert(op) |
|
||||||
|
BRUOpType.isJump(op))
|
||||||
|
io.out.target := Mux1H(
|
||||||
|
Seq(
|
||||||
|
(io.out.branch) -> (io.in.pc + io.in.info.imm),
|
||||||
|
(op === BRUOpType.jalr) -> ((src1 + src2) & ~1.U(XLEN.W))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
Loading…
Reference in New Issue