You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
from amaranth import *
 | 
						|
from amaranth.asserts import *
 | 
						|
 | 
						|
from .. import PowerFVCheck
 | 
						|
from ... import pfv, tb
 | 
						|
 | 
						|
 | 
						|
__all__ = ["IAForwardSpec", "IAForwardCheck"]
 | 
						|
 | 
						|
 | 
						|
class IAForwardSpec(Elaboratable):
 | 
						|
    """IA forward specification.
 | 
						|
 | 
						|
    Given two instructions retiring in order, the NIA of the first must match the CIA
 | 
						|
    of the second.
 | 
						|
    """
 | 
						|
    def __init__(self, post):
 | 
						|
        self.pfv  = pfv.Interface()
 | 
						|
        self.post = tb.Trigger(cycle=post)
 | 
						|
 | 
						|
    def triggers(self):
 | 
						|
        yield self.post
 | 
						|
 | 
						|
    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.stb):
 | 
						|
            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 IAForwardCheck(PowerFVCheck, name="cons_ia_fwd"):
 | 
						|
    def get_testbench(self, dut, post):
 | 
						|
        tb_spec = IAForwardSpec(post)
 | 
						|
        tb_top  = tb.Testbench(tb_spec, dut)
 | 
						|
        return tb_top
 |