trace renamed facs
parent
975bb2445d
commit
9e99702806
@ -0,0 +1,201 @@
|
|||||||
|
# A2O Core
|
||||||
|
|
||||||
|
import cocotb
|
||||||
|
from cocotb.triggers import Timer, RisingEdge
|
||||||
|
from cocotb.binary import BinaryValue
|
||||||
|
from cocotb.handle import Force
|
||||||
|
from cocotb.handle import Release
|
||||||
|
|
||||||
|
from dotmap import DotMap
|
||||||
|
import itertools
|
||||||
|
|
||||||
|
from OPEnv import *
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------------------------
|
||||||
|
# Tasks
|
||||||
|
|
||||||
|
async def A2ODriver(dut, sim):
|
||||||
|
"""A2O Core Driver"""
|
||||||
|
|
||||||
|
transTypes = {
|
||||||
|
'00': 'IFETCH',
|
||||||
|
'08': 'LOAD',
|
||||||
|
'20': 'STORE'
|
||||||
|
}
|
||||||
|
|
||||||
|
ok = True
|
||||||
|
readPending = []
|
||||||
|
countReads = 0
|
||||||
|
mem = {}
|
||||||
|
sim.msg('A2O Driver: nothing to do.')
|
||||||
|
|
||||||
|
#while ok and not sim.done:
|
||||||
|
# await RisingEdge(dut.clk_1x)
|
||||||
|
|
||||||
|
|
||||||
|
# A2O Checker
|
||||||
|
# check protocol, etc.
|
||||||
|
async def A2OChecker(dut, sim):
|
||||||
|
"""A2O Core Checker """
|
||||||
|
|
||||||
|
me = 'A2O Checker'
|
||||||
|
ok = True
|
||||||
|
sim.msg(f'{me}: started.')
|
||||||
|
|
||||||
|
# errors
|
||||||
|
creditsLdErr = dut.c0.lq0.lsq.arb.ld_cred_err_q
|
||||||
|
creditsStErr = dut.c0.lq0.lsq.arb.st_cred_err_q
|
||||||
|
errors = [
|
||||||
|
{'name': 'Load Credits', 'sig': creditsLdErr},
|
||||||
|
{'name': 'Store Credits', 'sig': creditsStErr},
|
||||||
|
]
|
||||||
|
|
||||||
|
while ok:
|
||||||
|
|
||||||
|
await RisingEdge(dut.clk_1x)
|
||||||
|
|
||||||
|
if not sim.resetDone:
|
||||||
|
continue
|
||||||
|
|
||||||
|
for i in range(len(errors)):
|
||||||
|
assert errors[i]['sig'].value == 0, f'{me} Error: {errors[i]["name"]}'
|
||||||
|
|
||||||
|
# A2O Monitor
|
||||||
|
# count transactions, etc.
|
||||||
|
# fail on bad addresses
|
||||||
|
async def A2OMonitor(dut, sim):
|
||||||
|
"""A2O Core Monitor"""
|
||||||
|
|
||||||
|
me = 'A2O Monitor'
|
||||||
|
ok = True
|
||||||
|
sim.msg(f'{me}: started.')
|
||||||
|
|
||||||
|
# completions
|
||||||
|
iu0Comp = dut.c0.iu_lq_i0_completed
|
||||||
|
iu0CompIFAR = dut.c0.iuq0.iuq_cpl_top0.iuq_cpl0.cp2_i0_ifar
|
||||||
|
iu1Comp = dut.c0.iu_lq_i1_completed
|
||||||
|
iu1CompIFAR = dut.c0.iuq0.iuq_cpl_top0.iuq_cpl0.cp2_i1_ifar
|
||||||
|
iuCompFlushIFAR = dut.c0.cp_t0_flush_ifar
|
||||||
|
cp3NIA = dut.c0.iuq0.iuq_cpl_top0.iuq_cpl0.iuq_cpl_ctrl.cp3_nia_q # nia after last cycle's completions
|
||||||
|
|
||||||
|
# GPR ppol and arch map
|
||||||
|
gprCompMap = []
|
||||||
|
lastGprCompMap = []
|
||||||
|
#wtf check what 33:36 are!
|
||||||
|
for i in range(36):
|
||||||
|
gprCompMap.append(dut.c0.iuq0.iuq_slice_top0.slice0.rn_top0.fx_rn0.gpr_rn_map.xhdl3.comp_map0[i].comp_map_latch.dout)
|
||||||
|
lastGprCompMap.append(i)
|
||||||
|
|
||||||
|
gpr = []
|
||||||
|
for i in range(144):
|
||||||
|
gpr.append(dut.c0.xu0.gpr.gpr0.loc[i].dat)
|
||||||
|
|
||||||
|
# CR fields pool and arch map
|
||||||
|
crCompMap = []
|
||||||
|
lastCrCompMap = []
|
||||||
|
for i in range(8):
|
||||||
|
crCompMap.append(dut.c0.iuq0.iuq_slice_top0.slice0.rn_top0.fx_rn0.cr_rn_map.xhdl3.comp_map0[i].comp_map_latch.dout)
|
||||||
|
lastCrCompMap.append(i)
|
||||||
|
|
||||||
|
cr = []
|
||||||
|
for i in range(24):
|
||||||
|
cr.append(dut.c0.xu0.cr.entry[i].reg_latch.dout)
|
||||||
|
|
||||||
|
# XER pool and arch map
|
||||||
|
xerCompMap = []
|
||||||
|
lastXerCompMap = []
|
||||||
|
for i in range(1):
|
||||||
|
xerCompMap.append(dut.c0.iuq0.iuq_slice_top0.slice0.rn_top0.fx_rn0.xer_rn_map.xhdl3.comp_map0[i].comp_map_latch.dout)
|
||||||
|
lastXerCompMap.append(i)
|
||||||
|
|
||||||
|
xer = []
|
||||||
|
for i in range(12):
|
||||||
|
xer.append(dut.c0.xu0.xer.entry[i].reg_latch.dout)
|
||||||
|
|
||||||
|
# CTR pool and arch map
|
||||||
|
ctrCompMap = []
|
||||||
|
lastCtrCompMap = []
|
||||||
|
for i in range(1):
|
||||||
|
ctrCompMap.append(dut.c0.iuq0.iuq_slice_top0.slice0.rn_top0.fx_rn0.ctr_rn_map.xhdl3.comp_map0[i].comp_map_latch.dout)
|
||||||
|
lastCtrCompMap.append(i)
|
||||||
|
|
||||||
|
ctr = []
|
||||||
|
for i in range(8):
|
||||||
|
ctr.append(dut.c0.xu0.ctr.entry[i].reg_latch.dout)
|
||||||
|
|
||||||
|
# LR pool and arch map
|
||||||
|
lrCompMap = []
|
||||||
|
lastLrCompMap = []
|
||||||
|
for i in range(1):
|
||||||
|
lrCompMap.append(dut.c0.iuq0.iuq_slice_top0.slice0.rn_top0.fx_rn0.lr_rn_map.xhdl3.comp_map0[i].comp_map_latch.dout)
|
||||||
|
lastLrCompMap.append(i)
|
||||||
|
|
||||||
|
lr = []
|
||||||
|
for i in range(8):
|
||||||
|
lr.append(dut.c0.xu0.lr.entry[i].reg_latch.dout)
|
||||||
|
|
||||||
|
while ok:
|
||||||
|
|
||||||
|
await RisingEdge(dut.clk_1x)
|
||||||
|
|
||||||
|
if not sim.resetDone:
|
||||||
|
continue
|
||||||
|
|
||||||
|
comp = ''
|
||||||
|
#wtf seeing something weird here
|
||||||
|
# there are cases where x's are in some bits of comp ifar's; maybe ok (predict array?) but why is completed indicated?
|
||||||
|
if iu0Comp.value == 1:
|
||||||
|
comp = f'0:{sim.safeint(iu0CompIFAR.value.binstr + "00", 2):06X} '
|
||||||
|
|
||||||
|
if iu1Comp.value == 1:
|
||||||
|
comp = f'{comp}1:{sim.safeint(iu1CompIFAR.value.binstr + "00", 2):06X} '
|
||||||
|
|
||||||
|
if comp != '':
|
||||||
|
comp = f'{comp}{sim.safeint(iuCompFlushIFAR.value.binstr + "00", 2):016X}'
|
||||||
|
sim.msg(f'C0: CP {comp}')
|
||||||
|
|
||||||
|
if sim.a2o.traceFacUpdates:
|
||||||
|
# renamables
|
||||||
|
for i in range(36):
|
||||||
|
good, arch = sim.safeint(gprCompMap[i].value.binstr, 2, rc=True)
|
||||||
|
if good and arch != lastGprCompMap[i]:
|
||||||
|
sim.msg(f'GPR Update: R{i:02d}={hex(gpr[arch], 16)}')
|
||||||
|
lastGprCompMap[i] = arch
|
||||||
|
for i in range(8):
|
||||||
|
good, arch = sim.safeint(crCompMap[i].value.binstr, 2, rc=True)
|
||||||
|
if good and arch != lastCrCompMap[i]:
|
||||||
|
sim.msg(f'CR Update: F{i:01d}={hex(cr[arch], 1)}')
|
||||||
|
lastCrCompMap[i] = arch
|
||||||
|
for i in range(1):
|
||||||
|
good, arch = sim.safeint(xerCompMap[i].value.binstr, 2, rc=True)
|
||||||
|
if good and arch != lastXerCompMap[i]:
|
||||||
|
v = xer[arch].value.binstr
|
||||||
|
sim.msg(f'XER Update: SO/OV/CA={v[0:3]} LEN={int(v[3:],2):02X}')
|
||||||
|
lastXerCompMap[i] = arch
|
||||||
|
for i in range(1):
|
||||||
|
good, arch = sim.safeint(ctrCompMap[i].value.binstr, 2, rc=True)
|
||||||
|
if good and arch != lastCtrCompMap[i]:
|
||||||
|
sim.msg(f'CTR Update:{hex(ctr[arch], 16)}')
|
||||||
|
lastCtrCompMap[i] = arch
|
||||||
|
for i in range(1):
|
||||||
|
good, arch = sim.safeint(lrCompMap[i].value.binstr, 2, rc=True)
|
||||||
|
if good and arch != lastLrCompMap[i]:
|
||||||
|
sim.msg(f'LR Update:{hex(lr[arch], 16)}')
|
||||||
|
lastLrCompMap[i] = arch
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------------------------
|
||||||
|
# Classes
|
||||||
|
|
||||||
|
class A2O:
|
||||||
|
driver = A2ODriver
|
||||||
|
checker = A2OChecker
|
||||||
|
monitor = A2OMonitor
|
||||||
|
|
||||||
|
def __init__(self, sim):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class A2OCore(DotMap):
|
||||||
|
def __init__(self, sim):
|
||||||
|
super().__init__()
|
||||||
|
self.sim = sim
|
||||||
|
self.traceFacUpdates = False
|
Loading…
Reference in New Issue