|
|
|
@ -214,6 +214,8 @@ async def genClocks(dut, sim):
|
|
|
|
|
await RisingEdge(dut.clk_1x)
|
|
|
|
|
|
|
|
|
|
dut._log.info(f'[{sim.cycle:08d}] Reached max cycle. Clocks stopped.')
|
|
|
|
|
sim.ok = False
|
|
|
|
|
sim.fail = 'Max cycle reached.'
|
|
|
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------------------------
|
|
|
|
|
# Interfaces
|
|
|
|
@ -235,31 +237,33 @@ async def tb(dut):
|
|
|
|
|
|
|
|
|
|
sim = Sim(dut)
|
|
|
|
|
sim.mem = Memory(sim)
|
|
|
|
|
#sim.memFiles = ['../mem/boot_ieq1.bin.hex'] #wtf cmdline parm
|
|
|
|
|
sim.maxCycles = 2000
|
|
|
|
|
|
|
|
|
|
'''
|
|
|
|
|
sim.memFiles = ['../mem/boot.bin.hex'] #wtf cmdline parm
|
|
|
|
|
|
|
|
|
|
for i in range(len(sim.memFiles)): #wtf el should be object with name, format, etc.
|
|
|
|
|
sim.mem.loadFile(sim.memFiles[i])
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
sim.memFiles = [
|
|
|
|
|
{
|
|
|
|
|
'addr': 0x00000000,
|
|
|
|
|
'file' : '../mem/test1/rom.init'
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
'addr': 0x10000000,
|
|
|
|
|
'file' : '../mem/test1/test.init'
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
for i in range(len(sim.memFiles)): #wtf el should be object with name, format, etc.
|
|
|
|
|
sim.mem.loadFile(sim.memFiles[i]['file'], addr=sim.memFiles[i]['addr'])
|
|
|
|
|
|
|
|
|
|
if sim.resetAddr is not None and sim.mem.read(sim.resetAddr) == sim.mem.default:
|
|
|
|
|
sim.mem.write(sim.resetAddr, sim.resetOp)
|
|
|
|
|
sim.msg(f'Set reset fetch @{sim.resetAddr:08X} to {sim.resetOp:08X}.')
|
|
|
|
|
|
|
|
|
|
# dut.cocotb_icarus
|
|
|
|
|
# dut._log.info(sim.top.__dict__)
|
|
|
|
|
# {'_handle': <cocotb.simulator.gpi_sim_hdl at 0x55f8fa8a3aa0>,
|
|
|
|
|
# '_len': None, '_sub_handles': {}, '_invalid_sub_handles': set(), '_name': 'cocotb_icarus',
|
|
|
|
|
# '_type': 'GPI_MODULE', '_fullname': 'cocotb_icarus(GPI_MODULE)', '_path': 'cocotb_icarus.cocotb_icarus',
|
|
|
|
|
# '_log': <SimBaseLog cocotb.cocotb_icarus (INFO)>, '_def_name': 'cocotb_icarus', '_def_file': './cocotb_icarus.v',
|
|
|
|
|
# '_discovered': False
|
|
|
|
|
# }
|
|
|
|
|
# dut
|
|
|
|
|
# {'_handle': <cocotb.simulator.gpi_sim_hdl at 0x557757943540>,
|
|
|
|
|
# '_len': None, '_sub_handles': {'an_ac_pm_thread_stop': ModifiableObject(cocotb_icarus.an_ac_pm_thread_stop),
|
|
|
|
|
# 'cocotb_icarus': HierarchyObject(cocotb_icarus.cocotb_icarus with definition cocotb_icarus (at ./cocotb_icarus.v))},
|
|
|
|
|
# '_invalid_sub_handles': set(), '_name': 'cocotb_icarus', '_type': 'GPI_MODULE', '_fullname': 'cocotb_icarus(GPI_MODULE)',
|
|
|
|
|
# '_path': 'cocotb_icarus', '_log': <SimBaseLog cocotb.cocotb_icarus (INFO)>, '_def_name': '', '_def_file': '',
|
|
|
|
|
# '_discovered': False
|
|
|
|
|
|
|
|
|
|
# init stuff
|
|
|
|
|
await init(dut, sim)
|
|
|
|
|
|
|
|
|
@ -294,8 +298,6 @@ async def tb(dut):
|
|
|
|
|
await RisingEdge(dut.clk_1x)
|
|
|
|
|
dut._log.info(f'[{sim.cycle:08d}] Threads enabled.')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# should await sim.done
|
|
|
|
|
await Timer((sim.maxCycles+100)*8, units='ns')
|
|
|
|
|
|
|
|
|
@ -303,5 +305,5 @@ async def tb(dut):
|
|
|
|
|
dut._log.info(f'[{sim.cycle:08d}] You has opulence.')
|
|
|
|
|
else:
|
|
|
|
|
dut._log.info(f'[{sim.cycle:08d}] You are worthless and weak!')
|
|
|
|
|
assert False, f'[{sim.cycle:08d}] {sim.fail}'
|
|
|
|
|
|
|
|
|
|
dut._log.info(f'[{sim.cycle:08d}] {sim.fail}')
|
|
|
|
|
assert False
|
|
|
|
|