# test_uart.py
|
|
|
|
import logging
|
|
import random
|
|
import cocotb
|
|
import pprint
|
|
from collections import defaultdict
|
|
from Sram import SramRead, SramWrite, SramMonitor
|
|
from cocotb.clock import Clock
|
|
from cocotb.triggers import FallingEdge, RisingEdge, Timer, ReadOnly
|
|
from cocotbext.wishbone.driver import WishboneMaster, WBOp
|
|
|
|
|
|
# Reset coroutine
|
|
async def reset_dut(reset_n, duration_ns):
|
|
reset_n.value = 1
|
|
await Timer(duration_ns, units="ns")
|
|
reset_n.value = 0
|
|
|
|
def bv_to_hexstr(data):
|
|
return str(hex(data.integer))
|
|
|
|
|
|
@cocotb.test()
|
|
async def test_wishbone(dut):
|
|
""" First simple test """
|
|
|
|
clkedge = RisingEdge(dut.wbclk_i)
|
|
|
|
# Connect reset
|
|
reset = dut.wbrst_i
|
|
|
|
|
|
# Create empty SRAM memory
|
|
memory = defaultdict()
|
|
|
|
mem_read = SramRead(dut.wbclk_i, dut.localren_o,
|
|
dut.localadress_o, dut.localdata_i, memory);
|
|
mem_write = SramWrite(dut.wbclk_i, dut.localwen_o,
|
|
dut.localadress_o, dut.localdata_o, memory);
|
|
sram_monitor = SramMonitor(dut.wbclk_i, dut.localwen_o, dut.localren_o,
|
|
dut.localadress_o, dut.localdata_i, dut.localdata_o);
|
|
|
|
wbmaster = WishboneMaster(dut, "", dut.wbclk_i,
|
|
width=16, # size of data bus
|
|
timeout=10, # in clock cycle number
|
|
signals_dict={"cyc": "wbcyc_i",
|
|
"stb": "wbstb_i",
|
|
"we": "wbwe_i",
|
|
"adr": "wbadr_i",
|
|
"datwr":"wbdat_i",
|
|
"datrd":"wbdat_o",
|
|
"ack": "wback_o" })
|
|
|
|
# Drive input defaults (setimmediatevalue to avoid x asserts)
|
|
dut.wbcyc_i.setimmediatevalue(0)
|
|
dut.wbstb_i.setimmediatevalue(0)
|
|
dut.wbwe_i.setimmediatevalue(0)
|
|
dut.wbadr_i.setimmediatevalue(0)
|
|
dut.wbdat_i.setimmediatevalue(0)
|
|
|
|
clock = Clock(dut.wbclk_i, 10, units="ns") # Create a 10 ns period clock
|
|
cocotb.start_soon(clock.start()) # Start the clock
|
|
|
|
# Execution will block until reset_dut has completed
|
|
dut._log.info("Hold reset")
|
|
await reset_dut(reset, 100)
|
|
dut._log.info("Released reset")
|
|
|
|
# Test 10 Wishbone transmissions
|
|
for i in range(10):
|
|
await clkedge
|
|
adr = random.randint(0, 255)
|
|
data = random.randint(0, 2**16-1)
|
|
await wbmaster.send_cycle([WBOp(adr=adr, dat=data)])
|
|
rec = await wbmaster.send_cycle([WBOp(adr=adr)])
|
|
|
|
# Example to print transactions collected by SRAM monitor
|
|
with open('results/sram_transactions.log', 'w', encoding='utf-8') as f:
|
|
f.write((f"{'Time':7}{'Type':7}{'Adr':6}{'Data'}\n"))
|
|
for k, v in sram_monitor.transactions.items():
|
|
f.write((f"{k:7}{v['type']:7}{bv_to_hexstr(v['adr']):6}{bv_to_hexstr(v['data'])} \n"))
|