checks.ia_fwd: add check.
parent
bfd1f3135e
commit
e0e434204b
@ -1 +1,2 @@
|
|||||||
from .unique import *
|
from .unique import *
|
||||||
|
from .ia_fwd import *
|
||||||
|
@ -0,0 +1,74 @@
|
|||||||
|
from amaranth import *
|
||||||
|
from amaranth.asserts import *
|
||||||
|
|
||||||
|
from .. import pfv
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ["IAForwardCheck", "IAForwardCover"]
|
||||||
|
|
||||||
|
|
||||||
|
class IAForwardCheck(Elaboratable):
|
||||||
|
"""IA forward check.
|
||||||
|
|
||||||
|
Given two instructions retiring in order, check that the NIA of the first matches the CIA
|
||||||
|
of the second.
|
||||||
|
"""
|
||||||
|
def __init__(self):
|
||||||
|
self.pre = Signal()
|
||||||
|
self.post = Signal()
|
||||||
|
self.pfv = pfv.Interface()
|
||||||
|
|
||||||
|
def elaborate(self, platform):
|
||||||
|
m = Module()
|
||||||
|
|
||||||
|
pred_order = AnyConst(self.pfv.order.width)
|
||||||
|
pred_stb = Signal()
|
||||||
|
pred_nia = Signal.like(self.pfv.nia)
|
||||||
|
|
||||||
|
with m.If(self.pfv.stb & (self.pfv.order == pred_order)):
|
||||||
|
m.d.sync += [
|
||||||
|
pred_stb.eq(1),
|
||||||
|
pred_nia.eq(self.pfv.nia)
|
||||||
|
]
|
||||||
|
|
||||||
|
with m.If(self.post):
|
||||||
|
m.d.sync += [
|
||||||
|
Assume(self.pfv.stb),
|
||||||
|
Assume(self.pfv.order == pred_order + 1),
|
||||||
|
Assume(self.pfv.order > 0),
|
||||||
|
Assert(pred_stb.implies(self.pfv.cia == pred_nia)),
|
||||||
|
]
|
||||||
|
|
||||||
|
return m
|
||||||
|
|
||||||
|
|
||||||
|
class IAForwardCover(Elaboratable):
|
||||||
|
def __init__(self):
|
||||||
|
self.pre = Signal()
|
||||||
|
self.post = Signal()
|
||||||
|
self.pfv = pfv.Interface()
|
||||||
|
|
||||||
|
def elaborate(self, platform):
|
||||||
|
m = Module()
|
||||||
|
|
||||||
|
insn_count = Signal(range(4))
|
||||||
|
pred_branch = Signal()
|
||||||
|
|
||||||
|
with m.If(self.pfv.stb):
|
||||||
|
m.d.sync += [
|
||||||
|
insn_count .eq(insn_count + 1),
|
||||||
|
pred_branch.eq(self.pfv.nia != (self.pfv.cia + 4)),
|
||||||
|
]
|
||||||
|
|
||||||
|
cover_1 = Signal()
|
||||||
|
cover_2 = Signal()
|
||||||
|
|
||||||
|
m.d.comb += [
|
||||||
|
cover_1.eq((insn_count > 1) & pred_branch),
|
||||||
|
cover_2.eq(cover_1 & self.pfv.stb),
|
||||||
|
|
||||||
|
Cover(cover_1),
|
||||||
|
Cover(cover_2),
|
||||||
|
]
|
||||||
|
|
||||||
|
return m
|
Loading…
Reference in New Issue