22# and provides common functionality for the tests.
33
44from cocotb .clock import Clock
5- from cocotb .triggers import ClockCycles
5+ from cocotb .triggers import ClockCycles , Timer
66
77from cocotb_bus .scoreboard import Scoreboard
88from cocotbext .apb import ApbBus , ApbSlave , MemoryRegion
99
10- from cocotblib .umi .drivers .sumi_driver import SumiDriver
11- from cocotblib .umi .monitors .sumi_monitor import SumiMonitor
12- from cocotblib .umi .sumi import SumiTransaction , SumiCmdType , SumiCmd
13- from cocotblib .common import drive_reset
10+ from cocotbext .umi .drivers .sumi_driver import SumiDriver
11+ from cocotbext .umi .monitors .sumi_monitor import SumiMonitor
12+ from cocotbext .umi .sumi import SumiTransaction , SumiCmdType , SumiCmd
13+
14+
15+ async def do_reset (reset , time_ns : int , active_level : bool = False ):
16+ """Drive an asynchronous reset pulse on *reset*."""
17+ reset .value = not active_level
18+ await Timer (1 , unit = "step" )
19+ reset .value = active_level
20+ await Timer (time_ns , "ns" )
21+ reset .value = not active_level
22+ await Timer (1 , unit = "step" )
1423
1524
1625# Creates the umi2apb test environment
1726class UMI2APBEnv :
18- def __init__ (self , dut , clk_period_ns = 10 , mem_size = 2 ** 16 ):
27+ def __init__ (
28+ self ,
29+ dut ,
30+ clk_period_ns = 10 ,
31+ mem_size = 2 ** 16 ,
32+ umi_valid_gen = None ,
33+ backpressure_on_apb = True
34+ ):
1935 self .dut = dut
2036 self .clk_period_ns = clk_period_ns
2137 self .mem_size = mem_size
38+ self .umi_valid_gen = umi_valid_gen
2239
2340 self .data_width = int (dut .RW .value ) # default of 64
2441 self .addr_width = int (dut .AW .value ) # default of 64
@@ -29,22 +46,20 @@ def __init__(self, dut, clk_period_ns=10, mem_size=2**16):
2946 self .clk = dut .apb_pclk
3047 self .nreset = dut .apb_nreset
3148
32- self ._build ()
33-
34- def _build (self ):
35- dut = self .dut
36-
3749 # Instantiates UMI driver
3850 self .sumi_driver = SumiDriver (
3951 entity = dut ,
4052 name = "udev_req" ,
4153 clock = self .clk ,
42- bus_separator = "_"
54+ bus_separator = "_" ,
55+ valid_generator = self .umi_valid_gen ,
4356 )
4457
4558 # Instantiates APB slave and memory region
4659 apb_bus = ApbBus .from_prefix (dut , "apb" )
4760 self .apb_slave = ApbSlave (apb_bus , self .clk , self .nreset )
61+ if backpressure_on_apb :
62+ self .apb_slave .enable_backpressure ()
4863 self .region = MemoryRegion (self .mem_size )
4964 self .apb_slave .target = self .region
5065
@@ -62,21 +77,9 @@ def _build(self):
6277
6378 # Prerequisites for starting tests
6479 async def start (self ):
80+ await do_reset (self .nreset , self .clk_period_ns )
6581 Clock (self .clk , self .clk_period_ns , unit = "ns" ).start ()
66- await drive_reset (self .nreset , self .clk_period_ns )
67- self .dut .udev_resp_ready .value = 1
68-
69- # Waits for umi responses
70- async def wait_for_responses (self , max_cycles ):
71- cycles = 0
72- while self .expected_responses :
73- await ClockCycles (self .clk , 1 )
74- cycles += 1
75- if cycles > max_cycles :
76- raise TimeoutError (
77- f"Timeout waiting for responses "
78- f"({ len (self .expected_responses )} remaining)"
79- )
82+ await ClockCycles (self .clk , 10 )
8083
8184
8285# Creates an ideal umi write response
0 commit comments