1 from nmigen
import Elaboratable
, Module
, Signal
4 __all__
= ["BranchPredictor"]
7 class BranchPredictor(Elaboratable
):
9 self
.d_branch
= Signal()
10 self
.d_jump
= Signal()
11 self
.d_offset
= Signal((32, True))
12 self
.d_pc
= Signal(32)
13 self
.d_rs1_re
= Signal()
15 self
.d_branch_taken
= Signal()
16 self
.d_branch_target
= Signal(32)
17 self
.d_fetch_misaligned
= Signal()
19 def elaborate(self
, platform
):
22 with m
.If(self
.d_branch
):
23 # Backward conditional branches are predicted as taken.
24 # Forward conditional branches are predicted as not taken.
25 m
.d
.comb
+= self
.d_branch_taken
.eq(self
.d_offset
[-1])
27 # Direct jumps are predicted as taken.
28 # Other branch types (ie. indirect jumps, exceptions) are not predicted.
29 m
.d
.comb
+= self
.d_branch_taken
.eq(self
.d_jump
& ~self
.d_rs1_re
)
32 self
.d_branch_target
.eq(self
.d_pc
+ self
.d_offset
),
33 self
.d_fetch_misaligned
.eq(self
.d_branch_target
[:2].bool())