Source code for uvm.dpi.uvm_hdl


import cocotb
import re


[docs]class uvm_hdl(): dut = None re_brackets = re.compile(r'(\w+)\[(\d+)\]')
[docs] @classmethod def set_dut(cls, dut): cls.dut = dut cls.SIM_NAME = cocotb.SIM_NAME
[docs] @classmethod def split_hdl_path(cls, path): if cls.SIM_NAME == 'Verilator': res = [] spl = path.split('.') for name in spl: match = cls.re_brackets.search(name) if match is not None: res.append(match[1]) # Throw exception if Conversion fails res.append(int(match[2])) else: res.append(name) return res else: return path.split('.')
[docs] @classmethod def uvm_hdl_read(cls, path, value): if cls.dut is not None: curr_obj = cls.dut #split = path.split('.') split = cls.split_hdl_path(path) for spl in split: curr_obj = cls.get_next_obj(curr_obj, spl) if curr_obj is not None: value.append(int(curr_obj)) return 1 return 0 else: raise Exception("dut is None. Use uvm_hdl.set_dut(dut) in your @cocotb.test()")
[docs] @classmethod def uvm_hdl_deposit(cls, path, value): if cls.dut is not None: curr_obj = cls.dut #split = path.split('.') split = cls.split_hdl_path(path) for spl in split: curr_obj = cls.get_next_obj(curr_obj, spl) #if hasattr(curr_obj, spl): # curr_obj = getattr(curr_obj, spl) #else: # continue if curr_obj is not None: curr_obj.value = value return 1 return 0 else: raise Exception("dut is None. Use uvm_hdl.set_dut(dut) in your @cocotb.test()")
[docs] @classmethod def get_next_obj(cls, curr_obj, spl): if isinstance(spl, int): #return curr_obj[spl] return curr_obj[spl] elif hasattr(curr_obj, spl): curr_obj = getattr(curr_obj, spl) return curr_obj