blob: bd535d3b95f905c06540e1eada89784f32333945 [file] [log] [blame]
'''
Created on Nov 23, 2019
@author: ballance
'''
import cocotb
from cocotb.bfms import BfmMgr
from fwrisc_rv32i_tests.instr_tests import InstrTests
from fwrisc_tracer_bfm.fwrisc_tracer_signal_bfm import FwriscTracerSignalBfm
from elftools.elf.elffile import ELFFile
from elftools.elf.sections import SymbolTableSection
from sys import stdout
class ZephyrTests(InstrTests):
def __init__(self, tracer_bfm):
super().__init__(tracer_bfm)
self.max_instr = 0
self.halt_addr = -1
tracer_bfm.add_listener(self)
sw_image = cocotb.plusargs["SW_IMAGE"]
self.raw_console = False
self.console_buffer = ""
self.console_output = []
with open(sw_image, "rb") as f:
elffile = ELFFile(f)
symtab = elffile.get_section_by_name(".symtab")
self.ram_console_addr = symtab.get_symbol_by_name("ram_console")[0]["st_value"]
tracer_bfm.add_addr_region(self.ram_console_addr, self.ram_console_addr+1023)
def configure_tracer(self):
self.tracer_bfm.set_trace_reg_writes(0)
self.tracer_bfm.set_trace_instr(0, 0, 0)
self.tracer_bfm.set_trace_all_memwrite(0)
self.tracer_bfm.add_addr_region(
self.ram_console_addr,
self.ram_console_addr+1023)
def instr_exec(self, pc, instr):
# print("instr_exec: 0x%08x" % (pc))
pass
def mem_write(self, maddr, mstrb, mdata):
# print("mem_write: 0x%08x 0x%08x" % (maddr, mdata))
if maddr >= self.ram_console_addr and maddr < self.ram_console_addr+1024 and mdata != 0:
ch = 0
if mstrb == 1:
ch = ((mdata >> 0) & 0xFF)
elif mstrb == 2:
ch = ((mdata >> 8) & 0xFF)
elif mstrb == 4:
ch = ((mdata >> 16) & 0xFF)
elif mstrb == 8:
ch = ((mdata >> 24) & 0xFF)
ch = str(chr(ch))
if ch == '\n':
self.console_line(self.console_buffer)
if not self.raw_console:
print(self.console_buffer)
stdout.flush()
self.console_buffer = ""
else:
self.console_buffer += ch
if self.raw_console:
stdout.write(ch)
stdout.flush()
def console_line(self, line):
self.console_output.append(line)
@cocotb.coroutine
def run(self):
# Configure the tracer BFM
self.configure_tracer()
yield self.test_done_ev.wait()
pass
@cocotb.coroutine
def check(self):
print("Check")
pass
@cocotb.test()
def runtest(dut):
use_tf_bfm = True
if use_tf_bfm:
tracer_bfm = BfmMgr.find_bfm(".*u_tracer")
else:
tracer_bfm = FwriscTracerSignalBfm(dut.u_dut.u_core.u_tracer)
test = ZephyrTests(tracer_bfm)
yield test.run()