From 690f96c0f9029c1d9e081377c88b5d6078bd9473 Mon Sep 17 00:00:00 2001 From: John Shahid Shaik Date: Wed, 21 Dec 2022 01:59:53 +0530 Subject: [PATCH 01/22] dut --- UVM_Framework/UVMF_2022.3/challeng3/dut.v | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 UVM_Framework/UVMF_2022.3/challeng3/dut.v diff --git a/UVM_Framework/UVMF_2022.3/challeng3/dut.v b/UVM_Framework/UVMF_2022.3/challeng3/dut.v new file mode 100644 index 00000000..7e95ea27 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challeng3/dut.v @@ -0,0 +1,18 @@ +module adder_ex(input [3:0]a, + input [3:0]b, + input clk, + input rst, + output reg [3:0]sum, + output reg c_out); + + always@(posedge clk) begin + if(!rst)begin + sum = 4'b0000; + c_out=1'b0; + end + + else + {c_out,sum} = a+b; + end + +endmodule From e8cef2ec2954b51e1ad9d1c0c9a23a136c2b8106 Mon Sep 17 00:00:00 2001 From: John Shahid Shaik Date: Wed, 21 Dec 2022 02:01:00 +0530 Subject: [PATCH 02/22] new --- UVM_Framework/UVMF_2022.3/challeng3/dut.v | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UVM_Framework/UVMF_2022.3/challeng3/dut.v b/UVM_Framework/UVMF_2022.3/challeng3/dut.v index 7e95ea27..fa94dd0b 100644 --- a/UVM_Framework/UVMF_2022.3/challeng3/dut.v +++ b/UVM_Framework/UVMF_2022.3/challeng3/dut.v @@ -3,16 +3,16 @@ module adder_ex(input [3:0]a, input clk, input rst, output reg [3:0]sum, - output reg c_out); + output reg cout); always@(posedge clk) begin if(!rst)begin sum = 4'b0000; - c_out=1'b0; + cout=1'b0; end else - {c_out,sum} = a+b; + {cout,sum} = a+b; end endmodule From 80b8398bdfa8391e3300407c6089034e4e761fec Mon Sep 17 00:00:00 2001 From: Dampuru Vinay Kumar Reddy Date: Fri, 23 Dec 2022 21:18:34 +0530 Subject: [PATCH 03/22] deleted --- UVM_Framework/UVMF_2022.3/challeng3/dut.v | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 UVM_Framework/UVMF_2022.3/challeng3/dut.v diff --git a/UVM_Framework/UVMF_2022.3/challeng3/dut.v b/UVM_Framework/UVMF_2022.3/challeng3/dut.v deleted file mode 100644 index fa94dd0b..00000000 --- a/UVM_Framework/UVMF_2022.3/challeng3/dut.v +++ /dev/null @@ -1,18 +0,0 @@ -module adder_ex(input [3:0]a, - input [3:0]b, - input clk, - input rst, - output reg [3:0]sum, - output reg cout); - - always@(posedge clk) begin - if(!rst)begin - sum = 4'b0000; - cout=1'b0; - end - - else - {cout,sum} = a+b; - end - -endmodule From f3a25a1ba79228f013f78c37845a6b7a4fd58247 Mon Sep 17 00:00:00 2001 From: Dampuru Vinay Kumar Reddy Date: Fri, 23 Dec 2022 21:22:11 +0530 Subject: [PATCH 04/22] challenge 3 --- .../UVMF_2022.3/challenge_3/yaml2uvmf.py | 1659 +++++++++++++++++ 1 file changed, 1659 insertions(+) create mode 100755 UVM_Framework/UVMF_2022.3/challenge_3/yaml2uvmf.py diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/yaml2uvmf.py b/UVM_Framework/UVMF_2022.3/challenge_3/yaml2uvmf.py new file mode 100755 index 00000000..286bec9b --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/yaml2uvmf.py @@ -0,0 +1,1659 @@ +#! /usr/bin/env python + +############################################################################## +## Copyright 2017 Mentor Graphics +## All Rights Reserved Worldwide +## +## Licensed under the Apache License, Version 2.0 (the "License"); you may +## not use this file except in compliance with the License. You may obtain +## a copy of the License at +## +## http://www.apache.org/license/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in +## writing, software distributed under the License is +## distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +## CONDITIONS OF ANY KIND, either express or implied. See +## the License for the specific language governing +## permissions and limitations under the License. +## +############################################################################## +## +## Mentor Graphics Inc +## +############################################################################## +## +## Created by : Jon Craft & Bob Oden +## Creation date : May 25 2017 +## +############################################################################## +## +## This script utilizes the Python-based generator API to take data structures +## defined in YAML and convert them into UVMF code for interfaces, environments +## and benches. +## +## Run 'yaml2uvmf.py --help' for more information +## +############################################################################## + +import sys +import os +import time +import re +import inspect +import copy +import pprint +from optparse import OptionParser, SUPPRESS_HELP +from fnmatch import fnmatch +import shutil + +# Determine addition to sys.path automatically based on script location +# This means user does not have to explicitly set PYTHONPATH in order for this +# script to work properly. + +sys.path.insert(0,os.path.dirname(os.path.dirname(os.path.realpath(__file__)))+"/templates/python"); +# Only need python2 packages if using python2 +if sys.version_info[0] < 3: + sys.path.insert(0,os.path.dirname(os.path.dirname(os.path.realpath(__file__)))+"/templates/python/python2"); + +from uvmf_yaml import * +import uvmf_gen +from uvmf_gen import (UVMFCommandLineParser,PassThroughOptionParser,UserError,InterfaceClass,EnvironmentClass,BenchClass) +from voluptuous import Invalid, MultipleInvalid +from voluptuous.humanize import humanize_error +from uvmf_version import version + +try: + import yaml +except ImportError: + print("ERROR : yaml package not found. See templates.README for more information") + print("Python version info:\n{}".format(sys.version)) + sys.exit(1) + +def merge_summary(merge,verbose=False): + block_count = sum(len(l) for l in merge.found_blocks.values()) + new_block_count = sum(len(l) for l in merge.new_blocks.values()) + if verbose: + print("============================== Merge Details ==============================") + print(" Parsed {0} original files finding a total of {1} \"pragma uvmf custom\" blocks".format(len(merge.rd), block_count)) + if verbose and (len(merge.found_blocks)>0): + for f in merge.found_blocks: + print(" File: {0}".format(f)) + for l in merge.found_blocks[f]: + print(" \"{0}\"".format(l['name'])) + print(" Copied {0} new files from generated source".format(len(merge.copied_files))) + if verbose and (len(merge.copied_files)>0): + print(" Files found in new output but not in merged source. List of copied file destinations:") + for f in merge.copied_files: + print(" {0}".format(f)) + print(" Found {0} new \"pragma uvmf custom\" blocks in generated source".format(new_block_count)) + if verbose and (len(merge.new_blocks)>0): + print(" Blocks found in new output but not in merged source. List of new blocks and their associated source file locations:") + for f in merge.new_blocks: + print(" File: {0}".format(f)) + for l in merge.new_blocks[f]: + print(" \"{0}\"".format(l)) + if verbose: + print("===========================================================================") + +class ConfigFileReader: + """Reads in a .f file and builds up array of files to parse""" + def __init__(self,fname,relative_to_file=False): + self.fname = fname + self.files = [] + try: + self.fh = open(fname,'r') + except IOError: + raise UserError("Unable to open -f/-F file "+fname) + self.lines = self.fh.readlines() + for line in self.lines: + # Strip comments + line = re.sub(r"(.*?)#.*",r"\1",line.rstrip()).strip() + # Elaborate environment variables + line = os.path.expandvars(line) + if (line != ""): + if relative_to_file: + line = os.path.normpath(os.path.dirname(os.path.abspath(fname))+os.path.sep+line) + self.files.append(line) + self.fh.close() + +class DataClass: + def __init__(self,parser,debug=False): + self.data = {'interfaces':{},'environments':{},'benches':{},'util_components':{},'qvip_environments':{},'qvip_library':{},'global':{}} + self.parser = parser + self.debug = debug + self.validators = {} + self.used_ac_items = [] + + def parseFile(self,fname): + try: + fs = open(fname) + except IOError: + raise UserError("Unable to open config file "+fname) + d = yaml.safe_load(fs) + fs.close() + try: + if 'uvmf' not in d.keys(): + raise UserError("Contents of "+fname+" not valid UVMF info") + except: + raise UserError("Contents of "+fname+" not valid UVMF info") + for k in d['uvmf'].keys(): + if k not in self.data.keys(): + raise UserError("Top-level element \""+k+"\" in "+fname+" is not valid. Allowed entries:\n "+str(self.data.keys())) + for elem in self.data.keys(): + try: self.data[elem].update(d['uvmf'][elem]) + except KeyError: + pass + + ## Validate various data structures against the associated schema + def validate(self): + self.validators = { + 'interfaces':InterfaceValidator(), + 'util_components':ComponentValidator(), + 'qvip_environments':QVIPEnvValidator(), + 'environments':EnvironmentValidator(), + 'benches':BenchValidator(), + 'global':GlobalValidator(), +# 'qvip_library':QVIPLibValidator(), ## Don't validate QVIP library info, for debug purposes only + } + ## Check for any incorrect top-level keys + for t in self.validators.keys(): + for c in self.data[t].keys(): + if (t=='global'): + v = self.data[t] + else: + v = self.data[t][c] + try: + self.validators[t].schema(v) + except MultipleInvalid as e: + resp = humanize_error(v,e).split('\n') + raise UserError("While validating "+t+" YAML '"+c+"':\n"+pprint.pformat(resp,indent=2)) + + def calculateRelativeVipLocation(self,compClass): + ## Determine relative path to "loc" if CWD is bench's "sim" directory + simpath = compClass.bench_location+"/bench_name/sim" + ret = os.path.relpath(compClass.vip_location,simpath) + ## Even on Windows, these need to be forward slashes because they'll be normalized within Tcl. Replace any backslashes with forward ones + ## Can't use pathlib here due to Python2 back-compat, just do a global search/replace + return ret.replace('\\','/') + + def calculateRelativeVipToCwd(self,compClass): + ret = os.path.relpath(os.getcwd(),compClass.vip_location) + return ret.replace('\\','/') + + def calculateRelativeBenchToCwd(self,compClass): + ret = os.path.relpath(os.getcwd(),compClass.bench_location) + return ret.replace('\\','/') + + def calculateRelativeInterfaceToCwd(self,compClass): + ret = os.path.relpath(os.getcwd(),compClass.vip_location+os.path.sep+compClass.interface_location) + return ret.replace('\\','/') + + def calculateRelativeEnvironmentToCwd(self,compClass): + ret = os.path.relpath(os.getcwd(),compClass.vip_location+os.path.sep+compClass.environment_location) + return ret.replace('\\','/') + + def setupGlobalVars(self,compClass): + try: + compClass.header = self.data['global']['header'] + except KeyError: + compClass.header = None + pass + try: + compClass.flat_output = (self.data['global']['flat_output'] == "True") + except KeyError: + compClass.flat_output = False + pass + try: + compClass.vip_location = self.data['global']['vip_location'] + except KeyError: + pass + try: + compClass.interface_location = self.data['global']['interface_location'] + except KeyError: + pass + try: + compClass.environment_location = self.data['global']['environment_location'] + except KeyError: + pass + try: + compClass.bench_location = self.data['global']['bench_location'] + except KeyError: + pass + compClass.relative_vip_from_sim = self.calculateRelativeVipLocation(compClass) + compClass.relative_vip_from_cwd = self.calculateRelativeVipToCwd(compClass) + compClass.relative_bench_from_cwd = self.calculateRelativeBenchToCwd(compClass) + compClass.relative_interface_from_cwd = self.calculateRelativeInterfaceToCwd(compClass) + compClass.relative_environment_from_cwd = self.calculateRelativeEnvironmentToCwd(compClass) + return compClass + + ## Generate everything from the data structures + def buildElements(self,genarray,verify=True,build_existing=False,archive_yaml=True): + count = 0 + self.interfaceDict = {} + try: + arrlen = len(genarray) + except TypeError: + arrlen = 0 + pass + for interface_name in self.data['interfaces']: + if ((arrlen>0) and (interface_name in genarray)) or (arrlen==0): + self.interfaceDict[interface_name] = self.generateInterface(interface_name,build_existing,archive_yaml) + count = count + 1 + self.environmentDict = {} + for environment_name in self.data['environments']: + if ((arrlen>0) and (environment_name in genarray)) or (arrlen==0): + self.environmentDict[environment_name] = self.generateEnvironment(environment_name,build_existing,archive_yaml) + count = count + 1 + self.benchDict = {} + for bench_name in self.data['benches']: + if ((arrlen>0) and (bench_name in genarray)) or (arrlen==0): + self.benchDict[bench_name] = self.generateBench(bench_name,build_existing,archive_yaml) + count = count + 1 + ## Check to see if any utility components were defined but never instantiated, flag that as a warning + for util_comp in self.data['util_components']: + if util_comp not in self.used_ac_items: + print(" WARNING : Utility component \""+util_comp+"\" was defined but never used. It will not be generated.") + ## Verify that something was produced (possible that YAML input was empty or genarray had no matches) + if count==0 and verify: + raise UserError("No output was produced!") + + + def recursion_print(self,recurse_list): + r = "" + for i,s in enumerate(recurse_list): + r = r + s + if i != len(recurse_list)-1: + r = r + " -> " + return r + + ## This method recursively searches all environments from the specified level down for QVIP subenvs, compiling + ## a list of underlying QVIP agents, their subenvironment parent names, their import list and active/passive info + def getQVIPAgents(self,topEnv,recurse_list=[]): + struct = self.data['environments'] + # Check for recursion, error out if detected + if topEnv in recurse_list: + raise UserError("Sub-environment recursion detected within environment \""+topEnv+"\". Tree: \""+self.recursion_print(recurse_list+[topEnv])+"\"") + try: + env = struct[topEnv] + except KeyError: + raise UserError("Unable to find environment \""+topEnv+"\" in defined environments (available list is "+str(struct.keys())) + agent_list = [] + import_list = [] + ## First look for any local QVIP subenvironments and extract those agent names + try: + qvip_subenv_list = env['qvip_subenvs'] + except KeyError: + qvip_subenv_list = [] + pass + for s in qvip_subenv_list: + try: + d = self.data['qvip_environments'][s['type']] + except KeyError: + raise UserError("Definition for QVIP subenvironment \""+s['name']+"\" of type \""+s['type']+"\" is not found") + local_agents = d['agents'] + for a in local_agents: + try: + active_passive = a['active_passive'] + except KeyError: + active_passive = None + agent_list = agent_list + [{ 'name': a['name'], 'parent': s['type'], 'active_passive': active_passive }] + try: + import_list = import_list + a['imports'] + except KeyError: pass + ## Next drill down and call getQVIPAgents on any non-QVIP subenvironments + try: + subenv_list = env['subenvs'] + except KeyError: + subenv_list = [] + pass + for s in subenv_list: + qstruct = self.getQVIPAgents(s['type'],recurse_list+[topEnv]) + agent_list = agent_list + qstruct['alist']; + import_list = import_list + qstruct['ilist']; + ## Finally, uniquify the import list + ilist = import_list + import_list = [] + for i in ilist: + if i not in import_list: + import_list = import_list + [ i ] + return {'alist':agent_list, 'ilist':import_list} + + ## This method will return a list of environments at the provided environment level or recursively. + def getEnvironments(self,topEnv,recursive=True): + struct = self.data['environments'] + try: + env = struct[topEnv] + except KeyError: + raise UserError("Unable to find environment \""+topEnv+"\" in defined environments (available list is "+str(struct.keys())) + envs = [] + try: + envs = env['subenvs'] + except KeyError: pass + if not recursive: + return envs + for subenv in envs: + envs = envs + self.getEnvironments(subenv['type'],recursive=True) + return envs + + ## This method takes a dotted component hierarchy string and returns + ## the same but with underscores. For use in cases where a unique identifier + ## is required. Removes final entry in component hierarchy too. + def getUniqueID(self,val): + l = val.split(".") + return "uvm_test_top."+'.'.join(l[:-1])+"." + + ## This method returns an ordered list of information on ALL BFMs from a given top-level environment, down. + ## The list entries all have the following structure: + ## - BFM Name ('bfm_name') + ## - BFM Type ('bfm_type') + ## - BFM Parent Type ('parent_type') + ## - Environment Path ('env_path') + ## - VIP Library Env Variable Name ('lib_env_var_name') (only valid for non-QVIP) + ## - QVIP/Non-QVIP flag ('is_qvip') + ## - Initiator/Responder info ('initiator_responder') + ## - VeloceReady flag ('veloce_ready') + def getAllAgents(self,env_type,env_inst,isQVIP,envPath): + alist = [] + if (isQVIP==1): + # This environment we've been given is a QVIP environment which is stored + # in a different structure + struct = self.data['qvip_environments'] + try: + env = struct[env_type] + except KeyError: + raise UserError("Unable to find QVIP environment \""+env_type+"\" in defined QVIP environments (available list is "+str(struct.keys())+")") + for a in env['agents']: + ## All we have is the name of each BFM. + alist = alist + [{ 'bfm_name': a['name'], + 'bfm_type': 'unknown', + 'parent_type': env_type, + 'env_path': envPath+"."+a['name'], + 'lib_env_var_name':'unknown', + 'is_qvip': 1 , + 'initiator_responder':'UNKNOWN', + 'veloce_ready':False }] + ## No nesting with QVIP environments so safe to just return here + return alist + else: + struct = self.data['environments'] + try: + env = struct[env_type] + except KeyError: + raise UserError("Unable to find environment \""+env_type+"\" in defined environments (available list is "+str(struct.keys())) + ## We're looking at a non-QVIP environment. This can have underlying QVIP and/or non-QVIP sub-environments as well as local agents. + ## Look for underlying QVIP subenvs first, then non-QVIP sub-envs, then local agents. + try: + qvip_subenvs = env['qvip_subenvs'] + for e in qvip_subenvs: + alist = alist + self.getAllAgents(e['type'],e['name'],1,envPath+"."+e['name']) + except KeyError: pass + try: + subenvs = env['subenvs'] + for e in subenvs: + alist = alist + self.getAllAgents(e['type'],e['name'],0,envPath+"."+e['name']) + except KeyError: pass + try: + agents = env['agents'] + for a in agents: + try: + env_var_name = self.data['interfaces'][a['type']]['vip_lib_env_variable'] + except KeyError: + env_var_name = 'UVMF_VIP_LIBRARY_HOME' + pass + try: + init_resp = a['initiator_responder'] + except KeyError: + init_resp = 'INITIATOR' + pass + try: + veloce_ready = (self.data['interfaces'][a['type']]['veloce_ready']=="True") + except KeyError: + veloce_ready = True + pass + infact_ready = ('infact_ready' in self.data['interfaces'][a['type']].keys() and self.data['interfaces'][a['type']]['infact_ready']) + + alist = alist + [{ 'bfm_name': a['name'], + 'bfm_type': a['type'], + 'parent_type': env_type, + 'env_path': envPath+"."+a['name'], + 'lib_env_var_name':env_var_name, + 'is_qvip': 0, + 'initiator_responder':init_resp , + 'veloce_ready':veloce_ready, + 'infact_ready':infact_ready }] + except KeyError: pass + return alist + + ## This method returns an ordered list of information on ALL BFMs from a given top-level environment, down. + ## The list entries all have the following structure: + ## - BFM Name ('bfm_name') + ## - BFM Type ('bfm_type') + ## - BFM Parent Type ('parent_type') + ## - Environment Path ('env_path') + ## - VIP Library Env Variable Name ('lib_env_var_name') (only valid for non-QVIP) + ## - QVIP/Non-QVIP flag ('is_qvip') + ## - Initiator/Responder info ('initiator_responder') + ## - VeloceReady flag ('veloce_ready') + def getAllScoreboards(self,env_type,env_inst,envPath): + sblist = [] + struct = self.data['environments'] + try: + env = struct[env_type] + except KeyError: + raise UserError("Unable to find environment \""+env_type+"\" in defined environments (available list is "+str(struct.keys())) + try: + subenvs = env['subenvs'] + for e in subenvs: + sblist = sblist + self.getAllScoreboards(e['type'],e['name'],envPath+"."+e['name']) + except KeyError: pass + try: + sbs = env['scoreboards'] + for sb in sbs: + sblist = sblist + [envPath+"."+sb['name']] + except KeyError: pass + return sblist + + ## This method can be employed to return either a list of (non-QVIP) agents at the provided environment + ## level or recursively, searching through all sub-environments and down. + def getAgents(self,topEnv,recursive=True,givePath=False,parentPath=[]): + struct = self.data['environments'] + try: + env = struct[topEnv] + except KeyError: + raise UserError("Unable to find environment \""+topEnv+"\" in defined environments (available list is "+str(struct.keys())) + agents = [] + try: + agents = env['agents'] + except: + agents = [] + pass + if not givePath: + structure = agents + else: + structure = [] + for agent in agents: + try: + vip_lib_env_variable = self.data['interfaces'][agent['type']]['vip_lib_env_variable'] + except KeyError: + vip_lib_env_variable = "UVMF_VIP_LIBRARY_HOME" + structure = structure + [{ 'envpath' : parentPath, 'agent' : agent, 'vip_lib_env_variable' : vip_lib_env_variable }] + if not recursive: + return structure + try: + subEnvs = env['subenvs'] + for subEnv in subEnvs: + structure = structure + self.getAgents(subEnv['type'],recursive=True,givePath=givePath,parentPath=parentPath+[subEnv['name']]) + except KeyError: pass + return structure + + def dataExtract(self,keys,dictionary): + ## Pull the specified keys out of the given structure. If the key + ## does not exist return None for the given value + ret = [] + for key in keys: + try: + ret = ret + [dictionary[key]] + except KeyError: + ret = ret + [None] + pass + return ret + + def generateEnvironment(self,name,build_existing=False,archive_yaml=True): + env = EnvironmentClass(name) + struct = self.data['environments'][name] + qvip_agents_dot = [] + qvip_agents_und = [] + valid_ap_list = [] + valid_ae_list = [] + valid_qsubenv_list = [] + env_has_extdef_items = False + env = self.setupGlobalVars(env) + ## Extract any environment-level parameters and add them + try: + for param in struct['parameters']: + pname,ptype,pval = self.dataExtract(['name','type','value'],param) + env.addParamDef(pname,ptype,pval) + except KeyError: pass + try: + for param in struct['hvl_pkg_parameters']: + pname,ptype,pval = self.dataExtract(['name','type','value'],param) + env.addHvlPkgParamDef(pname,ptype,pval) + except KeyError: pass + ## Extract any configuration variable settings and add them + try: + for cv_val in struct['config_variable_values']: + cvvname,cvvval = self.dataExtract(['name','value'],cv_val) + env.addConfigVariableValue(cvvname,cvvval) + except KeyError: pass + ## Drill down into any QVIP subenvironments for import information, that'll be needed here + qstruct = self.getQVIPAgents(name) + ilist = qstruct['ilist'] + for i in ilist: + env.addImport(i) + ## Call out any locally defined imports + try: + for imp in struct['imports']: + env.addImport(imp['name']) + except KeyError: pass + ## If imp-decl macros are needed, add them + try: + for impdecl in struct ['imp_decls']: + env.addImpDecl(impdecl['name']) + except KeyError: pass + try: + for nonUvmfComps in struct ['non_uvmf_components']: + cname,ctype = self.dataExtract(['name', 'type'],nonUvmfComps) + try: + cextdef = ( nonUvmfComps['extdef'] == 'True' ) + env_has_extdef_items = True + except KeyError: + pass + try: + cparams_array = nonUvmfComps['parameters'] + except KeyError: + cparams_array = {} + pass + cparams = {} + for item in cparams_array: + n,v = self.dataExtract(['name','value'],item) + cparams[n] = v + env.addNonUvmfComponent(cname,ctype,cparams) + except KeyError: pass + try: + for qvipMemAgents in struct ['qvip_memory_agents']: + qmaname,qmatype,qmaqenv = self.dataExtract(['name', 'type','qvip_environment'],qvipMemAgents) + try: + qmaparams_array = qvipMemAgents['parameters'] + except KeyError: + qmaparams_array = {} + pass + qmaparams = {} + for item in qmaparams_array: + n,v = self.dataExtract(['name','value'],item) + qmaparams[n] = v + env.addQvipMemoryAgent(qmaname,qmatype,qmaqenv,qmaparams) + except KeyError: pass + ## The order of the following loops is important. The order in which local agents, sub-environments and QVIP + ## sub-environments are added must match the order in which they will be added at the bench level, otherwise + ## things will be configured out-of-order. + ## The order is as follows: + ## QVIP subenvs + ## Custom sub-environments + ## Locally defined custom interfaces + ## Look for defined QVIP sub-environments and add those + try: + for subenv in struct['qvip_subenvs']: + n,t = self.dataExtract(['name','type'],subenv) + try: + qvipStruct = self.data['qvip_environments'][t] + except KeyError: + raise UserError("QVIP environment \""+t+"\" in environment \""+name+"\" is not defined") + alist = [] + for a in qvipStruct['agents']: + alist = alist + [a['name']] + qvip_agents_dot = qvip_agents_dot + [n+"."+a['name']] + qvip_agents_und = qvip_agents_und + [n+"_"+a['name']] + valid_qsubenv_list = valid_qsubenv_list + [n] + env.addQvipSubEnv(name=n,envPkg=t,agentList=alist) + except KeyError: pass + ## Look for defined sub-environments and add them + try: + for subenv in struct['subenvs']: + ename,etype = self.dataExtract(['name','type'],subenv) + try: + subextdef = ( subenv['extdef'] == 'True' ) + env_has_extdef_items = True + except KeyError: + pass + try: + eparams_array = subenv['parameters'] + except KeyError: + eparams_array = {} + pass + eparams = {} + num = 0 + for item in eparams_array: + n,v = self.dataExtract(['name','value'],item) + eparams[n] = v + num += 1 + ## Determine how many agents are defined in the subenvironment as that is a required argument going into + ## this API call. This is a recursive count of agents. + agents = self.getAgents(etype,recursive=True) + ## Also find any underlying QVIP agents underneath this subenvironment (nested underneath underlying QVIP subenvs) + qvip_agents_struct = self.getQVIPAgents(etype); + qvip_agents = qvip_agents_struct['alist'] + if agents==None: + raise UserError("Sub-environment type \""+etype+"\" used in environment \""+name+"\" is not found") + self.check_parameters('environment',name,'subenv',ename,etype,eparams_array,self.data['environments'][etype]) + ## Check if subenv has a register model defined unless asked explicitly to avoid it + try: + v = subenv['use_register_model']=='True' + except KeyError: + v = True + pass + if v: + try: + rm = self.data['environments'][etype]['register_model'] + except KeyError: + rm = None + pass + else: + rm = None + if not rm: + rm_pkg = None + rm_block_class = None + else: + try: + rm_pkg = rm['reg_model_package'] + except KeyError: + rm_pkg = etype+"_reg_pkg" + pass + try: + rm_block_class = rm['reg_block_class'] + except KeyError: + rm_block_class = etype+"_reg_model" + pass + env.addSubEnv(ename,etype,len(agents)+len(qvip_agents),eparams,rm_pkg,rm_block_class) + env_def = self.data['environments'][etype] + try: + env_ap_list = env_def['analysis_ports'] + for env_ap in env_ap_list: + valid_ap_list = valid_ap_list + [ename+"."+env_ap['name']] + except KeyError: pass + try: + env_ae_list = env_def['analysis_exports'] + for env_ae in env_ae_list: + valid_ae_list = valid_ae_list + [ename+"."+env_ae['name']] + except KeyError: pass + except KeyError: pass + ## Locally defined agent instantiations + try: + for agent in self.getAgents(name,recursive=False): + aname,atype = self.dataExtract(['name','type'],agent) + try: + aextdef = ( agent['extdef'] == 'True' ) + env_has_extdef_items = True + except KeyError: + pass + try: + aparams_list = agent['parameters'] + except KeyError: + aparams_list = [] + pass + aparams = {} + for item in aparams_list: + n,v = self.dataExtract(['name','value'],item) + aparams[n] = v; + try: + intf = self.data['interfaces'][atype] + except KeyError: + raise UserError("Agent type \""+atype+"\" in environment \""+name+"\" is not recognized") + try: + initResp = agent['initiator_responder'] + except KeyError: + initResp = 'INITIATOR' + pass + self.check_parameters('environment',name,'agent',agent['name'],atype,aparams_list,self.data['interfaces'][atype]) + env.addAgent(agent['name'],atype,intf['clock'],intf['reset'],aparams,initResp) + valid_ap_list = valid_ap_list + [agent['name']+".monitored_ap"] + except KeyError: pass + defined_ac_items = [] + try: + ac_items = struct['analysis_components'] + except KeyError: + ac_items = [] + pass + for ac_item in ac_items: + ac_type,ac_name = self.dataExtract(['type','name'],ac_item) + try: + ac_params = ac_item['parameters'] + except KeyError: + ac_params = [] + pass + ## Don't go through the trouble of poking at the definition of the analysis component if it was already + ## used before. Just instantiate it + try: + extdef = (ac_item['extdef'] == 'True') + env_has_extdef_items = True + except KeyError: + extdef = False + pass + if (ac_type not in defined_ac_items) and (not extdef): + try: + definition = self.data['util_components'][ac_type] + except KeyError: + raise UserError("No definition found for component \""+ac_name+"\" of type \""+ac_type) + ac_type_type = definition['type'] + exports = {} + try: + for item in definition['analysis_exports']: + exports[item['name']] = item['type'] + except KeyError: pass + ports = {} + try: + for item in definition['analysis_ports']: + ports[item['name']] = item['type'] + except KeyError: pass + qvip_exports = {} + try: + for item in definition['qvip_analysis_exports']: + qvip_exports[item['name']] = item['type'] + except KeyError: pass + try: + parameters = definition['parameters'] + except KeyError: + parameters = [] + pass + try: + ac_mtlb_ready = definition['mtlb_ready']==True + except KeyError: + ac_mtlb_ready = False + env.defineAnalysisComponent(ac_type_type,ac_type,exports,ports,qvip_exports,parameters,mtlbReady=ac_mtlb_ready) + defined_ac_items = defined_ac_items + [ac_type] + if ac_type not in self.used_ac_items: + self.used_ac_items = self.used_ac_items + [ac_type] + if not extdef: + self.check_parameters('environment',name,ac_type_type,ac_name,ac_type,ac_params,self.data['util_components'][ac_type]) + env.addAnalysisComponent(ac_name,ac_type,ac_params,extdef) + try: ports + except NameError: ports = None + if ports is not None: + for ap in ports: + valid_ap_list = valid_ap_list + [ac_name+"."+ap] + try: exports + except NameError: exports = None + if exports is not None: + for ae in exports: + valid_ae_list = valid_ae_list + [ac_name+"."+ae] + try: qvip_exports + except NameError: qvip_exports = None + if qvip_exports is not None: + for qae in qvip_exports: + valid_ae_list = valid_ae_list + [ac_name+"."+qae] + try: + sb_items = struct['scoreboards'] + except KeyError: + sb_items = [] + pass + for sb_item in sb_items: + sb_name,sb_type,trans_type = self.dataExtract(['name','sb_type','trans_type'],sb_item) + try: + sb_params_list = sb_item['parameters'] + except KeyError: + sb_params_list = [] + pass + sb_params = {} + for item in sb_params_list: + n,v = self.dataExtract(['name','value'],item) + sb_params[n] = v + env.addUvmfScoreboard(sb_name,sb_type,trans_type,sb_params) + valid_ae_list = valid_ae_list + [sb_name+".expected_analysis_export"] + valid_ae_list = valid_ae_list + [sb_name+".actual_analysis_export"] + try: + for item in struct['analysis_ports']: + n,t,c = self.dataExtract(['name','trans_type','connected_to'],item) + if c not in valid_ap_list: + mess = "TLM connected_to entry \""+c+"\" listed in analysis_ports for environment \""+name+"\" not a valid TLM driver name. \nValid names:" + for ap in valid_ap_list: + mess = mess+"\n "+ap + if env_has_extdef_items: + mess = mess+"\nPort may be on externally defined component - Skipping check on this connnection." + print(mess) + else: + raise UserError(mess) + env.addAnalysisPort(n,t,c) + except KeyError: pass + try: + for item in struct['analysis_exports']: + n,t,c = self.dataExtract(['name','trans_type','connected_to'],item) + if c not in valid_ae_list: + mess = "TLM connected_to entry \""+c+"\" listed in analysis_exports for environment \""+name+"\" not a valid TLM receiver name. \nValid names:" + for ae in valid_ae_list: + mess = mess+"\n "+ae + if env_has_extdef_items: + mess = mess+"\nPort may be on externally defined component - Skipping check on this connnection." + print(mess) + else: + raise UserError(mess) + env.addAnalysisExport(n,t,c) + except KeyError: pass + try: + for item in struct['qvip_connections']: + d,r,k,v = self.dataExtract(['driver','receiver','ap_key','validate'],item) + rlist = r.split(".") + ## Allow the driver (QVIP) to contain regular "." hierarchy for clarity. Convert any found + ## to underscores in order to adhere to the API + dm = re.sub(r'\.','_',d) + if not v: + v = 'True' + if v == 'True': + if dm not in qvip_agents_und: + mess = "QVIP TLM Driver name entry \""+d+"\" listed in qvip_connections for environment \""+name+"\" not a valid QVIP agent name. \nValid names:" + for b in qvip_agents_dot: + mess = mess+"\n "+b + mess = mess+"\nNote: Underscores are valid substitutions within YAML for dot delimeters in this list of valid names.\n" + if env_has_extdef_items: + mess = mess+"\nPort may be on externally defined component - Skipping check on this connnection." + print(mess) + else: + raise UserError(mess) + if r not in valid_ae_list: + mess = "QVIP TLM Receiver name entry \""+r+"\" listed in qvip_connections for environment \""+name+"\" not a valid QVIP TLM receiver name. \nValid names:" + for ae in valid_ae_list: + mess = mess+"\n "+ae + if env_has_extdef_items: + mess = mess+"\nPort may be on externally defined component - Skipping check on this connnection." + print(mess) + else: + raise UserError(mess) + env.addQvipConnection(dm,k,'.'.join(rlist[:-1]),rlist[-1],v) + except KeyError: pass + try: + for conn in struct['tlm_connections']: + d,r,v = self.dataExtract(['driver','receiver', 'validate'],conn) + dlist = d.split(".") + rlist = r.split(".") + ## The driver and receiver entries provided need to be split to work with the API in uvmf_gen + if not v: + v = 'True' + if v == 'True': + if d not in valid_ap_list: + mess = "TLM Driver name entry \""+d+"\" listed in tlm_connections for environment \""+name+"\" not a valid TLM driver name. \nValid names:" + for ap in valid_ap_list: + mess = mess+"\n "+ap + if dlist[0] not in valid_qsubenv_list: + if env_has_extdef_items: + mess = mess+"\nPort may be on externally defined component - Skipping check on this connnection." + print(mess) + else: + raise UserError(mess) + if r not in valid_ae_list: + mess = "TLM Receiver name entry \""+r+"\" listed in tlm_connections for environment \""+name+"\" not a valid TLM receiver name. \nValid names:" + for ae in valid_ae_list: + mess = mess+"\n "+ae + if env_has_extdef_items: + mess = mess+"\nPort may be on externally defined component - Skipping check on this connnection." + print(mess) + else: + raise UserError(mess) + env.addConnection('.'.join(dlist[:-1]),dlist[-1],'.'.join(rlist[:-1]),rlist[-1],v) + except KeyError: pass + try: + for cfg_item in struct['config_vars']: + n,t,c = self.dataExtract(['name','type','comment'],cfg_item) + if not c: + c = "" + try: + crand = (cfg_item['isrand']=="True") + except KeyError: + crand = False + pass + cval = '' + try: + cval = cfg_item['value'] + except KeyError: pass + try: + cvud = cfg_item['unpacked_dimension'] + except KeyError: + cvud = "" + pass + env.addConfigVar(n,t,crand,cval,c,cvud) + except KeyError: pass + try: + for item in struct['config_constraints']: + n,v,c = self.dataExtract(['name','value','comment'],item) + if not c: + c = "" + env.addConfigVarConstraint(n,v,c) + except KeyError: pass + try: + regInfo = struct['register_model'] + except KeyError: + regInfo = None + pass + if regInfo != None: + try: + reg_model_pkg = regInfo['reg_model_package'] + except KeyError: + reg_model_pkg = name+"_reg_pkg" + pass + try: + reg_blk_class = regInfo['reg_block_class'] + except KeyError: + reg_blk_class = name+"_reg_model" + pass + try: + maps = regInfo['maps'] + except KeyError: + maps = None + pass + if maps==None: + use_adapter = False + use_explicit_prediction = False + sequencer = None + trans = None + adapter = None + mapName = None + qvip_agent = False + else: + try: + use_adapter = regInfo['use_adapter'] == "True" + except KeyError: + use_adapter = True + try: + use_explicit_prediction = regInfo['use_explicit_prediction'] == "True" + except KeyError: + use_explicit_prediction = True + maps = regInfo['maps'] + ## Currently only support a single map - this will change in the future, hopefully + if len(maps) != 1: + raise UserError("Register model in environment \""+name+"\" can only have one map defined") + ## Extract information regarding the interface we should be attaching to. + ## First, confirm that the name of the agent is a valid instance. This will return a list + ## of structures, each with an 'name' key and 'type' key. The interface we're attaching to + ## must match up with the 'name' key in this list somewhere + try: + qvip_agent = maps[0]['qvip_agent'] + except KeyError: + qvip_agent = "False" + pass + if qvip_agent == "False": + agent_list = self.getAgents(name,recursive=True) + agent_type = "" + for a in agent_list: + if a['name'] == maps[0]['interface']: + ## Testing for a defined type might be thought to be needed here but if it wasn't a + ## valid agent type the above check would never pass + agent_type = a['type'] + try: + agent_params = self.parameterSyntax(a['parameters']) + except KeyError: + agent_params = "" + pass + break + if agent_type == "": + raise UserError("For register map \""+maps[0]['name']+"\" in environment \""+name+"\" no interface \""+maps[0]['interface']+"\" was found") + sequencer = maps[0]['interface'] + trans = agent_type+"_transaction"+agent_params + adapter = agent_type+"2reg_adapter"+agent_params + mapName = maps[0]['name'] + else: + sequencer = maps[0]['interface'] + trans = "uvm_sequence_item" + adapter = "uvm_reg_adapter" + mapName = maps[0]['name'] + env.addRegisterModel( + sequencer=sequencer, + transactionType=trans, + adapterType=adapter, + busMap=mapName, + useAdapter=use_adapter, + useExplicitPrediction=use_explicit_prediction, + qvipAgent=qvip_agent, + regModelPkg=reg_model_pkg, + regBlockClass=reg_blk_class) + try: + dpi_def = struct['dpi_define'] + ca = "" + la = "" + try: + ca = dpi_def['comp_args'] + except KeyError: pass + try: + la = dpi_def['link_args'] + except KeyError: pass + env.setDPISOName(value=dpi_def['name'],compArgs=ca,linkArgs=la) + for f in dpi_def['files']: + env.addDPIFile(f) + try: + for imp in dpi_def['imports']: + sv_args = [] + try: + sv_args = imp['sv_args'] + except KeyError: pass + env.addDPIImport(imp['c_return_type'],imp['sv_return_type'],imp['name'],imp['c_args'],sv_args) + except KeyError: pass + try: + for exp in dpi_def['exports']: + intf.addDPIExport(exp) + except KeyError: pass + except KeyError: pass + try: + typedefs = struct['typedefs'] + for t in typedefs: + n,v = self.dataExtract(['name','type'],t) + env.addTypedef(n,v) + except KeyError: pass + ## UVMC Stuff + try: + env.addUVMCflags(struct['uvmc_flags']) + except KeyError: pass + try: + env.addUVMClinkArgs(struct['uvmc_link_args']) + except KeyError: pass + try: + cpp_files = struct['uvmc_files'] + for f in cpp_files: + env.addUVMCfile(f) + except KeyError: pass + try: + env.mtlbReady = (struct['mtlb_ready']=="True") + except KeyError: + pass + existing_component = False + try: + if not build_existing: + existing_component = (struct['existing_library_component']=="True") + except KeyError: + pass + if (existing_component == True): + print(" Skipping generation of predefined component "+str(name)) + else: + env.create(parser=self.parser,archive_yaml=archive_yaml) + return env + + def parameterSyntax(self,parameterList): + ## Take the parameter list provided and return the SV syntax for a parameterized type + ## This is expected to be of "parameterUseSchema" with 'name' and a 'value' keys + l = [] + for p in parameterList: + s = "."+p['name']+"("+p['value']+")" + l = l + [ s ] + fs = "#("+','.join(l)+")" + return fs + + def generateBench(self,name,build_existing=False,archive_yaml=True): + ## Isolate the YAML structure for this bench + struct = self.data['benches'][name] + ## Get the name of the top-level environment + top_env = struct['top_env'] + ## Confirm top-level environment is defined + if top_env not in self.data['environments']: + raise UserError("Bench \"{}\" top-env of type \"{}\" is not defined".format(name,top_env)) + ## Top-level environment parameters + try: + env_params_list = struct['top_env_params'] + except KeyError: + env_params_list = [] + pass + ## Build up simpler name/value pair dict of env params + env_params = {} + for p in env_params_list: + env_params[p['name']] = p['value'] + ## Check that parameterization is valid for the top-env + self.check_parameters('bench',name,'environment',top_env,'top_env',env_params_list,self.data['environments'][top_env]) + ## With this information we can create the bench class object + ben = BenchClass(name,top_env,env_params) + ben = self.setupGlobalVars(ben) + ## Look for clock and reset control settings (all optional) + try: + ben.clockHalfPeriod = struct['clock_half_period'] + except KeyError: pass + try: + ben.clockPhaseOffset = struct['clock_phase_offset'] + except KeyError: pass + try: + ben.resetAssertionLevel = (struct['reset_assertion_level']=='True') + except KeyError: pass + try: + ben.useDpiLink = (struct['use_dpi_link']=='True') + except KeyError: pass + try: + ben.resetDuration = struct['reset_duration'] + except KeyError: pass + try: + ben.activePassiveDefault = struct['active_passive_default'] + except KeyError: + ben.activePassiveDefault = 'ACTIVE' + pass + ## Check for inFact ready flag + ben.inFactEnabled = ('infact_enabled' in struct.keys() and struct['infact_enabled']=='True') + + ## Use co-emulation clk/rst generator + try: + ben.useCoEmuClkRstGen = (struct['use_coemu_clk_rst_gen']=='True') + except KeyError: pass + ## Set the veloceReady flag for the bench + try: + ben.veloceReady = (struct['veloce_ready'] == "True") + except KeyError: + ben.veloceReady = True + pass + ## Pull out bench-level parameter definitions, if any + try: + for param in struct['parameters']: + pname,ptype,pval = self.dataExtract(['name','type','value'],param) + ben.addParamDef(pname,ptype,pval) + except KeyError: pass + ## Drill down into any QVIP subenvironments for import information, that'll be needed here + qstruct = self.getQVIPAgents(top_env) + ilist = qstruct['ilist'] + for i in ilist: + ben.addImport(i) + ## Imports + try: + for imp in struct['imports']: + ben.addImport(imp['name']) + except KeyError: pass + ## Pull out active/passive list and produce more easily parsed dict keyed by the BFM names + try: + ap_list = struct['active_passive'] + except KeyError: + ap_list = [] + pass + ap_dict = {} + for i in ap_list: + ap_dict[i['bfm_name']] = i['value'] + ## Do the same for interface parameters + try: + ifp_list = struct['interface_params'] + except KeyError: + ifp_list = [] + ifp_dict = {} + for entry in ifp_list: + bfm_name = entry['bfm_name'] + param_list = entry['value'] + ifp_dict[bfm_name] = {} + for p in param_list: + ifp_dict[bfm_name][p['name']] = p['value'] + ## Determine if top_env has a register model associated with it + try: + e = self.data['environments'][top_env] + except KeyError: + raise UserError("Top-level env \""+top_env+"\" is not defined") + try: + rm = e['register_model'] + ben.topEnvHasRegisterModel = True + try: + rm_pkg = rm['reg_model_package'] + ben.regModelPkg = e['register_model']['reg_model_package'] + except KeyError: + ben.regModelPkg = top_env+"_reg_pkg" + pass + try: + ben.regBlockClass = e['register_model']['reg_block_class'] + except KeyError: + ben.regBlockClass = top_env+"_reg_model" + pass + except KeyError: + ben.topEnvHasRegisterModel = False + pass + ## Find BFMs and add those - order is important, must match how we instantiated the components + ## within the environment. Traverse the environment topology in the order in which sub-envs were + ## called out in the YAML. Use getAllAgents to intelligently traverse the topology and build up a list + ## of BFMs (may be a mix of QVIP and non-QVIP BFMs). Each entry in the resulting list will be a structure + ## with the following information: + ## - BFM Name + ## - BFM Type + ## - Environment Path + ## - QVIP/Non-QVIP flag + ## - Active/Passive flag + ## - Initiator/Responder flag + ## - Veloce Ready flag (for checking) + alist = self.getAllAgents(top_env,'environment',0,'environment') + ## Check for Veloce compatibility. If the bench has been flagged for veloce_ready then none of the underlying + ## non-QVIP agents can be flagged differently. QVIP is a different story, for now. + if ben.veloceReady: + for a in alist: + if a['is_qvip']==0: # Don't bother checking QVIP agents + if not a['veloce_ready']: + ## Fatal out if bench veloce_ready is TRUE but any agents underneath are FALSE + raise UserError("Bench \""+name+"\" is flagged veloce_ready True but underlying agent \""+a['env_path']+"\" of type \""+a['bfm_type']+"\" is flagged veloce_ready False") + valid_bfm_names = [] + ## Now that we have an ordered list of BFMs we can call the appropriate API call for each + for a in alist: + if a['env_path'].count('.')==1: + bfm_name = a['bfm_name'] + debugpath = 'environment' + else: + debugpath = re.sub(r'(.*)\.\w+',r'\1',a['env_path']) + bfm_name = re.sub(r'^environment\.','',a['env_path']) + bfm_name = re.sub(r'\.',r'_',bfm_name) + valid_bfm_names = valid_bfm_names + [bfm_name] + try: + active_passive = ap_dict[bfm_name] + except KeyError: + active_passive = ben.activePassiveDefault + if a['is_qvip']==1: + ## Add each QVIP BFM instantiation. Function API is slightly different for QVIP vs. non-QVIP + ben.addQvipBfm(name=a['bfm_name'],ifPkg=a['parent_type'],activity=active_passive,unique_id=self.getUniqueID(a['env_path'])) + else: + ## Name of each BFM is simplified if they live under the top-level env + ## Determine this by inspecting the env_path entry for each item and counting + ## the number of dots (.). If only one, means this BFM lives at the top-most + ## level. + try: + agentDef = self.data['interfaces'][a['bfm_type']] + except: + raise UserError("Definition for interface type \""+a['bfm_type']+"\" for instance \""+a['env_path']+"\" is not found") + try: + aParams = ifp_dict[bfm_name] + except KeyError: + aParams = {} + pass + infact_ready = ('infact_ready' in a.keys() and a['infact_ready']) + try: + port_list = agentDef['ports'] + except KeyError: + port_list = [] + ben.addBfm(name=bfm_name,ifPkg=a['bfm_type'],clk=agentDef['clock'],rst=agentDef['reset'],activity=active_passive,parametersDict=aParams,sub_env_path=debugpath,agentInstName=a['bfm_name'],vipLibEnvVariable=a['lib_env_var_name'],initResp=a['initiator_responder'],inFactReady=infact_ready,portList=port_list) + ## Check that all keys in the ifp_dict and ap_dict match something in the valid_bfm_names list that + ## was based on the actual UVM component hierarchy elements. If not, it probably means we have a typo somewhere in the bench YAML + for k in ifp_dict.keys(): + if k not in valid_bfm_names: + mess = "BFM name entry \""+k+"\" listed in interface_params structure for bench \""+name+"\" but not a valid BFM name. Valid BFM names:" + for b in valid_bfm_names: + mess = mess+"\n "+b + raise UserError(mess) + for k in ap_dict.keys(): + if k not in valid_bfm_names: + mess = "BFM name entry \""+k+"\" listed in active_passive structure for bench \""+name+"\" but not a valid BFM name. Valid BFM names:" + for b in valid_bfm_names: + mess = mess+"\n "+b + raise UserError(mess) + ## Now drill down again but this time find any DPI packages - these could be defined at any + ## interface or environment, so getAgents isn't good enough. Also need to call getEnvironments + dpi_packages = [] + vinfo_interface_dpi_dependencies = [] + vinfo_environment_dpi_dependencies = [] + for agent in self.getAgents(top_env,recursive=True): + try: + dpi_pkg = self.data['interfaces'][agent['type']]['dpi_define']['name'] + if dpi_pkg not in dpi_packages: + dpi_packages.append(dpi_pkg) + #vinfo_interface_dpi_dependencies.append(self.data['interfaces'][agent['type']]['dpi_define']['name']) + vinfo_interface_dpi_dependencies.append(agent['type']) + except KeyError: pass + envs = self.getEnvironments(top_env,recursive=True) + ## Also add the top-environment to the array when searching for DPI + for env in envs+[{'type':top_env}]: + try: + dpi_pkg = self.data['environments'][env['type']]['dpi_define']['name'] + if dpi_pkg not in dpi_packages: + dpi_packages.append(dpi_pkg) + #vinfo_environment_dpi_dependencies.append(self.data['environments'][env['type']]['dpi_define']['name']) + vinfo_environment_dpi_dependencies.append(env['type']) + except KeyError: pass + for d in dpi_packages: + ben.addDPILibName(d) + for d in vinfo_interface_dpi_dependencies: + ben.addVinfoDependency("comp_"+d+"_pkg_c_files") + for d in vinfo_environment_dpi_dependencies: + ben.addVinfoDependency("comp_"+d+"_env_pkg_c_files") + sblist = self.getAllScoreboards(top_env,'environment','environment') + try: sblist + except NameError: sblist = None + if sblist is not None: + for sb in sblist: + ben.addScoreboard(sb) + try: + for t in struct['additional_tops']: + ben.addTopLevel(t) + except KeyError: pass + try: + ben.mtlbReady = (struct['mtlb_ready']=="True") + except KeyError: + pass + try: + ben.useBCR = (struct['use_bcr']=="True") + except KeyError: + ben.useBCR = False + existing_component = False + try: + if not build_existing: + existing_component = (struct['existing_library_component']=="True") + except KeyError: + pass + if (existing_component == True): + print(" Skipping generation of predefined component "+str(name)) + else: + ben.create(parser=self.parser,archive_yaml=archive_yaml) + return ben + + def generateInterface(self,name,build_existing=False,archive_yaml=True): + intf = InterfaceClass(name) + struct = self.data['interfaces'][name] + intf.clock = struct['clock'] + intf.reset = struct['reset'] + intf = self.setupGlobalVars(intf) + try: + intf.resetAssertionLevel = (struct['reset_assertion_level'] == 'True') + except KeyError: pass + try: + intf.useDpiLink = (struct['use_dpi_link']=='True') + except KeyError: pass + try: + intf.genInBoundStreamingDriver = (struct['gen_inbound_streaming_driver']=='True') + except KeyError: pass + try: + intf.vipLibEnvVariable = struct['vip_lib_env_variable'] + except KeyError: pass + try: + for imp in struct['imports']: + intf.addImport(imp['name']) + except KeyError: pass + try: + for item in struct['parameters']: + n,t,v = self.dataExtract(['name','type','value'],item) + intf.addParamDef(n,t,v) + except KeyError: pass + try: + for item in struct['hdl_pkg_parameters']: + n,t,v = self.dataExtract(['name','type','value'],item) + intf.addHdlPkgParamDef(n,t,v) + except KeyError: pass + try: + for item in struct['hvl_pkg_parameters']: + n,t,v = self.dataExtract(['name','type','value'],item) + intf.addHvlPkgParamDef(n,t,v) + except KeyError: pass + try: + for item in struct['hdl_typedefs']: + n,t = self.dataExtract(['name','type'],item) + intf.addHdlTypedef(n,t) + except KeyError: pass + try: + for item in struct['hvl_typedefs']: + n,t = self.dataExtract(['name','type'],item) + intf.addHvlTypedef(n,t) + except KeyError: pass + try: + for port in struct['ports']: + n,w,d = self.dataExtract(['name','width','dir'],port) + if not re.search(r"^(input|output|inout)$",d): + raise UserError("Direction \""+d+"\" invalid for port \""+n+"\" in interface \""+name+"\"") + try: + r = (port['reset_value']) + except KeyError: + r = "'bz" + intf.addPort(n,w,d,r) + except KeyError: pass + try: + for trans in struct['transaction_vars']: + n,t,c = self.dataExtract(['name','type','comment'],trans) + if not c: + c = "" + try: + trand = (trans['isrand']=="True") + except KeyError: + trand = False + pass + try: + tcomp = (trans['iscompare']=="True") + except KeyError: + tcomp = True + pass + try: + ud = trans['unpacked_dimension'] + except KeyError: + ud = "" + pass + intf.addTransVar(n,t,isrand=trand,iscompare=tcomp,unpackedDim=ud,comment=c) + except KeyError: pass + try: + for cfg in struct['config_vars']: + n,t,c = self.dataExtract(['name','type','comment'],cfg) + if not c: + c = "" + try: + crand = (cfg['isrand']=="True") + except KeyError: + crand = False + pass + cval = '' + try: + cval = cfg['value'] + except KeyError: pass + try: + cvud = cfg['unpacked_dimension'] + except KeyError: + cvud = "" + pass + intf.addConfigVar(n,t,crand,cval,c,cvud) + except KeyError: pass + try: + for item in struct['transaction_constraints']: + n,v,c = self.dataExtract(['name','value','comment'],item) + if not c: + c = "" + intf.addTransVarConstraint(n,v,c) + except KeyError: pass + try: + for item in struct['config_constraints']: + n,v,c = self.dataExtract(['name','value','comment'],item) + if not c: + c = "" + intf.addConfigVarConstraint(n,v,c) + except KeyError: pass + try: + response_info = struct['response_info'] + resp_op = response_info['operation'] + intf.specifyResponseOperation(resp_op) + resp_data = response_info['data'] + intf.specifyResponseData(resp_data) + print("Warning: response_info YAML structure deprecated. Slave agent response data now determined by arguments to respond_and_wait_for_next_transfer task within generated driver_bfm.") + except KeyError: pass + try: + dpi_def = struct['dpi_define'] + ca = "" + la = "" + try: + ca = dpi_def['comp_args'] + except KeyError: pass + try: + la = dpi_def['link_args'] + except KeyError: pass + intf.setDPISOName(value=dpi_def['name'],compArgs=ca,linkArgs=la) + for f in dpi_def['files']: + intf.addDPIFile(f) + try: + for imp in dpi_def['imports']: + sv_args = [] + try: + sv_args = imp['sv_args'] + except KeyError: pass + intf.addDPIImport(imp['c_return_type'],imp['sv_return_type'],imp['name'],imp['c_args'],sv_args) + except KeyError: pass + try: + for exp in dpi_def['exports']: + intf.addDPIExport(exp) + except KeyError: pass + except KeyError: pass + intf.inFactReady = ('infact_ready' in struct.keys() and struct['infact_ready']) + try: + intf.mtlbReady = (struct['mtlb_ready']=="True") + except KeyError: + pass + try: + intf.veloceReady = (struct['veloce_ready'] == "True") + except KeyError: + intf.veloceReady = True + pass + try: + intf.enableFunctionalCoverage = (struct['enable_functional_coverage'] == "True") + except KeyError: pass + if intf.veloceReady == True: + try: + for trans in struct['transaction_vars']: + try: + if trans['unpacked_dimension'] != "": + raise UserError("Interface \""+name+"\" flagged to be Veloce ready but transaction variable \""+trans['name']+"\" has specified an unpacked dimension") + except KeyError: pass + except KeyError: + ## If this happens it means there are no transaction variables, which is also illegal + raise UserError("Interface \"{0}\" flagged to be Veloce ready but no transaction variables have been defined. Must define at least one".format(name)) + pass + try: + for cfg in struct['config_vars']: + try: + if cfg['unpacked_dimension'] != "": + raise UserError("Interface \""+name+"\" flagged to be Veloce ready but configuration variable \""+cfg['name']+"\" has specified an unpacked dimension") + except KeyError: pass + except KeyError: pass + ## If this happens it means there are no transaction variables, which is also illegal +# raise UserError("Interface \"{0}\" flagged to be Veloce ready but no transaction variables have been defined. Must define at least one".format(name)) +# pass + ## Also possible that there was a transaction variables array defined but its empty. Also illegal + if len(struct['transaction_vars'])==0: + raise UserError("Interface \"{0}\" flagged to be Veloce ready but no transaction variables have been defined. Must define at least one".format(name)) + existing_component = False + try: + if not build_existing: + existing_component = (struct['existing_library_component']=="True") + except KeyError: + pass + if existing_component == True: + print(" Skipping generation of predefined component "+str(name)) + else: + intf.create(parser=self.parser,archive_yaml=archive_yaml) + return intf + + def check_parameters(self,parentType,parentName,instanceType,instanceName,definitionName,instanceParams,instanceDefinition): + ## Compare the parameters in a given instance to make sure that the names match up with + ## something in the list of parameters given in the definition. Can be used for any component. Pass + ## in the list of parameters for both. If problem found, display debug information + ## including the name of the parent component, the name and type of the instance and the + ## parameter in question. + ## Don't bother checking anything if the instiation was not provided any parameters. + if len(instanceParams) == 0: + return + try: + definitionParams = instanceDefinition['parameters'] + except KeyError: + raise UserError("When instantiating "+instanceType+" \""+instanceName+"\" of type \""+definitionName+"\" inside "+parentType+" \""+parentName+"\", parameters were provided but definition had no parameters") + ipn = [] + dpn = [] + for p in definitionParams: + dpn = dpn + [p['name']] + for p in instanceParams: + if p['name'] not in dpn: + raise UserError("Unable to find parameter \""+p['name']+"\" in definition of "+instanceType+" \""+definitionName+"\" as instance \""+instanceName+"\" in "+parentType+" \""+parentName+"\"") + +def run(): + ## When invoked, this script can read a series of provided YAML-based configuration files and parse them, building + ## up a database of information on the contained components. Each component will have an associated uvmf_gen class + ## created around it based on the contents. + + ## User can specify that a particular element(s) be created with the -g/--generate switch but the default is to produce + ## everything (i.e. call ".create()" against all defined elements). Any item passed in via --generate + ## that matches the name of a defined element will be generated (if environments/benches/interfaces are named the + ## same the script will match all of them) + search_paths = ['.'] + __version__ = version + uvmf_parser = UVMFCommandLineParser(version=__version__,usage="yaml2uvmf.py [options] [yaml_file1 [yaml_fileN]]") + uvmf_parser.parser.add_option("-f","--file",dest="configfile",action="append",help="Specify a file list of YAML configs. Relative paths relative to the invocation directory") + uvmf_parser.parser.add_option("-F","--relfile",dest="rel_configfile",action="append",help="Specify a file list of YAML configs. Relative paths relative to the file list itself") + uvmf_parser.parser.add_option("-g","--generate",dest="gen_name",action="append",help="Specify which elements to generate (default is everything") + uvmf_parser.parser.add_option("--pdb",dest="enable_pdb",action="store_true",help=SUPPRESS_HELP,default=False) + uvmf_parser.parser.add_option("-m","--merge_source",dest="merge_source",action="store",help="Enable auto-merge flow, pulling from the specified source directory") + uvmf_parser.parser.add_option("-s","--merge_skip_missing_blocks",dest="merge_skip_missing",action="store_true",help="Continue merge if unable to locate a custom block that was defined in old source, producing a report at the end. Default behavior is to raise an error",default=False) + uvmf_parser.parser.add_option("--merge_export_yaml",dest="merge_export_yaml",action="store",help=SUPPRESS_HELP,default=None) + uvmf_parser.parser.add_option("--merge_import_yaml",dest="merge_import_yaml",action="store",help=SUPPRESS_HELP,default=None) + uvmf_parser.parser.add_option("--merge_import_yaml_output",dest="merge_import_yaml_output",action="store",help=SUPPRESS_HELP,default="uvmf_template_merged") + uvmf_parser.parser.add_option("--merge_no_backup",dest="merge_no_backup",action="store_true",help="Do not back up original merge source",default=False) + uvmf_parser.parser.add_option("--merge_debug",dest="merge_debug",action="store_true",help="Provide intermediate unmerged output directory for debug purposes. Debug directory can be specified by --dest_dir switch.",default=False) + uvmf_parser.parser.add_option("--merge_verbose",dest="merge_verbose",action="store_true",help="Output more verbose messages during the merge operation for debug purposes.",default=False) + uvmf_parser.parser.add_option("--build_existing_components",dest="build_existing_components",action="store_true",help="Ignore \"existing_library_component\" flags and attempt to build anyway.",default=False) + uvmf_parser.parser.add_option("--no_archive_yaml",dest="no_archive_yaml",action="store_true",default=False,help="Disable YAML archive creation") + (options,args) = uvmf_parser.parser.parse_args() + if options.enable_pdb or options.debug: + print("Python version info:\n"+sys.version) + if options.enable_pdb == True: + import pdb + pdb.set_trace() + elif options.debug == False: + sys.tracebacklimit = 0 + if (len(args) == 0) and (options.configfile == None) and (options.rel_configfile == None) and (options.merge_source == None): + raise UserError("No configurations or config file specified as input. Must provide one or both") + if (options.merge_source != None) and (options.merge_import_yaml != None): + raise UserError("--merge_source and --merge_import_yaml options are mutually exclusive") + dataObj = DataClass(uvmf_parser) + configfiles = [] + if options.configfile != None: + for cf in options.configfile: + cfr = ConfigFileReader(cf) + configfiles = configfiles + cfr.files + if options.rel_configfile != None: + for cf in options.rel_configfile: + cfr = ConfigFileReader(cf,relative_to_file=True) + configfiles = configfiles + cfr.files + try: + configfiles = configfiles + args + except TypeError: + pass + if len(configfiles) == 0: + if not ((options.merge_source != None) and (options.merge_export_yaml)): + raise UserError("No configuration YAML specified to parse, must provide at least one") + if options.merge_source != None: + if os.path.abspath(os.path.normpath(options.dest_dir)) == os.path.abspath(os.path.normpath(options.merge_source)): + raise UserError("Cannot merge changes into source directory \"{0}\" without specifying an alternate output directory with --dest_dir switch".format(os.path.abspath(os.path.normpath(options.dest_dir)))) + for cfg in configfiles: + dataObj.parseFile(cfg) + dataObj.validate() + dataObj.buildElements(options.gen_name,verify=options.merge_export_yaml==None,build_existing=options.build_existing_components,archive_yaml=(not options.no_archive_yaml)) + if options.merge_source or options.merge_import_yaml: + if not options.merge_import_yaml: + if not (options.merge_no_backup or options.merge_export_yaml): + ## Create a backup of the original source. + backup_copy = backup(options.merge_source) + if not options.quiet: + print("Backed up original source to {0}".format(backup_copy)) + if not options.quiet: + print("Parsing customizations from {0} ...".format(options.merge_source)) + # Parse old source for pragma blocks. Resulting object will contain data structure of this activity + parse = Parse(quiet=options.quiet,cleanup=options.merge_import_yaml,root=os.path.abspath(os.path.normpath(options.merge_source))) + # Need to first produce a list of directories in the new output. Only validate files in the merge source + # that are in the equivalent directories (to do otherwise would be a waste of time) + parse.collect_directories(new_root_dir=options.dest_dir,old_root_dir=options.merge_source) + # Traverse through the merged source directory structure. This will only collect data on + # directories that were just re-generated, nothing outside of that area. + parse.traverse_dir(options.merge_source) + old_root = parse.root + if options.merge_export_yaml: + if not options.quiet: + print(" Exporting merge data to {0}".format(options.merge_export_yaml)) + parse.dump(options.merge_export_yaml) + sys.exit(0) + else: + if not options.quiet: + print("Merging custom code in {0} with new output ...".format(options.merge_source)) + else: + if not options.quiet: + print("Pulling in customizations from imported YAML file {0}".format(options.merge_import_yaml)) + old_root = os.path.abspath(os.path.normpath(options.merge_import_yaml_output)) + merge = Merge(outdir=old_root,skip_missing_blocks=options.merge_skip_missing,new_root=os.path.abspath(os.path.normpath(options.dest_dir)),old_root=old_root,quiet=options.quiet) + if options.merge_import_yaml: + merge.load_yaml(options.merge_import_yaml) + # If we're importing the data, copy newly generated source over to desired final location. This will be what we treat as the "original" output directory + from shutil import copytree + try: + copytree(options.dest_dir,options.merge_import_yaml_output) + except: + pass + else: + merge.load_data(parse.data) + merge.traverse_dir(options.dest_dir) + if (not options.merge_debug): + # Remove the intermediate directory unless asked otherwise + if not options.quiet: + print("Deleting intermediate directory {0} after merging data...".format(options.dest_dir)) + try: + shutil.rmtree(options.dest_dir) + except: + raise UserError("Unable to remove intermediate output directory {0}. Permissions issue?".format(options.dest_dir)) + if not options.quiet: + print("Merge complete!") + if options.merge_verbose: + merge_summary(merge,verbose=True) + merge_summary(merge) + if len(merge.missing_blocks)>0: + print("WARNING: Found \"pragma uvmf custom\" blocks in original source that could not be mapped to new output. These require hand-edits:") + for f in merge.missing_blocks: + print (" File: {0}".format(f)) + for l in merge.missing_blocks[f]: + print(" \"{0}\"".format(l)) + print(" Use backup or revision control source to recover the original content of these blocks") + +if __name__ == '__main__': + run() From 3b6e87c63932b824bd7524a87518575ceb184b6d Mon Sep 17 00:00:00 2001 From: Dampuru Vinay Kumar Reddy Date: Fri, 23 Dec 2022 21:43:16 +0530 Subject: [PATCH 05/22] interfaces --- UVM_Framework/UVMF_2022.3/challenge_3/block_b/apb_intf.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/apb_intf.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/apb_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/apb_intf.yaml new file mode 100644 index 00000000..e69de29b From 1c93cad2ffbc52329d84a77aa76412666a45c089 Mon Sep 17 00:00:00 2001 From: Dampuru Vinay Kumar Reddy Date: Fri, 23 Dec 2022 21:45:21 +0530 Subject: [PATCH 06/22] hi --- .../challenge_3/spi_pkg/.svproject | 16 + .../UVMF_2022.3/challenge_3/spi_pkg/Makefile | 62 +++ .../challenge_3/spi_pkg/compile.do | 14 + .../challenge_3/spi_pkg/doc/spi_if_wiring.pdf | Bin 0 -> 17718 bytes .../challenge_3/spi_pkg/spi.compile | 3 + .../challenge_3/spi_pkg/spi_bfm.vinfo | 6 + .../challenge_3/spi_pkg/spi_common.compile | 9 + .../challenge_3/spi_pkg/spi_filelist_hdl.f | 1 + .../challenge_3/spi_pkg/spi_filelist_hvl.f | 1 + .../challenge_3/spi_pkg/spi_filelist_xrtl.f | 4 + .../challenge_3/spi_pkg/spi_hdl.compile | 7 + .../challenge_3/spi_pkg/spi_hvl.compile | 6 + .../challenge_3/spi_pkg/spi_pkg.sv | 81 ++++ .../challenge_3/spi_pkg/spi_pkg.vinfo | 4 + .../challenge_3/spi_pkg/spi_pkg_hdl.sv | 35 ++ .../challenge_3/spi_pkg/spi_pkg_hdl.vinfo | 2 + .../challenge_3/spi_pkg/spi_pkg_sve.F | 10 + .../spi_pkg/src/spi2reg_adapter.svh | 103 +++++ .../challenge_3/spi_pkg/src/spi_agent.svh | 47 +++ .../spi_pkg/src/spi_configuration.svh | 186 +++++++++ .../challenge_3/spi_pkg/src/spi_driver.svh | 88 ++++ .../challenge_3/spi_pkg/src/spi_driver_bfm.sv | 294 ++++++++++++++ .../challenge_3/spi_pkg/src/spi_if.sv | 66 +++ .../challenge_3/spi_pkg/src/spi_macros.svh | 139 +++++++ .../spi_pkg/src/spi_master_seq.svh | 63 +++ .../spi_pkg/src/spi_mem_slave_seq.svh | 69 ++++ .../spi_pkg/src/spi_mem_slave_transaction.svh | 110 +++++ .../spi_mem_slave_transaction_coverage.svh | 70 ++++ .../src/spi_mem_slave_transaction_viewer.svh | 63 +++ .../challenge_3/spi_pkg/src/spi_monitor.svh | 81 ++++ .../spi_pkg/src/spi_monitor_bfm.sv | 163 ++++++++ .../spi_pkg/src/spi_random_sequence.svh | 50 +++ .../spi_pkg/src/spi_responder_sequence.svh | 48 +++ .../spi_pkg/src/spi_sequence_base.svh | 95 +++++ .../spi_pkg/src/spi_transaction.svh | 190 +++++++++ .../spi_pkg/src/spi_transaction_coverage.svh | 70 ++++ .../challenge_3/spi_pkg/src/spi_typedefs.svh | 20 + .../spi_pkg/src/spi_typedefs_hdl.svh | 23 ++ .../spi_pkg/yaml/spi_interface.yaml | 49 +++ .../UVMF_2022.3/challenge_3/wb_pkg/.svproject | 16 + .../UVMF_2022.3/challenge_3/wb_pkg/Makefile | 62 +++ .../UVMF_2022.3/challenge_3/wb_pkg/compile.do | 14 + .../challenge_3/wb_pkg/src/wb2reg_adapter.svh | 110 +++++ .../challenge_3/wb_pkg/src/wb_agent.svh | 68 ++++ .../wb_pkg/src/wb_configuration.svh | 195 +++++++++ .../challenge_3/wb_pkg/src/wb_driver.svh | 108 +++++ .../challenge_3/wb_pkg/src/wb_driver_bfm.sv | 383 ++++++++++++++++++ .../challenge_3/wb_pkg/src/wb_if.sv | 119 ++++++ .../challenge_3/wb_pkg/src/wb_macros.svh | 148 +++++++ .../wb_pkg/src/wb_master_access_sequence.svh | 50 +++ .../wb_pkg/src/wb_memory_slave_sequence.svh | 50 +++ .../challenge_3/wb_pkg/src/wb_monitor.svh | 96 +++++ .../challenge_3/wb_pkg/src/wb_monitor_bfm.sv | 212 ++++++++++ .../wb_pkg/src/wb_random_sequence.svh | 62 +++ .../wb_pkg/src/wb_reset_sequence.svh | 64 +++ .../wb_pkg/src/wb_responder_sequence.svh | 62 +++ .../wb_pkg/src/wb_sequence_base.svh | 117 ++++++ .../wb_pkg/src/wb_slave_access_sequence.svh | 52 +++ .../challenge_3/wb_pkg/src/wb_transaction.svh | 212 ++++++++++ .../wb_pkg/src/wb_transaction_coverage.svh | 82 ++++ .../challenge_3/wb_pkg/src/wb_typedefs.svh | 20 + .../wb_pkg/src/wb_typedefs_hdl.svh | 22 + .../UVMF_2022.3/challenge_3/wb_pkg/wb.compile | 3 + .../challenge_3/wb_pkg/wb_bfm.vinfo | 6 + .../challenge_3/wb_pkg/wb_common.compile | 9 + .../challenge_3/wb_pkg/wb_filelist_hdl.f | 1 + .../challenge_3/wb_pkg/wb_filelist_hvl.f | 1 + .../challenge_3/wb_pkg/wb_filelist_xrtl.f | 4 + .../challenge_3/wb_pkg/wb_hdl.compile | 7 + .../challenge_3/wb_pkg/wb_hvl.compile | 6 + .../UVMF_2022.3/challenge_3/wb_pkg/wb_pkg.sv | 79 ++++ .../challenge_3/wb_pkg/wb_pkg.vinfo | 4 + .../challenge_3/wb_pkg/wb_pkg_hdl.sv | 35 ++ .../challenge_3/wb_pkg/wb_pkg_hdl.vinfo | 2 + .../challenge_3/wb_pkg/wb_pkg_sve.F | 10 + .../challenge_3/wb_pkg/yaml/wb_interface.yaml | 97 +++++ 76 files changed, 4936 insertions(+) create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/.svproject create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/Makefile create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/compile.do create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/doc/spi_if_wiring.pdf create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi.compile create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_bfm.vinfo create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_common.compile create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_filelist_hdl.f create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_filelist_hvl.f create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_filelist_xrtl.f create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_hdl.compile create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_hvl.compile create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg.sv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg.vinfo create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg_hdl.sv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg_hdl.vinfo create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg_sve.F create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi2reg_adapter.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_agent.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_configuration.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_driver.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_driver_bfm.sv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_if.sv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_macros.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_master_seq.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_seq.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_transaction.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_transaction_coverage.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_transaction_viewer.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_monitor.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_monitor_bfm.sv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_random_sequence.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_responder_sequence.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_sequence_base.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_transaction.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_transaction_coverage.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_typedefs.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_typedefs_hdl.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/yaml/spi_interface.yaml create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/.svproject create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/Makefile create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/compile.do create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb2reg_adapter.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_agent.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_configuration.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_driver.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_driver_bfm.sv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_if.sv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_macros.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_master_access_sequence.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_memory_slave_sequence.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_monitor.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_monitor_bfm.sv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_random_sequence.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_reset_sequence.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_responder_sequence.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_sequence_base.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_slave_access_sequence.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_transaction.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_transaction_coverage.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_typedefs.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_typedefs_hdl.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb.compile create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_bfm.vinfo create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_common.compile create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_filelist_hdl.f create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_filelist_hvl.f create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_filelist_xrtl.f create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_hdl.compile create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_hvl.compile create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg.sv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg.vinfo create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg_hdl.sv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg_hdl.vinfo create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg_sve.F create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/yaml/wb_interface.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/.svproject b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/.svproject new file mode 100644 index 00000000..a60de9cf --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/.svproject @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/Makefile b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/Makefile new file mode 100644 index 00000000..6e92ac2c --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/Makefile @@ -0,0 +1,62 @@ +# spi interface packages source +# pragma uvmf custom additional begin +# pragma uvmf custom additional end + +spi_PKG = \ + +incdir+$(UVMF_VIP_LIBRARY_HOME)/interface_packages/spi_pkg \ + -F $(UVMF_VIP_LIBRARY_HOME)/interface_packages/spi_pkg/spi_filelist_hvl.f + +spi_PKG_HDL = \ + +incdir+$(UVMF_VIP_LIBRARY_HOME)/interface_packages/spi_pkg \ + -F $(UVMF_VIP_LIBRARY_HOME)/interface_packages/spi_pkg/spi_filelist_hdl.f + +spi_PKG_XRTL = \ + +incdir+$(UVMF_VIP_LIBRARY_HOME)/interface_packages/spi_pkg \ + -F $(UVMF_VIP_LIBRARY_HOME)/interface_packages/spi_pkg/spi_filelist_xrtl.f + +COMP_spi_PKG_TGT_0 = q_comp_spi_pkg +COMP_spi_PKG_TGT_1 = v_comp_spi_pkg +COMP_spi_PKG_TGT = $(COMP_spi_PKG_TGT_$(USE_VELOCE)) + +comp_spi_pkg: $(COMP_spi_PKG_TGT) + +q_comp_spi_pkg: + $(HDL_COMP_CMD) $(spi_PKG_HDL) + $(HVL_COMP_CMD) $(spi_PKG) + $(HDL_COMP_CMD) $(spi_PKG_XRTL) + +v_comp_spi_pkg: + $(HVL_COMP_CMD) $(spi_PKG_HDL) + $(HVL_COMP_CMD) $(spi_PKG) + $(VELANALYZE_HVL_CMD) $(spi_PKG_HDL) + $(VELANALYZE_HVL_CMD) $(spi_PKG) + $(HDL_COMP_CMD) $(spi_PKG_XRTL) + +ifeq ($(MTI_VCO_MODE),64) + GCC_COMP_ARCH = -m64 +else + GCC_COMP_ARCH = -m32 +endif + +C_FILE_COMPILE_LIST_spi_pkg = \ + +O_FILE_COMPILE_LIST_spi_pkg = $(notdir $(C_FILE_COMPILE_LIST_spi_pkg:.c=.o)) + +GCC_COMP_ARGS_spi_pkg += -I$(UVMF_VIP_LIBRARY_HOME)/interface_packages/spi_pkg/dpi \ + -fPIC + +GCC_LINK_ARGS_spi_pkg += \ + \ + -o .so + +comp_spi_pkg_c_files: + @echo "--------------------------------" + @echo "Compiling Interface C source" + @echo "--------------------------------" + gcc $(GCC_COMP_ARCH) $(GCC_COMP_ARGS_spi_pkg) $(C_FILE_COMPILE_LIST_spi_pkg) + @echo "--------------------------------" + @echo "Linking Interface C objects into a shared object" + @echo "--------------------------------" + gcc $(GCC_COMP_ARCH) $(GCC_LINK_ARGS_spi_pkg) $(O_FILE_COMPILE_LIST_spi_pkg) + @echo "--------------------------------" + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/compile.do b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/compile.do new file mode 100644 index 00000000..644f2b84 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/compile.do @@ -0,0 +1,14 @@ +# Tcl do file for compile of spi interface + +# pragma uvmf custom additional begin +# pragma uvmf custom additional end + + +vlog -sv -timescale 1ps/1ps -suppress 2223,2286 +incdir+$env(UVMF_VIP_LIBRARY_HOME)/interface_packages/spi_pkg \ + -F $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/spi_pkg/spi_filelist_hdl.f + +vlog -sv -timescale 1ps/1ps -suppress 2223,2286 +incdir+$env(UVMF_VIP_LIBRARY_HOME)/interface_packages/spi_pkg \ + -F $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/spi_pkg/spi_filelist_hvl.f + +vlog -sv -timescale 1ps/1ps -suppress 2223,2286 +incdir+$env(UVMF_VIP_LIBRARY_HOME)/interface_packages/spi_pkg \ + -F $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/spi_pkg/spi_filelist_xrtl.f \ No newline at end of file diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/doc/spi_if_wiring.pdf b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/doc/spi_if_wiring.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9ed883ab9219f5dea59fa8c7baea1ea34e997d4c GIT binary patch literal 17718 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 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi.compile b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi.compile new file mode 100644 index 00000000..f10c71a6 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi.compile @@ -0,0 +1,3 @@ +needs: + - spi_hvl.compile + - spi_hdl.compile diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_bfm.vinfo b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_bfm.vinfo new file mode 100644 index 00000000..678dc7f5 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_bfm.vinfo @@ -0,0 +1,6 @@ +@use $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.vinfo +@use spi_pkg_hdl.vinfo ++incdir+@vinfodir +src/spi_if.sv +src/spi_driver_bfm.sv +src/spi_monitor_bfm.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_common.compile b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_common.compile new file mode 100644 index 00000000..5b4df47e --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_common.compile @@ -0,0 +1,9 @@ +incdir: + - ${uvm_path}/src + - . + +needs: + - $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.compile + +src: + - spi_pkg_hdl.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_filelist_hdl.f b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_filelist_hdl.f new file mode 100644 index 00000000..e8cb92ed --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_filelist_hdl.f @@ -0,0 +1 @@ +$UVMF_VIP_LIBRARY_HOME/interface_packages/spi_pkg/spi_pkg_hdl.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_filelist_hvl.f b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_filelist_hvl.f new file mode 100644 index 00000000..92f98f2b --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_filelist_hvl.f @@ -0,0 +1 @@ +$UVMF_VIP_LIBRARY_HOME/interface_packages/spi_pkg/spi_pkg.sv \ No newline at end of file diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_filelist_xrtl.f b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_filelist_xrtl.f new file mode 100644 index 00000000..0e06eef6 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_filelist_xrtl.f @@ -0,0 +1,4 @@ +$UVMF_VIP_LIBRARY_HOME/interface_packages/spi_pkg/spi_pkg_hdl.sv +$UVMF_VIP_LIBRARY_HOME/interface_packages/spi_pkg/src/spi_if.sv +$UVMF_VIP_LIBRARY_HOME/interface_packages/spi_pkg/src/spi_monitor_bfm.sv +$UVMF_VIP_LIBRARY_HOME/interface_packages/spi_pkg/src/spi_driver_bfm.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_hdl.compile b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_hdl.compile new file mode 100644 index 00000000..9a4f4399 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_hdl.compile @@ -0,0 +1,7 @@ +src: + - src/spi_if.sv + - src/spi_driver_bfm.sv + - src/spi_monitor_bfm.sv + +needs: + - spi_common.compile diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_hvl.compile b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_hvl.compile new file mode 100644 index 00000000..424e2970 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_hvl.compile @@ -0,0 +1,6 @@ +needs: + - $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg.compile + - spi_common.compile + +src: + - spi_pkg.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg.sv b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg.sv new file mode 100644 index 00000000..52f6bdba --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg.sv @@ -0,0 +1,81 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// PACKAGE: This file defines all of the files contained in the +// interface package that will run on the host simulator. +// +// CONTAINS: +// - +// - +// - + +// - +// - +// - + +// - +// - +// - + +// - +// - +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +package spi_pkg; + + import uvm_pkg::*; + import uvmf_base_pkg_hdl::*; + import uvmf_base_pkg::*; + import spi_pkg_hdl::*; + + `include "uvm_macros.svh" + + // pragma uvmf custom package_imports_additional begin + // pragma uvmf custom package_imports_additional end + + `include "src/spi_macros.svh" + + export spi_pkg_hdl::*; + + + + // Parameters defined as HVL parameters + + `include "src/spi_typedefs.svh" + `include "src/spi_transaction.svh" + + `include "src/spi_configuration.svh" + `include "src/spi_driver.svh" + `include "src/spi_monitor.svh" + + `include "src/spi_transaction_coverage.svh" + `include "src/spi_sequence_base.svh" + `include "src/spi_random_sequence.svh" + + `include "src/spi_responder_sequence.svh" + `include "src/spi2reg_adapter.svh" + + `include "src/spi_agent.svh" + + // pragma uvmf custom package_item_additional begin + `include "src/spi_mem_slave_transaction.svh" + `include "src/spi_mem_slave_transaction_coverage.svh" + `include "src/spi_mem_slave_transaction_viewer.svh" + + `include "src/spi_master_seq.svh" + `include "src/spi_mem_slave_seq.svh" + + + + + // pragma uvmf custom package_item_additional end + +endpackage + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg.vinfo b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg.vinfo new file mode 100644 index 00000000..045dc07e --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg.vinfo @@ -0,0 +1,4 @@ +@use $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg.vinfo +@use spi_pkg_hdl.vinfo ++incdir+@vinfodir +spi_pkg.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg_hdl.sv b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg_hdl.sv new file mode 100644 index 00000000..cc139714 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg_hdl.sv @@ -0,0 +1,35 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// PACKAGE: This file defines all of the files contained in the +// interface package that needs to be compiled and synthesized +// for running on Veloce. +// +// CONTAINS: +// - +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +package spi_pkg_hdl; + + import uvmf_base_pkg_hdl::*; + + // pragma uvmf custom package_imports_additional begin + // pragma uvmf custom package_imports_additional end + + // Parameters defined as HDL parameters + + `include "src/spi_typedefs_hdl.svh" + `include "src/spi_macros.svh" + + // pragma uvmf custom package_item_additional begin + // pragma uvmf custom package_item_additional end + +endpackage + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg_hdl.vinfo b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg_hdl.vinfo new file mode 100644 index 00000000..42093530 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg_hdl.vinfo @@ -0,0 +1,2 @@ +@use $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.vinfo +spi_pkg_hdl.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg_sve.F b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg_sve.F new file mode 100644 index 00000000..d2339b7a --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/spi_pkg_sve.F @@ -0,0 +1,10 @@ +// UVM ++incdir+${UVM_HOME}/src +${UVM_HOME}/src/uvm_pkg.sv + +// Common UVMF files +-f ${UVMF_HOME}/common/common_sve.f + ++incdir+. +-f ${UVMF_VIP_LIBRARY_HOME}/interface_packages/spi_pkg/spi_filelist_hdl.f +-f ${UVMF_VIP_LIBRARY_HOME}/interface_packages/spi_pkg/spi_filelist_hvl.f diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi2reg_adapter.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi2reg_adapter.svh new file mode 100644 index 00000000..9779c223 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi2reg_adapter.svh @@ -0,0 +1,103 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This file contains the UVM register adapter for the spi interface. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class spi2reg_adapter extends uvm_reg_adapter; + + `uvm_object_utils( spi2reg_adapter ) + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + //-------------------------------------------------------------------- + // new + //-------------------------------------------------------------------- + function new (string name = "spi2reg_adapter" ); + super.new(name); + // pragma uvmf custom new begin + // UVMF_CHANGE_ME : Configure the adapter regarding byte enables and provides response. + + // Does the protocol the Agent is modeling support byte enables? + // 0 = NO + // 1 = YES + supports_byte_enable = 0; + + // Does the Agent's Driver provide separate response sequence items? + // i.e. Does the driver call seq_item_port.put() + // and do the sequences call get_response()? + // 0 = NO + // 1 = YES + provides_responses = 0; + + + + // pragma uvmf custom new end + + endfunction: new + + //-------------------------------------------------------------------- + // reg2bus + //-------------------------------------------------------------------- + virtual function uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw); + + spi_transaction trans_h = spi_transaction ::type_id::create("trans_h"); + + // pragma uvmf custom reg2bus begin + // UVMF_CHANGE_ME : Fill in the reg2bus adapter mapping registe fields to protocol fields. + + //Adapt the following for your sequence item type + // trans_h.op = (rw.kind == UVM_READ) ? WB_READ : WB_WRITE; + //Copy over address + // trans_h.addr = rw.addr; + //Copy over write data + // trans_h.data = rw.data; + + + + + // pragma uvmf custom reg2bus end + + // Return the adapted transaction + return trans_h; + + endfunction: reg2bus + + //-------------------------------------------------------------------- + // bus2reg + //-------------------------------------------------------------------- + virtual function void bus2reg(uvm_sequence_item bus_item, + ref uvm_reg_bus_op rw); + spi_transaction trans_h; + if (!$cast(trans_h, bus_item)) begin + `uvm_fatal("ADAPT","Provided bus_item is not of the correct type") + return; + end + // pragma uvmf custom bus2reg begin + // UVMF_CHANGE_ME : Fill in the bus2reg adapter mapping protocol fields to register fields. + //Adapt the following for your sequence item type + //Copy over instruction type + // rw.kind = (trans_h.op == WB_WRITE) ? UVM_WRITE : UVM_READ; + //Copy over address + // rw.addr = trans_h.addr; + //Copy over read data + // rw.data = trans_h.data; + //Check for errors on the bus and return UVM_NOT_OK if there is an error + // rw.status = UVM_IS_OK; + + + + // pragma uvmf custom bus2reg end + + endfunction: bus2reg + +endclass : spi2reg_adapter diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_agent.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_agent.svh new file mode 100644 index 00000000..a35be3d4 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_agent.svh @@ -0,0 +1,47 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Protocol specific agent class definition +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class spi_agent extends uvmf_parameterized_agent #( + .CONFIG_T(spi_configuration ), + .DRIVER_T(spi_driver ), + .MONITOR_T(spi_monitor ), + .COVERAGE_T(spi_transaction_coverage ), + .TRANS_T(spi_transaction ) + ); + + `uvm_component_utils( spi_agent ) + +// pragma uvmf custom class_item_additional begin +// pragma uvmf custom class_item_additional end + +// **************************************************************************** +// FUNCTION : new() +// This function is the standard SystemVerilog constructor. +// + function new( string name = "", uvm_component parent = null ); + super.new( name, parent ); + endfunction + +// **************************************************************************** + // FUNCTION: build_phase + virtual function void build_phase(uvm_phase phase); + super.build_phase(phase); + if (configuration.active_passive == ACTIVE) begin + // Place sequencer handle into configuration object + // so that it may be retrieved from configuration + // rather than using uvm_config_db + configuration.sequencer = this.sequencer; + end + endfunction + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_configuration.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_configuration.svh new file mode 100644 index 00000000..a70693e6 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_configuration.svh @@ -0,0 +1,186 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class contains all variables and functions used +// to configure the spi agent and its bfm's. It gets the +// bfm's from the uvm_config_db for use by the agent. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class spi_configuration extends uvmf_parameterized_agent_configuration_base #( + .DRIVER_BFM_BIND_T(virtual spi_driver_bfm ), + .MONITOR_BFM_BIND_T( virtual spi_monitor_bfm )); + + `uvm_object_utils( spi_configuration ) + + + // Sequencer handle populated by agent + uvm_sequencer #(spi_transaction ) sequencer; + + //Constraints for the configuration variables: + + // pragma uvmf custom class_item_additional begin +// SPCR : Serial Peripheral Control Register + bit SPCR_SPIE = 0; // Serial Peripheral Interrupt Enable + bit SPCR_SPE = 0; // Serial Peripheral Enable + bit SPCR_RESERVED = 0; // Reserved field + bit SPCR_MSTR = 1; // Master Mode Select + rand bit SPCR_CPOL = 0; // Clock Polarity + rand bit SPCR_CPHA = 0; // Clock Phase + rand bit [1:0] SPCR_SPR = 0; // SPI Clock Rate Select + +// SPER : Serial Peripheral Extensions Register + bit [1:0] SPER_ICNT = 0; // Serial Peripheral Interrupt Count + bit [3:0] SPER_RESERVED = 0; // Reserved field + rand bit [1:0] SPER_ESPR = 0; // Extended SPI Clock Rate Select + + + + + // pragma uvmf custom class_item_additional end + + covergroup spi_configuration_cg; + // pragma uvmf custom covergroup begin + option.auto_bin_max=1024; + // pragma uvmf custom covergroup end + endgroup + + //******************************************************************* + //******************************************************************* + // Structure used to pass configuration variables to monitor and driver BFM's. + // Use to_struct function to pack variables into structure. + // Use from_struct function to unpack variables from structure. + // This structure is defined in spi_macros.svh + `spi_CONFIGURATION_STRUCT + spi_configuration_s spi_configuration_struct; + //******************************************************************* + // FUNCTION: to_struct() + // This function packs variables into a spi_configuration_s + // structure. The function returns the handle to the spi_configuration_struct. + // This function is defined in spi_macros.svh + `spi_CONFIGURATION_TO_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_struct() + // This function unpacks the struct provided as an argument into + // variables of this class. + // This function is defined in spi_macros.svh + `spi_CONFIGURATION_FROM_STRUCT_FUNCTION + + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new( string name = "" ); + super.new( name ); + // Construct the covergroup for this configuration class + spi_configuration_cg = new; + endfunction + + // **************************************************************************** + // FUNCTION: post_randomize() + // This function is automatically called after the randomize() function + // is executed. + // + function void post_randomize(); + super.post_randomize(); + spi_configuration_cg.sample(); + endfunction + + // **************************************************************************** + // FUNCTION: initialize + // This function causes the configuration to retrieve + // its virtual interface handle from the uvm_config_db. + // This function also makes itself available to its + // agent through the uvm_config_db. + // + // ARGUMENTS: + // uvmf_active_passive_t activity: + // This argument identifies the simulation level + // as either BLOCK, CHIP, SIMULATION, etc. + // + // AGENT_PATH: + // This argument identifies the path to this + // configurations agent. This configuration + // makes itself available to the agent specified + // by agent_path by placing itself into the + // uvm_config_db. + // + // INTERFACE_NAME: + // This argument identifies the string name of + // this configurations BFM's. This string + // name is used to retrieve the driver and + // monitor BFM from the uvm_config_db. + // + virtual function void initialize(uvmf_active_passive_t activity, + string agent_path, + string interface_name); + + super.initialize( activity, agent_path, interface_name); + // The covergroup is given the same name as the interface + spi_configuration_cg.set_inst_name(interface_name); + + // This configuration places itself into the uvm_config_db for the agent, identified by the agent_path variable, to retrieve. + uvm_config_db #( spi_configuration + )::set( null ,agent_path,UVMF_AGENT_CONFIG, this ); + + // This configuration also places itself in the config db using the same identifier used by the interface. This allows users to access + // configuration variables and the interface through the bfm api class rather than directly accessing the BFM. This is useful for + // accessingthe BFM when using Veloce + uvm_config_db #( spi_configuration + )::set( null ,UVMF_CONFIGURATIONS, interface_name, this ); + + spi_configuration_cg.set_inst_name($sformatf("spi_configuration_cg_%s",get_full_name())); + + // pragma uvmf custom initialize begin + // This controls whether or not the agent returns a transaction handle in the driver when calling + // item_done() back into the sequencer or not. If set to 1, a transaction is sent back which means + // the sequence on the other end must use the get_response() part of the driver/sequence API. If + // this doesn't occur, there will eventually be response_queue overflow errors during the test. + return_transaction_response = 1'b0; + + + + + // pragma uvmf custom initialize end + + endfunction + + // **************************************************************************** + // TASK: wait_for_reset + // *[Required]* Blocks until reset is released. The wait_for_reset operation is performed + // by a task in the monitor bfm. + virtual task wait_for_reset(); + monitor_bfm.wait_for_reset(); + endtask + + // **************************************************************************** + // TASK: wait_for_num_clocks + // *[Required]* Blocks until specified number of clocks have elapsed. The wait_for_num_clocks + // operation is performed by a task in the monitor bfm. + virtual task wait_for_num_clocks(int clocks); + monitor_bfm.wait_for_num_clocks(clocks); + endtask + + // **************************************************************************** + // FUNCTION : convert2string() + // This function is used to convert variables in this class into a string for log messaging. + // + virtual function string convert2string (); + // pragma uvmf custom convert2string begin + return $sformatf(""); + // pragma uvmf custom convert2string end + endfunction + + // **************************************************************************** + // FUNCTION: get_sequencer + function uvm_sequencer #(spi_transaction) get_sequencer(); + return sequencer; + endfunction + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_driver.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_driver.svh new file mode 100644 index 00000000..50ebb98b --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_driver.svh @@ -0,0 +1,88 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class passes transactions between the sequencer +// and the BFM driver interface. It accesses the driver BFM +// through the bfm handle. This driver +// passes transactions to the driver BFM through the access +// task. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class spi_driver extends uvmf_driver_base #( + .CONFIG_T(spi_configuration ), + .BFM_BIND_T(virtual spi_driver_bfm ), + .REQ(spi_transaction ), + .RSP(spi_transaction )); + + `uvm_component_utils( spi_driver ) +//******************************************************************* +// Macros that define structs located in spi_macros.svh +//******************************************************************* +// Initiator macro used by spi_driver and spi_driver_bfm +// to communicate initiator driven data to spi_driver_bfm. +`spi_INITIATOR_STRUCT + spi_initiator_s spi_initiator_struct; +//******************************************************************* +// Responder macro used by spi_driver and spi_driver_bfm +// to communicate Responder driven data to spi_driver_bfm. +`spi_RESPONDER_STRUCT + spi_responder_s spi_responder_struct; + +// pragma uvmf custom class_item_additional begin +// pragma uvmf custom class_item_additional end + +// **************************************************************************** +// This function is the standard SystemVerilog constructor. +// + function new( string name = "", uvm_component parent=null ); + super.new( name, parent ); + endfunction + +// **************************************************************************** +// This function sends configuration object variables to the driver BFM +// using the configuration struct. +// + virtual function void configure(input CONFIG_T cfg); + bfm.configure( cfg.to_struct() ); + endfunction + +// **************************************************************************** +// This function places a handle to this class in the proxy variable in the +// driver BFM. This allows the driver BFM to call tasks and function within this class. +// + virtual function void set_bfm_proxy_handle(); + bfm.proxy = this; endfunction + +// **************************************************************************** +// This task is called by the run_phase in uvmf_driver_base. + virtual task access( inout REQ txn ); +// pragma uvmf custom access begin + if (configuration.initiator_responder==RESPONDER) begin + // Complete current transfer and wait for next transfer + bfm.set_miso_data(txn.to_responder_struct()); + bfm.get_mosi_data(spi_initiator_struct); + // Unpack information about initiated transfer received by this responder + txn.from_initiator_struct(spi_initiator_struct); + end else begin + // Initiate a transfer and get response + bfm.initiate_and_get_response( + txn.to_initiator_struct(), + spi_responder_struct + ); + // Unpack transfer response information received by this initiator + txn.from_responder_struct(spi_responder_struct); + end + + + +// pragma uvmf custom access end + endtask + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_driver_bfm.sv b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_driver_bfm.sv new file mode 100644 index 00000000..fdee6367 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_driver_bfm.sv @@ -0,0 +1,294 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This interface performs the spi signal driving. It is +// accessed by the uvm spi driver through a virtual interface +// handle in the spi configuration. It drives the singals passed +// in through the port connection named bus of type spi_if. +// +// Input signals from the spi_if are assigned to an internal input +// signal with a _i suffix. The _i signal should be used for sampling. +// +// The input signal connections are as follows: +// bus.signal -> signal_i +// +// This bfm drives signals with a _o suffix. These signals +// are driven onto signals within spi_if based on INITIATOR/RESPONDER and/or +// ARBITRATION/GRANT status. +// +// The output signal connections are as follows: +// signal_o -> bus.signal +// +// +// Interface functions and tasks used by UVM components: +// +// configure: +// This function gets configuration attributes from the +// UVM driver to set any required BFM configuration +// variables such as 'initiator_responder'. +// +// initiate_and_get_response: +// This task is used to perform signaling activity for initiating +// a protocol transfer. The task initiates the transfer, using +// input data from the initiator struct. Then the task captures +// response data, placing the data into the response struct. +// The response struct is returned to the driver class. +// +// respond_and_wait_for_next_transfer: +// This task is used to complete a current transfer as a responder +// and then wait for the initiator to start the next transfer. +// The task uses data in the responder struct to drive protocol +// signals to complete the transfer. The task then waits for +// the next transfer. Once the next transfer begins, data from +// the initiator is placed into the initiator struct and sent +// to the responder sequence for processing to determine +// what data to respond with. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +import uvmf_base_pkg_hdl::*; +import spi_pkg_hdl::*; +`include "src/spi_macros.svh" + +interface spi_driver_bfm + (spi_if bus); + // The following pragma and additional ones in-lined further below are for running this BFM on Veloce + // pragma attribute spi_driver_bfm partition_interface_xif + // Config value to determine if this is an initiator or a responder + uvmf_initiator_responder_t initiator_responder; + // Custom configuration variables. + // These are set using the configure function which is called during the UVM connect_phase + + tri sck_i; + tri rst_i; + + // Signal list (all signals are capable of being inputs and outputs for the sake + // of supporting both INITIATOR and RESPONDER mode operation. Expectation is that + // directionality in the config file was from the point-of-view of the INITIATOR + + // INITIATOR mode input signals + tri miso_i; + reg miso_o = 'bz; + + // INITIATOR mode output signals + tri mosi_i; + reg mosi_o = 'bz; + + // Bi-directional signals + + + assign sck_i = bus.sck; + assign rst_i = bus.rst; + + // These are signals marked as 'input' by the config file, but the signals will be + // driven by this BFM if put into RESPONDER mode (flipping all signal directions around) + assign miso_i = bus.miso; + assign bus.miso = (initiator_responder == RESPONDER) ? miso_o : 'bz; + + + // These are signals marked as 'output' by the config file, but the outputs will + // not be driven by this BFM unless placed in INITIATOR mode. + assign bus.mosi = (initiator_responder == INITIATOR) ? mosi_o : 'bz; + assign mosi_i = bus.mosi; + + // Proxy handle to UVM driver + spi_pkg::spi_driver proxy; + // pragma tbx oneway proxy.my_function_name_in_uvm_driver + + // **************************************************************************** + // **************************************************************************** + // Macros that define structs located in spi_macros.svh + // **************************************************************************** + // Struct for passing configuration data from spi_driver to this BFM + // **************************************************************************** + `spi_CONFIGURATION_STRUCT + // **************************************************************************** + // Structs for INITIATOR and RESPONDER data flow + //******************************************************************* + // Initiator macro used by spi_driver and spi_driver_bfm + // to communicate initiator driven data to spi_driver_bfm. + `spi_INITIATOR_STRUCT + spi_initiator_s spi_initiator_struct; + // Responder macro used by spi_driver and spi_driver_bfm + // to communicate Responder driven data to spi_driver_bfm. + `spi_RESPONDER_STRUCT + spi_responder_s spi_responder_struct; + + // **************************************************************************** + // Always block used to return signals to reset value upon assertion of reset + always @( posedge rst_i ) + begin + // RESPONDER mode output signals + miso_o <= 'b0; + // INITIATOR mode output signals + mosi_o <= 'b0; + // Bi-directional signals + + end + + // pragma uvmf custom interface_item_additional begin +// **************************************************************************** +/* bit spi_active; + + function void put_spi_dout(input spi_transaction_s spi_txn); // pragma tbx xtf + spi_driver_dout = spi_txn.spi_data; + spi_output <= spi_driver_dout[SPI_XFER_WIDTH-1]; + put_spi_dout_active = 1; + endfunction + + always begin + wait(spi_active); + @(posedge bus.sck); + for (int i=6;i>=0;i--) begin + miso_o <= miso_data[i]; @(posedge bus.sck); + end + spi_active = 0; + end + +// **************************************************************************** + task get_spi_din(input spi_transaction_s spi_txn, + output bit [SPI_XFER_WIDTH-1:0] spi_driver_din); // pragma tbx xtf + @(posedge bus.sck); + spi_driver_din[SPI_XFER_WIDTH-1]=spi_input; + for (int i=(SPI_XFER_WIDTH-2);i>=0;i--) begin + @(posedge bus.sck) spi_driver_din[i]=spi_input; + end + endtask +*/ + + + + // pragma uvmf custom interface_item_additional end + + //****************************************************************** + // The configure() function is used to pass agent configuration + // variables to the driver BFM. It is called by the driver within + // the agent at the beginning of the simulation. It may be called + // during the simulation if agent configuration variables are updated + // and the driver BFM needs to be aware of the new configuration + // variables. + // + + function void configure(spi_configuration_s spi_configuration_arg); // pragma tbx xtf + initiator_responder = spi_configuration_arg.initiator_responder; + // pragma uvmf custom configure begin + // pragma uvmf custom configure end + endfunction + +// pragma uvmf custom initiate_and_get_response begin +// **************************************************************************** +// UVMF_CHANGE_ME +// This task is used by an initator. The task first initiates a transfer then +// waits for the responder to complete the transfer. + task initiate_and_get_response( + // This argument passes transaction variables used by an initiator + // to perform the initial part of a protocol transfer. The values + // come from a sequence item created in a sequence. + input spi_initiator_s spi_initiator_struct, + // This argument is used to send data received from the responder + // back to the sequence item. The sequence item is returned to the sequence. + output spi_responder_s spi_responder_struct + );// pragma tbx xtf + // + // Members within the spi_initiator_struct: + // spi_dir_t dir ; + // bit [7:0] mosi_data ; + // bit [7:0] miso_data ; + // Members within the spi_responder_struct: + // spi_dir_t dir ; + // bit [7:0] mosi_data ; + // bit [7:0] miso_data ; + // + // Reference code; + // How to wait for signal value + // while (control_signal == 1'b1) @(posedge sck_i); + // + // How to assign a responder struct member, named xyz, from a signal. + // All available input signals listed. + // spi_responder_struct.xyz = mosi_i; // + // spi_responder_struct.xyz = miso_i; // + // How to assign a signal, named xyz, from an initiator struct member. + // All available input signals listed. + // Notice the _o. Those are storage variables that allow for procedural assignment. + // mosi_o <= spi_initiator_struct.xyz; // + // miso_o <= spi_initiator_struct.xyz; // + // Initiate a transfer using the data received. + @(posedge sck_i); + @(posedge sck_i); + // Wait for the responder to complete the transfer then place the responder data into + // spi_responder_struct. + @(posedge sck_i); + @(posedge sck_i); + endtask + + + +// pragma uvmf custom initiate_and_get_response end + +// pragma uvmf custom respond_and_wait_for_next_transfer begin +bit [7:0] miso_data; +bit miso_valid = 0; + + function void set_miso_data( + // This argument passes transaction variables used by a responder + // to complete a protocol transfer. The values come from a sequence item. + input spi_responder_s spi_responder_struct + );// pragma tbx xtf + miso_data = spi_responder_struct.miso_data; + miso_o <= miso_data[7]; + miso_valid =1; + endfunction + + always begin + wait(miso_valid); + @(posedge sck_i); + for (int i=6;i>=0;i--) begin + miso_o <= miso_data[i]; + @(posedge sck_i); + end + miso_valid = 0; + end +// **************************************************************************** +// The first_transfer variable is used to prevent completing a transfer in the +// first call to this task. For the first call to this task, there is not +// current transfer to complete. +bit first_transfer=1; + +// UVMF_CHANGE_ME +// This task is used by a responder. The task first completes the current +// transfer in progress then waits for the initiator to start the next transfer. + task get_mosi_data( + // This argument is used to send data received from the initiator + // back to the sequence item. The sequence determines how to respond. + output spi_initiator_s spi_initiator_struct + );// pragma tbx xtf + // Variables within the spi_initiator_struct: + // spi_dir_t dir ; + // bit [7:0] mosi_data ; + // bit [7:0] miso_data ; + // Variables within the spi_responder_struct: + // spi_dir_t dir ; + // bit [7:0] mosi_data ; + // bit [7:0] miso_data ; + + @(posedge sck_i); + spi_initiator_struct.mosi_data[7] = mosi_i; + for (int i=6;i>=0;i--) begin + @(posedge sck_i); + spi_initiator_struct.mosi_data[i] = mosi_i; + end + endtask + + + +// pragma uvmf custom respond_and_wait_for_next_transfer end + + +endinterface diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_if.sv b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_if.sv new file mode 100644 index 00000000..c47d99a5 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_if.sv @@ -0,0 +1,66 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This interface contains the spi interface signals. +// It is instantiated once per spi bus. Bus Functional Models, +// BFM's named spi_driver_bfm, are used to drive signals on the bus. +// BFM's named spi_monitor_bfm are used to monitor signals on the +// bus. This interface signal bundle is passed in the port list of +// the BFM in order to give the BFM access to the signals in this +// interface. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// This template can be used to connect a DUT to these signals +// +// .dut_signal_port(spi_bus.mosi), // Agent output +// .dut_signal_port(spi_bus.miso), // Agent input + +import uvmf_base_pkg_hdl::*; +import spi_pkg_hdl::*; + +interface spi_if + + ( + input tri sck, + input tri rst, + inout tri mosi, + inout tri miso + ); + +modport monitor_port + ( + input sck, + input rst, + input mosi, + input miso + ); + +modport initiator_port + ( + input sck, + input rst, + output mosi, + input miso + ); + +modport responder_port + ( + input sck, + input rst, + input mosi, + output miso + ); + + +// pragma uvmf custom interface_item_additional begin +// pragma uvmf custom interface_item_additional end + +endinterface + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_macros.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_macros.svh new file mode 100644 index 00000000..a78d1af5 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_macros.svh @@ -0,0 +1,139 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This file contains macros used with the spi package. +// These macros include packed struct definitions. These structs are +// used to pass data between classes, hvl, and BFM's, hdl. Use of +// structs are more efficient and simpler to modify. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_struct +// and from_struct methods defined in the macros below that are used in +// the spi_configuration class. +// + `define spi_CONFIGURATION_STRUCT \ +typedef struct packed { \ + uvmf_active_passive_t active_passive; \ + uvmf_initiator_responder_t initiator_responder; \ + } spi_configuration_s; + + `define spi_CONFIGURATION_TO_STRUCT_FUNCTION \ + virtual function spi_configuration_s to_struct();\ + spi_configuration_struct = \ + {\ + this.active_passive,\ + this.initiator_responder\ + };\ + return ( spi_configuration_struct );\ + endfunction + + `define spi_CONFIGURATION_FROM_STRUCT_FUNCTION \ + virtual function void from_struct(spi_configuration_s spi_configuration_struct);\ + {\ + this.active_passive,\ + this.initiator_responder \ + } = spi_configuration_struct;\ + endfunction + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_monitor_struct +// and from_monitor_struct methods of the spi_transaction class. +// + `define spi_MONITOR_STRUCT typedef struct packed { \ + spi_dir_t dir ; \ + bit [7:0] mosi_data ; \ + bit [7:0] miso_data ; \ + } spi_monitor_s; + + `define spi_TO_MONITOR_STRUCT_FUNCTION \ + virtual function spi_monitor_s to_monitor_struct();\ + spi_monitor_struct = \ + { \ + this.dir , \ + this.mosi_data , \ + this.miso_data \ + };\ + return ( spi_monitor_struct);\ + endfunction\ + + `define spi_FROM_MONITOR_STRUCT_FUNCTION \ + virtual function void from_monitor_struct(spi_monitor_s spi_monitor_struct);\ + {\ + this.dir , \ + this.mosi_data , \ + this.miso_data \ + } = spi_monitor_struct;\ + endfunction + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_initiator_struct +// and from_initiator_struct methods of the spi_transaction class. +// Also update the comments in the driver BFM. +// + `define spi_INITIATOR_STRUCT typedef struct packed { \ + spi_dir_t dir ; \ + bit [7:0] mosi_data ; \ + bit [7:0] miso_data ; \ + } spi_initiator_s; + + `define spi_TO_INITIATOR_STRUCT_FUNCTION \ + virtual function spi_initiator_s to_initiator_struct();\ + spi_initiator_struct = \ + {\ + this.dir , \ + this.mosi_data , \ + this.miso_data \ + };\ + return ( spi_initiator_struct);\ + endfunction + + `define spi_FROM_INITIATOR_STRUCT_FUNCTION \ + virtual function void from_initiator_struct(spi_initiator_s spi_initiator_struct);\ + {\ + this.dir , \ + this.mosi_data , \ + this.miso_data \ + } = spi_initiator_struct;\ + endfunction + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_responder_struct +// and from_responder_struct methods of the spi_transaction class. +// Also update the comments in the driver BFM. +// + `define spi_RESPONDER_STRUCT typedef struct packed { \ + spi_dir_t dir ; \ + bit [7:0] mosi_data ; \ + bit [7:0] miso_data ; \ + } spi_responder_s; + + `define spi_TO_RESPONDER_STRUCT_FUNCTION \ + virtual function spi_responder_s to_responder_struct();\ + spi_responder_struct = \ + {\ + this.dir , \ + this.mosi_data , \ + this.miso_data \ + };\ + return ( spi_responder_struct);\ + endfunction + + `define spi_FROM_RESPONDER_STRUCT_FUNCTION \ + virtual function void from_responder_struct(spi_responder_s spi_responder_struct);\ + {\ + this.dir , \ + this.mosi_data , \ + this.miso_data \ + } = spi_responder_struct;\ + endfunction +// pragma uvmf custom additional begin +// pragma uvmf custom additional end diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_master_seq.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_master_seq.svh new file mode 100644 index 00000000..63417102 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_master_seq.svh @@ -0,0 +1,63 @@ +//---------------------------------------------------------------------- +// Copyright 2013 Mentor Graphics Corporation +// All Rights Reserved Worldwide +// +// Licensed under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in +// writing, software distributed under the License is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See +// the License for the specific language governing +// permissions and limitations under the License. +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// Mentor Graphics Inc +//---------------------------------------------------------------------- +// Project : spi interface agent +// Unit : Sequence library +// File : spi_master_seq.svh +//---------------------------------------------------------------------- +// Creation Date : 05.12.2011 +//---------------------------------------------------------------------- +// Description: This file contains the sequence used for master +// operations on the spi bus. +// +//---------------------------------------------------------------------- +// +class spi_master_seq extends spi_sequence_base; + + `uvm_object_utils( spi_master_seq ) + + REQ mosi_transaction; + RSP miso_transaction; + + function new(string name = "" ); + super.new( name ); + mosi_transaction=spi_transaction::type_id::create("mosi_transaction"); + endfunction + + function void set_mosi(bit [7:0] data); + mosi_transaction.mosi_data = data; + endfunction + + function bit [7:0] get_miso(); + return miso_transaction.miso_data; + endfunction + + function string convert2string(); + return ({"MOSI:",mosi_transaction.convert2string(),"MISO:",miso_transaction.convert2string()}); + endfunction + + virtual task body(); + start_item(mosi_transaction); + finish_item(mosi_transaction); + //get_response(miso_transaction); + endtask + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_seq.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_seq.svh new file mode 100644 index 00000000..20d77526 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_seq.svh @@ -0,0 +1,69 @@ +//---------------------------------------------------------------------- +// Copyright 2013 Mentor Graphics Corporation +// All Rights Reserved Worldwide +// +// Licensed under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in +// writing, software distributed under the License is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See +// the License for the specific language governing +// permissions and limitations under the License. +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// Mentor Graphics Inc +//---------------------------------------------------------------------- +// Project : spi interface agent +// Unit : Sequence library +// File : spi_mem_slave_seq.svh +//---------------------------------------------------------------------- +// Creation Date : 05.12.2011 +//---------------------------------------------------------------------- +// Description: This sequence is used to model a memory slave on the +// spi bus. +// +//---------------------------------------------------------------------- +// +class spi_mem_slave_seq extends spi_sequence_base; + + `uvm_object_utils( spi_mem_slave_seq ) + + spi_mem_slave_transaction req_transaction; + // mem_slave_transaction rsp_transaction; + + bit [7:0] next_req; + bit [3:0] mem [7:0]; + + function new(string name = "" ); + super.new( name ); + endfunction + + virtual task body(); + forever begin + req_transaction=spi_mem_slave_transaction::type_id::create("req_transaction"); + req_transaction.dir = MISO; + req_transaction.status = next_req[7]; + req_transaction.addr = next_req[6:4]; + req_transaction.data = next_req[3:0]; + req_transaction.pack_fields(); + start_item(req_transaction); + finish_item(req_transaction); + // get_response(rsp_transaction); + if (req_transaction.mosi_data[7] == SPI_SLAVE_WRITE ) begin + mem[req_transaction.mosi_data[6:4]]=req_transaction.mosi_data[3:0]; + next_req = {1'b1, req_transaction.mosi_data[6:0]}; + `uvm_info("SEQ",{"WRITE:",req_transaction.convert2string()},UVM_HIGH) + end else begin // SPI_SLAVE_READ + next_req = {1'b1, req_transaction.mosi_data[6:4], mem[req_transaction.mosi_data[6:4]]}; + `uvm_info("SEQ",{"READ:",req_transaction.convert2string()},UVM_HIGH) + end + end + endtask + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_transaction.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_transaction.svh new file mode 100644 index 00000000..f81d641b --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_transaction.svh @@ -0,0 +1,110 @@ +//---------------------------------------------------------------------- +// Copyright 2013 Mentor Graphics Corporation +// All Rights Reserved Worldwide +// +// Licensed under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in +// writing, software distributed under the License is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See +// the License for the specific language governing +// permissions and limitations under the License. +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// Mentor Graphics Inc +//---------------------------------------------------------------------- +// Project : spi interface agent +// Unit : Transaction +// File : spi_transaction.svh +//---------------------------------------------------------------------- +// Creation Date : 05.12.2011 +//---------------------------------------------------------------------- +// Description: This class defines the variables required for an spi +// memory slave transaction. Class variables to be displayed in +// waveform transaction viewing are added to the transaction viewing +// stream in the add_to_wave function. +// +//---------------------------------------------------------------------- +// +class spi_mem_slave_transaction extends spi_transaction; + + `uvm_object_utils( spi_mem_slave_transaction ) + + spi_op_t op; + bit [2:0] addr; + bit [3:0] data; + bit status; + bit command; + + +// **************************************************************************** + function new( string name = "" ); + super.new( name ); + endfunction + +// **************************************************************************** + virtual function string convert2string(); + string msg; + $sformat(msg,"op:%s dir:%s command:%h status:%h addr:0x%h data:0x%h",op, dir, command,status,addr,data); + return { msg, super.convert2string()}; + endfunction + +//******************************************************************* + function void do_copy (uvm_object rhs); + spi_transaction RHS; + assert($cast(RHS,rhs)); + super.do_copy(rhs); + unpack_fields(); + endfunction : do_copy + +//******************************************************************* + virtual function void do_print(uvm_printer printer); + $display(convert2string()); + endfunction + +//******************************************************************* + virtual function bit do_compare (uvm_object rhs, uvm_comparer comparer); + spi_transaction RHS; + if (!$cast(RHS,rhs)) + return 0; + + pack_fields(); + return (super.do_compare(rhs, comparer)); + + endfunction : do_compare + +// **************************************************************************** + virtual function void unpack_fields(); + if (mosi_data[7]== 1) op = SPI_SLAVE_WRITE; + else op = SPI_SLAVE_READ; + command = mosi_data[7]; + addr = mosi_data[6:4]; + data = mosi_data[3:0]; + endfunction + +// **************************************************************************** + virtual function void pack_fields(); + //mosi_data = { command, addr, data}; + miso_data = { status, addr, data}; + endfunction + +// **************************************************************************** + virtual function void add_to_wave( int transaction_viewing_stream_h ); + transaction_view_h = $begin_transaction(transaction_viewing_stream_h,op.name(),start_time); + if ( op == SPI_SLAVE_WRITE ) $add_color( transaction_view_h, "cyan" ); + else if ( op == SPI_SLAVE_READ ) $add_color( transaction_view_h, "brown" ); + $add_attribute( transaction_view_h, dir, "dir" ); + $add_attribute( transaction_view_h, op, "op" ); + $add_attribute( transaction_view_h, addr, "addr" ); + $add_attribute( transaction_view_h, data, "data" ); + $end_transaction(transaction_view_h,end_time); + $free_transaction(transaction_view_h); + endfunction + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_transaction_coverage.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_transaction_coverage.svh new file mode 100644 index 00000000..738e480c --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_transaction_coverage.svh @@ -0,0 +1,70 @@ +//---------------------------------------------------------------------- +// Copyright 2013 Mentor Graphics Corporation +// All Rights Reserved Worldwide +// +// Licensed under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in +// writing, software distributed under the License is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See +// the License for the specific language governing +// permissions and limitations under the License. +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// Mentor Graphics Inc +//---------------------------------------------------------------------- +// Project : spi interface agent +// Unit : Transaction coverage +// File : spi_transaction_coverage.svh +//---------------------------------------------------------------------- +// Creation Date : 05.12.2011 +//---------------------------------------------------------------------- +// Description: This class records spi memory slave transaction information using +// a covergroup named spi_mem_slave_transaction_cg. An instance of this +// coverage component is instantiated in the uvmf_parameterized_agent +// if the has_coverage flag is set. +// +//---------------------------------------------------------------------- +// +class spi_mem_slave_transaction_coverage extends uvm_subscriber#(spi_transaction); + + `uvm_component_utils( spi_mem_slave_transaction_coverage ) + + spi_op_t op; + bit [2:0] addr; + bit [3:0] data; + +// **************************************************************************** + covergroup spi_mem_slave_transaction_cg; + coverpoint op; + coverpoint addr; + coverpoint data; + addr_x_data: cross addr, data; + op_x_addr: cross op, addr; + endgroup + + function new(string name="", uvm_component parent=null); + super.new(name,parent); + spi_mem_slave_transaction_cg=new; + spi_mem_slave_transaction_cg.set_inst_name($sformatf("spi_mem_slave_transaction_cg_%s",get_full_name())); + endfunction + + virtual function void write (T t); + `uvm_info("COV","Received transaction",UVM_LOW); + if ( t.dir == MOSI ) begin + if ( t.mosi_data[7] == 1'b1 ) op = SPI_SLAVE_WRITE; + else op = SPI_SLAVE_READ; + addr = t.mosi_data[6:4]; + data = t.mosi_data[3:0]; + spi_mem_slave_transaction_cg.sample(); + end + + endfunction + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_transaction_viewer.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_transaction_viewer.svh new file mode 100644 index 00000000..0efaeb8d --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_mem_slave_transaction_viewer.svh @@ -0,0 +1,63 @@ +//---------------------------------------------------------------------- +// Copyright 2013 Mentor Graphics Corporation +// All Rights Reserved Worldwide +// +// Licensed under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in +// writing, software distributed under the License is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See +// the License for the specific language governing +// permissions and limitations under the License. +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// Mentor Graphics Inc +//---------------------------------------------------------------------- +// Project : spi interface agent +// Unit : Transaction viewer +// File : spi_transaction_coverage.svh +//---------------------------------------------------------------------- +// Creation Date : 05.12.2011 +//---------------------------------------------------------------------- +// Description: This class creates a waveform transaction viewing stream +// for spi mem slave transactions from the spi agent +// +//---------------------------------------------------------------------- +// +class spi_mem_slave_transaction_viewer extends uvm_subscriber#(.T(spi_transaction)); + + `uvm_component_utils( spi_mem_slave_transaction_viewer ) + + spi_mem_slave_transaction spi_mem_transaction=new; + + spi_configuration configuration; + + // Handle used for transaction viewing + int transaction_viewing_stream; + + function new(string name="", uvm_component parent=null); + super.new(name,parent); + endfunction + + // FUNCTION: start_of_simulation_phase + virtual function void start_of_simulation_phase(uvm_phase phase); + if (configuration.enable_transaction_viewing) + transaction_viewing_stream = $create_transaction_stream({"..",get_full_name(),".","txn_stream"}); + endfunction + + virtual function void write (T t); + `uvm_info("VIEW","Received transaction",UVM_LOW); + if ( configuration.enable_transaction_viewing ) begin + spi_mem_transaction.do_copy(t); + spi_mem_transaction.unpack_fields(); + spi_mem_transaction.add_to_wave(transaction_viewing_stream); + end + endfunction + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_monitor.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_monitor.svh new file mode 100644 index 00000000..d095e540 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_monitor.svh @@ -0,0 +1,81 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class receives spi transactions observed by the +// spi monitor BFM and broadcasts them through the analysis port +// on the agent. It accesses the monitor BFM through the monitor +// task. This UVM component captures transactions +// for viewing in the waveform viewer if the +// enable_transaction_viewing flag is set in the configuration. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class spi_monitor extends uvmf_monitor_base #( + .CONFIG_T(spi_configuration ), + .BFM_BIND_T(virtual spi_monitor_bfm ), + .TRANS_T(spi_transaction )); + + `uvm_component_utils( spi_monitor ) + +// Structure used to pass data from monitor BFM to monitor class in agent. +// Use to_monitor_struct function to pack transaction variables into structure. +// Use from_monitor_struct function to unpack transaction variables from structure. +`spi_MONITOR_STRUCT + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + +// **************************************************************************** +// This function is the standard SystemVerilog constructor. +// + function new( string name = "", uvm_component parent = null ); + super.new( name, parent ); + endfunction + +// **************************************************************************** +// This function sends configuration object variables to the monitor BFM +// using the configuration struct. +// + virtual function void configure(input CONFIG_T cfg); + bfm.configure( cfg.to_struct() ); + + endfunction + +// **************************************************************************** +// This function places a handle to this class in the proxy variable in the +// monitor BFM. This allows the monitor BFM to call the notify_transaction +// function within this class. +// + virtual function void set_bfm_proxy_handle(); + bfm.proxy = this; endfunction + +// *************************************************************************** + virtual task run_phase(uvm_phase phase); + // Start monitor BFM thread and don't call super.run() in order to + // override the default monitor proxy 'pull' behavior with the more + // emulation-friendly BFM 'push' approach using the notify_transaction + // function below + bfm.start_monitoring(); + endtask + +// ************************************************************************** + +// This function is called by the monitor BFM. It receives data observed by the +// monitor BFM. Data is passed using the spi_monitor_struct. + virtual function void notify_transaction(input spi_monitor_s spi_monitor_struct); + trans = new("trans"); + trans.start_time = time_stamp; + trans.end_time = $time; + time_stamp = trans.end_time; + + trans.from_monitor_struct(spi_monitor_struct); + analyze(trans); + endfunction + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_monitor_bfm.sv b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_monitor_bfm.sv new file mode 100644 index 00000000..ddd9c48a --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_monitor_bfm.sv @@ -0,0 +1,163 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This interface performs the spi signal monitoring. +// It is accessed by the uvm spi monitor through a virtual +// interface handle in the spi configuration. It monitors the +// signals passed in through the port connection named bus of +// type spi_if. +// +// Input signals from the spi_if are assigned to an internal input +// signal with a _i suffix. The _i signal should be used for sampling. +// +// The input signal connections are as follows: +// bus.signal -> signal_i +// +// Interface functions and tasks used by UVM components: +// monitor(inout TRANS_T txn); +// This task receives the transaction, txn, from the +// UVM monitor and then populates variables in txn +// from values observed on bus activity. This task +// blocks until an operation on the spi bus is complete. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +import uvmf_base_pkg_hdl::*; +import spi_pkg_hdl::*; + +`include "src/spi_macros.svh" + +interface spi_monitor_bfm + ( spi_if bus ); + // The pragma below and additional ones in-lined further down are for running this BFM on Veloce + // pragma attribute spi_monitor_bfm partition_interface_xif + + // Structure used to pass transaction data from monitor BFM to monitor class in agent. +`spi_MONITOR_STRUCT + spi_monitor_s spi_monitor_struct; + + // Structure used to pass configuration data from monitor class to monitor BFM. + `spi_CONFIGURATION_STRUCT + + + // Config value to determine if this is an initiator or a responder + uvmf_initiator_responder_t initiator_responder; + // Custom configuration variables. + // These are set using the configure function which is called during the UVM connect_phase + + tri sck_i; + tri rst_i; + tri mosi_i; + tri miso_i; + assign sck_i = bus.sck; + assign rst_i = bus.rst; + assign mosi_i = bus.mosi; + assign miso_i = bus.miso; + + // Proxy handle to UVM monitor + spi_pkg::spi_monitor proxy; + // pragma tbx oneway proxy.notify_transaction + + // pragma uvmf custom interface_item_additional begin + // pragma uvmf custom interface_item_additional end + + //****************************************************************** + task wait_for_reset();// pragma tbx xtf + @(posedge sck_i) ; + do_wait_for_reset(); + endtask + + // **************************************************************************** + task do_wait_for_reset(); + wait ( rst_i == 0 ) ; + @(posedge sck_i) ; + endtask + + //****************************************************************** + + task wait_for_num_clocks(input int unsigned count); // pragma tbx xtf + @(posedge sck_i); + + repeat (count-1) @(posedge sck_i); + endtask + + //****************************************************************** + event go; + function void start_monitoring();// pragma tbx xtf + -> go; + endfunction + + // **************************************************************************** + initial begin + @go; + forever begin + @(posedge sck_i); + do_monitor( spi_monitor_struct ); + + + proxy.notify_transaction( spi_monitor_struct ); + + end + end + + //****************************************************************** + // The configure() function is used to pass agent configuration + // variables to the monitor BFM. It is called by the monitor within + // the agent at the beginning of the simulation. It may be called + // during the simulation if agent configuration variables are updated + // and the monitor BFM needs to be aware of the new configuration + // variables. + // + function void configure(spi_configuration_s spi_configuration_arg); // pragma tbx xtf + initiator_responder = spi_configuration_arg.initiator_responder; + // pragma uvmf custom configure begin + // pragma uvmf custom configure end + endfunction + + + // **************************************************************************** + + task do_monitor(output spi_monitor_s spi_monitor_struct); + // UVMF_CHANGE_ME : Implement protocol monitoring. The commented reference code + // below are examples of how to capture signal values and assign them to + // structure members. All available input signals are listed. The 'while' + // code example shows how to wait for a synchronous flow control signal. This + // task should return when a complete transfer has been observed. Once this task is + // exited with captured values, it is then called again to wait for and observe + // the next transfer. One clock cycle is consumed between calls to do_monitor. + // + // Available struct members: + // // spi_monitor_struct.dir + // // spi_monitor_struct.mosi_data + // // spi_monitor_struct.miso_data + // // + // Reference code; + // How to wait for signal value + // while (control_signal == 1'b1) @(posedge sck_i); + // + // How to assign a struct member, named xyz, from a signal. + // All available input signals listed. + // spi_monitor_struct.xyz = mosi_i; // + // spi_monitor_struct.xyz = miso_i; // + // pragma uvmf custom do_monitor begin + spi_monitor_struct.mosi_data[7] = mosi_i; + spi_monitor_struct.miso_data[7] = miso_i; + for (int i=6;i>=0;i--) begin + @(posedge sck_i); + spi_monitor_struct.mosi_data[i] = mosi_i; + spi_monitor_struct.miso_data[i] = miso_i; + end + + + + // pragma uvmf custom do_monitor end + endtask + + +endinterface diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_random_sequence.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_random_sequence.svh new file mode 100644 index 00000000..5e5fe665 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_random_sequence.svh @@ -0,0 +1,50 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This sequences randomizes the spi transaction and sends it +// to the UVM driver. +// +// This sequence constructs and randomizes a spi_transaction. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class spi_random_sequence + extends spi_sequence_base ; + + `uvm_object_utils( spi_random_sequence ) + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + //***************************************************************** + function new(string name = ""); + super.new(name); + endfunction: new + + // **************************************************************************** + // TASK : body() + // This task is automatically executed when this sequence is started using the + // start(sequencerHandle) task. + // + task body(); + begin + // Construct the transaction + req=spi_transaction::type_id::create("req"); + start_item(req); + // Randomize the transaction + if(!req.randomize()) `uvm_fatal("SEQ", "spi_random_sequence::body()-spi_transaction randomization failed") + // Send the transaction to the spi_driver_bfm via the sequencer and spi_driver. + finish_item(req); + `uvm_info("SEQ", {"Response:",req.convert2string()},UVM_MEDIUM) + end + + endtask + +endclass: spi_random_sequence diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_responder_sequence.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_responder_sequence.svh new file mode 100644 index 00000000..d5c3adc1 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_responder_sequence.svh @@ -0,0 +1,48 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class can be used to provide stimulus when an interface +// has been configured to run in a responder mode. It +// will never finish by default, always going back to the driver +// and driver BFM for the next transaction with which to respond. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class spi_responder_sequence + extends spi_sequence_base ; + + `uvm_object_utils( spi_responder_sequence ) + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + function new(string name = "spi_responder_sequence"); + super.new(name); + endfunction + + task body(); + req=spi_transaction::type_id::create("req"); + forever begin + start_item(req); + finish_item(req); + // pragma uvmf custom body begin + // UVMF_CHANGE_ME : Do something here with the resulting req item. The + // finish_item() call above will block until the req transaction is ready + // to be handled by the responder sequence. + // If this was an item that required a response, the expectation is + // that the response should be populated within this transaction now. + `uvm_info("SEQ",$sformatf("Processed txn: %s",req.convert2string()),UVM_HIGH) + + + + // pragma uvmf custom body end + end + endtask + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_sequence_base.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_sequence_base.svh new file mode 100644 index 00000000..802d2ea2 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_sequence_base.svh @@ -0,0 +1,95 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This file contains the class used as the base class for all sequences +// for this interface. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class spi_sequence_base extends uvmf_sequence_base #( + .REQ(spi_transaction ), + .RSP(spi_transaction )); + + `uvm_object_utils( spi_sequence_base ) + + // variables + typedef spi_transaction spi_transaction_req_t; + spi_transaction_req_t req; + typedef spi_transaction spi_transaction_rsp_t; + spi_transaction_rsp_t rsp; + + // Event for identifying when a response was received from the sequencer + event new_rsp; + + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + // **************************************************************************** + // TASK : get_responses() + // This task recursively gets sequence item responses from the sequencer. + // + virtual task get_responses(); + fork + begin + // Block until new rsp available + get_response(rsp); + // New rsp received. Indicate to sequence using event. + ->new_rsp; + // Display the received response transaction + `uvm_info("SEQ", {"New response transaction:",rsp.convert2string()}, UVM_MEDIUM) + end + join_none + endtask + + // **************************************************************************** + // TASK : pre_body() + // This task is called automatically when start is called with call_pre_post set to 1 (default). + // By calling get_responses() within pre_body() any derived sequences are automatically + // processing response transactions. + // + virtual task pre_body(); + // pragma uvmf custom pre_body begin + get_responses(); + // pragma uvmf custom pre_body end + endtask + + // **************************************************************************** + // TASK : body() + // This task is called automatically when start is called. This sequence sends + // a req sequence item to the sequencer identified as an argument in the call + // to start. + // + virtual task body(); + // pragma uvmf custom body begin + start_item(req); + finish_item(req); + + + + // pragma uvmf custom body end + endtask + + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new( string name =""); + super.new( name ); + // pragma uvmf custom new begin + req = spi_transaction_req_t::type_id::create("req"); + rsp = spi_transaction_rsp_t::type_id::create("rsp"); + + + + // pragma uvmf custom new end + endfunction + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_transaction.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_transaction.svh new file mode 100644 index 00000000..5214fcd4 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_transaction.svh @@ -0,0 +1,190 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class defines the variables required for an spi +// transaction. Class variables to be displayed in waveform transaction +// viewing are added to the transaction viewing stream in the add_to_wave +// function. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class spi_transaction extends uvmf_transaction_base; + + `uvm_object_utils( spi_transaction ) + + spi_dir_t dir ; + bit [7:0] mosi_data ; + bit [7:0] miso_data ; + + //Constraints for the transaction variables: + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + //******************************************************************* + //******************************************************************* + // Macros that define structs and associated functions are + // located in spi_macros.svh + + //******************************************************************* + // Monitor macro used by spi_monitor and spi_monitor_bfm + // This struct is defined in spi_macros.svh + `spi_MONITOR_STRUCT + spi_monitor_s spi_monitor_struct; + //******************************************************************* + // FUNCTION: to_monitor_struct() + // This function packs transaction variables into a spi_monitor_s + // structure. The function returns the handle to the spi_monitor_struct. + // This function is defined in spi_macros.svh + `spi_TO_MONITOR_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_monitor_struct() + // This function unpacks the struct provided as an argument into transaction + // variables of this class. + // This function is defined in spi_macros.svh + `spi_FROM_MONITOR_STRUCT_FUNCTION + + //******************************************************************* + // Initiator macro used by spi_driver and spi_driver_bfm + // to communicate initiator driven data to spi_driver_bfm. + // This struct is defined in spi_macros.svh + `spi_INITIATOR_STRUCT + spi_initiator_s spi_initiator_struct; + //******************************************************************* + // FUNCTION: to_initiator_struct() + // This function packs transaction variables into a spi_initiator_s + // structure. The function returns the handle to the spi_initiator_struct. + // This function is defined in spi_macros.svh + `spi_TO_INITIATOR_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_initiator_struct() + // This function unpacks the struct provided as an argument into transaction + // variables of this class. + // This function is defined in spi_macros.svh + `spi_FROM_INITIATOR_STRUCT_FUNCTION + + //******************************************************************* + // Responder macro used by spi_driver and spi_driver_bfm + // to communicate Responder driven data to spi_driver_bfm. + // This struct is defined in spi_macros.svh + `spi_RESPONDER_STRUCT + spi_responder_s spi_responder_struct; + //******************************************************************* + // FUNCTION: to_responder_struct() + // This function packs transaction variables into a spi_responder_s + // structure. The function returns the handle to the spi_responder_struct. + // This function is defined in spi_macros.svh + `spi_TO_RESPONDER_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_responder_struct() + // This function unpacks the struct provided as an argument into transaction + // variables of this class. + // This function is defined in spi_macros.svh + `spi_FROM_RESPONDER_STRUCT_FUNCTION + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new( string name = "" ); + super.new( name ); + endfunction + + // **************************************************************************** + // FUNCTION: convert2string() + // This function converts all variables in this class to a single string for + // logfile reporting. + // + virtual function string convert2string(); + // pragma uvmf custom convert2string begin + // UVMF_CHANGE_ME : Customize format if desired. + return $sformatf("dir:0x%x mosi_data:0x%x miso_data:0x%x ",dir,mosi_data,miso_data); + + + + // pragma uvmf custom convert2string end + endfunction + + //******************************************************************* + // FUNCTION: do_print() + // This function is automatically called when the .print() function + // is called on this class. + // + virtual function void do_print(uvm_printer printer); + // pragma uvmf custom do_print begin + // UVMF_CHANGE_ME : Current contents of do_print allows for the use of UVM 1.1d, 1.2 or P1800.2. + // Update based on your own printing preference according to your preferred UVM version + $display(convert2string()); + + + + // pragma uvmf custom do_print end + endfunction + + //******************************************************************* + // FUNCTION: do_compare() + // This function is automatically called when the .compare() function + // is called on this class. + // + virtual function bit do_compare (uvm_object rhs, uvm_comparer comparer); + spi_transaction RHS; + if (!$cast(RHS,rhs)) return 0; + // UVMF_CHANGE_ME : Eliminate comparison of variables not to be used for compare + return (super.do_compare(rhs,comparer) + &&(this.mosi_data == RHS.mosi_data) + &&(this.miso_data == RHS.miso_data) + ); + endfunction + + //******************************************************************* + // FUNCTION: do_copy() + // This function is automatically called when the .copy() function + // is called on this class. + // + virtual function void do_copy (uvm_object rhs); + spi_transaction RHS; + assert($cast(RHS,rhs)); + super.do_copy(rhs); + this.dir = RHS.dir; + this.mosi_data = RHS.mosi_data; + this.miso_data = RHS.miso_data; + endfunction + + // **************************************************************************** + // FUNCTION: add_to_wave() + // This function is used to display variables in this class in the waveform + // viewer. The start_time and end_time variables must be set before this + // function is called. If the start_time and end_time variables are not set + // the transaction will be hidden at 0ns on the waveform display. + // + virtual function void add_to_wave(int transaction_viewing_stream_h); + `ifdef QUESTA + if (transaction_view_h == 0) begin + transaction_view_h = $begin_transaction(transaction_viewing_stream_h,"spi_transaction",start_time); + end + super.add_to_wave(transaction_view_h); + // pragma uvmf custom add_to_wave begin + // UVMF_CHANGE_ME : Color can be applied to transaction entries based on content, example below + // case() + // 1 : $add_color(transaction_view_h,"red"); + // default : $add_color(transaction_view_h,"grey"); + // endcase + // UVMF_CHANGE_ME : Eliminate transaction variables not wanted in transaction viewing in the waveform viewer + $add_attribute(transaction_view_h,dir,"dir"); + $add_attribute(transaction_view_h,mosi_data,"mosi_data"); + $add_attribute(transaction_view_h,miso_data,"miso_data"); + + + + // pragma uvmf custom add_to_wave end + $end_transaction(transaction_view_h,end_time); + $free_transaction(transaction_view_h); + `endif // QUESTA + endfunction + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_transaction_coverage.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_transaction_coverage.svh new file mode 100644 index 00000000..818e8ed5 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_transaction_coverage.svh @@ -0,0 +1,70 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class records spi transaction information using +// a covergroup named spi_transaction_cg. An instance of this +// coverage component is instantiated in the uvmf_parameterized_agent +// if the has_coverage flag is set. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class spi_transaction_coverage extends uvm_subscriber #(.T(spi_transaction )); + + `uvm_component_utils( spi_transaction_coverage ) + + T coverage_trans; + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + // **************************************************************************** + covergroup spi_transaction_cg; + // pragma uvmf custom covergroup begin + // UVMF_CHANGE_ME : Add coverage bins, crosses, exclusions, etc. according to coverage needs. + option.auto_bin_max=1024; + option.per_instance=1; + dir: coverpoint coverage_trans.dir; + mosi_data: coverpoint coverage_trans.mosi_data; + miso_data: coverpoint coverage_trans.miso_data; + + + + // pragma uvmf custom covergroup end + endgroup + + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new(string name="", uvm_component parent=null); + super.new(name,parent); + spi_transaction_cg=new; + endfunction + + // **************************************************************************** + // FUNCTION : build_phase() + // This function is the standard UVM build_phase. + // + function void build_phase(uvm_phase phase); + spi_transaction_cg.set_inst_name($sformatf("spi_transaction_cg_%s",get_full_name())); + endfunction + + // **************************************************************************** + // FUNCTION: write (T t) + // This function is automatically executed when a transaction arrives on the + // analysis_export. It copies values from the variables in the transaction + // to local variables used to collect functional coverage. + // + virtual function void write (T t); + `uvm_info("COV","Received transaction",UVM_HIGH); + coverage_trans = t; + spi_transaction_cg.sample(); + endfunction + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_typedefs.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_typedefs.svh new file mode 100644 index 00000000..b78302a6 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_typedefs.svh @@ -0,0 +1,20 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This file contains defines and typedefs to be compiled for use in +// the simulation running on the host server when using Veloce. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + + +// pragma uvmf custom additional begin +// pragma uvmf custom additional end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_typedefs_hdl.svh b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_typedefs_hdl.svh new file mode 100644 index 00000000..e4863057 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/src/spi_typedefs_hdl.svh @@ -0,0 +1,23 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This file contains defines and typedefs to be compiled for use in +// the simulation running on the emulator when using Veloce. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + + +typedef enum {SPI_SLAVE_READ, SPI_SLAVE_WRITE} spi_op_t; +typedef enum {MOSI, MISO, TO_SPI, FROM_SPI} spi_dir_t; + +// pragma uvmf custom additional begin +// pragma uvmf custom additional end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/yaml/spi_interface.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/yaml/spi_interface.yaml new file mode 100644 index 00000000..50d444a1 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_pkg/yaml/spi_interface.yaml @@ -0,0 +1,49 @@ +uvmf: + interfaces: + spi: + clock: sck + config_constraints: [] + config_vars: [] + existing_library_component: 'True' + gen_inbound_streaming_driver: 'False' + hdl_pkg_parameters: [] + hdl_typedefs: + - name: spi_op_t + type: enum {SPI_SLAVE_READ, SPI_SLAVE_WRITE} + - name: spi_dir_t + type: enum {MOSI, MISO, TO_SPI, FROM_SPI} + hvl_pkg_parameters: [] + hvl_typedefs: [] + parameters: [] + ports: + - dir: output + name: mosi + reset_value: '''b0' + width: '1' + - dir: input + name: miso + reset_value: '''b0' + width: '1' + reset: rst + reset_assertion_level: 'True' + response_info: + data: [] + operation: 1'b1 + transaction_constraints: [] + transaction_vars: + - iscompare: 'False' + isrand: 'False' + name: dir + type: spi_dir_t + unpacked_dimension: '' + - iscompare: 'True' + isrand: 'False' + name: mosi_data + type: bit [7:0] + unpacked_dimension: '' + - iscompare: 'True' + isrand: 'False' + name: miso_data + type: bit [7:0] + unpacked_dimension: '' + use_dpi_link: 'False' diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/.svproject b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/.svproject new file mode 100644 index 00000000..954f4b7f --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/.svproject @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/Makefile b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/Makefile new file mode 100644 index 00000000..fdfe9902 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/Makefile @@ -0,0 +1,62 @@ +# wb interface packages source +# pragma uvmf custom additional begin +# pragma uvmf custom additional end + +wb_PKG = \ + +incdir+$(UVMF_VIP_LIBRARY_HOME)/interface_packages/wb_pkg \ + -F $(UVMF_VIP_LIBRARY_HOME)/interface_packages/wb_pkg/wb_filelist_hvl.f + +wb_PKG_HDL = \ + +incdir+$(UVMF_VIP_LIBRARY_HOME)/interface_packages/wb_pkg \ + -F $(UVMF_VIP_LIBRARY_HOME)/interface_packages/wb_pkg/wb_filelist_hdl.f + +wb_PKG_XRTL = \ + +incdir+$(UVMF_VIP_LIBRARY_HOME)/interface_packages/wb_pkg \ + -F $(UVMF_VIP_LIBRARY_HOME)/interface_packages/wb_pkg/wb_filelist_xrtl.f + +COMP_wb_PKG_TGT_0 = q_comp_wb_pkg +COMP_wb_PKG_TGT_1 = v_comp_wb_pkg +COMP_wb_PKG_TGT = $(COMP_wb_PKG_TGT_$(USE_VELOCE)) + +comp_wb_pkg: $(COMP_wb_PKG_TGT) + +q_comp_wb_pkg: + $(HDL_COMP_CMD) $(wb_PKG_HDL) + $(HVL_COMP_CMD) $(wb_PKG) + $(HDL_COMP_CMD) $(wb_PKG_XRTL) + +v_comp_wb_pkg: + $(HVL_COMP_CMD) $(wb_PKG_HDL) + $(HVL_COMP_CMD) $(wb_PKG) + $(VELANALYZE_HVL_CMD) $(wb_PKG_HDL) + $(VELANALYZE_HVL_CMD) $(wb_PKG) + $(HDL_COMP_CMD) $(wb_PKG_XRTL) + +ifeq ($(MTI_VCO_MODE),64) + GCC_COMP_ARCH = -m64 +else + GCC_COMP_ARCH = -m32 +endif + +C_FILE_COMPILE_LIST_wb_pkg = \ + +O_FILE_COMPILE_LIST_wb_pkg = $(notdir $(C_FILE_COMPILE_LIST_wb_pkg:.c=.o)) + +GCC_COMP_ARGS_wb_pkg += -I$(UVMF_VIP_LIBRARY_HOME)/interface_packages/wb_pkg/dpi \ + -fPIC + +GCC_LINK_ARGS_wb_pkg += \ + \ + -o .so + +comp_wb_pkg_c_files: + @echo "--------------------------------" + @echo "Compiling Interface C source" + @echo "--------------------------------" + gcc $(GCC_COMP_ARCH) $(GCC_COMP_ARGS_wb_pkg) $(C_FILE_COMPILE_LIST_wb_pkg) + @echo "--------------------------------" + @echo "Linking Interface C objects into a shared object" + @echo "--------------------------------" + gcc $(GCC_COMP_ARCH) $(GCC_LINK_ARGS_wb_pkg) $(O_FILE_COMPILE_LIST_wb_pkg) + @echo "--------------------------------" + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/compile.do b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/compile.do new file mode 100644 index 00000000..de71b4b8 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/compile.do @@ -0,0 +1,14 @@ +# Tcl do file for compile of wb interface + +# pragma uvmf custom additional begin +# pragma uvmf custom additional end + + +vlog -sv -timescale 1ps/1ps -suppress 2223,2286 +incdir+$env(UVMF_VIP_LIBRARY_HOME)/interface_packages/wb_pkg \ + -F $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/wb_pkg/wb_filelist_hdl.f + +vlog -sv -timescale 1ps/1ps -suppress 2223,2286 +incdir+$env(UVMF_VIP_LIBRARY_HOME)/interface_packages/wb_pkg \ + -F $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/wb_pkg/wb_filelist_hvl.f + +vlog -sv -timescale 1ps/1ps -suppress 2223,2286 +incdir+$env(UVMF_VIP_LIBRARY_HOME)/interface_packages/wb_pkg \ + -F $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/wb_pkg/wb_filelist_xrtl.f \ No newline at end of file diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb2reg_adapter.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb2reg_adapter.svh new file mode 100644 index 00000000..96e8c702 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb2reg_adapter.svh @@ -0,0 +1,110 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This file contains the UVM register adapter for the wb interface. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class wb2reg_adapter #( + int WB_ADDR_WIDTH = 32, + int WB_DATA_WIDTH = 16 + ) extends uvm_reg_adapter; + + `uvm_object_param_utils( wb2reg_adapter #( + WB_ADDR_WIDTH, + WB_DATA_WIDTH + )) + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + //-------------------------------------------------------------------- + // new + //-------------------------------------------------------------------- + function new (string name = "wb2reg_adapter" ); + super.new(name); + // pragma uvmf custom new begin + // UVMF_CHANGE_ME : Configure the adapter regarding byte enables and provides response. + + // Does the protocol the Agent is modeling support byte enables? + // 0 = NO + // 1 = YES + supports_byte_enable = 0; + + // Does the Agent's Driver provide separate response sequence items? + // i.e. Does the driver call seq_item_port.put() + // and do the sequences call get_response()? + // 0 = NO + // 1 = YES + provides_responses = 0; + + + + + + // pragma uvmf custom new end + + endfunction: new + + //-------------------------------------------------------------------- + // reg2bus + //-------------------------------------------------------------------- + virtual function uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw); + + wb_transaction #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ) trans_h = wb_transaction #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + )::type_id::create("trans_h"); + + // pragma uvmf custom reg2bus begin + //Adapt the following for your sequence item type + trans_h.op = (rw.kind == UVM_READ) ? WB_READ : WB_WRITE; + //Copy over address + trans_h.addr = rw.addr; + //Copy over write data + trans_h.data = rw.data; + // pragma uvmf custom reg2bus end + + // Return the adapted transaction + return trans_h; + + endfunction: reg2bus + + //-------------------------------------------------------------------- + // bus2reg + //-------------------------------------------------------------------- + virtual function void bus2reg(uvm_sequence_item bus_item, + ref uvm_reg_bus_op rw); + wb_transaction #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ) trans_h; + if (!$cast(trans_h, bus_item)) begin + `uvm_fatal("ADAPT","Provided bus_item is not of the correct type") + return; + end + // pragma uvmf custom bus2reg begin + //Adapt the following for your sequence item type + //Copy over instruction type + rw.kind = (trans_h.op == WB_WRITE) ? UVM_WRITE : UVM_READ; + //Copy over address + rw.addr = trans_h.addr; + //Copy over read data + rw.data = trans_h.data; + //Check for errors on the bus and return UVM_NOT_OK if there is an error + rw.status = UVM_IS_OK; + // pragma uvmf custom bus2reg end + + endfunction: bus2reg + +endclass : wb2reg_adapter diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_agent.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_agent.svh new file mode 100644 index 00000000..a00d2368 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_agent.svh @@ -0,0 +1,68 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Protocol specific agent class definition +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class wb_agent #( + int WB_ADDR_WIDTH = 32, + int WB_DATA_WIDTH = 16 + ) extends uvmf_parameterized_agent #( + .CONFIG_T(wb_configuration #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + )), + .DRIVER_T(wb_driver #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + )), + .MONITOR_T(wb_monitor #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + )), + .COVERAGE_T(wb_transaction_coverage #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + )), + .TRANS_T(wb_transaction #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + )) + ); + + `uvm_component_param_utils( wb_agent #( + WB_ADDR_WIDTH, + WB_DATA_WIDTH + )) + +// pragma uvmf custom class_item_additional begin +// pragma uvmf custom class_item_additional end + +// **************************************************************************** +// FUNCTION : new() +// This function is the standard SystemVerilog constructor. +// + function new( string name = "", uvm_component parent = null ); + super.new( name, parent ); + endfunction + +// **************************************************************************** + // FUNCTION: build_phase + virtual function void build_phase(uvm_phase phase); + super.build_phase(phase); + if (configuration.active_passive == ACTIVE) begin + // Place sequencer handle into configuration object + // so that it may be retrieved from configuration + // rather than using uvm_config_db + configuration.sequencer = this.sequencer; + end + endfunction + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_configuration.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_configuration.svh new file mode 100644 index 00000000..aa093b44 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_configuration.svh @@ -0,0 +1,195 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class contains all variables and functions used +// to configure the wb agent and its bfm's. It gets the +// bfm's from the uvm_config_db for use by the agent. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class wb_configuration #( + int WB_ADDR_WIDTH = 32, + int WB_DATA_WIDTH = 16 + ) extends uvmf_parameterized_agent_configuration_base #( + .DRIVER_BFM_BIND_T(virtual wb_driver_bfm #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + )), + .MONITOR_BFM_BIND_T( virtual wb_monitor_bfm #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ))); + + `uvm_object_param_utils( wb_configuration #( + WB_ADDR_WIDTH, + WB_DATA_WIDTH + )) + + + // Sequencer handle populated by agent + uvm_sequencer #(wb_transaction #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ) ) sequencer; + + //Constraints for the configuration variables: + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + covergroup wb_configuration_cg; + // pragma uvmf custom covergroup begin + option.auto_bin_max=1024; + // pragma uvmf custom covergroup end + endgroup + + //******************************************************************* + //******************************************************************* + // Structure used to pass configuration variables to monitor and driver BFM's. + // Use to_struct function to pack variables into structure. + // Use from_struct function to unpack variables from structure. + // This structure is defined in wb_macros.svh + `wb_CONFIGURATION_STRUCT + wb_configuration_s wb_configuration_struct; + //******************************************************************* + // FUNCTION: to_struct() + // This function packs variables into a wb_configuration_s + // structure. The function returns the handle to the wb_configuration_struct. + // This function is defined in wb_macros.svh + `wb_CONFIGURATION_TO_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_struct() + // This function unpacks the struct provided as an argument into + // variables of this class. + // This function is defined in wb_macros.svh + `wb_CONFIGURATION_FROM_STRUCT_FUNCTION + + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new( string name = "" ); + super.new( name ); + // Construct the covergroup for this configuration class + wb_configuration_cg = new; + endfunction + + // **************************************************************************** + // FUNCTION: post_randomize() + // This function is automatically called after the randomize() function + // is executed. + // + function void post_randomize(); + super.post_randomize(); + wb_configuration_cg.sample(); + endfunction + + // **************************************************************************** + // FUNCTION: initialize + // This function causes the configuration to retrieve + // its virtual interface handle from the uvm_config_db. + // This function also makes itself available to its + // agent through the uvm_config_db. + // + // ARGUMENTS: + // uvmf_active_passive_t activity: + // This argument identifies the simulation level + // as either BLOCK, CHIP, SIMULATION, etc. + // + // AGENT_PATH: + // This argument identifies the path to this + // configurations agent. This configuration + // makes itself available to the agent specified + // by agent_path by placing itself into the + // uvm_config_db. + // + // INTERFACE_NAME: + // This argument identifies the string name of + // this configurations BFM's. This string + // name is used to retrieve the driver and + // monitor BFM from the uvm_config_db. + // + virtual function void initialize(uvmf_active_passive_t activity, + string agent_path, + string interface_name); + + super.initialize( activity, agent_path, interface_name); + // The covergroup is given the same name as the interface + wb_configuration_cg.set_inst_name(interface_name); + + // This configuration places itself into the uvm_config_db for the agent, identified by the agent_path variable, to retrieve. + uvm_config_db #( wb_configuration #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ) + )::set( null ,agent_path,UVMF_AGENT_CONFIG, this ); + + // This configuration also places itself in the config db using the same identifier used by the interface. This allows users to access + // configuration variables and the interface through the bfm api class rather than directly accessing the BFM. This is useful for + // accessingthe BFM when using Veloce + uvm_config_db #( wb_configuration #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ) + )::set( null ,UVMF_CONFIGURATIONS, interface_name, this ); + + wb_configuration_cg.set_inst_name($sformatf("wb_configuration_cg_%s",get_full_name())); + + // pragma uvmf custom initialize begin + // This controls whether or not the agent returns a transaction handle in the driver when calling + // item_done() back into the sequencer or not. If set to 1, a transaction is sent back which means + // the sequence on the other end must use the get_response() part of the driver/sequence API. If + // this doesn't occur, there will eventually be response_queue overflow errors during the test. + return_transaction_response = 1'b0; + + + + + + + // pragma uvmf custom initialize end + + endfunction + + // **************************************************************************** + // TASK: wait_for_reset + // *[Required]* Blocks until reset is released. The wait_for_reset operation is performed + // by a task in the monitor bfm. + virtual task wait_for_reset(); + monitor_bfm.wait_for_reset(); + endtask + + // **************************************************************************** + // TASK: wait_for_num_clocks + // *[Required]* Blocks until specified number of clocks have elapsed. The wait_for_num_clocks + // operation is performed by a task in the monitor bfm. + virtual task wait_for_num_clocks(int clocks); + monitor_bfm.wait_for_num_clocks(clocks); + endtask + + // **************************************************************************** + // FUNCTION : convert2string() + // This function is used to convert variables in this class into a string for log messaging. + // + virtual function string convert2string (); + // pragma uvmf custom convert2string begin + return $sformatf(""); + // pragma uvmf custom convert2string end + endfunction + + // **************************************************************************** + // FUNCTION: get_sequencer + function uvm_sequencer #(wb_transaction#( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + )) get_sequencer(); + return sequencer; + endfunction + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_driver.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_driver.svh new file mode 100644 index 00000000..b98f1b50 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_driver.svh @@ -0,0 +1,108 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class passes transactions between the sequencer +// and the BFM driver interface. It accesses the driver BFM +// through the bfm handle. This driver +// passes transactions to the driver BFM through the access +// task. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class wb_driver #( + int WB_ADDR_WIDTH = 32, + int WB_DATA_WIDTH = 16 + ) extends uvmf_driver_base #( + .CONFIG_T(wb_configuration #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ) ), + .BFM_BIND_T(virtual wb_driver_bfm #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ) ), + .REQ(wb_transaction #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ) ), + .RSP(wb_transaction #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ) )); + + `uvm_component_param_utils( wb_driver #( + WB_ADDR_WIDTH, + WB_DATA_WIDTH + )) +//******************************************************************* +// Macros that define structs located in wb_macros.svh +//******************************************************************* +// Initiator macro used by wb_driver and wb_driver_bfm +// to communicate initiator driven data to wb_driver_bfm. +`wb_INITIATOR_STRUCT + wb_initiator_s wb_initiator_struct; +//******************************************************************* +// Responder macro used by wb_driver and wb_driver_bfm +// to communicate Responder driven data to wb_driver_bfm. +`wb_RESPONDER_STRUCT + wb_responder_s wb_responder_struct; + +// pragma uvmf custom class_item_additional begin +// pragma uvmf custom class_item_additional end + +// **************************************************************************** +// This function is the standard SystemVerilog constructor. +// + function new( string name = "", uvm_component parent=null ); + super.new( name, parent ); + endfunction + +// **************************************************************************** +// This function sends configuration object variables to the driver BFM +// using the configuration struct. +// + virtual function void configure(input CONFIG_T cfg); + bfm.configure( cfg.to_struct() ); + endfunction + +// **************************************************************************** +// This function places a handle to this class in the proxy variable in the +// driver BFM. This allows the driver BFM to call tasks and function within this class. +// + virtual function void set_bfm_proxy_handle(); + bfm.proxy = this; endfunction + +// **************************************************************************** +// This task is called by the run_phase in uvmf_driver_base. + virtual task access( inout REQ txn ); +// pragma uvmf custom access begin + if (configuration.initiator_responder==RESPONDER) begin + // Complete current transfer and wait for next transfer + bfm.respond_and_wait_for_next_transfer( + wb_initiator_struct, + txn.to_responder_struct() + ); + // Unpack information about initiated transfer received by this responder + txn.from_initiator_struct(wb_initiator_struct); + end else begin + // Initiate a transfer and get response + bfm.initiate_and_get_response( + txn.to_initiator_struct(), + wb_responder_struct + ); + // Unpack transfer response information received by this initiator + txn.from_responder_struct(wb_responder_struct); + end + + + +// pragma uvmf custom access end + endtask + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_driver_bfm.sv b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_driver_bfm.sv new file mode 100644 index 00000000..aab2aaa8 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_driver_bfm.sv @@ -0,0 +1,383 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This interface performs the wb signal driving. It is +// accessed by the uvm wb driver through a virtual interface +// handle in the wb configuration. It drives the singals passed +// in through the port connection named bus of type wb_if. +// +// Input signals from the wb_if are assigned to an internal input +// signal with a _i suffix. The _i signal should be used for sampling. +// +// The input signal connections are as follows: +// bus.signal -> signal_i +// +// This bfm drives signals with a _o suffix. These signals +// are driven onto signals within wb_if based on INITIATOR/RESPONDER and/or +// ARBITRATION/GRANT status. +// +// The output signal connections are as follows: +// signal_o -> bus.signal +// +// +// Interface functions and tasks used by UVM components: +// +// configure: +// This function gets configuration attributes from the +// UVM driver to set any required BFM configuration +// variables such as 'initiator_responder'. +// +// initiate_and_get_response: +// This task is used to perform signaling activity for initiating +// a protocol transfer. The task initiates the transfer, using +// input data from the initiator struct. Then the task captures +// response data, placing the data into the response struct. +// The response struct is returned to the driver class. +// +// respond_and_wait_for_next_transfer: +// This task is used to complete a current transfer as a responder +// and then wait for the initiator to start the next transfer. +// The task uses data in the responder struct to drive protocol +// signals to complete the transfer. The task then waits for +// the next transfer. Once the next transfer begins, data from +// the initiator is placed into the initiator struct and sent +// to the responder sequence for processing to determine +// what data to respond with. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +import uvmf_base_pkg_hdl::*; +import wb_pkg_hdl::*; +`include "src/wb_macros.svh" + +interface wb_driver_bfm #( + int WB_ADDR_WIDTH = 32, + int WB_DATA_WIDTH = 16 + ) + (wb_if bus); + // The following pragma and additional ones in-lined further below are for running this BFM on Veloce + // pragma attribute wb_driver_bfm partition_interface_xif + // Config value to determine if this is an initiator or a responder + uvmf_initiator_responder_t initiator_responder; + // Custom configuration variables. + // These are set using the configure function which is called during the UVM connect_phase + + tri clk_i; + tri rst_i; + + // Signal list (all signals are capable of being inputs and outputs for the sake + // of supporting both INITIATOR and RESPONDER mode operation. Expectation is that + // directionality in the config file was from the point-of-view of the INITIATOR + + // INITIATOR mode input signals + tri [WB_DATA_WIDTH-1:0] din_i; + reg [WB_DATA_WIDTH-1:0] din_o = 'bz; + tri [WB_DATA_WIDTH/8-1:0] sel_i; + reg [WB_DATA_WIDTH/8-1:0] sel_o = 'bz; + tri [WB_DATA_WIDTH-1:0] q_i; + reg [WB_DATA_WIDTH-1:0] q_o = 'bz; + tri ack_i; + reg ack_o = 1'b0; + + // INITIATOR mode output signals + tri inta_i; + reg inta_o = 'bz; + tri cyc_i; + reg cyc_o = 0; + tri stb_i; + reg stb_o = 0; + tri [WB_ADDR_WIDTH-1:0] adr_i; + reg [WB_ADDR_WIDTH-1:0] adr_o = 'bz; + tri we_i; + reg we_o = 0; + tri [WB_DATA_WIDTH-1:0] dout_i; + reg [WB_DATA_WIDTH-1:0] dout_o = 'bz; + tri err_i; + reg err_o = 'bz; + tri rty_i; + reg rty_o = 'bz; + + // Bi-directional signals + + + assign clk_i = bus.clk; + assign rst_i = bus.rst; + + // These are signals marked as 'input' by the config file, but the signals will be + // driven by this BFM if put into RESPONDER mode (flipping all signal directions around) + assign din_i = bus.din; + assign bus.din = (initiator_responder == RESPONDER) ? din_o : 'bz; + assign sel_i = bus.sel; + assign bus.sel = (initiator_responder == RESPONDER) ? sel_o : 'bz; + assign q_i = bus.q; + assign bus.q = (initiator_responder == RESPONDER) ? q_o : 'bz; + assign ack_i = bus.ack; + assign bus.ack = (initiator_responder == RESPONDER) ? ack_o : 'bz; + + + // These are signals marked as 'output' by the config file, but the outputs will + // not be driven by this BFM unless placed in INITIATOR mode. + assign bus.inta = (initiator_responder == INITIATOR) ? inta_o : 'bz; + assign inta_i = bus.inta; + assign bus.cyc = (initiator_responder == INITIATOR) ? cyc_o : 'bz; + assign cyc_i = bus.cyc; + assign bus.stb = (initiator_responder == INITIATOR) ? stb_o : 'bz; + assign stb_i = bus.stb; + assign bus.adr = (initiator_responder == INITIATOR) ? adr_o : 'bz; + assign adr_i = bus.adr; + assign bus.we = (initiator_responder == INITIATOR) ? we_o : 'bz; + assign we_i = bus.we; + assign bus.dout = (initiator_responder == INITIATOR) ? dout_o : 'bz; + assign dout_i = bus.dout; + assign bus.err = (initiator_responder == INITIATOR) ? err_o : 'bz; + assign err_i = bus.err; + assign bus.rty = (initiator_responder == INITIATOR) ? rty_o : 'bz; + assign rty_i = bus.rty; + + // Proxy handle to UVM driver + wb_pkg::wb_driver #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ) proxy; + // pragma tbx oneway proxy.my_function_name_in_uvm_driver + + // **************************************************************************** + // **************************************************************************** + // Macros that define structs located in wb_macros.svh + // **************************************************************************** + // Struct for passing configuration data from wb_driver to this BFM + // **************************************************************************** + `wb_CONFIGURATION_STRUCT + // **************************************************************************** + // Structs for INITIATOR and RESPONDER data flow + //******************************************************************* + // Initiator macro used by wb_driver and wb_driver_bfm + // to communicate initiator driven data to wb_driver_bfm. + `wb_INITIATOR_STRUCT + wb_initiator_s wb_initiator_struct; + // Responder macro used by wb_driver and wb_driver_bfm + // to communicate Responder driven data to wb_driver_bfm. + `wb_RESPONDER_STRUCT + wb_responder_s wb_responder_struct; + + // **************************************************************************** + // Always block used to return signals to reset value upon assertion of reset + always @( negedge rst_i ) + begin + // RESPONDER mode output signals + din_o <= 'b0; + sel_o <= 'b0; + q_o <= 'b0; + ack_o <= 1'b0; + // INITIATOR mode output signals + inta_o <= 'b0; + cyc_o <= 0; + stb_o <= 0; + adr_o <= 'b0; + we_o <= 0; + dout_o <= 'b0; + err_o <= 'b0; + rty_o <= 'b0; + // Bi-directional signals + + end + + // pragma uvmf custom interface_item_additional begin + bit cyc_q, stb_q; + always @(posedge clk_i) begin + cyc_q <= cyc_i; + stb_q <= stb_i; + end + // Need to detect rising edge on cyc and stb in order to begin a new operation + wire cycle_ready = (!cyc_q & cyc_i) & (!stb_q & stb_i); + + + + + + // pragma uvmf custom interface_item_additional end + + //****************************************************************** + // The configure() function is used to pass agent configuration + // variables to the driver BFM. It is called by the driver within + // the agent at the beginning of the simulation. It may be called + // during the simulation if agent configuration variables are updated + // and the driver BFM needs to be aware of the new configuration + // variables. + // + + function void configure(wb_configuration_s wb_configuration_arg); // pragma tbx xtf + initiator_responder = wb_configuration_arg.initiator_responder; + // pragma uvmf custom configure begin + // pragma uvmf custom configure end + endfunction + +// pragma uvmf custom initiate_and_get_response begin +// **************************************************************************** +// UVMF_CHANGE_ME +// This task is used by an initator. The task first initiates a transfer then +// waits for the responder to complete the transfer. + task initiate_and_get_response( + // This argument passes transaction variables used by an initiator + // to perform the initial part of a protocol transfer. The values + // come from a sequence item created in a sequence. + input wb_initiator_s wb_initiator_struct, + // This argument is used to send data received from the responder + // back to the sequence item. The sequence item is returned to the sequence. + output wb_responder_s wb_responder_struct + );// pragma tbx xtf + // + // Members within the wb_initiator_struct: + // wb_op_t op ; + // bit [WB_DATA_WIDTH-1:0] data ; + // bit [WB_ADDR_WIDTH-1:0] addr ; + // bit [(WB_DATA_WIDTH/8)-1:0] byte_select ; + // Members within the wb_responder_struct: + // wb_op_t op ; + // bit [WB_DATA_WIDTH-1:0] data ; + // bit [WB_ADDR_WIDTH-1:0] addr ; + // bit [(WB_DATA_WIDTH/8)-1:0] byte_select ; + // + // Reference code; + // How to wait for signal value + // while (control_signal == 1'b1) @(posedge clk_i); + // + // How to assign a responder struct member, named xyz, from a signal. + // All available input signals listed. + // wb_responder_struct.xyz = inta_i; // + // wb_responder_struct.xyz = cyc_i; // + // wb_responder_struct.xyz = stb_i; // + // wb_responder_struct.xyz = adr_i; // [WB_ADDR_WIDTH-1:0] + // wb_responder_struct.xyz = we_i; // + // wb_responder_struct.xyz = dout_i; // [WB_DATA_WIDTH-1:0] + // wb_responder_struct.xyz = din_i; // [WB_DATA_WIDTH-1:0] + // wb_responder_struct.xyz = err_i; // + // wb_responder_struct.xyz = rty_i; // + // wb_responder_struct.xyz = sel_i; // [WB_DATA_WIDTH/8-1:0] + // wb_responder_struct.xyz = q_i; // [WB_DATA_WIDTH-1:0] + // wb_responder_struct.xyz = ack_i; // + // How to assign a signal, named xyz, from an initiator struct member. + // All available input signals listed. + // Notice the _o. Those are storage variables that allow for procedural assignment. + // inta_o <= wb_initiator_struct.xyz; // + // cyc_o <= wb_initiator_struct.xyz; // + // stb_o <= wb_initiator_struct.xyz; // + // adr_o <= wb_initiator_struct.xyz; // [WB_ADDR_WIDTH-1:0] + // we_o <= wb_initiator_struct.xyz; // + // dout_o <= wb_initiator_struct.xyz; // [WB_DATA_WIDTH-1:0] + // din_o <= wb_initiator_struct.xyz; // [WB_DATA_WIDTH-1:0] + // err_o <= wb_initiator_struct.xyz; // + // rty_o <= wb_initiator_struct.xyz; // + // sel_o <= wb_initiator_struct.xyz; // [WB_DATA_WIDTH/8-1:0] + // q_o <= wb_initiator_struct.xyz; // [WB_DATA_WIDTH-1:0] + // ack_o <= wb_initiator_struct.xyz; // + @(posedge clk_i); + case (wb_initiator_struct.op) + WB_WRITE : begin + adr_o <= wb_initiator_struct.addr; + dout_o <= wb_initiator_struct.data; + cyc_o <= 1'b1; + stb_o <= 1'b1; + we_o <= 1'b1; + sel_o <= wb_initiator_struct.byte_select; + while (!ack_i) @(posedge clk_i); + cyc_o <= 1'b0; + stb_o <= 1'b0; + adr_o <= 'bx; + dout_o <= 'bx; + we_o <= 1'b0; + sel_o <= 1'b0; + wb_responder_struct.data = wb_initiator_struct.data; + @(posedge clk_i); + @(posedge clk_i); + end + WB_READ : begin + adr_o <= wb_initiator_struct.addr; + dout_o <= 'bx; + cyc_o <= 1'b1; + stb_o <= 1'b1; + we_o <= 1'b0; + sel_o <= wb_initiator_struct.byte_select; + @(posedge clk_i); + while (!ack_i) @(posedge clk_i); + cyc_o <= 1'b0; + stb_o <= 1'b0; + adr_o <= 'bx; + dout_o <= 'bx; + we_o <= 1'b0; + sel_o <= 'b0; + wb_responder_struct.data = din_i; + end + endcase + + endtask + + + +// pragma uvmf custom initiate_and_get_response end + +// pragma uvmf custom respond_and_wait_for_next_transfer begin +// **************************************************************************** +// The first_transfer variable is used to prevent completing a transfer in the +// first call to this task. For the first call to this task, there is not +// current transfer to complete. +bit first_transfer=1; + +// UVMF_CHANGE_ME +// This task is used by a responder. The task first completes the current +// transfer in progress then waits for the initiator to start the next transfer. + task respond_and_wait_for_next_transfer( + // This argument is used to send data received from the initiator + // back to the sequence item. The sequence determines how to respond. + output wb_initiator_s wb_initiator_struct, + // This argument passes transaction variables used by a responder + // to complete a protocol transfer. The values come from a sequence item. + input wb_responder_s wb_responder_struct + );// pragma tbx xtf + // Variables within the wb_initiator_struct: + // wb_op_t op ; + // bit [WB_DATA_WIDTH-1:0] data ; + // bit [WB_ADDR_WIDTH-1:0] addr ; + // bit [(WB_DATA_WIDTH/8)-1:0] byte_select ; + // Variables within the wb_responder_struct: + // wb_op_t op ; + // bit [WB_DATA_WIDTH-1:0] data ; + // bit [WB_ADDR_WIDTH-1:0] addr ; + // bit [(WB_DATA_WIDTH/8)-1:0] byte_select ; + + @(posedge clk_i); + if (!first_transfer) begin + din_o <= wb_responder_struct.data; + ack_o <= 1'b1; + @(posedge clk_i); + din_o <= 'b0; + ack_o <= 1'b0; + end + // Wait for next transfer then gather info from intiator about the transfer. + // Place the data into the wb_initiator_struct. + while (cycle_ready!==1'b1) @(posedge clk_i); + wb_initiator_struct.addr = adr_i; + wb_initiator_struct.data = dout_i; + if (we_i) begin + wb_initiator_struct.op = WB_WRITE; + end else begin + wb_initiator_struct.op = WB_READ; + end + first_transfer = 0; + + + endtask + + + +// pragma uvmf custom respond_and_wait_for_next_transfer end + + +endinterface diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_if.sv b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_if.sv new file mode 100644 index 00000000..2291029a --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_if.sv @@ -0,0 +1,119 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This interface contains the wb interface signals. +// It is instantiated once per wb bus. Bus Functional Models, +// BFM's named wb_driver_bfm, are used to drive signals on the bus. +// BFM's named wb_monitor_bfm are used to monitor signals on the +// bus. This interface signal bundle is passed in the port list of +// the BFM in order to give the BFM access to the signals in this +// interface. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// This template can be used to connect a DUT to these signals +// +// .dut_signal_port(wb_bus.inta), // Agent output +// .dut_signal_port(wb_bus.cyc), // Agent output +// .dut_signal_port(wb_bus.stb), // Agent output +// .dut_signal_port(wb_bus.adr), // Agent output +// .dut_signal_port(wb_bus.we), // Agent output +// .dut_signal_port(wb_bus.dout), // Agent output +// .dut_signal_port(wb_bus.din), // Agent input +// .dut_signal_port(wb_bus.err), // Agent output +// .dut_signal_port(wb_bus.rty), // Agent output +// .dut_signal_port(wb_bus.sel), // Agent input +// .dut_signal_port(wb_bus.q), // Agent input +// .dut_signal_port(wb_bus.ack), // Agent input + +import uvmf_base_pkg_hdl::*; +import wb_pkg_hdl::*; + +interface wb_if #( + int WB_ADDR_WIDTH = 32, + int WB_DATA_WIDTH = 16 + ) + + ( + input tri clk, + input tri rst, + inout tri inta, + inout tri cyc, + inout tri stb, + inout tri [WB_ADDR_WIDTH-1:0] adr, + inout tri we, + inout tri [WB_DATA_WIDTH-1:0] dout, + inout tri [WB_DATA_WIDTH-1:0] din, + inout tri err, + inout tri rty, + inout tri [WB_DATA_WIDTH/8-1:0] sel, + inout tri [WB_DATA_WIDTH-1:0] q, + inout tri ack + ); + +modport monitor_port + ( + input clk, + input rst, + input inta, + input cyc, + input stb, + input adr, + input we, + input dout, + input din, + input err, + input rty, + input sel, + input q, + input ack + ); + +modport initiator_port + ( + input clk, + input rst, + output inta, + output cyc, + output stb, + output adr, + output we, + output dout, + input din, + output err, + output rty, + input sel, + input q, + input ack + ); + +modport responder_port + ( + input clk, + input rst, + input inta, + input cyc, + input stb, + input adr, + input we, + input dout, + output din, + input err, + input rty, + output sel, + output q, + output ack + ); + + +// pragma uvmf custom interface_item_additional begin +// pragma uvmf custom interface_item_additional end + +endinterface + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_macros.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_macros.svh new file mode 100644 index 00000000..66b40758 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_macros.svh @@ -0,0 +1,148 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This file contains macros used with the wb package. +// These macros include packed struct definitions. These structs are +// used to pass data between classes, hvl, and BFM's, hdl. Use of +// structs are more efficient and simpler to modify. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_struct +// and from_struct methods defined in the macros below that are used in +// the wb_configuration class. +// + `define wb_CONFIGURATION_STRUCT \ +typedef struct packed { \ + uvmf_active_passive_t active_passive; \ + uvmf_initiator_responder_t initiator_responder; \ + } wb_configuration_s; + + `define wb_CONFIGURATION_TO_STRUCT_FUNCTION \ + virtual function wb_configuration_s to_struct();\ + wb_configuration_struct = \ + {\ + this.active_passive,\ + this.initiator_responder\ + };\ + return ( wb_configuration_struct );\ + endfunction + + `define wb_CONFIGURATION_FROM_STRUCT_FUNCTION \ + virtual function void from_struct(wb_configuration_s wb_configuration_struct);\ + {\ + this.active_passive,\ + this.initiator_responder \ + } = wb_configuration_struct;\ + endfunction + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_monitor_struct +// and from_monitor_struct methods of the wb_transaction class. +// + `define wb_MONITOR_STRUCT typedef struct packed { \ + wb_op_t op ; \ + bit [WB_DATA_WIDTH-1:0] data ; \ + bit [WB_ADDR_WIDTH-1:0] addr ; \ + bit [(WB_DATA_WIDTH/8)-1:0] byte_select ; \ + } wb_monitor_s; + + `define wb_TO_MONITOR_STRUCT_FUNCTION \ + virtual function wb_monitor_s to_monitor_struct();\ + wb_monitor_struct = \ + { \ + this.op , \ + this.data , \ + this.addr , \ + this.byte_select \ + };\ + return ( wb_monitor_struct);\ + endfunction\ + + `define wb_FROM_MONITOR_STRUCT_FUNCTION \ + virtual function void from_monitor_struct(wb_monitor_s wb_monitor_struct);\ + {\ + this.op , \ + this.data , \ + this.addr , \ + this.byte_select \ + } = wb_monitor_struct;\ + endfunction + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_initiator_struct +// and from_initiator_struct methods of the wb_transaction class. +// Also update the comments in the driver BFM. +// + `define wb_INITIATOR_STRUCT typedef struct packed { \ + wb_op_t op ; \ + bit [WB_DATA_WIDTH-1:0] data ; \ + bit [WB_ADDR_WIDTH-1:0] addr ; \ + bit [(WB_DATA_WIDTH/8)-1:0] byte_select ; \ + } wb_initiator_s; + + `define wb_TO_INITIATOR_STRUCT_FUNCTION \ + virtual function wb_initiator_s to_initiator_struct();\ + wb_initiator_struct = \ + {\ + this.op , \ + this.data , \ + this.addr , \ + this.byte_select \ + };\ + return ( wb_initiator_struct);\ + endfunction + + `define wb_FROM_INITIATOR_STRUCT_FUNCTION \ + virtual function void from_initiator_struct(wb_initiator_s wb_initiator_struct);\ + {\ + this.op , \ + this.data , \ + this.addr , \ + this.byte_select \ + } = wb_initiator_struct;\ + endfunction + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_responder_struct +// and from_responder_struct methods of the wb_transaction class. +// Also update the comments in the driver BFM. +// + `define wb_RESPONDER_STRUCT typedef struct packed { \ + wb_op_t op ; \ + bit [WB_DATA_WIDTH-1:0] data ; \ + bit [WB_ADDR_WIDTH-1:0] addr ; \ + bit [(WB_DATA_WIDTH/8)-1:0] byte_select ; \ + } wb_responder_s; + + `define wb_TO_RESPONDER_STRUCT_FUNCTION \ + virtual function wb_responder_s to_responder_struct();\ + wb_responder_struct = \ + {\ + this.op , \ + this.data , \ + this.addr , \ + this.byte_select \ + };\ + return ( wb_responder_struct);\ + endfunction + + `define wb_FROM_RESPONDER_STRUCT_FUNCTION \ + virtual function void from_responder_struct(wb_responder_s wb_responder_struct);\ + {\ + this.op , \ + this.data , \ + this.addr , \ + this.byte_select \ + } = wb_responder_struct;\ + endfunction +// pragma uvmf custom additional begin +// pragma uvmf custom additional end diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_master_access_sequence.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_master_access_sequence.svh new file mode 100644 index 00000000..873e1711 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_master_access_sequence.svh @@ -0,0 +1,50 @@ +class wb_master_access_sequence #(int WB_ADDR_WIDTH = 32, int WB_DATA_WIDTH = 16 ) + extends wb_sequence_base #(.WB_ADDR_WIDTH(WB_ADDR_WIDTH),.WB_DATA_WIDTH(WB_DATA_WIDTH)); + + `uvm_object_param_utils(wb_master_access_sequence#(WB_ADDR_WIDTH, WB_DATA_WIDTH )) + + typedef wb_transaction #(.WB_ADDR_WIDTH(WB_ADDR_WIDTH),.WB_DATA_WIDTH(WB_DATA_WIDTH)) wb_trans_t; + + bit [WB_ADDR_WIDTH-1:0] req_addr; + bit [WB_DATA_WIDTH-1:0] req_data; + wb_op_t req_op; + + function new(string name = "wb_master_access_sequence"); + super.new(name); + endfunction + + task read(input bit [WB_ADDR_WIDTH-1:0] addr, output bit [WB_DATA_WIDTH-1:0] read_data, + input uvm_sequencer #(wb_trans_t) seqr, + // input uvm_sequencer #(wb_transaction #(.WB_ADDR_WIDTH(WB_ADDR_WIDTH),.WB_DATA_WIDTH(WB_DATA_WIDTH))) seqr, + input uvm_sequence_base parent = null); + this.req_addr = addr; + this.req_op = WB_READ; + this.start(seqr,parent); + read_data = req.data; + endtask + + task write(input bit [WB_ADDR_WIDTH-1:0] addr, input bit [WB_DATA_WIDTH-1:0] write_data, + input uvm_sequencer #(wb_trans_t) seqr, + // input uvm_sequencer #(wb_transaction #(.WB_ADDR_WIDTH(WB_ADDR_WIDTH),.WB_DATA_WIDTH(WB_DATA_WIDTH))) seqr, + input uvm_sequence_base parent = null); + this.req_addr = addr; + this.req_op = WB_WRITE; + this.req_data = write_data; + this.start(seqr,parent); + endtask + + task body(); + req = wb_trans_t::type_id::create("req"); + start_item(req); + if (!req.randomize() with { + op == req_op; + addr == req_addr; + data == req_data; + byte_select == {WB_DATA_WIDTH/8{1'b1}}; + }) + `uvm_fatal("SEQ","Randomization failed"); + finish_item(req); + `uvm_info("SEQ",{"Transaction finished: ",req.convert2string()},UVM_MEDIUM) + endtask + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_memory_slave_sequence.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_memory_slave_sequence.svh new file mode 100644 index 00000000..ac223a22 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_memory_slave_sequence.svh @@ -0,0 +1,50 @@ +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// Created by : jcraft +// Creation Date : 2016 Nov 03 +//---------------------------------------------------------------------- +// +//---------------------------------------------------------------------- +// Project : wb responder sequence +// Unit : Interface UVM Responder +// File : wb_responder_sequence.svh +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class can be used to provide stimulus when an interface +// has been configured to run in a responder mode. It +// will never finish by default, always going back to the driver +// and driver BFM for the next transaction with which to respond. +// +// **************************************************************************** +// **************************************************************************** +//---------------------------------------------------------------------- +// +class wb_memory_slave_sequence #( + int WB_ADDR_WIDTH = 32, int WB_DATA_WIDTH = 16 ) +extends wb_sequence_base #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), .WB_DATA_WIDTH(WB_DATA_WIDTH) ) ; + + `uvm_object_param_utils( wb_memory_slave_sequence #( WB_ADDR_WIDTH, WB_DATA_WIDTH )) + + bit [WB_DATA_WIDTH-1:0] mem[bit[WB_ADDR_WIDTH-1:0]]; + + function new(string name = "wb_memory_slave_sequence"); + super.new(name); + endfunction + + task body(); + req=wb_transaction #( .WB_ADDR_WIDTH(WB_ADDR_WIDTH), .WB_DATA_WIDTH(WB_DATA_WIDTH) ) ::type_id::create("req"); + forever begin + start_item(req); + finish_item(req); + if (req.op == WB_READ) begin + if (mem.exists(req.addr)) req.data = mem[req.addr]; + else req.data = ~req.addr; + end else begin + mem[req.addr] = req.data; + end + `uvm_info("SEQ",$sformatf("Processed txn: %s",req.convert2string()),UVM_HIGH) + end + endtask + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_monitor.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_monitor.svh new file mode 100644 index 00000000..78f9905b --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_monitor.svh @@ -0,0 +1,96 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class receives wb transactions observed by the +// wb monitor BFM and broadcasts them through the analysis port +// on the agent. It accesses the monitor BFM through the monitor +// task. This UVM component captures transactions +// for viewing in the waveform viewer if the +// enable_transaction_viewing flag is set in the configuration. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class wb_monitor #( + int WB_ADDR_WIDTH = 32, + int WB_DATA_WIDTH = 16 + ) extends uvmf_monitor_base #( + .CONFIG_T(wb_configuration #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + )), + .BFM_BIND_T(virtual wb_monitor_bfm #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + )), + .TRANS_T(wb_transaction #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ))); + + `uvm_component_param_utils( wb_monitor #( + WB_ADDR_WIDTH, + WB_DATA_WIDTH + )) + +// Structure used to pass data from monitor BFM to monitor class in agent. +// Use to_monitor_struct function to pack transaction variables into structure. +// Use from_monitor_struct function to unpack transaction variables from structure. +`wb_MONITOR_STRUCT + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + +// **************************************************************************** +// This function is the standard SystemVerilog constructor. +// + function new( string name = "", uvm_component parent = null ); + super.new( name, parent ); + endfunction + +// **************************************************************************** +// This function sends configuration object variables to the monitor BFM +// using the configuration struct. +// + virtual function void configure(input CONFIG_T cfg); + bfm.configure( cfg.to_struct() ); + + endfunction + +// **************************************************************************** +// This function places a handle to this class in the proxy variable in the +// monitor BFM. This allows the monitor BFM to call the notify_transaction +// function within this class. +// + virtual function void set_bfm_proxy_handle(); + bfm.proxy = this; endfunction + +// *************************************************************************** + virtual task run_phase(uvm_phase phase); + // Start monitor BFM thread and don't call super.run() in order to + // override the default monitor proxy 'pull' behavior with the more + // emulation-friendly BFM 'push' approach using the notify_transaction + // function below + bfm.start_monitoring(); + endtask + +// ************************************************************************** + +// This function is called by the monitor BFM. It receives data observed by the +// monitor BFM. Data is passed using the wb_monitor_struct. + virtual function void notify_transaction(input wb_monitor_s wb_monitor_struct); + trans = new("trans"); + trans.start_time = time_stamp; + trans.end_time = $time; + time_stamp = trans.end_time; + + trans.from_monitor_struct(wb_monitor_struct); + analyze(trans); + endfunction + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_monitor_bfm.sv b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_monitor_bfm.sv new file mode 100644 index 00000000..2a327e34 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_monitor_bfm.sv @@ -0,0 +1,212 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This interface performs the wb signal monitoring. +// It is accessed by the uvm wb monitor through a virtual +// interface handle in the wb configuration. It monitors the +// signals passed in through the port connection named bus of +// type wb_if. +// +// Input signals from the wb_if are assigned to an internal input +// signal with a _i suffix. The _i signal should be used for sampling. +// +// The input signal connections are as follows: +// bus.signal -> signal_i +// +// Interface functions and tasks used by UVM components: +// monitor(inout TRANS_T txn); +// This task receives the transaction, txn, from the +// UVM monitor and then populates variables in txn +// from values observed on bus activity. This task +// blocks until an operation on the wb bus is complete. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +import uvmf_base_pkg_hdl::*; +import wb_pkg_hdl::*; + +`include "src/wb_macros.svh" + +interface wb_monitor_bfm #( + int WB_ADDR_WIDTH = 32, + int WB_DATA_WIDTH = 16 + ) + ( wb_if bus ); + // The pragma below and additional ones in-lined further down are for running this BFM on Veloce + // pragma attribute wb_monitor_bfm partition_interface_xif + + // Structure used to pass transaction data from monitor BFM to monitor class in agent. +`wb_MONITOR_STRUCT + wb_monitor_s wb_monitor_struct; + + // Structure used to pass configuration data from monitor class to monitor BFM. + `wb_CONFIGURATION_STRUCT + + + // Config value to determine if this is an initiator or a responder + uvmf_initiator_responder_t initiator_responder; + // Custom configuration variables. + // These are set using the configure function which is called during the UVM connect_phase + + tri clk_i; + tri rst_i; + tri inta_i; + tri cyc_i; + tri stb_i; + tri [WB_ADDR_WIDTH-1:0] adr_i; + tri we_i; + tri [WB_DATA_WIDTH-1:0] dout_i; + tri [WB_DATA_WIDTH-1:0] din_i; + tri err_i; + tri rty_i; + tri [WB_DATA_WIDTH/8-1:0] sel_i; + tri [WB_DATA_WIDTH-1:0] q_i; + tri ack_i; + assign clk_i = bus.clk; + assign rst_i = bus.rst; + assign inta_i = bus.inta; + assign cyc_i = bus.cyc; + assign stb_i = bus.stb; + assign adr_i = bus.adr; + assign we_i = bus.we; + assign dout_i = bus.dout; + assign din_i = bus.din; + assign err_i = bus.err; + assign rty_i = bus.rty; + assign sel_i = bus.sel; + assign q_i = bus.q; + assign ack_i = bus.ack; + + // Proxy handle to UVM monitor + wb_pkg::wb_monitor #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ) proxy; + // pragma tbx oneway proxy.notify_transaction + + // pragma uvmf custom interface_item_additional begin + // pragma uvmf custom interface_item_additional end + + //****************************************************************** + task wait_for_reset();// pragma tbx xtf + @(posedge clk_i) ; + do_wait_for_reset(); + endtask + + // **************************************************************************** + task do_wait_for_reset(); + wait ( rst_i == 1 ) ; + @(posedge clk_i) ; + endtask + + //****************************************************************** + + task wait_for_num_clocks(input int unsigned count); // pragma tbx xtf + @(posedge clk_i); + + repeat (count-1) @(posedge clk_i); + endtask + + //****************************************************************** + event go; + function void start_monitoring();// pragma tbx xtf + -> go; + endfunction + + // **************************************************************************** + initial begin + @go; + forever begin + @(posedge clk_i); + do_monitor( wb_monitor_struct ); + + + proxy.notify_transaction( wb_monitor_struct ); + + end + end + + //****************************************************************** + // The configure() function is used to pass agent configuration + // variables to the monitor BFM. It is called by the monitor within + // the agent at the beginning of the simulation. It may be called + // during the simulation if agent configuration variables are updated + // and the monitor BFM needs to be aware of the new configuration + // variables. + // + function void configure(wb_configuration_s wb_configuration_arg); // pragma tbx xtf + initiator_responder = wb_configuration_arg.initiator_responder; + // pragma uvmf custom configure begin + // pragma uvmf custom configure end + endfunction + + + // **************************************************************************** + + task do_monitor(output wb_monitor_s wb_monitor_struct); + // UVMF_CHANGE_ME : Implement protocol monitoring. The commented reference code + // below are examples of how to capture signal values and assign them to + // structure members. All available input signals are listed. The 'while' + // code example shows how to wait for a synchronous flow control signal. This + // task should return when a complete transfer has been observed. Once this task is + // exited with captured values, it is then called again to wait for and observe + // the next transfer. One clock cycle is consumed between calls to do_monitor. + // + // Available struct members: + // // wb_monitor_struct.op + // // wb_monitor_struct.data + // // wb_monitor_struct.addr + // // wb_monitor_struct.byte_select + // // + // Reference code; + // How to wait for signal value + // while (control_signal == 1'b1) @(posedge clk_i); + // + // How to assign a struct member, named xyz, from a signal. + // All available input signals listed. + // wb_monitor_struct.xyz = inta_i; // + // wb_monitor_struct.xyz = cyc_i; // + // wb_monitor_struct.xyz = stb_i; // + // wb_monitor_struct.xyz = adr_i; // [WB_ADDR_WIDTH-1:0] + // wb_monitor_struct.xyz = we_i; // + // wb_monitor_struct.xyz = dout_i; // [WB_DATA_WIDTH-1:0] + // wb_monitor_struct.xyz = din_i; // [WB_DATA_WIDTH-1:0] + // wb_monitor_struct.xyz = err_i; // + // wb_monitor_struct.xyz = rty_i; // + // wb_monitor_struct.xyz = sel_i; // [WB_DATA_WIDTH/8-1:0] + // wb_monitor_struct.xyz = q_i; // [WB_DATA_WIDTH-1:0] + // wb_monitor_struct.xyz = ack_i; // + // pragma uvmf custom do_monitor begin + if ( !rst_i ) begin + wb_monitor_struct.op = WB_RESET; + do_wait_for_reset(); + end + else begin + while (!ack_i) @(posedge clk_i); + if (we_i) begin + wb_monitor_struct.op = WB_WRITE; + wb_monitor_struct.data = dout_i; + wb_monitor_struct.addr = adr_i; + end else begin + wb_monitor_struct.op = WB_READ; + wb_monitor_struct.data = din_i; + wb_monitor_struct.addr = adr_i; + end + end + if (wb_monitor_struct.op == WB_WRITE) repeat (2) @(posedge clk_i); + + + + + + // pragma uvmf custom do_monitor end + endtask + + +endinterface diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_random_sequence.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_random_sequence.svh new file mode 100644 index 00000000..5c80af6a --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_random_sequence.svh @@ -0,0 +1,62 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This sequences randomizes the wb transaction and sends it +// to the UVM driver. +// +// This sequence constructs and randomizes a wb_transaction. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class wb_random_sequence #( + int WB_ADDR_WIDTH = 32, + int WB_DATA_WIDTH = 16 + ) + extends wb_sequence_base #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ); + + `uvm_object_param_utils( wb_random_sequence #( + WB_ADDR_WIDTH, + WB_DATA_WIDTH + )) + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + //***************************************************************** + function new(string name = ""); + super.new(name); + endfunction: new + + // **************************************************************************** + // TASK : body() + // This task is automatically executed when this sequence is started using the + // start(sequencerHandle) task. + // + task body(); + begin + // Construct the transaction + req=wb_transaction#( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + )::type_id::create("req"); + start_item(req); + // Randomize the transaction + if(!req.randomize()) `uvm_fatal("SEQ", "wb_random_sequence::body()-wb_transaction randomization failed") + // Send the transaction to the wb_driver_bfm via the sequencer and wb_driver. + finish_item(req); + `uvm_info("SEQ", {"Response:",req.convert2string()},UVM_MEDIUM) + end + + endtask + +endclass: wb_random_sequence diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_reset_sequence.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_reset_sequence.svh new file mode 100644 index 00000000..fc99d856 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_reset_sequence.svh @@ -0,0 +1,64 @@ +//---------------------------------------------------------------------- +// Copyright 2013 Mentor Graphics Corporation +// All Rights Reserved Worldwide +// +// Licensed under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in +// writing, software distributed under the License is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See +// the License for the specific language governing +// permissions and limitations under the License. +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// Mentor Graphics Inc +//---------------------------------------------------------------------- +// Project : WB interface agent +// Unit : Sequence library +// File : wb_reset_sequence.svh +//---------------------------------------------------------------------- +// Creation Date : 05.12.2011 +//---------------------------------------------------------------------- +// Description: This file contains wb sequence used to generate a reset +// on the wb bus. +// +//---------------------------------------------------------------------- +// +class wb_reset_sequence #(int WB_ADDR_WIDTH = 32, int WB_DATA_WIDTH = 16 ) extends wb_sequence_base #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) ); + + // declaration macros + `uvm_object_param_utils( wb_reset_sequence #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) )) + + typedef wb_transaction#( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) ) wb_trans_t; + +//***************************************************************** + function new(string name = ""); + super.new(name); + endfunction: new + +//***************************************************************** + task body(); + + begin + assert($cast(req, create_item(wb_trans_t::get_type(), m_sequencer, "req"))); + start_item(req); + req.op = WB_RESET; + `uvm_info("SEQ",{"Sending transaction ",req.convert2string()}, UVM_MEDIUM); + finish_item(req); + end + + endtask: body + +endclass: wb_reset_sequence diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_responder_sequence.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_responder_sequence.svh new file mode 100644 index 00000000..c8257987 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_responder_sequence.svh @@ -0,0 +1,62 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class can be used to provide stimulus when an interface +// has been configured to run in a responder mode. It +// will never finish by default, always going back to the driver +// and driver BFM for the next transaction with which to respond. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class wb_responder_sequence #( + int WB_ADDR_WIDTH = 32, + int WB_DATA_WIDTH = 16 + ) + extends wb_sequence_base #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ); + + `uvm_object_param_utils( wb_responder_sequence #( + WB_ADDR_WIDTH, + WB_DATA_WIDTH + )) + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + function new(string name = "wb_responder_sequence"); + super.new(name); + endfunction + + task body(); + req=wb_transaction#( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + )::type_id::create("req"); + forever begin + start_item(req); + finish_item(req); + // pragma uvmf custom body begin + // UVMF_CHANGE_ME : Do something here with the resulting req item. The + // finish_item() call above will block until the req transaction is ready + // to be handled by the responder sequence. + // If this was an item that required a response, the expectation is + // that the response should be populated within this transaction now. + `uvm_info("SEQ",$sformatf("Processed txn: %s",req.convert2string()),UVM_HIGH) + + + + + + // pragma uvmf custom body end + end + endtask + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_sequence_base.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_sequence_base.svh new file mode 100644 index 00000000..7619ea8f --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_sequence_base.svh @@ -0,0 +1,117 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This file contains the class used as the base class for all sequences +// for this interface. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class wb_sequence_base #( + int WB_ADDR_WIDTH = 32, + int WB_DATA_WIDTH = 16 + ) extends uvmf_sequence_base #( + .REQ(wb_transaction #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + )), + .RSP(wb_transaction #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ))); + + `uvm_object_param_utils( wb_sequence_base #( + WB_ADDR_WIDTH, + WB_DATA_WIDTH + )) + + // variables + typedef wb_transaction #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ) wb_transaction_req_t; + wb_transaction_req_t req; + typedef wb_transaction #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ) wb_transaction_rsp_t; + wb_transaction_rsp_t rsp; + + // Event for identifying when a response was received from the sequencer + event new_rsp; + + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + // **************************************************************************** + // TASK : get_responses() + // This task recursively gets sequence item responses from the sequencer. + // + virtual task get_responses(); + fork + begin + // Block until new rsp available + get_response(rsp); + // New rsp received. Indicate to sequence using event. + ->new_rsp; + // Display the received response transaction + `uvm_info("SEQ", {"New response transaction:",rsp.convert2string()}, UVM_MEDIUM) + end + join_none + endtask + + // **************************************************************************** + // TASK : pre_body() + // This task is called automatically when start is called with call_pre_post set to 1 (default). + // By calling get_responses() within pre_body() any derived sequences are automatically + // processing response transactions. + // + virtual task pre_body(); + // pragma uvmf custom pre_body begin + get_responses(); + // pragma uvmf custom pre_body end + endtask + + // **************************************************************************** + // TASK : body() + // This task is called automatically when start is called. This sequence sends + // a req sequence item to the sequencer identified as an argument in the call + // to start. + // + virtual task body(); + // pragma uvmf custom body begin + start_item(req); + finish_item(req); + + + + + + // pragma uvmf custom body end + endtask + + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new( string name =""); + super.new( name ); + // pragma uvmf custom new begin + req = wb_transaction_req_t::type_id::create("req"); + rsp = wb_transaction_rsp_t::type_id::create("rsp"); + + + + + + // pragma uvmf custom new end + endfunction + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_slave_access_sequence.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_slave_access_sequence.svh new file mode 100644 index 00000000..ca9ab7e4 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_slave_access_sequence.svh @@ -0,0 +1,52 @@ +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// Created by : jcraft +// Creation Date : 2016 Nov 03 +//---------------------------------------------------------------------- +// +//---------------------------------------------------------------------- +// Project : wb responder sequence +// Unit : Interface UVM Responder +// File : wb_responder_sequence.svh +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class can be used to provide stimulus when an interface +// has been configured to run in a responder mode. It +// will never finish by default, always going back to the driver +// and driver BFM for the next transaction with which to respond. +// +// **************************************************************************** +// **************************************************************************** +//---------------------------------------------------------------------- +// +class wb_slave_access_sequence #( + int WB_ADDR_WIDTH = 32, int WB_DATA_WIDTH = 16 ) +extends wb_sequence_base #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), .WB_DATA_WIDTH(WB_DATA_WIDTH) ) ; + + `uvm_object_param_utils( wb_slave_access_sequence #( WB_ADDR_WIDTH, WB_DATA_WIDTH )) + + function new(string name = "wb_memory_slave_sequence"); + super.new(name); + endfunction + + task body(); + req=wb_transaction #( .WB_ADDR_WIDTH(WB_ADDR_WIDTH), .WB_DATA_WIDTH(WB_DATA_WIDTH) ) ::type_id::create("req"); + // This loop will reuse the transaction object created above for as long as the simulation is + // running. The first call to start_item() and finish_item() is a "dummy" transaction. The + // finish_item() call will block in the driver BFM until a valid transaction is seen at which + // point this will unblock, allowing the sequence to act on the resulting information. In the event + // of a read, we return the inverted address seen. This response is passed back into the driver + // on the next pass into start_item()/finish_item() which will also block again waiting for the + // next transaction. + forever begin + start_item(req); + finish_item(req); + if (req.op == WB_READ) begin + req.data = ~req.addr; + end + `uvm_info("SEQ",$sformatf("Processed txn: %s",req.convert2string()),UVM_HIGH) + end + endtask + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_transaction.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_transaction.svh new file mode 100644 index 00000000..4f127a60 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_transaction.svh @@ -0,0 +1,212 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class defines the variables required for an wb +// transaction. Class variables to be displayed in waveform transaction +// viewing are added to the transaction viewing stream in the add_to_wave +// function. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class wb_transaction #( + int WB_ADDR_WIDTH = 32, + int WB_DATA_WIDTH = 16 + ) extends uvmf_transaction_base; + + `uvm_object_param_utils( wb_transaction #( + WB_ADDR_WIDTH, + WB_DATA_WIDTH + )) + + rand wb_op_t op ; + rand bit [WB_DATA_WIDTH-1:0] data ; + rand bit [WB_ADDR_WIDTH-1:0] addr ; + rand bit [(WB_DATA_WIDTH/8)-1:0] byte_select ; + + //Constraints for the transaction variables: + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + //******************************************************************* + //******************************************************************* + // Macros that define structs and associated functions are + // located in wb_macros.svh + + //******************************************************************* + // Monitor macro used by wb_monitor and wb_monitor_bfm + // This struct is defined in wb_macros.svh + `wb_MONITOR_STRUCT + wb_monitor_s wb_monitor_struct; + //******************************************************************* + // FUNCTION: to_monitor_struct() + // This function packs transaction variables into a wb_monitor_s + // structure. The function returns the handle to the wb_monitor_struct. + // This function is defined in wb_macros.svh + `wb_TO_MONITOR_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_monitor_struct() + // This function unpacks the struct provided as an argument into transaction + // variables of this class. + // This function is defined in wb_macros.svh + `wb_FROM_MONITOR_STRUCT_FUNCTION + + //******************************************************************* + // Initiator macro used by wb_driver and wb_driver_bfm + // to communicate initiator driven data to wb_driver_bfm. + // This struct is defined in wb_macros.svh + `wb_INITIATOR_STRUCT + wb_initiator_s wb_initiator_struct; + //******************************************************************* + // FUNCTION: to_initiator_struct() + // This function packs transaction variables into a wb_initiator_s + // structure. The function returns the handle to the wb_initiator_struct. + // This function is defined in wb_macros.svh + `wb_TO_INITIATOR_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_initiator_struct() + // This function unpacks the struct provided as an argument into transaction + // variables of this class. + // This function is defined in wb_macros.svh + `wb_FROM_INITIATOR_STRUCT_FUNCTION + + //******************************************************************* + // Responder macro used by wb_driver and wb_driver_bfm + // to communicate Responder driven data to wb_driver_bfm. + // This struct is defined in wb_macros.svh + `wb_RESPONDER_STRUCT + wb_responder_s wb_responder_struct; + //******************************************************************* + // FUNCTION: to_responder_struct() + // This function packs transaction variables into a wb_responder_s + // structure. The function returns the handle to the wb_responder_struct. + // This function is defined in wb_macros.svh + `wb_TO_RESPONDER_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_responder_struct() + // This function unpacks the struct provided as an argument into transaction + // variables of this class. + // This function is defined in wb_macros.svh + `wb_FROM_RESPONDER_STRUCT_FUNCTION + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new( string name = "" ); + super.new( name ); + endfunction + + // **************************************************************************** + // FUNCTION: convert2string() + // This function converts all variables in this class to a single string for + // logfile reporting. + // + virtual function string convert2string(); + // pragma uvmf custom convert2string begin + // UVMF_CHANGE_ME : Customize format if desired. + return $sformatf("op:0x%x data:0x%x addr:0x%x byte_select:0x%x ",op,data,addr,byte_select); + + + + + + // pragma uvmf custom convert2string end + endfunction + + //******************************************************************* + // FUNCTION: do_print() + // This function is automatically called when the .print() function + // is called on this class. + // + virtual function void do_print(uvm_printer printer); + // pragma uvmf custom do_print begin + // UVMF_CHANGE_ME : Current contents of do_print allows for the use of UVM 1.1d, 1.2 or P1800.2. + // Update based on your own printing preference according to your preferred UVM version + $display(convert2string()); + + + + + + // pragma uvmf custom do_print end + endfunction + + //******************************************************************* + // FUNCTION: do_compare() + // This function is automatically called when the .compare() function + // is called on this class. + // + virtual function bit do_compare (uvm_object rhs, uvm_comparer comparer); + wb_transaction #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ) RHS; + if (!$cast(RHS,rhs)) return 0; + // UVMF_CHANGE_ME : Eliminate comparison of variables not to be used for compare + return (super.do_compare(rhs,comparer) + &&(this.data == RHS.data) + &&(this.addr == RHS.addr) + &&(this.byte_select == RHS.byte_select) + ); + endfunction + + //******************************************************************* + // FUNCTION: do_copy() + // This function is automatically called when the .copy() function + // is called on this class. + // + virtual function void do_copy (uvm_object rhs); + wb_transaction #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ) RHS; + assert($cast(RHS,rhs)); + super.do_copy(rhs); + this.op = RHS.op; + this.data = RHS.data; + this.addr = RHS.addr; + this.byte_select = RHS.byte_select; + endfunction + + // **************************************************************************** + // FUNCTION: add_to_wave() + // This function is used to display variables in this class in the waveform + // viewer. The start_time and end_time variables must be set before this + // function is called. If the start_time and end_time variables are not set + // the transaction will be hidden at 0ns on the waveform display. + // + virtual function void add_to_wave(int transaction_viewing_stream_h); + `ifdef QUESTA + if (transaction_view_h == 0) begin + transaction_view_h = $begin_transaction(transaction_viewing_stream_h,"wb_transaction",start_time); + end + super.add_to_wave(transaction_view_h); + // pragma uvmf custom add_to_wave begin + // UVMF_CHANGE_ME : Color can be applied to transaction entries based on content, example below + // case() + // 1 : $add_color(transaction_view_h,"red"); + // default : $add_color(transaction_view_h,"grey"); + // endcase + // UVMF_CHANGE_ME : Eliminate transaction variables not wanted in transaction viewing in the waveform viewer + $add_attribute(transaction_view_h,op,"op"); + $add_attribute(transaction_view_h,data,"data"); + $add_attribute(transaction_view_h,addr,"addr"); + $add_attribute(transaction_view_h,byte_select,"byte_select"); + + + + + + // pragma uvmf custom add_to_wave end + $end_transaction(transaction_view_h,end_time); + $free_transaction(transaction_view_h); + `endif // QUESTA + endfunction + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_transaction_coverage.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_transaction_coverage.svh new file mode 100644 index 00000000..910f2250 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_transaction_coverage.svh @@ -0,0 +1,82 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class records wb transaction information using +// a covergroup named wb_transaction_cg. An instance of this +// coverage component is instantiated in the uvmf_parameterized_agent +// if the has_coverage flag is set. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class wb_transaction_coverage #( + int WB_ADDR_WIDTH = 32, + int WB_DATA_WIDTH = 16 + ) extends uvm_subscriber #(.T(wb_transaction #( + .WB_ADDR_WIDTH(WB_ADDR_WIDTH), + .WB_DATA_WIDTH(WB_DATA_WIDTH) + ))); + + `uvm_component_param_utils( wb_transaction_coverage #( + WB_ADDR_WIDTH, + WB_DATA_WIDTH + )) + + T coverage_trans; + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + // **************************************************************************** + covergroup wb_transaction_cg; + // pragma uvmf custom covergroup begin + // UVMF_CHANGE_ME : Add coverage bins, crosses, exclusions, etc. according to coverage needs. + option.auto_bin_max=1024; + option.per_instance=1; + op: coverpoint coverage_trans.op; + data: coverpoint coverage_trans.data; + addr: coverpoint coverage_trans.addr; + byte_select: coverpoint coverage_trans.byte_select; + + + + + + // pragma uvmf custom covergroup end + endgroup + + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new(string name="", uvm_component parent=null); + super.new(name,parent); + wb_transaction_cg=new; + endfunction + + // **************************************************************************** + // FUNCTION : build_phase() + // This function is the standard UVM build_phase. + // + function void build_phase(uvm_phase phase); + wb_transaction_cg.set_inst_name($sformatf("wb_transaction_cg_%s",get_full_name())); + endfunction + + // **************************************************************************** + // FUNCTION: write (T t) + // This function is automatically executed when a transaction arrives on the + // analysis_export. It copies values from the variables in the transaction + // to local variables used to collect functional coverage. + // + virtual function void write (T t); + `uvm_info("COV","Received transaction",UVM_HIGH); + coverage_trans = t; + wb_transaction_cg.sample(); + endfunction + +endclass diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_typedefs.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_typedefs.svh new file mode 100644 index 00000000..b78302a6 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_typedefs.svh @@ -0,0 +1,20 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This file contains defines and typedefs to be compiled for use in +// the simulation running on the host server when using Veloce. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + + +// pragma uvmf custom additional begin +// pragma uvmf custom additional end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_typedefs_hdl.svh b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_typedefs_hdl.svh new file mode 100644 index 00000000..077b08e6 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/src/wb_typedefs_hdl.svh @@ -0,0 +1,22 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This file contains defines and typedefs to be compiled for use in +// the simulation running on the emulator when using Veloce. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + + +typedef enum {WB_RESET, WB_WRITE, WB_READ} wb_op_t; + +// pragma uvmf custom additional begin +// pragma uvmf custom additional end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb.compile b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb.compile new file mode 100644 index 00000000..38c2764e --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb.compile @@ -0,0 +1,3 @@ +needs: + - wb_hvl.compile + - wb_hdl.compile diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_bfm.vinfo b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_bfm.vinfo new file mode 100644 index 00000000..15605674 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_bfm.vinfo @@ -0,0 +1,6 @@ +@use $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.vinfo +@use wb_pkg_hdl.vinfo ++incdir+@vinfodir +src/wb_if.sv +src/wb_driver_bfm.sv +src/wb_monitor_bfm.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_common.compile b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_common.compile new file mode 100644 index 00000000..2879ffee --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_common.compile @@ -0,0 +1,9 @@ +incdir: + - ${uvm_path}/src + - . + +needs: + - $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.compile + +src: + - wb_pkg_hdl.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_filelist_hdl.f b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_filelist_hdl.f new file mode 100644 index 00000000..ca9787c8 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_filelist_hdl.f @@ -0,0 +1 @@ +$UVMF_VIP_LIBRARY_HOME/interface_packages/wb_pkg/wb_pkg_hdl.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_filelist_hvl.f b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_filelist_hvl.f new file mode 100644 index 00000000..895e5a80 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_filelist_hvl.f @@ -0,0 +1 @@ +$UVMF_VIP_LIBRARY_HOME/interface_packages/wb_pkg/wb_pkg.sv \ No newline at end of file diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_filelist_xrtl.f b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_filelist_xrtl.f new file mode 100644 index 00000000..4d20beaa --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_filelist_xrtl.f @@ -0,0 +1,4 @@ +$UVMF_VIP_LIBRARY_HOME/interface_packages/wb_pkg/wb_pkg_hdl.sv +$UVMF_VIP_LIBRARY_HOME/interface_packages/wb_pkg/src/wb_if.sv +$UVMF_VIP_LIBRARY_HOME/interface_packages/wb_pkg/src/wb_monitor_bfm.sv +$UVMF_VIP_LIBRARY_HOME/interface_packages/wb_pkg/src/wb_driver_bfm.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_hdl.compile b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_hdl.compile new file mode 100644 index 00000000..b6ac46e9 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_hdl.compile @@ -0,0 +1,7 @@ +src: + - src/wb_if.sv + - src/wb_driver_bfm.sv + - src/wb_monitor_bfm.sv + +needs: + - wb_common.compile diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_hvl.compile b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_hvl.compile new file mode 100644 index 00000000..94b4d7db --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_hvl.compile @@ -0,0 +1,6 @@ +needs: + - $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg.compile + - wb_common.compile + +src: + - wb_pkg.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg.sv b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg.sv new file mode 100644 index 00000000..fc83bdaf --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg.sv @@ -0,0 +1,79 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// PACKAGE: This file defines all of the files contained in the +// interface package that will run on the host simulator. +// +// CONTAINS: +// - +// - +// - + +// - +// - +// - + +// - +// - +// - + +// - +// - +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +package wb_pkg; + + import uvm_pkg::*; + import uvmf_base_pkg_hdl::*; + import uvmf_base_pkg::*; + import wb_pkg_hdl::*; + + `include "uvm_macros.svh" + + // pragma uvmf custom package_imports_additional begin + // pragma uvmf custom package_imports_additional end + + `include "src/wb_macros.svh" + + export wb_pkg_hdl::*; + + + + // Parameters defined as HVL parameters + + `include "src/wb_typedefs.svh" + `include "src/wb_transaction.svh" + + `include "src/wb_configuration.svh" + `include "src/wb_driver.svh" + `include "src/wb_monitor.svh" + + `include "src/wb_transaction_coverage.svh" + `include "src/wb_sequence_base.svh" + `include "src/wb_random_sequence.svh" + + `include "src/wb_responder_sequence.svh" + `include "src/wb2reg_adapter.svh" + + `include "src/wb_agent.svh" + + // pragma uvmf custom package_item_additional begin + `include "src/wb_master_access_sequence.svh" + `include "src/wb_memory_slave_sequence.svh" + `include "src/wb_slave_access_sequence.svh" + + + + + + // pragma uvmf custom package_item_additional end + +endpackage + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg.vinfo b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg.vinfo new file mode 100644 index 00000000..bb2526ed --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg.vinfo @@ -0,0 +1,4 @@ +@use $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg.vinfo +@use wb_pkg_hdl.vinfo ++incdir+@vinfodir +wb_pkg.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg_hdl.sv b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg_hdl.sv new file mode 100644 index 00000000..5c5db632 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg_hdl.sv @@ -0,0 +1,35 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2019.4_1 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// PACKAGE: This file defines all of the files contained in the +// interface package that needs to be compiled and synthesized +// for running on Veloce. +// +// CONTAINS: +// - +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +package wb_pkg_hdl; + + import uvmf_base_pkg_hdl::*; + + // pragma uvmf custom package_imports_additional begin + // pragma uvmf custom package_imports_additional end + + // Parameters defined as HDL parameters + + `include "src/wb_typedefs_hdl.svh" + `include "src/wb_macros.svh" + + // pragma uvmf custom package_item_additional begin + // pragma uvmf custom package_item_additional end + +endpackage + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg_hdl.vinfo b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg_hdl.vinfo new file mode 100644 index 00000000..56bf8ef4 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg_hdl.vinfo @@ -0,0 +1,2 @@ +@use $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.vinfo +wb_pkg_hdl.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg_sve.F b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg_sve.F new file mode 100644 index 00000000..fd084d09 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/wb_pkg_sve.F @@ -0,0 +1,10 @@ +// UVM ++incdir+${UVM_HOME}/src +${UVM_HOME}/src/uvm_pkg.sv + +// Common UVMF files +-f ${UVMF_HOME}/common/common_sve.f + ++incdir+. +-f ${UVMF_VIP_LIBRARY_HOME}/interface_packages/wb_pkg/wb_filelist_hdl.f +-f ${UVMF_VIP_LIBRARY_HOME}/interface_packages/wb_pkg/wb_filelist_hvl.f diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/yaml/wb_interface.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/yaml/wb_interface.yaml new file mode 100644 index 00000000..67a87085 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_pkg/yaml/wb_interface.yaml @@ -0,0 +1,97 @@ +uvmf: + interfaces: + wb: + clock: clk + config_constraints: [] + config_vars: [] + gen_inbound_streaming_driver: 'False' + hdl_pkg_parameters: [] + hdl_typedefs: + - name: wb_op_t + type: enum {WB_RESET, WB_WRITE, WB_READ} + hvl_pkg_parameters: [] + hvl_typedefs: [] + parameters: + - name: WB_ADDR_WIDTH + type: int + value: '32' + - name: WB_DATA_WIDTH + type: int + value: '16' + ports: + - dir: output + name: inta + reset_value: '''b0' + width: '1' + - dir: output + name: cyc + reset_value: '0' + width: '1' + - dir: output + name: stb + reset_value: '0' + width: '1' + - dir: output + name: adr + reset_value: '''b0' + width: WB_ADDR_WIDTH + - dir: output + name: we + reset_value: '0' + width: '1' + - dir: output + name: dout + reset_value: '''b0' + width: WB_DATA_WIDTH + - dir: input + name: din + reset_value: '''b0' + width: WB_DATA_WIDTH + - dir: output + name: err + reset_value: '''b0' + width: '1' + - dir: output + name: rty + reset_value: '''b0' + width: '1' + - dir: input + name: sel + reset_value: '''b0' + width: WB_DATA_WIDTH/8 + - dir: input + name: q + reset_value: '''b0' + width: WB_DATA_WIDTH + - dir: input + name: ack + reset_value: 1'b0 + width: '1' + reset: rst + reset_assertion_level: 'False' + response_info: + data: [] + operation: 1'b1 + transaction_constraints: [] + transaction_vars: + - iscompare: 'False' + isrand: 'True' + name: op + type: wb_op_t + unpacked_dimension: '' + - iscompare: 'True' + isrand: 'True' + name: data + type: bit [WB_DATA_WIDTH-1:0] + unpacked_dimension: '' + - iscompare: 'True' + isrand: 'True' + name: addr + type: bit [WB_ADDR_WIDTH-1:0] + unpacked_dimension: '' + - iscompare: 'True' + isrand: 'True' + name: byte_select + type: bit [(WB_DATA_WIDTH/8)-1:0] + unpacked_dimension: '' + use_dpi_link: 'False' From dfa4cfc5dbb9d873f280cae6fa6cbd31716e42ac Mon Sep 17 00:00:00 2001 From: VINUTHNA-SRI Date: Fri, 23 Dec 2022 23:28:15 +0530 Subject: [PATCH 07/22] Adding wb intf yaml files --- .../UVMF_2022.3/challenge_3/wb_master.yaml | 97 +++++++++++++++++++ .../UVMF_2022.3/challenge_3/wb_slave.yaml | 94 ++++++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/wb_slave.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml new file mode 100644 index 00000000..d6f4a232 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml @@ -0,0 +1,97 @@ +uvmf: + interfaces: + wb: + clock: clk + # gen_inbound_streaming_driver: 'False' + hdl_pkg_parameters: [] + # hdl_typedefs: + # - name: wb_op_t + # type: enum {WB_RESET, WB_WRITE, WB_READ} + hvl_pkg_parameters: [] + hvl_typedefs: [] + parameters: + -name: WB_ADDR_WIDTH + type: int + value: '32' + -name: WB_DATA_WIDTH + type: int + value: '16' + ports: + #- dir: output + #name: inta + #reset_value: '''b0' + #width: '1' + - dir: output + name: cyc + reset_value: '0' + width: '1' + #- dir: output + # name: stb + # reset_value: '0' + # width: '1' + - dir: output + name: adr + reset_value: '''b0' + width: WB_ADDR_WIDTH + - dir: output + name: we + reset_value: '0' + width: '1' + - dir: output + name: dout + reset_value: '''b0' + width: '32' + - dir: input + name: din + reset_value: '''b0' + width: WB_DATA_WIDTH + - dir: input + name: err + reset_value: '''b0' + width: '1' + #- dir: output + # name: rty + # reset_value: '''b0' + # width: '1' + - dir: output + name: sel + reset_value: '''b0' + width: WB_DATA_WIDTH/8 + #- dir: input + # name: q + # reset_value: '''b0' + # width: WB_DATA_WIDTH + - dir: input + name: ack + reset_value: 1'b0 + width: '1' + reset: rst + reset_assertion_level: 'True' + #response_info: + # data: [] + # operation: 1'b1 + transaction_constraints: [] + transaction_vars: + # - iscompare: 'False' + #isrand: 'True' + #name: op + #type: wb_op_t + #unpacked_dimension: '' + - iscompare: 'True' + isrand: 'True' + name: data + type: bit [WB_DATA_WIDTH-1:0] + unpacked_dimension: '' + - iscompare: 'True' + isrand: 'True' + name: addr + type: bit [WB_ADDR_WIDTH-1:0] + unpacked_dimension: '' + - isrand: "True" + name: select + type: bit [WB_DATA_WIDTH/8-1:0] + #- iscompare: 'True' + # isrand: 'True' + # name: byte_select + # type: bit [(WB_DATA_WIDTH/8)-1:0] + # unpacked_dimension: '' diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_slave.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/wb_slave.yaml new file mode 100644 index 00000000..71db8a67 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_slave.yaml @@ -0,0 +1,94 @@ +uvmf: + interfaces: + wb: + clock: clk + #gen_inbound_streaming_driver: 'False' + hdl_pkg_parameters: [] + # hdl_typedefs: + # - name: wb_op_t + # type: enum {WB_RESET, WB_WRITE, WB_READ} + hvl_pkg_parameters: [] + hvl_typedefs: [] + parameters: + -name: WB_ADDR_WIDTH + type: int + value: '32' + -name: WB_DATA_WIDTH + type: int + value: '16' + ports: + #- dir: output + #name: inta + #reset_value: '''b0' + #width: '1' + - dir: input + name: cyc + reset_value: '0' + width: '1' + #- dir: output + # name: stb + # reset_value: '0' + # width: '1' + - dir: input + name: adr + reset_value: '''b0' + width: WB_ADDR_WIDTH + - dir: input + name: we + reset_value: '0' + width: '1' + - dir: output + name: dout + reset_value: '''b0' + width: '32' + - dir: input + name: din + reset_value: '''b0' + width: WB_DATA_WIDTH + - dir: output + name: err + reset_value: '''b0' + width: '1' + #- dir: output + # name: rty + # reset_value: '''b0' + # width: '1' + - dir: input + name: sel + reset_value: '''b0' + width: WB_DATA_WIDTH/8 + #- dir: input + # name: q + # reset_value: '''b0' + # width: WB_DATA_WIDTH + - dir: output + name: ack + reset_value: 1'b0 + width: '1' + reset: rst + reset_assertion_level: 'True' + #response_info: + # data: [] + # operation: 1'b1 + transaction_constraints: [] + transaction_vars: + # - iscompare: 'False' + #isrand: 'True' + #name: op + #type: wb_op_t + #unpacked_dimension: '' + - iscompare: 'True' + isrand: 'True' + name: data + type: bit [WB_DATA_WIDTH-1:0] + unpacked_dimension: '' + #- iscompare: 'True' + # isrand: 'True' + # name: addr + # type: bit [WB_ADDR_WIDTH-1:0] + # unpacked_dimension: '' + #- iscompare: 'True' + # isrand: 'True' + # name: byte_select + # type: bit [(WB_DATA_WIDTH/8)-1:0] + # unpacked_dimension: '' From 266ce8a6b3ba692393d0c50020e4170f0795a54f Mon Sep 17 00:00:00 2001 From: Dampuru Vinay Kumar Reddy Date: Fri, 23 Dec 2022 23:29:26 +0530 Subject: [PATCH 08/22] apb_interface.yaml --- .../challenge_3/block_b/apb_intf.yaml | 96 +++++ .../interface_packages/apb_pkg/.project | 30 ++ .../interface_packages/apb_pkg/.svproject | 16 + .../interface_packages/apb_pkg/Makefile | 66 +++ .../interface_packages/apb_pkg/apb.compile | 3 + .../interface_packages/apb_pkg/apb_bfm.vinfo | 6 + .../apb_pkg/apb_common.compile | 7 + .../apb_pkg/apb_filelist_hdl.f | 1 + .../apb_pkg/apb_filelist_hvl.f | 1 + .../apb_pkg/apb_filelist_xrtl.f | 3 + .../apb_pkg/apb_hdl.compile | 9 + .../apb_pkg/apb_hvl.compile | 7 + .../interface_packages/apb_pkg/apb_pkg.sv | 77 ++++ .../interface_packages/apb_pkg/apb_pkg.vinfo | 4 + .../interface_packages/apb_pkg/apb_pkg_hdl.sv | 38 ++ .../apb_pkg/apb_pkg_hdl.vinfo | 2 + .../interface_packages/apb_pkg/apb_pkg_sve.F | 10 + .../interface_packages/apb_pkg/compile.do | 14 + .../apb_pkg/src/apb2reg_adapter.svh | 113 ++++++ .../apb_pkg/src/apb_agent.svh | 74 ++++ .../apb_pkg/src/apb_configuration.svh | 203 ++++++++++ .../apb_pkg/src/apb_driver.svh | 109 +++++ .../apb_pkg/src/apb_driver_bfm.sv | 376 ++++++++++++++++++ .../interface_packages/apb_pkg/src/apb_if.sv | 112 ++++++ .../src/apb_infact_coverage_strategy.csv | 6 + .../apb_pkg/src/apb_macros.svh | 202 ++++++++++ .../apb_pkg/src/apb_monitor.svh | 102 +++++ .../apb_pkg/src/apb_monitor_bfm.sv | 216 ++++++++++ .../apb_pkg/src/apb_random_sequence.svh | 65 +++ .../apb_pkg/src/apb_responder_sequence.svh | 61 +++ .../apb_pkg/src/apb_sequence_base.svh | 114 ++++++ .../apb_pkg/src/apb_transaction.svh | 229 +++++++++++ .../apb_pkg/src/apb_transaction_coverage.svh | 88 ++++ .../apb_pkg/src/apb_typedefs.svh | 20 + .../apb_pkg/src/apb_typedefs_hdl.svh | 21 + .../apb_pkg/yaml/apb_interface.yaml | 125 ++++++ .../python/python2/jinja2/__init__.pyc | Bin 0 -> 2549 bytes .../python/python2/jinja2/_compat.pyc | Bin 0 -> 6110 bytes .../python/python2/jinja2/bccache.pyc | Bin 0 -> 16674 bytes .../python/python2/jinja2/compiler.pyc | Bin 0 -> 65649 bytes .../python/python2/jinja2/defaults.pyc | Bin 0 -> 1642 bytes .../python/python2/jinja2/environment.pyc | Bin 0 -> 51739 bytes .../python/python2/jinja2/exceptions.pyc | Bin 0 -> 7721 bytes .../python/python2/jinja2/filters.pyc | Bin 0 -> 39053 bytes .../templates/python/python2/jinja2/lexer.pyc | Bin 0 -> 25802 bytes .../python/python2/jinja2/loaders.pyc | Bin 0 -> 22382 bytes .../templates/python/python2/jinja2/nodes.pyc | Bin 0 -> 51891 bytes .../python/python2/jinja2/optimizer.pyc | Bin 0 -> 3289 bytes .../python/python2/jinja2/parser.pyc | Bin 0 -> 35781 bytes .../python/python2/jinja2/runtime.pyc | Bin 0 -> 32008 bytes .../templates/python/python2/jinja2/tests.pyc | Bin 0 -> 7093 bytes .../templates/python/python2/jinja2/utils.pyc | Bin 0 -> 23480 bytes .../python/python2/jinja2/visitor.pyc | Bin 0 -> 4396 bytes .../python/python2/markupsafe/__init__.pyc | Bin 0 -> 12617 bytes .../python/python2/markupsafe/_native.pyc | Bin 0 -> 1591 bytes .../python/python2/yaml/__init__.pyc | Bin 0 -> 17053 bytes .../python/python2/yaml/composer.pyc | Bin 0 -> 5382 bytes .../python/python2/yaml/constructor.pyc | Bin 0 -> 30355 bytes .../templates/python/python2/yaml/cyaml.pyc | Bin 0 -> 5968 bytes .../templates/python/python2/yaml/dumper.pyc | Bin 0 -> 3169 bytes .../templates/python/python2/yaml/emitter.pyc | Bin 0 -> 36613 bytes .../templates/python/python2/yaml/error.pyc | Bin 0 -> 3602 bytes .../templates/python/python2/yaml/events.pyc | Bin 0 -> 6573 bytes .../templates/python/python2/yaml/loader.pyc | Bin 0 -> 3631 bytes .../templates/python/python2/yaml/nodes.pyc | Bin 0 -> 2896 bytes .../templates/python/python2/yaml/parser.pyc | Bin 0 -> 17125 bytes .../templates/python/python2/yaml/reader.pyc | Bin 0 -> 6770 bytes .../python/python2/yaml/representer.pyc | Bin 0 -> 17502 bytes .../python/python2/yaml/resolver.pyc | Bin 0 -> 7482 bytes .../templates/python/python2/yaml/scanner.pyc | Bin 0 -> 38186 bytes .../python/python2/yaml/serializer.pyc | Bin 0 -> 5041 bytes .../templates/python/python2/yaml/tokens.pyc | Bin 0 -> 8619 bytes .../interface_templates/interface_if.TMPL | 6 +- .../UVMF_2022.3/templates/python/uvmf_gen.pyc | Bin 0 -> 69703 bytes .../templates/python/uvmf_version.pyc | Bin 0 -> 229 bytes .../templates/python/uvmf_yaml/__init__.pyc | Bin 0 -> 758 bytes .../templates/python/uvmf_yaml/backup.pyc | Bin 0 -> 925 bytes .../templates/python/uvmf_yaml/dumper.pyc | Bin 0 -> 15625 bytes .../templates/python/uvmf_yaml/regen.pyc | Bin 0 -> 14610 bytes .../templates/python/uvmf_yaml/validator.pyc | Bin 0 -> 14683 bytes .../templates/python/voluptuous/__init__.pyc | Bin 0 -> 496 bytes .../templates/python/voluptuous/error.pyc | Bin 0 -> 13650 bytes .../templates/python/voluptuous/humanize.pyc | Bin 0 -> 2236 bytes .../python/voluptuous/schema_builder.pyc | Bin 0 -> 46852 bytes .../templates/python/voluptuous/util.pyc | Bin 0 -> 7690 bytes .../python/voluptuous/validators.pyc | Bin 0 -> 42838 bytes 86 files changed, 2629 insertions(+), 3 deletions(-) create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.project create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.svproject create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/Makefile create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb.compile create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_bfm.vinfo create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_common.compile create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hdl.f create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hvl.f create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_xrtl.f create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hdl.compile create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hvl.compile create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.sv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.vinfo create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.sv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.vinfo create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_sve.F create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/compile.do create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb2reg_adapter.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_agent.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_configuration.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver_bfm.sv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_if.sv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_infact_coverage_strategy.csv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_macros.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor_bfm.sv create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_random_sequence.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_responder_sequence.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_sequence_base.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction_coverage.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs_hdl.svh create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/yaml/apb_interface.yaml create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/__init__.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/_compat.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/bccache.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/compiler.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/defaults.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/environment.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/exceptions.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/filters.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/lexer.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/loaders.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/nodes.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/optimizer.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/parser.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/runtime.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/tests.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/utils.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/visitor.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/markupsafe/__init__.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/markupsafe/_native.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/__init__.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/composer.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/constructor.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/cyaml.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/dumper.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/emitter.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/error.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/events.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/loader.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/nodes.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/parser.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/reader.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/representer.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/resolver.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/scanner.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/serializer.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/tokens.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/uvmf_gen.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/uvmf_version.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/uvmf_yaml/__init__.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/uvmf_yaml/backup.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/uvmf_yaml/dumper.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/uvmf_yaml/regen.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/uvmf_yaml/validator.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/voluptuous/__init__.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/voluptuous/error.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/voluptuous/humanize.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/voluptuous/schema_builder.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/voluptuous/util.pyc create mode 100644 UVM_Framework/UVMF_2022.3/templates/python/voluptuous/validators.pyc diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/apb_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/apb_intf.yaml index e69de29b..a1b70e5a 100644 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/apb_intf.yaml +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/apb_intf.yaml @@ -0,0 +1,96 @@ +uvmf: + interfaces: + apb: + clock: "pclk" + parameters: + - name: "APB_ADDR_WIDTH" + type: int + value: '32' + - name: "APB_DATA_WIDTH" + type: int + value: '32' + ports: + - dir: "output" + name: "psel" + reset_value: '''b0' + width: '16' + - dir: "output" + name: "penable" + reset_value: '''b0' + width: '1' + - dir: "output" + name: "paddr" + reset_value: '''b0' + width: "APB_ADDR_WIDTH" + - dir: "output" + name: "pwdata" + reset_value: '''b0' + width: "APB_DATA_WIDTH" + - dir: "output" + name: "pwrite" + reset_value: '''b0' + width: '1' + - dir: "output" + name: "pstrb" + reset_value: '''b0' + width: '4' + - dir: "output" + name: "pprot" + reset_value: '''b0' + width: '3' + - dir: "input" + name: "prdata" + reset_value: '''b0' + width: "APB_DATA_WIDTH" + - dir: "input" + name: "pready" + reset_value: '0' + width: '1' + - dir: "input" + name: "pslverr" + reset_value: '0' + width: '1' + reset: "presetn" + veloce_ready: "True" + reset_assertion_level: 'False' + transaction_vars: + - iscompare: 'False' + isrand: 'True' + name: "psel" + type: "bit" + - iscompare: 'True' + isrand: 'True' + name: "penable" + type: "bit" + - iscompare: 'True' + isrand: 'True' + name: "paddr" + type: "bit [APB_ADDR_WIDTH-1:0]" + - iscompare: 'True' + isrand: 'True' + name: "pwdata" + type: "bit [APB_DATA_WIDTH-1:0]" + - iscompare: 'True' + isrand: 'True' + name: "pwrite" + type: "bit" + - iscompare: 'True' + isrand: 'True' + name: "pstrb" + type: "bit [3:0]" + - iscompare: 'True' + isrand: 'True' + name: "pprot" + type: "bit [3:0]" + - iscompare: 'True' + isrand: 'True' + name: "prdata" + type: "APB_DATA_WIDTH" + - iscompare: 'True' + isrand: 'True' + name: "pready" + type: "bit" + - iscompare: 'True' + isrand: 'True' + name: "pslverr" + type: "bit" diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.project b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.project new file mode 100644 index 00000000..af8fae51 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.project @@ -0,0 +1,30 @@ + + + apb_pkg + + + + + + org.python.pydev.PyDevBuilder + + + + + net.sf.sveditor.core.SVProjectBuilder + + + + + + net.sf.sveditor.core.SVNature + org.python.pydev.pythonNature + + + + UVMF_VIP_LIBRARY_HOME + $%7BPARENT-2-PROJECT_LOC%7D + + + + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.svproject b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.svproject new file mode 100644 index 00000000..e1c28bec --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.svproject @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/Makefile b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/Makefile new file mode 100644 index 00000000..a9e84894 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/Makefile @@ -0,0 +1,66 @@ +# apb interface packages source +# pragma uvmf custom additional begin +# pragma uvmf custom additional end + +apb_PKG = \ + +incdir+$(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg \ + -F $(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg/apb_filelist_hvl.f + +apb_PKG_HDL = \ + +incdir+$(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg \ + -F $(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg/apb_filelist_hdl.f + +apb_PKG_XRTL = \ + +incdir+$(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg \ + -F $(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg/apb_filelist_xrtl.f + +COMP_apb_PKG_TGT_0 = q_comp_apb_pkg +COMP_apb_PKG_TGT_1 = v_comp_apb_pkg +COMP_apb_PKG_TGT = $(COMP_apb_PKG_TGT_$(USE_VELOCE)) + +comp_apb_pkg: $(COMP_apb_PKG_TGT) + +q_comp_apb_pkg: + $(HDL_COMP_CMD) $(apb_PKG_HDL) + $(HVL_COMP_CMD) $(apb_PKG) + $(HDL_COMP_CMD) $(apb_PKG_XRTL) + +v_comp_apb_pkg: + $(HVL_COMP_CMD) $(apb_PKG_HDL) + $(HVL_COMP_CMD) $(apb_PKG) + $(VELANALYZE_CMD) $(apb_PKG_HDL) + $(VELANALYZE_HVL_CMD) $(apb_PKG) + $(HDL_COMP_CMD) $(apb_PKG_XRTL) + +ifeq ($(MTI_VCO_MODE),64) + GCC_COMP_ARCH = -m64 +else + GCC_COMP_ARCH = -m32 +endif + +export apb_IF_DPI_SRC ?= $(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg/dpi + +C_FILE_COMPILE_LIST_apb_pkg = \ + +O_FILE_COMPILE_LIST_apb_pkg = $(notdir $(C_FILE_COMPILE_LIST_apb_pkg:.c=.o)) + +GCC_COMP_ARGS_apb_pkg += -I$(apb_IF_DPI_SRC) \ + -fPIC + +GCC_COMP_ARGS_apb_pkg += $(apb_IF_GCC_COMP_ARGUMENTS) + +GCC_LINK_ARGS_apb_pkg += \ + \ + -o .so + +comp_apb_pkg_c_files: + @echo "--------------------------------" + @echo "Compiling Interface C source" + @echo "--------------------------------" + gcc $(GCC_COMP_ARCH) $(GCC_COMP_ARGS_apb_pkg) $(C_FILE_COMPILE_LIST_apb_pkg) + @echo "--------------------------------" + @echo "Linking Interface C objects into a shared object" + @echo "--------------------------------" + gcc $(GCC_COMP_ARCH) $(GCC_LINK_ARGS_apb_pkg) $(O_FILE_COMPILE_LIST_apb_pkg) + @echo "--------------------------------" + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb.compile b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb.compile new file mode 100644 index 00000000..65122a00 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb.compile @@ -0,0 +1,3 @@ +needs: + - apb_hvl.compile + - apb_hdl.compile diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_bfm.vinfo b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_bfm.vinfo new file mode 100644 index 00000000..2079586d --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_bfm.vinfo @@ -0,0 +1,6 @@ +@use $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.vinfo +@use apb_pkg_hdl.vinfo ++incdir+@vinfodir +src/apb_if.sv +src/apb_driver_bfm.sv +src/apb_monitor_bfm.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_common.compile b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_common.compile new file mode 100644 index 00000000..576b6d1e --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_common.compile @@ -0,0 +1,7 @@ +needs: + - $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.compile +incdir: + - . + - ${uvm_path}/src +src: + - apb_pkg_hdl.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hdl.f b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hdl.f new file mode 100644 index 00000000..67f8b07b --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hdl.f @@ -0,0 +1 @@ +$UVMF_VIP_LIBRARY_HOME/interface_packages/apb_pkg/apb_pkg_hdl.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hvl.f b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hvl.f new file mode 100644 index 00000000..f968ecb1 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hvl.f @@ -0,0 +1 @@ +$UVMF_VIP_LIBRARY_HOME/interface_packages/apb_pkg/apb_pkg.sv \ No newline at end of file diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_xrtl.f b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_xrtl.f new file mode 100644 index 00000000..af0179c5 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_xrtl.f @@ -0,0 +1,3 @@ +$UVMF_VIP_LIBRARY_HOME/interface_packages/apb_pkg/src/apb_if.sv +$UVMF_VIP_LIBRARY_HOME/interface_packages/apb_pkg/src/apb_monitor_bfm.sv +$UVMF_VIP_LIBRARY_HOME/interface_packages/apb_pkg/src/apb_driver_bfm.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hdl.compile b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hdl.compile new file mode 100644 index 00000000..7d6c731f --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hdl.compile @@ -0,0 +1,9 @@ +needs: + - $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.compile + - ./apb_common.compile +incdir: + - . +src: + - src/apb_if.sv + - src/apb_monitor_bfm.sv + - src/apb_driver_bfm.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hvl.compile b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hvl.compile new file mode 100644 index 00000000..fd509f26 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hvl.compile @@ -0,0 +1,7 @@ +needs: + - $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg.compile + - ./apb_common.compile +incdir: + - . +src: + - apb_pkg.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.sv b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.sv new file mode 100644 index 00000000..61c9106e --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.sv @@ -0,0 +1,77 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// PACKAGE: This file defines all of the files contained in the +// interface package that will run on the host simulator. +// +// CONTAINS: +// - +// - +// - + +// - +// - +// - + +// - +// - +// - + +// - +// - +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +package apb_pkg; + + import uvm_pkg::*; + import uvmf_base_pkg_hdl::*; + import uvmf_base_pkg::*; + import apb_pkg_hdl::*; + + `include "uvm_macros.svh" + + // pragma uvmf custom package_imports_additional begin + // pragma uvmf custom package_imports_additional end + `include "src/apb_macros.svh" + + export apb_pkg_hdl::*; + + + + // Parameters defined as HVL parameters + + `include "src/apb_typedefs.svh" + `include "src/apb_transaction.svh" + + `include "src/apb_configuration.svh" + `include "src/apb_driver.svh" + `include "src/apb_monitor.svh" + + `include "src/apb_transaction_coverage.svh" + `include "src/apb_sequence_base.svh" + `include "src/apb_random_sequence.svh" + + `include "src/apb_responder_sequence.svh" + `include "src/apb2reg_adapter.svh" + + `include "src/apb_agent.svh" + + // pragma uvmf custom package_item_additional begin + // UVMF_CHANGE_ME : When adding new interface sequences to the src directory + // be sure to add the sequence file here so that it will be + // compiled as part of the interface package. Be sure to place + // the new sequence after any base sequences of the new sequence. + // pragma uvmf custom package_item_additional end + +endpackage + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.vinfo b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.vinfo new file mode 100644 index 00000000..f49104d7 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.vinfo @@ -0,0 +1,4 @@ +@use $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg.vinfo +@use apb_pkg_hdl.vinfo ++incdir+@vinfodir +apb_pkg.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.sv b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.sv new file mode 100644 index 00000000..5fe0e351 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.sv @@ -0,0 +1,38 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// PACKAGE: This file defines all of the files contained in the +// interface package that needs to be compiled and synthesized +// for running on Veloce. +// +// CONTAINS: +// - +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +package apb_pkg_hdl; + + import uvmf_base_pkg_hdl::*; + + // pragma uvmf custom package_imports_additional begin + // pragma uvmf custom package_imports_additional end + + // Parameters defined as HDL parameters + + `include "src/apb_typedefs_hdl.svh" + `include "src/apb_macros.svh" + + // pragma uvmf custom package_item_additional begin + // pragma uvmf custom package_item_additional end + +endpackage + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.vinfo b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.vinfo new file mode 100644 index 00000000..7826b306 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.vinfo @@ -0,0 +1,2 @@ +@use $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.vinfo +apb_pkg_hdl.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_sve.F b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_sve.F new file mode 100644 index 00000000..9f2d5506 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_sve.F @@ -0,0 +1,10 @@ +// UVM ++incdir+${UVM_HOME}/src +${UVM_HOME}/src/uvm_pkg.sv + +// Common UVMF files +-f ${UVMF_HOME}/common/common_sve.f + ++incdir+. +-f ${UVMF_VIP_LIBRARY_HOME}/interface_packages/apb_pkg/apb_filelist_hdl.f +-f ${UVMF_VIP_LIBRARY_HOME}/interface_packages/apb_pkg/apb_filelist_hvl.f diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/compile.do b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/compile.do new file mode 100644 index 00000000..ae028fe8 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/compile.do @@ -0,0 +1,14 @@ +# Tcl do file for compile of apb interface + +# pragma uvmf custom additional begin +# pragma uvmf custom additional end + + +vlog -sv -timescale 1ps/1ps -suppress 2223,2286 +incdir+$env(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg \ + -F $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg/apb_filelist_hdl.f + +vlog -sv -timescale 1ps/1ps -suppress 2223,2286 +incdir+$env(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg \ + -F $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg/apb_filelist_hvl.f + +vlog -sv -timescale 1ps/1ps -suppress 2223,2286 +incdir+$env(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg \ + -F $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg/apb_filelist_xrtl.f \ No newline at end of file diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb2reg_adapter.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb2reg_adapter.svh new file mode 100644 index 00000000..e5840607 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb2reg_adapter.svh @@ -0,0 +1,113 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This file contains the UVM register adapter for the apb interface. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class apb2reg_adapter #( + int APB_ADDR_WIDTH = 32, + int APB_DATA_WIDTH = 32 + ) extends uvm_reg_adapter; + + `uvm_object_param_utils( apb2reg_adapter #( + APB_ADDR_WIDTH, + APB_DATA_WIDTH + )) + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + //-------------------------------------------------------------------- + // new + //-------------------------------------------------------------------- + function new (string name = "apb2reg_adapter" ); + super.new(name); + // pragma uvmf custom new begin + // UVMF_CHANGE_ME : Configure the adapter regarding byte enables and provides response. + + // Does the protocol the Agent is modeling support byte enables? + // 0 = NO + // 1 = YES + supports_byte_enable = 0; + + // Does the Agent's Driver provide separate response sequence items? + // i.e. Does the driver call seq_item_port.put() + // and do the sequences call get_response()? + // 0 = NO + // 1 = YES + provides_responses = 0; + // pragma uvmf custom new end + + endfunction: new + + //-------------------------------------------------------------------- + // reg2bus + //-------------------------------------------------------------------- + virtual function uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw); + + apb_transaction #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ) trans_h = apb_transaction #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + )::type_id::create("trans_h"); + + // pragma uvmf custom reg2bus begin + // UVMF_CHANGE_ME : Fill in the reg2bus adapter mapping registe fields to protocol fields. + + //Adapt the following for your sequence item type + // trans_h.op = (rw.kind == UVM_READ) ? WB_READ : WB_WRITE; + //Copy over address + // trans_h.addr = rw.addr; + //Copy over write data + // trans_h.data = rw.data; + + // pragma uvmf custom reg2bus end + + // Return the adapted transaction + return trans_h; + + endfunction: reg2bus + + //-------------------------------------------------------------------- + // bus2reg + //-------------------------------------------------------------------- + virtual function void bus2reg(uvm_sequence_item bus_item, + ref uvm_reg_bus_op rw); + apb_transaction #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ) trans_h; + if (!$cast(trans_h, bus_item)) begin + `uvm_fatal("ADAPT","Provided bus_item is not of the correct type") + return; + end + // pragma uvmf custom bus2reg begin + // UVMF_CHANGE_ME : Fill in the bus2reg adapter mapping protocol fields to register fields. + //Adapt the following for your sequence item type + //Copy over instruction type + // rw.kind = (trans_h.op == WB_WRITE) ? UVM_WRITE : UVM_READ; + //Copy over address + // rw.addr = trans_h.addr; + //Copy over read data + // rw.data = trans_h.data; + //Check for errors on the bus and return UVM_NOT_OK if there is an error + // rw.status = UVM_IS_OK; + // pragma uvmf custom bus2reg end + + endfunction: bus2reg + +endclass : apb2reg_adapter + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_agent.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_agent.svh new file mode 100644 index 00000000..beabbd7d --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_agent.svh @@ -0,0 +1,74 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Protocol specific agent class definition +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class apb_agent #( + int APB_ADDR_WIDTH = 32, + int APB_DATA_WIDTH = 32 + ) extends uvmf_parameterized_agent #( + .CONFIG_T(apb_configuration #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + )), + .DRIVER_T(apb_driver #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + )), + .MONITOR_T(apb_monitor #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + )), + .COVERAGE_T(apb_transaction_coverage #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + )), + .TRANS_T(apb_transaction #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + )) + ); + + `uvm_component_param_utils( apb_agent #( + APB_ADDR_WIDTH, + APB_DATA_WIDTH + )) + +// pragma uvmf custom class_item_additional begin +// pragma uvmf custom class_item_additional end + +// **************************************************************************** +// FUNCTION : new() +// This function is the standard SystemVerilog constructor. +// + function new( string name = "", uvm_component parent = null ); + super.new( name, parent ); + endfunction + +// **************************************************************************** + // FUNCTION: build_phase + virtual function void build_phase(uvm_phase phase); +// pragma uvmf custom build_phase_pre_super begin +// pragma uvmf custom build_phase_pre_super end + super.build_phase(phase); + if (configuration.active_passive == ACTIVE) begin + // Place sequencer handle into configuration object + // so that it may be retrieved from configuration + // rather than using uvm_config_db + configuration.sequencer = this.sequencer; + end + endfunction + +endclass + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_configuration.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_configuration.svh new file mode 100644 index 00000000..c3ade2ce --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_configuration.svh @@ -0,0 +1,203 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class contains all variables and functions used +// to configure the apb agent and its bfm's. It gets the +// bfm's from the uvm_config_db for use by the agent. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class apb_configuration #( + int APB_ADDR_WIDTH = 32, + int APB_DATA_WIDTH = 32 + ) extends uvmf_parameterized_agent_configuration_base #( + .DRIVER_BFM_BIND_T(virtual apb_driver_bfm #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + )), + .MONITOR_BFM_BIND_T( virtual apb_monitor_bfm #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ))); + + `uvm_object_param_utils( apb_configuration #( + APB_ADDR_WIDTH, + APB_DATA_WIDTH + )) + + + // Sequencer handle populated by agent + uvm_sequencer #(apb_transaction #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ) ) sequencer; + + //Constraints for the configuration variables: + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + covergroup apb_configuration_cg; + // pragma uvmf custom covergroup begin + option.auto_bin_max=1024; + // pragma uvmf custom covergroup end + endgroup + + //******************************************************************* + //******************************************************************* + // Structure used to pass configuration variables to monitor and driver BFM's. + // Use to_struct function to pack variables into structure. + // Use from_struct function to unpack variables from structure. + // This structure is defined in apb_macros.svh + `apb_CONFIGURATION_STRUCT + apb_configuration_s apb_configuration_struct; + //******************************************************************* + // FUNCTION: to_struct() + // This function packs variables into a apb_configuration_s + // structure. The function returns the handle to the apb_configuration_struct. + // This function is defined in apb_macros.svh + `apb_CONFIGURATION_TO_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_struct() + // This function unpacks the struct provided as an argument into + // variables of this class. + // This function is defined in apb_macros.svh + `apb_CONFIGURATION_FROM_STRUCT_FUNCTION + + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new( string name = "" ); + super.new( name ); + // Construct the covergroup for this configuration class + apb_configuration_cg = new; + endfunction + + // **************************************************************************** + // FUNCTION: post_randomize() + // This function is automatically called after the randomize() function + // is executed. + // + function void post_randomize(); + super.post_randomize(); + apb_configuration_cg.sample(); + endfunction + + // **************************************************************************** + // FUNCTION: initialize + // This function causes the configuration to retrieve + // its virtual interface handle from the uvm_config_db. + // This function also makes itself available to its + // agent through the uvm_config_db. + // + // ARGUMENTS: + // uvmf_active_passive_t activity: + // This argument identifies the simulation level + // as either BLOCK, CHIP, SIMULATION, etc. + // + // AGENT_PATH: + // This argument identifies the path to this + // configurations agent. This configuration + // makes itself available to the agent specified + // by agent_path by placing itself into the + // uvm_config_db. + // + // INTERFACE_NAME: + // This argument identifies the string name of + // this configurations BFM's. This string + // name is used to retrieve the driver and + // monitor BFM from the uvm_config_db. + // + virtual function void initialize(uvmf_active_passive_t activity, + string agent_path, + string interface_name); + + super.initialize( activity, agent_path, interface_name); + // The covergroup is given the same name as the interface + apb_configuration_cg.set_inst_name(interface_name); + + // This configuration places itself into the uvm_config_db for the agent, identified by the agent_path variable, to retrieve. + uvm_config_db #( apb_configuration #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ) + )::set( null ,agent_path,UVMF_AGENT_CONFIG, this ); + + // This configuration also places itself in the config db using the same identifier used by the interface. This allows users to access + // configuration variables and the interface through the bfm api class rather than directly accessing the BFM. This is useful for + // accessingthe BFM when using Veloce + uvm_config_db #( apb_configuration #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ) + )::set( null ,UVMF_CONFIGURATIONS, interface_name, this ); + + apb_configuration_cg.set_inst_name($sformatf("apb_configuration_cg_%s",get_full_name())); + +// This code is to aid in debugging parameter mismatches between the BFM and its corresponding agent. +// Enable this debug by setting UVM_VERBOSITY to UVM_DEBUG +// Setting UVM_VERBOSITY to UVM_DEBUG causes all BFM's and all agents to display their parameter settings. +// All of the messages from this feature have a UVM messaging id value of "CFG" +// The transcript or run.log can be parsed to ensure BFM parameter settings match its corresponding agents parameter settings. + `uvm_info("CFG", + $psprintf("The agent at '%s' is using interface named %s has the following parameters: APB_ADDR_WIDTH=%x APB_DATA_WIDTH=%x ", agent_path, interface_name, APB_ADDR_WIDTH ,APB_DATA_WIDTH ), + UVM_DEBUG) + + // pragma uvmf custom initialize begin + // This controls whether or not the agent returns a transaction handle in the driver when calling + // item_done() back into the sequencer or not. If set to 1, a transaction is sent back which means + // the sequence on the other end must use the get_response() part of the driver/sequence API. If + // this doesn't occur, there will eventually be response_queue overflow errors during the test. + return_transaction_response = 1'b0; + + // pragma uvmf custom initialize end + + endfunction + + // **************************************************************************** + // TASK: wait_for_reset + // *[Required]* Blocks until reset is released. The wait_for_reset operation is performed + // by a task in the monitor bfm. + virtual task wait_for_reset(); + monitor_bfm.wait_for_reset(); + endtask + + // **************************************************************************** + // TASK: wait_for_num_clocks + // *[Required]* Blocks until specified number of clocks have elapsed. The wait_for_num_clocks + // operation is performed by a task in the monitor bfm. + virtual task wait_for_num_clocks(int clocks); + monitor_bfm.wait_for_num_clocks(clocks); + endtask + + // **************************************************************************** + // FUNCTION : convert2string() + // This function is used to convert variables in this class into a string for log messaging. + // + virtual function string convert2string (); + // pragma uvmf custom convert2string begin + return $sformatf(""); + // pragma uvmf custom convert2string end + endfunction + + // **************************************************************************** + // FUNCTION: get_sequencer + function uvm_sequencer #(apb_transaction#( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + )) get_sequencer(); + return sequencer; + endfunction + +endclass + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver.svh new file mode 100644 index 00000000..d23d3410 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver.svh @@ -0,0 +1,109 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class passes transactions between the sequencer +// and the BFM driver interface. It accesses the driver BFM +// through the bfm handle. This driver +// passes transactions to the driver BFM through the access +// task. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class apb_driver #( + int APB_ADDR_WIDTH = 32, + int APB_DATA_WIDTH = 32 + ) extends uvmf_driver_base #( + .CONFIG_T(apb_configuration #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ) ), + .BFM_BIND_T(virtual apb_driver_bfm #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ) ), + .REQ(apb_transaction #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ) ), + .RSP(apb_transaction #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ) )); + + `uvm_component_param_utils( apb_driver #( + APB_ADDR_WIDTH, + APB_DATA_WIDTH + )) +//******************************************************************* +// Macros that define structs located in apb_macros.svh +//******************************************************************* +// Initiator macro used by apb_driver and apb_driver_bfm +// to communicate initiator driven data to apb_driver_bfm. +`apb_INITIATOR_STRUCT + apb_initiator_s apb_initiator_struct; +//******************************************************************* +// Responder macro used by apb_driver and apb_driver_bfm +// to communicate Responder driven data to apb_driver_bfm. +`apb_RESPONDER_STRUCT + apb_responder_s apb_responder_struct; + +// pragma uvmf custom class_item_additional begin +// pragma uvmf custom class_item_additional end + +// **************************************************************************** +// This function is the standard SystemVerilog constructor. +// + function new( string name = "", uvm_component parent=null ); + super.new( name, parent ); + endfunction + +// **************************************************************************** +// This function sends configuration object variables to the driver BFM +// using the configuration struct. +// + virtual function void configure(input CONFIG_T cfg); + bfm.configure( cfg.to_struct() ); + endfunction + +// **************************************************************************** +// This function places a handle to this class in the proxy variable in the +// driver BFM. This allows the driver BFM to call tasks and function within this class. +// + virtual function void set_bfm_proxy_handle(); + bfm.proxy = this; endfunction + +// **************************************************************************** +// This task is called by the run_phase in uvmf_driver_base. + virtual task access( inout REQ txn ); +// pragma uvmf custom access begin + if (configuration.initiator_responder==RESPONDER) begin + // Complete current transfer and wait for next transfer + bfm.respond_and_wait_for_next_transfer( + apb_initiator_struct, + txn.to_responder_struct() + ); + // Unpack information about initiated transfer received by this responder + txn.from_initiator_struct(apb_initiator_struct); + end else begin + // Initiate a transfer and get response + bfm.initiate_and_get_response( + txn.to_initiator_struct(), + apb_responder_struct + ); + // Unpack transfer response information received by this initiator + txn.from_responder_struct(apb_responder_struct); + end +// pragma uvmf custom access end + endtask + +endclass + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver_bfm.sv b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver_bfm.sv new file mode 100644 index 00000000..b555ffc8 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver_bfm.sv @@ -0,0 +1,376 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This interface performs the apb signal driving. It is +// accessed by the uvm apb driver through a virtual interface +// handle in the apb configuration. It drives the singals passed +// in through the port connection named bus of type apb_if. +// +// Input signals from the apb_if are assigned to an internal input +// signal with a _i suffix. The _i signal should be used for sampling. +// +// The input signal connections are as follows: +// bus.signal -> signal_i +// +// This bfm drives signals with a _o suffix. These signals +// are driven onto signals within apb_if based on INITIATOR/RESPONDER and/or +// ARBITRATION/GRANT status. +// +// The output signal connections are as follows: +// signal_o -> bus.signal +// +// +// Interface functions and tasks used by UVM components: +// +// configure: +// This function gets configuration attributes from the +// UVM driver to set any required BFM configuration +// variables such as 'initiator_responder'. +// +// initiate_and_get_response: +// This task is used to perform signaling activity for initiating +// a protocol transfer. The task initiates the transfer, using +// input data from the initiator struct. Then the task captures +// response data, placing the data into the response struct. +// The response struct is returned to the driver class. +// +// respond_and_wait_for_next_transfer: +// This task is used to complete a current transfer as a responder +// and then wait for the initiator to start the next transfer. +// The task uses data in the responder struct to drive protocol +// signals to complete the transfer. The task then waits for +// the next transfer. Once the next transfer begins, data from +// the initiator is placed into the initiator struct and sent +// to the responder sequence for processing to determine +// what data to respond with. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +import uvmf_base_pkg_hdl::*; +import apb_pkg_hdl::*; +`include "src/apb_macros.svh" + +interface apb_driver_bfm #( + int APB_ADDR_WIDTH = 32, + int APB_DATA_WIDTH = 32 + ) + (apb_if bus); + // The following pragma and additional ones in-lined further below are for running this BFM on Veloce + // pragma attribute apb_driver_bfm partition_interface_xif + +`ifndef XRTL +// This code is to aid in debugging parameter mismatches between the BFM and its corresponding agent. +// Enable this debug by setting UVM_VERBOSITY to UVM_DEBUG +// Setting UVM_VERBOSITY to UVM_DEBUG causes all BFM's and all agents to display their parameter settings. +// All of the messages from this feature have a UVM messaging id value of "CFG" +// The transcript or run.log can be parsed to ensure BFM parameter settings match its corresponding agents parameter settings. +import uvm_pkg::*; +`include "uvm_macros.svh" +initial begin : bfm_vs_agent_parameter_debug + `uvm_info("CFG", + $psprintf("The BFM at '%m' has the following parameters: APB_ADDR_WIDTH=%x APB_DATA_WIDTH=%x ", APB_ADDR_WIDTH,APB_DATA_WIDTH), + UVM_DEBUG) +end +`endif + + // Config value to determine if this is an initiator or a responder + uvmf_initiator_responder_t initiator_responder; + // Custom configuration variables. + // These are set using the configure function which is called during the UVM connect_phase + + tri pclk_i; + tri presetn_i; + + // Signal list (all signals are capable of being inputs and outputs for the sake + // of supporting both INITIATOR and RESPONDER mode operation. Expectation is that + // directionality in the config file was from the point-of-view of the INITIATOR + + // INITIATOR mode input signals + tri [APB_DATA_WIDTH-1:0] prdata_i; + reg [APB_DATA_WIDTH-1:0] prdata_o = 'b0; + tri pready_i; + reg pready_o = 0; + tri pslverr_i; + reg pslverr_o = 0; + + // INITIATOR mode output signals + tri [15:0] psel_i; + reg [15:0] psel_o = 'b0; + tri penable_i; + reg penable_o = 'b0; + tri [APB_ADDR_WIDTH-1:0] paddr_i; + reg [APB_ADDR_WIDTH-1:0] paddr_o = 'b0; + tri [APB_DATA_WIDTH-1:0] pwdata_i; + reg [APB_DATA_WIDTH-1:0] pwdata_o = 'b0; + tri pwrite_i; + reg pwrite_o = 'b0; + tri [3:0] pstrb_i; + reg [3:0] pstrb_o = 'b0; + tri [2:0] pprot_i; + reg [2:0] pprot_o = 'b0; + + // Bi-directional signals + + + assign pclk_i = bus.pclk; + assign presetn_i = bus.presetn; + + // These are signals marked as 'input' by the config file, but the signals will be + // driven by this BFM if put into RESPONDER mode (flipping all signal directions around) + assign prdata_i = bus.prdata; + assign bus.prdata = (initiator_responder == RESPONDER) ? prdata_o : 'bz; + assign pready_i = bus.pready; + assign bus.pready = (initiator_responder == RESPONDER) ? pready_o : 'bz; + assign pslverr_i = bus.pslverr; + assign bus.pslverr = (initiator_responder == RESPONDER) ? pslverr_o : 'bz; + + + // These are signals marked as 'output' by the config file, but the outputs will + // not be driven by this BFM unless placed in INITIATOR mode. + assign bus.psel = (initiator_responder == INITIATOR) ? psel_o : 'bz; + assign psel_i = bus.psel; + assign bus.penable = (initiator_responder == INITIATOR) ? penable_o : 'bz; + assign penable_i = bus.penable; + assign bus.paddr = (initiator_responder == INITIATOR) ? paddr_o : 'bz; + assign paddr_i = bus.paddr; + assign bus.pwdata = (initiator_responder == INITIATOR) ? pwdata_o : 'bz; + assign pwdata_i = bus.pwdata; + assign bus.pwrite = (initiator_responder == INITIATOR) ? pwrite_o : 'bz; + assign pwrite_i = bus.pwrite; + assign bus.pstrb = (initiator_responder == INITIATOR) ? pstrb_o : 'bz; + assign pstrb_i = bus.pstrb; + assign bus.pprot = (initiator_responder == INITIATOR) ? pprot_o : 'bz; + assign pprot_i = bus.pprot; + + // Proxy handle to UVM driver + apb_pkg::apb_driver #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ) proxy; + // pragma tbx oneway proxy.my_function_name_in_uvm_driver + + // **************************************************************************** + // **************************************************************************** + // Macros that define structs located in apb_macros.svh + // **************************************************************************** + // Struct for passing configuration data from apb_driver to this BFM + // **************************************************************************** + `apb_CONFIGURATION_STRUCT + // **************************************************************************** + // Structs for INITIATOR and RESPONDER data flow + //******************************************************************* + // Initiator macro used by apb_driver and apb_driver_bfm + // to communicate initiator driven data to apb_driver_bfm. + `apb_INITIATOR_STRUCT + apb_initiator_s initiator_struct; + // Responder macro used by apb_driver and apb_driver_bfm + // to communicate Responder driven data to apb_driver_bfm. + `apb_RESPONDER_STRUCT + apb_responder_s responder_struct; + + // **************************************************************************** +// pragma uvmf custom reset_condition_and_response begin + // Always block used to return signals to reset value upon assertion of reset + always @( negedge presetn_i ) + begin + // RESPONDER mode output signals + prdata_o <= 'b0; + pready_o <= 0; + pslverr_o <= 0; + // INITIATOR mode output signals + psel_o <= 'b0; + penable_o <= 'b0; + paddr_o <= 'b0; + pwdata_o <= 'b0; + pwrite_o <= 'b0; + pstrb_o <= 'b0; + pprot_o <= 'b0; + // Bi-directional signals + + end +// pragma uvmf custom reset_condition_and_response end + + // pragma uvmf custom interface_item_additional begin + // pragma uvmf custom interface_item_additional end + + //****************************************************************** + // The configure() function is used to pass agent configuration + // variables to the driver BFM. It is called by the driver within + // the agent at the beginning of the simulation. It may be called + // during the simulation if agent configuration variables are updated + // and the driver BFM needs to be aware of the new configuration + // variables. + // + + function void configure(apb_configuration_s apb_configuration_arg); // pragma tbx xtf + initiator_responder = apb_configuration_arg.initiator_responder; + // pragma uvmf custom configure begin + // pragma uvmf custom configure end + endfunction + +// pragma uvmf custom initiate_and_get_response begin +// **************************************************************************** +// UVMF_CHANGE_ME +// This task is used by an initator. The task first initiates a transfer then +// waits for the responder to complete the transfer. + task initiate_and_get_response( + // This argument passes transaction variables used by an initiator + // to perform the initial part of a protocol transfer. The values + // come from a sequence item created in a sequence. + input apb_initiator_s apb_initiator_struct, + // This argument is used to send data received from the responder + // back to the sequence item. The sequence item is returned to the sequence. + output apb_responder_s apb_responder_struct + );// pragma tbx xtf + // + // Members within the apb_initiator_struct: + // bit psel ; + // bit penable ; + // bit [APB_ADDR_WIDTH-1:0] paddr ; + // bit [APB_DATA_WIDTH-1:0] pwdata ; + // bit pwrite ; + // bit [3:0] pstrb ; + // bit [3:0] pprot ; + // APB_DATA_WIDTH prdata ; + // bit pready ; + // bit pslverr ; + // Members within the apb_responder_struct: + // bit psel ; + // bit penable ; + // bit [APB_ADDR_WIDTH-1:0] paddr ; + // bit [APB_DATA_WIDTH-1:0] pwdata ; + // bit pwrite ; + // bit [3:0] pstrb ; + // bit [3:0] pprot ; + // APB_DATA_WIDTH prdata ; + // bit pready ; + // bit pslverr ; + initiator_struct = apb_initiator_struct; + // + // Reference code; + // How to wait for signal value + // while (control_signal == 1'b1) @(posedge pclk_i); + // + // How to assign a responder struct member, named xyz, from a signal. + // All available initiator input and inout signals listed. + // Initiator input signals + // apb_responder_struct.xyz = prdata_i; // [APB_DATA_WIDTH-1:0] + // apb_responder_struct.xyz = pready_i; // + // apb_responder_struct.xyz = pslverr_i; // + // Initiator inout signals + // How to assign a signal from an initiator struct member named xyz. + // All available initiator output and inout signals listed. + // Notice the _o. Those are storage variables that allow for procedural assignment. + // Initiator output signals + // psel_o <= apb_initiator_struct.xyz; // [15:0] + // penable_o <= apb_initiator_struct.xyz; // + // paddr_o <= apb_initiator_struct.xyz; // [APB_ADDR_WIDTH-1:0] + // pwdata_o <= apb_initiator_struct.xyz; // [APB_DATA_WIDTH-1:0] + // pwrite_o <= apb_initiator_struct.xyz; // + // pstrb_o <= apb_initiator_struct.xyz; // [3:0] + // pprot_o <= apb_initiator_struct.xyz; // [2:0] + // Initiator inout signals + // Initiate a transfer using the data received. + @(posedge pclk_i); + @(posedge pclk_i); + // Wait for the responder to complete the transfer then place the responder data into + // apb_responder_struct. + @(posedge pclk_i); + @(posedge pclk_i); + responder_struct = apb_responder_struct; + endtask +// pragma uvmf custom initiate_and_get_response end + +// pragma uvmf custom respond_and_wait_for_next_transfer begin +// **************************************************************************** +// The first_transfer variable is used to prevent completing a transfer in the +// first call to this task. For the first call to this task, there is not +// current transfer to complete. +bit first_transfer=1; + +// UVMF_CHANGE_ME +// This task is used by a responder. The task first completes the current +// transfer in progress then waits for the initiator to start the next transfer. + task respond_and_wait_for_next_transfer( + // This argument is used to send data received from the initiator + // back to the sequence item. The sequence determines how to respond. + output apb_initiator_s apb_initiator_struct, + // This argument passes transaction variables used by a responder + // to complete a protocol transfer. The values come from a sequence item. + input apb_responder_s apb_responder_struct + );// pragma tbx xtf + // Variables within the apb_initiator_struct: + // bit psel ; + // bit penable ; + // bit [APB_ADDR_WIDTH-1:0] paddr ; + // bit [APB_DATA_WIDTH-1:0] pwdata ; + // bit pwrite ; + // bit [3:0] pstrb ; + // bit [3:0] pprot ; + // APB_DATA_WIDTH prdata ; + // bit pready ; + // bit pslverr ; + // Variables within the apb_responder_struct: + // bit psel ; + // bit penable ; + // bit [APB_ADDR_WIDTH-1:0] paddr ; + // bit [APB_DATA_WIDTH-1:0] pwdata ; + // bit pwrite ; + // bit [3:0] pstrb ; + // bit [3:0] pprot ; + // APB_DATA_WIDTH prdata ; + // bit pready ; + // bit pslverr ; + // Reference code; + // How to wait for signal value + // while (control_signal == 1'b1) @(posedge pclk_i); + // + // How to assign a responder struct member, named xyz, from a signal. + // All available responder input and inout signals listed. + // Responder input signals + // apb_responder_struct.xyz = psel_i; // [15:0] + // apb_responder_struct.xyz = penable_i; // + // apb_responder_struct.xyz = paddr_i; // [APB_ADDR_WIDTH-1:0] + // apb_responder_struct.xyz = pwdata_i; // [APB_DATA_WIDTH-1:0] + // apb_responder_struct.xyz = pwrite_i; // + // apb_responder_struct.xyz = pstrb_i; // [3:0] + // apb_responder_struct.xyz = pprot_i; // [2:0] + // Responder inout signals + // How to assign a signal, named xyz, from an initiator struct member. + // All available responder output and inout signals listed. + // Notice the _o. Those are storage variables that allow for procedural assignment. + // Responder output signals + // prdata_o <= apb_initiator_struct.xyz; // [APB_DATA_WIDTH-1:0] + // pready_o <= apb_initiator_struct.xyz; // + // pslverr_o <= apb_initiator_struct.xyz; // + // Responder inout signals + + @(posedge pclk_i); + if (!first_transfer) begin + // Perform transfer response here. + // Reply using data recieved in the apb_responder_struct. + @(posedge pclk_i); + // Reply using data recieved in the transaction handle. + @(posedge pclk_i); + end + // Wait for next transfer then gather info from intiator about the transfer. + // Place the data into the apb_initiator_struct. + @(posedge pclk_i); + @(posedge pclk_i); + first_transfer = 0; + endtask +// pragma uvmf custom respond_and_wait_for_next_transfer end + + +endinterface + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_if.sv b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_if.sv new file mode 100644 index 00000000..24a87bdb --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_if.sv @@ -0,0 +1,112 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This interface contains the apb interface signals. +// It is instantiated once per apb bus. Bus Functional Models, +// BFM's named apb_driver_bfm, are used to drive signals on the bus. +// BFM's named apb_monitor_bfm are used to monitor signals on the +// bus. This interface signal bundle is passed in the port list of +// the BFM in order to give the BFM access to the signals in this +// interface. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// This template can be used to connect a DUT to these signals +// +// .dut_signal_port(apb_bus.psel), // Agent output +// .dut_signal_port(apb_bus.penable), // Agent output +// .dut_signal_port(apb_bus.paddr), // Agent output +// .dut_signal_port(apb_bus.pwdata), // Agent output +// .dut_signal_port(apb_bus.pwrite), // Agent output +// .dut_signal_port(apb_bus.pstrb), // Agent output +// .dut_signal_port(apb_bus.pprot), // Agent output +// .dut_signal_port(apb_bus.prdata), // Agent input +// .dut_signal_port(apb_bus.pready), // Agent input +// .dut_signal_port(apb_bus.pslverr), // Agent input + +import uvmf_base_pkg_hdl::*; +import apb_pkg_hdl::*; + +interface apb_if #( + int APB_ADDR_WIDTH = 32, + int APB_DATA_WIDTH = 32 + ) + + ( + input bit pclk, + input bit presetn, + inout bit [15:0] psel, + inout bit penable, + inout bit [APB_ADDR_WIDTH-1:0] paddr, + inout bit [APB_DATA_WIDTH-1:0] pwdata, + inout bit pwrite, + inout bit [3:0] pstrb, + inout bit [2:0] pprot, + inout bit [APB_DATA_WIDTH-1:0] prdata, + inout bit pready, + inout bit pslverr + ); + +modport monitor_port + ( + input pclk, + input presetn, + input psel, + input penable, + input paddr, + input pwdata, + input pwrite, + input pstrb, + input pprot, + input prdata, + input pready, + input pslverr + ); + +modport initiator_port + ( + input pclk, + input presetn, + output psel, + output penable, + output paddr, + output pwdata, + output pwrite, + output pstrb, + output pprot, + input prdata, + input pready, + input pslverr + ); + +modport responder_port + ( + input pclk, + input presetn, + input psel, + input penable, + input paddr, + input pwdata, + input pwrite, + input pstrb, + input pprot, + output prdata, + output pready, + output pslverr + ); + + +// pragma uvmf custom interface_item_additional begin +// pragma uvmf custom interface_item_additional end + +endinterface + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_infact_coverage_strategy.csv b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_infact_coverage_strategy.csv new file mode 100644 index 00000000..1c218e14 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_infact_coverage_strategy.csv @@ -0,0 +1,6 @@ +Global +auto_bin_max, 64 + +Name,Type,Include +rand_fields,coverpoint,=rand *.** + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_macros.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_macros.svh new file mode 100644 index 00000000..9490a051 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_macros.svh @@ -0,0 +1,202 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This file contains macros used with the apb package. +// These macros include packed struct definitions. These structs are +// used to pass data between classes, hvl, and BFM's, hdl. Use of +// structs are more efficient and simpler to modify. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_struct +// and from_struct methods defined in the macros below that are used in +// the apb_configuration class. +// + `define apb_CONFIGURATION_STRUCT \ +typedef struct packed { \ + uvmf_active_passive_t active_passive; \ + uvmf_initiator_responder_t initiator_responder; \ + } apb_configuration_s; + + `define apb_CONFIGURATION_TO_STRUCT_FUNCTION \ + virtual function apb_configuration_s to_struct();\ + apb_configuration_struct = \ + {\ + this.active_passive,\ + this.initiator_responder\ + };\ + return ( apb_configuration_struct );\ + endfunction + + `define apb_CONFIGURATION_FROM_STRUCT_FUNCTION \ + virtual function void from_struct(apb_configuration_s apb_configuration_struct);\ + {\ + this.active_passive,\ + this.initiator_responder \ + } = apb_configuration_struct;\ + endfunction + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_monitor_struct +// and from_monitor_struct methods of the apb_transaction class. +// + `define apb_MONITOR_STRUCT typedef struct packed { \ + bit psel ; \ + bit penable ; \ + bit [APB_ADDR_WIDTH-1:0] paddr ; \ + bit [APB_DATA_WIDTH-1:0] pwdata ; \ + bit pwrite ; \ + bit [3:0] pstrb ; \ + bit [3:0] pprot ; \ + APB_DATA_WIDTH prdata ; \ + bit pready ; \ + bit pslverr ; \ + } apb_monitor_s; + + `define apb_TO_MONITOR_STRUCT_FUNCTION \ + virtual function apb_monitor_s to_monitor_struct();\ + apb_monitor_struct = \ + { \ + this.psel , \ + this.penable , \ + this.paddr , \ + this.pwdata , \ + this.pwrite , \ + this.pstrb , \ + this.pprot , \ + this.prdata , \ + this.pready , \ + this.pslverr \ + };\ + return ( apb_monitor_struct);\ + endfunction\ + + `define apb_FROM_MONITOR_STRUCT_FUNCTION \ + virtual function void from_monitor_struct(apb_monitor_s apb_monitor_struct);\ + {\ + this.psel , \ + this.penable , \ + this.paddr , \ + this.pwdata , \ + this.pwrite , \ + this.pstrb , \ + this.pprot , \ + this.prdata , \ + this.pready , \ + this.pslverr \ + } = apb_monitor_struct;\ + endfunction + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_initiator_struct +// and from_initiator_struct methods of the apb_transaction class. +// Also update the comments in the driver BFM. +// + `define apb_INITIATOR_STRUCT typedef struct packed { \ + bit psel ; \ + bit penable ; \ + bit [APB_ADDR_WIDTH-1:0] paddr ; \ + bit [APB_DATA_WIDTH-1:0] pwdata ; \ + bit pwrite ; \ + bit [3:0] pstrb ; \ + bit [3:0] pprot ; \ + APB_DATA_WIDTH prdata ; \ + bit pready ; \ + bit pslverr ; \ + } apb_initiator_s; + + `define apb_TO_INITIATOR_STRUCT_FUNCTION \ + virtual function apb_initiator_s to_initiator_struct();\ + apb_initiator_struct = \ + {\ + this.psel , \ + this.penable , \ + this.paddr , \ + this.pwdata , \ + this.pwrite , \ + this.pstrb , \ + this.pprot , \ + this.prdata , \ + this.pready , \ + this.pslverr \ + };\ + return ( apb_initiator_struct);\ + endfunction + + `define apb_FROM_INITIATOR_STRUCT_FUNCTION \ + virtual function void from_initiator_struct(apb_initiator_s apb_initiator_struct);\ + {\ + this.psel , \ + this.penable , \ + this.paddr , \ + this.pwdata , \ + this.pwrite , \ + this.pstrb , \ + this.pprot , \ + this.prdata , \ + this.pready , \ + this.pslverr \ + } = apb_initiator_struct;\ + endfunction + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_responder_struct +// and from_responder_struct methods of the apb_transaction class. +// Also update the comments in the driver BFM. +// + `define apb_RESPONDER_STRUCT typedef struct packed { \ + bit psel ; \ + bit penable ; \ + bit [APB_ADDR_WIDTH-1:0] paddr ; \ + bit [APB_DATA_WIDTH-1:0] pwdata ; \ + bit pwrite ; \ + bit [3:0] pstrb ; \ + bit [3:0] pprot ; \ + APB_DATA_WIDTH prdata ; \ + bit pready ; \ + bit pslverr ; \ + } apb_responder_s; + + `define apb_TO_RESPONDER_STRUCT_FUNCTION \ + virtual function apb_responder_s to_responder_struct();\ + apb_responder_struct = \ + {\ + this.psel , \ + this.penable , \ + this.paddr , \ + this.pwdata , \ + this.pwrite , \ + this.pstrb , \ + this.pprot , \ + this.prdata , \ + this.pready , \ + this.pslverr \ + };\ + return ( apb_responder_struct);\ + endfunction + + `define apb_FROM_RESPONDER_STRUCT_FUNCTION \ + virtual function void from_responder_struct(apb_responder_s apb_responder_struct);\ + {\ + this.psel , \ + this.penable , \ + this.paddr , \ + this.pwdata , \ + this.pwrite , \ + this.pstrb , \ + this.pprot , \ + this.prdata , \ + this.pready , \ + this.pslverr \ + } = apb_responder_struct;\ + endfunction +// pragma uvmf custom additional begin +// pragma uvmf custom additional end diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor.svh new file mode 100644 index 00000000..216e7e39 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor.svh @@ -0,0 +1,102 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class receives apb transactions observed by the +// apb monitor BFM and broadcasts them through the analysis port +// on the agent. It accesses the monitor BFM through the monitor +// task. This UVM component captures transactions +// for viewing in the waveform viewer if the +// enable_transaction_viewing flag is set in the configuration. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class apb_monitor #( + int APB_ADDR_WIDTH = 32, + int APB_DATA_WIDTH = 32 + ) extends uvmf_monitor_base #( + .CONFIG_T(apb_configuration #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + )), + .BFM_BIND_T(virtual apb_monitor_bfm #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + )), + .TRANS_T(apb_transaction #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ))); + + `uvm_component_param_utils( apb_monitor #( + APB_ADDR_WIDTH, + APB_DATA_WIDTH + )) + +// Structure used to pass data from monitor BFM to monitor class in agent. +// Use to_monitor_struct function to pack transaction variables into structure. +// Use from_monitor_struct function to unpack transaction variables from structure. +`apb_MONITOR_STRUCT + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + +// **************************************************************************** +// This function is the standard SystemVerilog constructor. +// + function new( string name = "", uvm_component parent = null ); + super.new( name, parent ); + endfunction + +// **************************************************************************** +// This function sends configuration object variables to the monitor BFM +// using the configuration struct. +// + virtual function void configure(input CONFIG_T cfg); + bfm.configure( cfg.to_struct() ); + + endfunction + +// **************************************************************************** +// This function places a handle to this class in the proxy variable in the +// monitor BFM. This allows the monitor BFM to call the notify_transaction +// function within this class. +// + virtual function void set_bfm_proxy_handle(); + bfm.proxy = this; endfunction + +// *************************************************************************** + virtual task run_phase(uvm_phase phase); + // Start monitor BFM thread and don't call super.run() in order to + // override the default monitor proxy 'pull' behavior with the more + // emulation-friendly BFM 'push' approach using the notify_transaction + // function below + bfm.start_monitoring(); + endtask + +// ************************************************************************** + +// This function is called by the monitor BFM. It receives data observed by the +// monitor BFM. Data is passed using the apb_monitor_struct. + virtual function void notify_transaction(input apb_monitor_s apb_monitor_struct); + + + trans = new("trans"); + trans.from_monitor_struct(apb_monitor_struct); + trans.start_time = time_stamp; + trans.end_time = $time; + time_stamp = trans.end_time; + + analyze(trans); + endfunction + +endclass + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor_bfm.sv b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor_bfm.sv new file mode 100644 index 00000000..4720bf30 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor_bfm.sv @@ -0,0 +1,216 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This interface performs the apb signal monitoring. +// It is accessed by the uvm apb monitor through a virtual +// interface handle in the apb configuration. It monitors the +// signals passed in through the port connection named bus of +// type apb_if. +// +// Input signals from the apb_if are assigned to an internal input +// signal with a _i suffix. The _i signal should be used for sampling. +// +// The input signal connections are as follows: +// bus.signal -> signal_i +// +// Interface functions and tasks used by UVM components: +// monitor(inout TRANS_T txn); +// This task receives the transaction, txn, from the +// UVM monitor and then populates variables in txn +// from values observed on bus activity. This task +// blocks until an operation on the apb bus is complete. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +import uvmf_base_pkg_hdl::*; +import apb_pkg_hdl::*; +`include "src/apb_macros.svh" + + +interface apb_monitor_bfm #( + int APB_ADDR_WIDTH = 32, + int APB_DATA_WIDTH = 32 + ) + ( apb_if bus ); + // The pragma below and additional ones in-lined further down are for running this BFM on Veloce + // pragma attribute apb_monitor_bfm partition_interface_xif + +`ifndef XRTL +// This code is to aid in debugging parameter mismatches between the BFM and its corresponding agent. +// Enable this debug by setting UVM_VERBOSITY to UVM_DEBUG +// Setting UVM_VERBOSITY to UVM_DEBUG causes all BFM's and all agents to display their parameter settings. +// All of the messages from this feature have a UVM messaging id value of "CFG" +// The transcript or run.log can be parsed to ensure BFM parameter settings match its corresponding agents parameter settings. +import uvm_pkg::*; +`include "uvm_macros.svh" +initial begin : bfm_vs_agent_parameter_debug + `uvm_info("CFG", + $psprintf("The BFM at '%m' has the following parameters: APB_ADDR_WIDTH=%x APB_DATA_WIDTH=%x ", APB_ADDR_WIDTH,APB_DATA_WIDTH), + UVM_DEBUG) +end +`endif + + + // Structure used to pass transaction data from monitor BFM to monitor class in agent. +`apb_MONITOR_STRUCT + apb_monitor_s apb_monitor_struct; + + // Structure used to pass configuration data from monitor class to monitor BFM. + `apb_CONFIGURATION_STRUCT + + + // Config value to determine if this is an initiator or a responder + uvmf_initiator_responder_t initiator_responder; + // Custom configuration variables. + // These are set using the configure function which is called during the UVM connect_phase + + tri pclk_i; + tri presetn_i; + tri [15:0] psel_i; + tri penable_i; + tri [APB_ADDR_WIDTH-1:0] paddr_i; + tri [APB_DATA_WIDTH-1:0] pwdata_i; + tri pwrite_i; + tri [3:0] pstrb_i; + tri [2:0] pprot_i; + tri [APB_DATA_WIDTH-1:0] prdata_i; + tri pready_i; + tri pslverr_i; + assign pclk_i = bus.pclk; + assign presetn_i = bus.presetn; + assign psel_i = bus.psel; + assign penable_i = bus.penable; + assign paddr_i = bus.paddr; + assign pwdata_i = bus.pwdata; + assign pwrite_i = bus.pwrite; + assign pstrb_i = bus.pstrb; + assign pprot_i = bus.pprot; + assign prdata_i = bus.prdata; + assign pready_i = bus.pready; + assign pslverr_i = bus.pslverr; + + // Proxy handle to UVM monitor + apb_pkg::apb_monitor #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ) proxy; + // pragma tbx oneway proxy.notify_transaction + + // pragma uvmf custom interface_item_additional begin + // pragma uvmf custom interface_item_additional end + + //****************************************************************** + task wait_for_reset();// pragma tbx xtf + @(posedge pclk_i) ; + do_wait_for_reset(); + endtask + + // **************************************************************************** + task do_wait_for_reset(); + // pragma uvmf custom reset_condition begin + wait ( presetn_i === 1 ) ; + @(posedge pclk_i) ; + // pragma uvmf custom reset_condition end + endtask + + //****************************************************************** + + task wait_for_num_clocks(input int unsigned count); // pragma tbx xtf + @(posedge pclk_i); + + repeat (count-1) @(posedge pclk_i); + endtask + + //****************************************************************** + event go; + function void start_monitoring();// pragma tbx xtf + -> go; + endfunction + + // **************************************************************************** + initial begin + @go; + forever begin + @(posedge pclk_i); + do_monitor( apb_monitor_struct ); + + + proxy.notify_transaction( apb_monitor_struct ); + + end + end + + //****************************************************************** + // The configure() function is used to pass agent configuration + // variables to the monitor BFM. It is called by the monitor within + // the agent at the beginning of the simulation. It may be called + // during the simulation if agent configuration variables are updated + // and the monitor BFM needs to be aware of the new configuration + // variables. + // + function void configure(apb_configuration_s apb_configuration_arg); // pragma tbx xtf + initiator_responder = apb_configuration_arg.initiator_responder; + // pragma uvmf custom configure begin + // pragma uvmf custom configure end + endfunction + + + // **************************************************************************** + + task do_monitor(output apb_monitor_s apb_monitor_struct); + // + // Available struct members: + // // apb_monitor_struct.psel + // // apb_monitor_struct.penable + // // apb_monitor_struct.paddr + // // apb_monitor_struct.pwdata + // // apb_monitor_struct.pwrite + // // apb_monitor_struct.pstrb + // // apb_monitor_struct.pprot + // // apb_monitor_struct.prdata + // // apb_monitor_struct.pready + // // apb_monitor_struct.pslverr + // // + // Reference code; + // How to wait for signal value + // while (control_signal === 1'b1) @(posedge pclk_i); + // + // How to assign a struct member, named xyz, from a signal. + // All available input signals listed. + // apb_monitor_struct.xyz = psel_i; // [15:0] + // apb_monitor_struct.xyz = penable_i; // + // apb_monitor_struct.xyz = paddr_i; // [APB_ADDR_WIDTH-1:0] + // apb_monitor_struct.xyz = pwdata_i; // [APB_DATA_WIDTH-1:0] + // apb_monitor_struct.xyz = pwrite_i; // + // apb_monitor_struct.xyz = pstrb_i; // [3:0] + // apb_monitor_struct.xyz = pprot_i; // [2:0] + // apb_monitor_struct.xyz = prdata_i; // [APB_DATA_WIDTH-1:0] + // apb_monitor_struct.xyz = pready_i; // + // apb_monitor_struct.xyz = pslverr_i; // + // pragma uvmf custom do_monitor begin + // UVMF_CHANGE_ME : Implement protocol monitoring. The commented reference code + // below are examples of how to capture signal values and assign them to + // structure members. All available input signals are listed. The 'while' + // code example shows how to wait for a synchronous flow control signal. This + // task should return when a complete transfer has been observed. Once this task is + // exited with captured values, it is then called again to wait for and observe + // the next transfer. One clock cycle is consumed between calls to do_monitor. + @(posedge pclk_i); + @(posedge pclk_i); + @(posedge pclk_i); + @(posedge pclk_i); + // pragma uvmf custom do_monitor end + endtask + + +endinterface + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_random_sequence.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_random_sequence.svh new file mode 100644 index 00000000..705307f5 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_random_sequence.svh @@ -0,0 +1,65 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This sequences randomizes the apb transaction and sends it +// to the UVM driver. +// +// This sequence constructs and randomizes a apb_transaction. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class apb_random_sequence #( + int APB_ADDR_WIDTH = 32, + int APB_DATA_WIDTH = 32 + ) + extends apb_sequence_base #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ); + + `uvm_object_param_utils( apb_random_sequence #( + APB_ADDR_WIDTH, + APB_DATA_WIDTH + )) + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + //***************************************************************** + function new(string name = ""); + super.new(name); + endfunction: new + + // **************************************************************************** + // TASK : body() + // This task is automatically executed when this sequence is started using the + // start(sequencerHandle) task. + // + task body(); + + // Construct the transaction + req=apb_transaction#( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + )::type_id::create("req"); + start_item(req); + // Randomize the transaction + if(!req.randomize()) `uvm_fatal("SEQ", "apb_random_sequence::body()-apb_transaction randomization failed") + // Send the transaction to the apb_driver_bfm via the sequencer and apb_driver. + finish_item(req); + `uvm_info("SEQ", {"Response:",req.convert2string()},UVM_MEDIUM) + + endtask + +endclass: apb_random_sequence + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_responder_sequence.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_responder_sequence.svh new file mode 100644 index 00000000..aa44a888 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_responder_sequence.svh @@ -0,0 +1,61 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class can be used to provide stimulus when an interface +// has been configured to run in a responder mode. It +// will never finish by default, always going back to the driver +// and driver BFM for the next transaction with which to respond. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class apb_responder_sequence #( + int APB_ADDR_WIDTH = 32, + int APB_DATA_WIDTH = 32 + ) + extends apb_sequence_base #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ); + + `uvm_object_param_utils( apb_responder_sequence #( + APB_ADDR_WIDTH, + APB_DATA_WIDTH + )) + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + function new(string name = "apb_responder_sequence"); + super.new(name); + endfunction + + task body(); + req=apb_transaction#( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + )::type_id::create("req"); + forever begin + start_item(req); + finish_item(req); + // pragma uvmf custom body begin + // UVMF_CHANGE_ME : Do something here with the resulting req item. The + // finish_item() call above will block until the req transaction is ready + // to be handled by the responder sequence. + // If this was an item that required a response, the expectation is + // that the response should be populated within this transaction now. + `uvm_info("SEQ",$sformatf("Processed txn: %s",req.convert2string()),UVM_HIGH) + // pragma uvmf custom body end + end + endtask + +endclass + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_sequence_base.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_sequence_base.svh new file mode 100644 index 00000000..ddd46184 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_sequence_base.svh @@ -0,0 +1,114 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This file contains the class used as the base class for all sequences +// for this interface. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class apb_sequence_base #( + int APB_ADDR_WIDTH = 32, + int APB_DATA_WIDTH = 32 + ) extends uvmf_sequence_base #( + .REQ(apb_transaction #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + )), + .RSP(apb_transaction #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ))); + + `uvm_object_param_utils( apb_sequence_base #( + APB_ADDR_WIDTH, + APB_DATA_WIDTH + )) + + // variables + typedef apb_transaction #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ) apb_transaction_req_t; + apb_transaction_req_t req; + typedef apb_transaction #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ) apb_transaction_rsp_t; + apb_transaction_rsp_t rsp; + + // Event for identifying when a response was received from the sequencer + event new_rsp; + + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + // **************************************************************************** + // TASK : get_responses() + // This task recursively gets sequence item responses from the sequencer. + // + virtual task get_responses(); + fork + begin + // Block until new rsp available + get_response(rsp); + // New rsp received. Indicate to sequence using event. + ->new_rsp; + // Display the received response transaction + `uvm_info("SEQ", {"New response transaction:",rsp.convert2string()}, UVM_MEDIUM) + end + join_none + endtask + + // **************************************************************************** + // TASK : pre_body() + // This task is called automatically when start is called with call_pre_post set to 1 (default). + // By calling get_responses() within pre_body() any derived sequences are automatically + // processing response transactions. Only un-comment this call to get_responses() if you + // have configured the interface driver to utilize the response transaction path by setting + // the configuration variable "return_transaction_response" to 1. Otherwise it is possible + // to impact runtime performance and memory utilization. + // + virtual task pre_body(); + // pragma uvmf custom pre_body begin +// get_responses(); + // pragma uvmf custom pre_body end + endtask + + // **************************************************************************** + // TASK : body() + // This task is called automatically when start is called. This sequence sends + // a req sequence item to the sequencer identified as an argument in the call + // to start. + // + virtual task body(); + // pragma uvmf custom body begin + start_item(req); + finish_item(req); + // pragma uvmf custom body end + endtask + + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new( string name =""); + super.new( name ); + // pragma uvmf custom new begin + req = apb_transaction_req_t::type_id::create("req"); + rsp = apb_transaction_rsp_t::type_id::create("rsp"); + // pragma uvmf custom new end + endfunction + +endclass + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction.svh new file mode 100644 index 00000000..964aebc3 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction.svh @@ -0,0 +1,229 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class defines the variables required for an apb +// transaction. Class variables to be displayed in waveform transaction +// viewing are added to the transaction viewing stream in the add_to_wave +// function. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class apb_transaction #( + int APB_ADDR_WIDTH = 32, + int APB_DATA_WIDTH = 32 + ) extends uvmf_transaction_base; + + `uvm_object_param_utils( apb_transaction #( + APB_ADDR_WIDTH, + APB_DATA_WIDTH + )) + + rand bit psel ; + rand bit penable ; + rand bit [APB_ADDR_WIDTH-1:0] paddr ; + rand bit [APB_DATA_WIDTH-1:0] pwdata ; + rand bit pwrite ; + rand bit [3:0] pstrb ; + rand bit [3:0] pprot ; + rand APB_DATA_WIDTH prdata ; + rand bit pready ; + rand bit pslverr ; + + //Constraints for the transaction variables: + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + //******************************************************************* + //******************************************************************* + // Macros that define structs and associated functions are + // located in apb_macros.svh + + //******************************************************************* + // Monitor macro used by apb_monitor and apb_monitor_bfm + // This struct is defined in apb_macros.svh + `apb_MONITOR_STRUCT + apb_monitor_s apb_monitor_struct; + //******************************************************************* + // FUNCTION: to_monitor_struct() + // This function packs transaction variables into a apb_monitor_s + // structure. The function returns the handle to the apb_monitor_struct. + // This function is defined in apb_macros.svh + `apb_TO_MONITOR_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_monitor_struct() + // This function unpacks the struct provided as an argument into transaction + // variables of this class. + // This function is defined in apb_macros.svh + `apb_FROM_MONITOR_STRUCT_FUNCTION + + //******************************************************************* + // Initiator macro used by apb_driver and apb_driver_bfm + // to communicate initiator driven data to apb_driver_bfm. + // This struct is defined in apb_macros.svh + `apb_INITIATOR_STRUCT + apb_initiator_s apb_initiator_struct; + //******************************************************************* + // FUNCTION: to_initiator_struct() + // This function packs transaction variables into a apb_initiator_s + // structure. The function returns the handle to the apb_initiator_struct. + // This function is defined in apb_macros.svh + `apb_TO_INITIATOR_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_initiator_struct() + // This function unpacks the struct provided as an argument into transaction + // variables of this class. + // This function is defined in apb_macros.svh + `apb_FROM_INITIATOR_STRUCT_FUNCTION + + //******************************************************************* + // Responder macro used by apb_driver and apb_driver_bfm + // to communicate Responder driven data to apb_driver_bfm. + // This struct is defined in apb_macros.svh + `apb_RESPONDER_STRUCT + apb_responder_s apb_responder_struct; + //******************************************************************* + // FUNCTION: to_responder_struct() + // This function packs transaction variables into a apb_responder_s + // structure. The function returns the handle to the apb_responder_struct. + // This function is defined in apb_macros.svh + `apb_TO_RESPONDER_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_responder_struct() + // This function unpacks the struct provided as an argument into transaction + // variables of this class. + // This function is defined in apb_macros.svh + `apb_FROM_RESPONDER_STRUCT_FUNCTION + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new( string name = "" ); + super.new( name ); + endfunction + + // **************************************************************************** + // FUNCTION: convert2string() + // This function converts all variables in this class to a single string for + // logfile reporting. + // + virtual function string convert2string(); + // pragma uvmf custom convert2string begin + // UVMF_CHANGE_ME : Customize format if desired. + return $sformatf("psel:0x%x penable:0x%x paddr:0x%x pwdata:0x%x pwrite:0x%x pstrb:0x%x pprot:0x%x prdata:0x%x pready:0x%x pslverr:0x%x ",psel,penable,paddr,pwdata,pwrite,pstrb,pprot,prdata,pready,pslverr); + // pragma uvmf custom convert2string end + endfunction + + //******************************************************************* + // FUNCTION: do_print() + // This function is automatically called when the .print() function + // is called on this class. + // + virtual function void do_print(uvm_printer printer); + // pragma uvmf custom do_print begin + // UVMF_CHANGE_ME : Current contents of do_print allows for the use of UVM 1.1d, 1.2 or P1800.2. + // Update based on your own printing preference according to your preferred UVM version + $display(convert2string()); + // pragma uvmf custom do_print end + endfunction + + //******************************************************************* + // FUNCTION: do_compare() + // This function is automatically called when the .compare() function + // is called on this class. + // + virtual function bit do_compare (uvm_object rhs, uvm_comparer comparer); + apb_transaction #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ) RHS; + if (!$cast(RHS,rhs)) return 0; + // pragma uvmf custom do_compare begin + // UVMF_CHANGE_ME : Eliminate comparison of variables not to be used for compare + return (super.do_compare(rhs,comparer) + &&(this.penable == RHS.penable) + &&(this.paddr == RHS.paddr) + &&(this.pwdata == RHS.pwdata) + &&(this.pwrite == RHS.pwrite) + &&(this.pstrb == RHS.pstrb) + &&(this.pprot == RHS.pprot) + &&(this.prdata == RHS.prdata) + &&(this.pready == RHS.pready) + &&(this.pslverr == RHS.pslverr) + ); + // pragma uvmf custom do_compare end + endfunction + + //******************************************************************* + // FUNCTION: do_copy() + // This function is automatically called when the .copy() function + // is called on this class. + // + virtual function void do_copy (uvm_object rhs); + apb_transaction #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ) RHS; + assert($cast(RHS,rhs)); + // pragma uvmf custom do_copy begin + super.do_copy(rhs); + this.psel = RHS.psel; + this.penable = RHS.penable; + this.paddr = RHS.paddr; + this.pwdata = RHS.pwdata; + this.pwrite = RHS.pwrite; + this.pstrb = RHS.pstrb; + this.pprot = RHS.pprot; + this.prdata = RHS.prdata; + this.pready = RHS.pready; + this.pslverr = RHS.pslverr; + // pragma uvmf custom do_copy end + endfunction + + // **************************************************************************** + // FUNCTION: add_to_wave() + // This function is used to display variables in this class in the waveform + // viewer. The start_time and end_time variables must be set before this + // function is called. If the start_time and end_time variables are not set + // the transaction will be hidden at 0ns on the waveform display. + // + virtual function void add_to_wave(int transaction_viewing_stream_h); + `ifdef QUESTA + if (transaction_view_h == 0) begin + transaction_view_h = $begin_transaction(transaction_viewing_stream_h,"apb_transaction",start_time); + end + super.add_to_wave(transaction_view_h); + // pragma uvmf custom add_to_wave begin + // UVMF_CHANGE_ME : Color can be applied to transaction entries based on content, example below + // case() + // 1 : $add_color(transaction_view_h,"red"); + // default : $add_color(transaction_view_h,"grey"); + // endcase + // UVMF_CHANGE_ME : Eliminate transaction variables not wanted in transaction viewing in the waveform viewer + $add_attribute(transaction_view_h,psel,"psel"); + $add_attribute(transaction_view_h,penable,"penable"); + $add_attribute(transaction_view_h,paddr,"paddr"); + $add_attribute(transaction_view_h,pwdata,"pwdata"); + $add_attribute(transaction_view_h,pwrite,"pwrite"); + $add_attribute(transaction_view_h,pstrb,"pstrb"); + $add_attribute(transaction_view_h,pprot,"pprot"); + $add_attribute(transaction_view_h,prdata,"prdata"); + $add_attribute(transaction_view_h,pready,"pready"); + $add_attribute(transaction_view_h,pslverr,"pslverr"); + // pragma uvmf custom add_to_wave end + $end_transaction(transaction_view_h,end_time); + $free_transaction(transaction_view_h); + `endif // QUESTA + endfunction + +endclass + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction_coverage.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction_coverage.svh new file mode 100644 index 00000000..0fa185e4 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction_coverage.svh @@ -0,0 +1,88 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class records apb transaction information using +// a covergroup named apb_transaction_cg. An instance of this +// coverage component is instantiated in the uvmf_parameterized_agent +// if the has_coverage flag is set. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class apb_transaction_coverage #( + int APB_ADDR_WIDTH = 32, + int APB_DATA_WIDTH = 32 + ) extends uvm_subscriber #(.T(apb_transaction #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) + ))); + + `uvm_component_param_utils( apb_transaction_coverage #( + APB_ADDR_WIDTH, + APB_DATA_WIDTH + )) + + T coverage_trans; + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + // **************************************************************************** + covergroup apb_transaction_cg; + // pragma uvmf custom covergroup begin + // UVMF_CHANGE_ME : Add coverage bins, crosses, exclusions, etc. according to coverage needs. + option.auto_bin_max=1024; + option.per_instance=1; + psel: coverpoint coverage_trans.psel; + penable: coverpoint coverage_trans.penable; + paddr: coverpoint coverage_trans.paddr; + pwdata: coverpoint coverage_trans.pwdata; + pwrite: coverpoint coverage_trans.pwrite; + pstrb: coverpoint coverage_trans.pstrb; + pprot: coverpoint coverage_trans.pprot; + prdata: coverpoint coverage_trans.prdata; + pready: coverpoint coverage_trans.pready; + pslverr: coverpoint coverage_trans.pslverr; + // pragma uvmf custom covergroup end + endgroup + + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new(string name="", uvm_component parent=null); + super.new(name,parent); + apb_transaction_cg=new; + `uvm_warning("COVERAGE_MODEL_REVIEW", "A covergroup has been constructed which may need review because of either generation or re-generation with merging. Please note that transaction variables added as a result of re-generation and merging are not automatically added to the covergroup. Remove this warning after the covergroup has been reviewed.") + endfunction + + // **************************************************************************** + // FUNCTION : build_phase() + // This function is the standard UVM build_phase. + // + function void build_phase(uvm_phase phase); + apb_transaction_cg.set_inst_name($sformatf("apb_transaction_cg_%s",get_full_name())); + endfunction + + // **************************************************************************** + // FUNCTION: write (T t) + // This function is automatically executed when a transaction arrives on the + // analysis_export. It copies values from the variables in the transaction + // to local variables used to collect functional coverage. + // + virtual function void write (T t); + `uvm_info("COV","Received transaction",UVM_HIGH); + coverage_trans = t; + apb_transaction_cg.sample(); + endfunction + +endclass + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs.svh new file mode 100644 index 00000000..43d85640 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs.svh @@ -0,0 +1,20 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This file contains defines and typedefs to be compiled for use in +// the simulation running on the host server when using Veloce. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + + +// pragma uvmf custom additional begin +// pragma uvmf custom additional end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs_hdl.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs_hdl.svh new file mode 100644 index 00000000..74738c8c --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs_hdl.svh @@ -0,0 +1,21 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This file contains defines and typedefs to be compiled for use in +// the simulation running on the emulator when using Veloce. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + + + +// pragma uvmf custom additional begin +// pragma uvmf custom additional end + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/yaml/apb_interface.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/yaml/apb_interface.yaml new file mode 100644 index 00000000..c3de1222 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/yaml/apb_interface.yaml @@ -0,0 +1,125 @@ +uvmf: + interfaces: + apb: + clock: pclk + config_constraints: [] + config_vars: [] + existing_library_component: 'True' + gen_inbound_streaming_driver: 'False' + hdl_pkg_parameters: [] + hdl_typedefs: [] + hvl_pkg_parameters: [] + hvl_typedefs: [] + parameters: + - name: APB_ADDR_WIDTH + type: int + value: '32' + - name: APB_DATA_WIDTH + type: int + value: '32' + ports: + - dir: output + name: psel + reset_value: '''b0' + width: '16' + - dir: output + name: penable + reset_value: '''b0' + width: '1' + - dir: output + name: paddr + reset_value: '''b0' + width: APB_ADDR_WIDTH + - dir: output + name: pwdata + reset_value: '''b0' + width: APB_DATA_WIDTH + - dir: output + name: pwrite + reset_value: '''b0' + width: '1' + - dir: output + name: pstrb + reset_value: '''b0' + width: '4' + - dir: output + name: pprot + reset_value: '''b0' + width: '3' + - dir: input + name: prdata + reset_value: '''b0' + width: APB_DATA_WIDTH + - dir: input + name: pready + reset_value: '0' + width: '1' + - dir: input + name: pslverr + reset_value: '0' + width: '1' + reset: presetn + reset_assertion_level: 'False' + transaction_constraints: [] + transaction_vars: + - comment: '' + iscompare: 'False' + isrand: 'True' + name: psel + type: bit + unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'True' + name: penable + type: bit + unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'True' + name: paddr + type: bit [APB_ADDR_WIDTH-1:0] + unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'True' + name: pwdata + type: bit [APB_DATA_WIDTH-1:0] + unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'True' + name: pwrite + type: bit + unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'True' + name: pstrb + type: bit [3:0] + unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'True' + name: pprot + type: bit [3:0] + unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'True' + name: prdata + type: APB_DATA_WIDTH + unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'True' + name: pready + type: bit + unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'True' + name: pslverr + type: bit + unpacked_dimension: '' + use_dpi_link: 'False' diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/__init__.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..661c107ed47f1b6602108b53f62c4d4c11a0dbf7 GIT binary patch literal 2549 zcma)7+fE!u5Iq<$u;y+qw!wCT!7RS)Iyh1yL{MTI6h{VGgB?ZvGMb%k*fG;HtLa`0 za>!HO@(+2-=j3bh0ZCQQE-Y3QWma1=eY&c;>Qr@i|6gO3U;q3gj?sCR=>0AI?Qea6 z0wl>k$UdlRkk_F4p$3rl!wf(UzzjkTqL0x*q}O4FActUvA%|f`AV**-kQJC4kT+mP zAxB}xAje?FA;(M0>qsYHCLt$brXZ(arXi=xxgn%CVP+s_U}hm_Vdfy`VCEs`OO0Wq zw_t8V-iEmYc?V_zasg%$auMb(9IWK+QtULCr(m zg1QZL2WkOo5$Z0~J*fLo0%{3r8R`Ml3e+mpL#Q>VD%3jEBdEtXq8J}TJ;6csDHrAU zYd}TN^C8JTL>vC|7ynfJ_YWQxi4~D>+O*QhX`!>DB-7$!kvOL_kz}IPF0^=i=9+m{ z6XLZKts*~3lqNIp=GBKNJIYDZwvs|Ck>%ObpZ4AedzQKAR5aR7*mkRx7tWGW%HH*9 ztI*aac}7k$<=sS?$Xkw}C>55#Mt(}pbas*yd1iFxYGu^>ZD*T0O})|6&Qnf(uPM?< zSQDiwtr1a5TI7cWbyDqSxw%;yFgc%ANtIGnR;)E5t7}bX(lxPq?ic82G}1gi7A|q* zaP@pon}#mZ#5y*nQ2p$`S;Topu3fJ;A-3A-_JwmFz+qm9w$%mG&2M|vfK1Y4dn*#n zLLYv!{OOZdsH+Nq%H`~;9{BBFy5Kmv_;;4tl@=~LTn02oKsO))Zq}Vd(kw z-?TAJ^_IV$JFks;8F)PmlPsaS)@Yi0Z_D^YYMT?VD f(XW55e{*ngV0oZ6xOnZ$!O_0az7hJdoFMrRiKlec literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/_compat.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/_compat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98452d838d134ffcda420460fdd2ec7a0b863fe2 GIT binary patch literal 6110 zcmd5=+j1Mn5$y#?2!KFI7AeZIsA#E+O~o`JL6u6vIIcvDR8|sGtc8_Wcv&xY2gH(l z%g&G#5+x6zD)x`$EAkEbk-X%=AK;ws!9^T=s^2X&U;g`_VMycO zBEG*u(f@UbBBCB@hoTB44)q*T4joh|s?wEcfetIwtCCt^Y_v$HXf9GzqnDUgBUQyB zq|Q*UPO3q@CaJU3YjHimT1%wP32>gGGcx4@MRft*qo^Uk#mU~w)LRy~Ny!SOm#BA% z(pBoMlB4js%mhYf=_S^^Lh1wRT_v?fy=$a?M7`@mwM#vhRE>J;Qs0pJCPgjT=@w=G zB2^b!Zwr+ljwx2RX#mEAT=kK_pm=FQ@wo}b=U=CIV?yx-O6~})Gm1ezCj6=>;he87so3B@;E{0`#mAn0uQVV)L& z5!Bya`!xmE%~RzTqfWaR-FNNSxF0968M*qXDDu*{{Xnb8%`-P}wJGDGKr6~mGMRs@ zN*$vwAGkVx?&{nk$Lo+oQyZfv$JJ=_ms*H6Fv{E64ylBKqjI8>Qd+wOzzZ*2eX zAMZTe?LKq|c?nWX5GQ)88Gn!8ZVZW0TtQ_np(;kj$Tww>=_D{<%8#=_9zvirDLa7m z0;(4Tfire@0~HBqxc%I=8L9t*sy#eWCeIVyKFP~NKPXku9+Y`zAd>cRoCPEQ!B5-a zFh~-W?JNI&`{^IPc*K?es0>oYvjpXL?shs`_uEFL1;|qx8Z*N@8-F@&tMK+%;aljf zWB*T+AnixNXYVmVC^Y4V*%p2-05HPRfkUT6r_Pi&5e@Sj8&w(x4%JA{xQ*tATaRhI zit=_`dR0s{HB`qza-=Me9>>!;V{z^OWRY2dHq-g#@Y;mK4KcqnXg(Oh;2%E`i|!%@ zW&4kxgsd?xQ$zk3jTboLP*>=%LFKwM9d5#?|L#yG0{}!b|CLRaFx6+@4^=-14*{M7 z<|H=58FE8RM1~iJ#VD3y1ks-#D={pvQk6lh)lGn!jhdYE&P8YH`y8ouxR1vomO*5b zaK>FCXW!4%bL0Es?H;4&hevVtyUYN}ETm1@Y65H7I(-9Y9L%P1Y#x35=WoLq^UR#h zdHmXb8{QgY-sU@S{bItJ1TK$>mP-EwP^1R#*ef?ovFVDMHeJ*IIsZUSC;3{^r#*f-Z^dtIOFcTN&k)E9TyfS;aJ<+RZ zg^8XYH#f_mC`P`cQk5C)vv~(5FCPIt4r?u^HVbQ05v*art0F+o{8BLfSP(pN_chUV zc}?EW&O_WlHiUUNIJ%q4a!N>r92mI6sS~DY<9s+MZ+q}!n84sGr zGi{HVLYbXu?36oLPSv+E**2E{qrEpI+Z`6&I4+i)GS%WGoKvHSm(Np3PSnT;TMW;h`s>;F;(av zxZDsu`)h?WLOg>+uq>de5FAh5H5{^2+!4bh&^kmzejF^g=uK1#&m(wAsn9`H-cJB5 zP;cRteTetLTZ(7nZOBV=;qbu$Mt4v#0k}=osk}kZC!S@XKP0c9`$d&b7pM#J(f$@# zw3$SSSynZoRv{T@ha3xLR9MY&+IE7hje9+IW$9+EiXE6?tbM-GYn%A+qLR!CPR6nT zWSe*G`rd622YFAl-Evl)4UV#t{1i+f?y`CNews%|37X!m*?c0Uj15AZl>F%^H_FEwN$U6c+Gl&%d8B89y+>l0??-tE^|A!?NShYE z<7Xv#xsi^&XB`$+g#Gt$Sh<>2}9g!w_d}2xisiMaZTe1byP-fm0v^~CJd+Xf8 zTY*Kn>v`81!>c~GjB^Z0@@!uu817jbnXYg`jR=9$GI`_jIP!`fj>;s7`&&g&YUS}o zO$Gw%ixLgzPLJ87&BL-p&70ae-aUZUf&t8jTZ)uEwGrksQS{d!t>&~U%eYrJsx>5` v{D-?%*kv0P4pp^EYjKRP*l%k*vW1zij;mMJFuJjbf2C1ttW=#9XUX{=8&bdL literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/bccache.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/bccache.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ce5a98e17ac2f42673b0946899352c28aa04fd6 GIT binary patch literal 16674 zcmd5@OOxEzb-tKx_B=G?@TH+-Q3@i5V$&vjB&t%fCNgEd6w{`LGKMm#ahz^6aC;g( z-M|PB4qK7Du(Zr7Raqp9R5nSa;w-YrCY7pGsB{Dds>1CsAM_X6l1j$&t# z;xvgnzy)w0=bU>U-#uvj*U6Qye)$(cpzQAi{(cWf_NAj#sMHQhM}-S&?5N3t+F4MO zhT3T;hqVpX?%>3nH`PwFJU^j!PL$^@wbLrk7uC*UdA_7}mdf*GwX-beO*LLolNZ#^ z3#N|~YP_l@C)LhLbKO$oQ);rNcGlG7wAwkXCTG;n88tbpcFrnCpHbN_m0nb%b86?j zoV=)Z)>V8~g^TJd%;&rcm*iw!h3NEx3Rl$VB^AD)Fk^jMjb2t7mCNeO1$Dt*H`VAH zDqK}BhbPqyZLUtKmv7;X3p=l$MQ{g$KUz2Cg zSGB*P!WYZh^{Un-eYe{e$c%phGge&uMo~QSuXp-E;0Hr3RX>~itw`O&VU)R(BrL|- zjVAkJJ<)NVx%p7L{b{a)B-F07;AYb-*Aw>#Y}dt0$$lOsu|FP9rJ*8=;@ytxN`tsv zWO`7H-Du!WlfoVPPqh0)r&Bjb*vnHFZS9Z!T)SD67e1THTt5z_E%wgmqH!d5++^UQ zBaAA^boFNDX5-|*4U>bIeWb3xzdw!w^G2Q|($u5~h8;82?Yg6bp-#~d=UxxhM^!S& zb?gq3bPuy}4|IRFQIf^arCB~3#ZeylZf=xYx7-s?-n?k-FuL?P_Z8cdt;q9aQe|F z*YjmQqo3y8e7dg#cFBWxZ{x_`Ly;@>xubH2@}9n~@&z?&sL!PmHBP+F+oPu3IKdkb zdi-}n1>xjKx7zGDUqKN;TC&`a11&QfL>LNZHt|zTWh|9pG1Fl8^Z$)2^eP^2Vi9v-10XDX%d6E;l`6F_NU!j?`#CvJ> z4~1Sl$)pMt2<0tr4No0Ya&frd!tg3`opd6ReiozaG9^C?qA0?(ie6$tQi?#|DuO+o z2fV`{>u=%6?x4_6=TN#R7ic=Z!byXsiYG8c4LN}oYRU;r&t+IJYy)A^u++CeRqoVm-r_j?b%s{Z06%!XLVIo5{iX9C{yD_H0 zZZIF*iZY{z6W1^DWCE2MP|-uPjdYN^Ns)(~g0&2|uTyA3PB0FmCsA0SyK)ZFk~JYk zKNxc!8MJnMIX7kj)C)*TzmIlplTrKxniZYEE*RAqG(mnIlm*dAS8xK2gN4z>$%35V zQgl*RE}@^WU}hB%8^~Wkq2nhJ6auZC=)gTa&AF0FB8jY}I@7sPpL{XXMV{d}9y-~31ta+(j*Qb+3u52MQ7&nbr9Z_9t(WLvC|oF6 z{Qm+{v_NIN*HGz(s9-BmRLk)0VCKw&B6On`rH{}4Caf;3 zA>?s@*H%>e$I5XW+%M%8y*vhwENf^d?o**xOUtZe-=+C

5>vINHNSp9>WXqBZi) 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

}AbXpf{26DT{9K-!f!OHRF5-{*L1p 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 b|2Cq9P}3UPtx8S%->1?*ZCP6@o_h6P0Xv0k literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/environment.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/environment.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f124e501115a06a0da265d1425ffe9f36569b493 GIT binary patch literal 51739 zcmdUY3y@q_THfiNhcwbiqlYC~wrsa$Yc=vpBU^rJCGX18$kwhr*4`Pfyv=%hdb;mu zTI$EBZ?~jbTd=Xr?m~EMSdzf*hENbHfrNylNKuur2?ZonNPtuU2}xCeBB6?qKvgQF z67nM7_xM^Yc%$GPYEpZ|USGxDFeZF%RHexz1&{?91>{}6u3=ZenN zohu_PxO&kw3$Ba{yDqwNQP(4`IpSKQt~}}rd^hTvW3Dys%HyuJ$(1*`)@E1U>{=79 zJmFefTzQLYZFS|Xt~Ke(ldiSRmAARpc30l+T2rn(B=Wv>jSR*0oOX^%BNiGv@4%>truMR1uJp8YkttRKIF3s3J& zpMJ!}CtZDicyV8N!KyF1`u*X>f$*aIii@9j^#{U>2g3_~G3R0w_+eLhm7q62{SYDY zpCj2)!k?>+_SNc%nYewU(e1Qbal5C--+b4fEqZ>b+qu!G$4RMLsx_-gQtGW#d!?05 zv!0Z?{dTX>ic8gYy|h~GCXM!$k{)zcdyP&znXw{H);gBaeTM@vZ@mo8p7J3BW&TUzdPORY{fF4f~+ zwb4ZBjX%Mkx#azPJa^&%XM~E3%fP=Ve_sleVquM;%Y4_q=J$twr4+$Tw#;0N{ znNP07?YLX*#j5=*=J6$a(CJQ(;I(RhtzD0o8|}ER+S~EXO3e!HZ9V>R@F*qEH|3SpsZG5rMI>kCmNUr-r(1=I}Wv8s*Wy(wUNXc5j40NbHyhWep2nB z`Rr!yd9Rc259hm$;sj}Nn{BJ0A#uBkR&!o1ef)&ldFkVqKAyoqH?H?$j`5T8ueeYR0AMMw_Ut(_K4~FV+wxzV9da3dl>PV3q`w zNhv@)-gP@IG|{G2<+nRMdrB0^0WT$M2|hI(IcFfaAN{N3`c%pFDbeg;`UD>ffE0s& zt;h`XYwqSc?N}EJ-M&F?vQotq+TtV>R=ZcMK-4ged#5D%7F-=)xf%C5on~_UW~Y0t zg72!w(H{VFyMFveqg`FAy!h<#+Df$vsJRkXo;?2A$6h(lq;kHC@#I%}R5|hZi4!wV z9#048`0843rPKERoj7iE>v*n{Gstm2+CV7%D&uezuM;9=H#Sn(UD#IGT9_=17Varb z6lx?J{1H0O;+H&z1mFZt>{`)vcZhiUd*`|(*8ni~0?f_}FX}2A2^@v#lGBGxH4D_!1MI!Y`sZ_Abga8@;9DU`5WdTS*z5T(v?ZaCGLnYn4A z6%C~zm?%*f^+v6y!4+DrRadLEMsLkVnxE+NAscF;OLWu*dKRtB4fHM!G$EC6!k-}a zA}#<^w~Ox92Z{O4z45HOJwn|27Se*d12}%dVZ?DuJUimrdWFfs?OS?&b;O;zzRg|6 z-Mj`UxrtIQcB*v^H?TkWF>-SmMrt;ap77LC1Ds!@SL$^vZ-!Y6Q`yQO@5l+^3^v*c zP;jpSfU4)QCAc{U^x-5Y8wlz1ngJ4R_cf#=BIZiA?*jVWei-Y)dvJE#Q=(%?Gj(2Q+0|t zR``q&fxFAo5P3KbJrpTUyBO_5jlJzi&Lm)%DK8m`Cbd%Mz=)w6fgK~i9y&Yth8&#l z`QQr*JL~(T6&?|}4A}w@H>=v5|N42{Zm7f-o(hl_W* zc$bTJyZ9a#Lz3U?Vo2`yx)@^meXf4c#SqI6@N<-g6w3`ycu{ok?4hQlK0>Ly{2&!O zym-jPrElN;`Sh$4}1mDhtTc|>CdtBoHZ3s$u zJZM9n$jZkkaiE|a5w$O$&~WWh{wG6GdwIcuMb3Th9jL;d3a_9oK`l=!gAMq8_YUUq z8CRFS1gakP<$kuDy?8FGx(>aGb?y1w!w15{levdbq*%@mgnA!Ry{BBgq%k?|qWS4Z z2xk8qD|La~9(58}fRHYTe1OMHsR7oX?BC*SMimz!Yh36dGvpAEH<3J(B0&>N#&)MD zEdj#0#**91jVpafYd{f414cYr>OuHRj;e?&&CXJ_Nl67L5_NVH*5k=%VvG}7V|cbz zT_fggb$|~WAi|Ah6HHd(wG!C(5@iqH5|-Ck#uHR#VoT{}70m*j!iPzxv|Q~P-F`)- zL9P{}05qLj$!OOykhlh8xzPpU-=H+L;bx=REHz_t9vu*d?rN7@z?D)A#9ixI|55~s zPOMaKG&*R3K7JXvT^-<{uXem})&N;*RGW=YscF+6Va}^1m4bmk7cW=AZeaF1rNza=Zyq|lxaix+!hCI@BObMX zO?8R-y-O{JZm+9lLt61QRkf~Lm;@uKm^Hw+%{M#3KkNJY=2vUQH`?9xwGUJ|Fi9Bd z+v^8mBeM97jDas_gUNklU57)B-)MioYE6%<@0+nIJuuRomda`utktc-&Rtmc!Y3Cp zSS>L`z#J<;23l*t1JX`lQQP-YvWm}HszPlsFu-6(tS(}gc_?Oqayq4xsQ2U|KRK3V z7=U**G>prielvYdUtc2$%QG{j8$b-eVAVSC+sTuq6Ei1rSOTNhs%ViXcMY?K6r<`n z#>GYIQWh6;IL|X;9v6CS0rk?r5O?EN=LS&gw5mBOTpSj1saL)7@R9W(cpj4w4-Pk{ zdG+gUD6y{iT1d)N_5)yg)g@d2sj9%$bw4~Va9o9U z11~PKgX%(~sLo?$7>!rFBmv?}Gz={8i7wWp5k^ic|L|!WPfJkAD2MLwHLHM3LVQhC zUz+dcN~5+S<=?>kV6iOso9P$S@LX)P`?oY+ug;fV_j)=s5i2YPHPin~1BFyqS7GEZ zQkka<*W!4!(u1}ZJ-Y(6t9m#%B9|b^#@!pS;3{MdgHgJ<0zDH1oI13@BvC=tIEb?E z>atDC;!%9hPD}9O7?bouu<{KV98hotSjh@h&jJU~TNzw*m?FcB;FP+hv@~Ov zV&akWcrMFRqfK$wSP3v6K!F1@+w63%m0%q+oXC!+r9p)4)S&AJ<3}E;bV};XW7+!` z1{QHJkkkh|o~(5GP1DPS9O@es@{ob+A55vEfLS;wH{^>c?=)EINil{e7henFxz-5) zASaqr$wR{*hE)^;Bi)TX2n>utS_k;pW*?};wBs9rz#@z}WX-&o*ZaRe2Z-)PDc@#JAi@u(CPP9`#nFk@vSNiBhW5@+eT&J zxIqZaEJ`rtpG9iP7YRgIyNzCR4gEr6QVpd+PzkUW=SRHS?{(q?`p0#B1ZDQ5q6b2u zzP$d*#p5q8ymGOWe#1q)4ApC&&8EphlMKu0Ko>pw%7dvlkd~@T=;vU0FsKfE9p?U< zO}#$T@6obqrYlM-XCywDKyzZ|DYVotEE4~Lk}yTpbu)*ot1uaZpyiQ3iFOoW%oQxX z-e4(RGuRmY6uLI_^uM1VqP}1hMRT?`O`&ebl=N)tjfA( zOk)kaLVIAK2xZC@SAm$jF)a98A%-YC6+$}!^l7tY4O6)8HuO)4K{?SK6^BJSV0BvrbUT#XPDnaXmNs9Gs1TN&fpvzW zaidLRi6FkC5%spcCcx(D$8*&Puqxe{13Ng&^Bt@X8*dY}b0eYBp!hWAfdn6@L1W=Z zd7z0&r{5(rM~UB{9JWe$R^$wdTw(PpI6btPyyXQ`25=DgXP}kYY?b`-oc6c}c26Ko zICRJvByBG~7-&zIyd2D!h7LSPNxz4IvuU&@`_`JR6>rw!1QR`okR`v^_zjEzIze*1 z0(TQEi&axl(~N)u4g((r#lSkeQ*R_G#mP_8(pnFY2eY?eXK5+r6 zwvk-}I|^7K*n5PR>m{d}0-ff!8jn6~#U8CNWzY+Y-QZcp(PhpIL zi2=5L8kul`TbcSQxRouUf?L?^@d~#v+v5Van{H@b@ zy1?yrU2Jo2?a&2ocj{uw!SmzlPIm|GK}EahAd=nQ{#fERCVqt%5aKj3-~@&ca}>M$2e-99G|tmqYtjT}%+-IQqv zB3gRnpb>Z&nDT>mD0-DIX%q+|boNe8Jd}f|_XkvDdH|KCH{mPrLC_EMXf4YLvhrhT zig))CV|0l*Xl>X~9*I7}*YpJn3}{^@*1*ci=8+N2NcD{(J59K9Nbx3}h?XsRZAp0X}U>szGhjLBstuQTCrL?36OGHHp>7)0O1t4}bgB2mA!U_`j18ec3S88R~q zO?Q?m)N0X}Z~?%-8qAQm z1`fC)8?;tKAsF~MW@qYfA0+b}tjjqaagHmJy4l6FyW$tb7k5)k!Q zLE&P-g?V0JVY=vLBttegTmtA&W&(Zzh*V}uH&(-?2Ag(YuEB((e(RJ>zcTcmdt=6Z zqDWr=dH@Jz0r%1xyiFbem=D?e?~J$t?EN(P!(`>1E`AS%VNQ(v0Fy|0O~xV^;RDZ^ zpPWEh>K)OQ_!h+SbQacPidPF17w}K4AY49;!lbjFluq4*=Nh>B0ZEv0d>6`f@CxQN zMFK^kaH(3mM!2D=H)jv;|yio)tY_s07Ln|s~ueeNyL)vb>1d@BzAj3lZcx%->|bH!a>fiKF=kmc{v z)e^TTgvD-mZ4htK`>Wfthwy>n+a2!Kld2TW+F|t`9H+qQr` z+~5a$D_n5tlBxB(bWa%gI=)qlSK$l@)=<<%z|V!rs=5s*sv!-h;F$sWY(T71gL!Eu zsFzt9kgsnoc*IJLIcNset zy~tbgMdGmN4QA|@I4>d_Yc@IGuaE0`S6<78p~gbVVMWg)0g{4`=8dSy2Q4H+hL<;? zNq)V}5iviCdw0)NVGkTxc9W?p?uRqwJ~&nGD()&y6b=;b!~KDx2o6-o2|Yy@u?Lc;Bp<#K$c0bM2a}I)4cQcNVVr7KTTAuo3!g><6WlxV zF&xDeJ?6E-5_rwW^^CtXJ-0blk!2XNZqc)lZO_=s1pe|aVV_)aPoXw~|9L}R;Vgd1 z_aRvWVFt-9y8ZK)+usV;d`x4(Et`Y>7v!K1Zn8+`6p3IZBj>SYa58~E{% zK@C?jy2bH=2dPW$!@Vnx04MDRGdWV&0gu#C-0#Hyn+%2sNBm4ML`uc!#$*bNG~I#; zc-LdPu`94pXcqtzc|bd+Js=oq!rF*3E;1tlV)Wer;yY2@Hv|wV*kq*kwYL1OPQp)U z<>aCt1T*EQxl51HgY_{p1yCVj_MfZ}&2;oOn&o}eKZDEYvrGtP(H$lN4i1};t*&hWoOcwSQYMgt5c1nHjLsp{(-034B^)|!=^DM>|fG50{ zGG6Tk)&QJw?H8#uASxMgt7qxmh*$e4(n>uD!UYrpQK9?o)F0AE8719RNkA%TDI@MG z>Om|bKms8_zq!xKLWhu1{2CjUjf0GfeUOLp329OSkp!8lfN0rc- z9#;OUboCu50oXvw+{_h92-3EHjBWw9akF6zia1cBJ9 zeGjfx6YY7!wcJFCC}MHT9SHaja^;bubK|>&hxZrw|5S0e{+}#N7N>xn$xqg}2H9i& zgpbLBuV0H;P*_2>9cSaUh#b-xt$xUX_!4|CaKFiSk!chmuA|rte2E7Clz>;h?DRuL z4Ym*OP}c(x8xq0NupWS>+4+rNA^HMe{COlpHsQnwns9dW?{T_`Pu-YJca0t8#HI*# z4mWF1sEFe>I!n$9Y|`cS10bbFYM&tmH6;$H&h1f0vdeFP9RpE?Bv1e(cv0X>s9O7Y z4gJWBNF$h(58gsgTm%O(Nb13%>_Gaf*fdj}4IsmLl2pwif zChpR*A>4YvUZG?}k~bPQ;D z-lNA{+I-b{t-}SFAUk~t{ieXI!`|71#E)X-8gU{oCvB+GOgkaNKeq%XR%Yo+r(=49 z8x3lZ%nr)Y(r`k%VjH8O|E2NJ`w65p0v% z1_o8@g=;27f|Q}jk>a12QY;Xz7jPz{l#a1F{0_M1knw`wkS#kZXF7O%q{{3?)x4-x zvFPdYqHPI^cAl9K@b5}%1S{QzI!XUQ<^rj5QIt@$;MWRdME-i>kIz+>a- z$r2UZ8f>A!Bn1xN1_;Pl_*o$!3^91I0R#kDaAO2S+;=g)CG_LB&u)l>s$qF>ann6* ztq~(IMYd8Hp#Y2(%o%;C`RJdaGJzRdrNzZ*T1eX+x-cT2_RMof8Qj*6&}H9Nn>S+A zAZx;?4nsyjE$eIuzhO5-VMv%g3u&I#{nu@-NM?x*pmvNQhqG)iX3?ud#v3~sqSBy4lZkdEI zbl)KMVdt4K;abPqfeiRrX;Pry_>3`SvcP~sV+9czQO&^xnEX2=m(n>0_;Lcgi;S!X zR90six*P?hK|Iyar}IbN0uwIvKfWaTB4RUp8ojG{XS10|bMhFV?=j`~(~eopd|<*R zO|+^T3yk_nA5~zhb{k0wmf#TZI5ga*|5J3j3Ja{p-ttFmO*TGZg3*8?5$NS}1@}2f zQXCeHG$4zq409P2YQTWc@vTw|EfNvO3fl_N4h4=yhuj|$V(`B+Q}q*U<)@i&xx5Fl z;5cRd8j3FcFq-u5*(J^&*;UCO6thxR^_y`+N}*{rp#l>M3c`njXAuh;)1(@x4U+-Bf1UR!mN;9vRIXMcWfF2QtG5SFyV!OgR z5nxD4w`OqH7$WYNVv^#veO%|qgD6vYSDrz}*XcX4g=q3{aUN2t!qkMpfrIORA}no3 zhur9%!u`@XP8IeWR1u;GS!eM}_9HQN1Yl(IPOUKksNiuZms`rptN;5RT4Y$8QSBOj&&l1s56 z;cNj7A7d_rfM{20?ihwX3_nGi&G@Av&TrucYEPibwI8Au9Yhq21+(1B_1Vk8~6h((?a;M1(EwD%>p~B5X=^6tE6JkBg5PfC4&-Q6O@n zfaHsSy0bPQCF}>Iyi6e=C=NWAM6HF`qPVn3wb3G(9{dmPGw+>DG)`Yb+nV4R=Cmwx zD!|4OdU#*$KxU{z4#<-O&mHj{B=Ft}Hi|&w0YCU8sdm?FA0O)oqBNCc;eH^rlf-*u zTnsq}8?29@8$wtxs%Ar`pfyNajBN>lw_0CK>V}_Yu2H@0{nUdmILESu&4_gBh6`6( zT0onv2K2*um%Ifu+G~a+Kv|REC1I?mj1~kutg4W2Fh{4px`I`up7TD;t1YJ-fe zoY|mvQM@)dj^wt0WQZOhAh$QFuzW_=U2W7=KO98*&|_&RJYL04c9S*J`utWrwm0Bj zdcILLBoA-%SciUIf#}rzuoc6+Xw#DNPB_8I*cSqam|PDwvLQT`76YJK%y%)HCOKke z9DPI@CVkAQ0B0|Fv2YvSn3n%6uMRVz-XSV8xrfP*Gm-M-CwN6|)_O6KNY8Y;>v$fZ z1qV=4161P>3Xaj=LL;{kjX#PDw|5*;<5Xe1a4#G|cH!>?t{Gcv0`4I9m^8_5vCk<( z{l~Z=ofSh3j0}`}r&s`*MHmq1c-KBmG;2yNFv`5fzfqT5CVnSEwI|@GfnN~?Wr9q% zH^IsNg_0qR77R<9A^#m==?Qmri@TF4a-hNi5{KpNuL{M(A0JP^q*IuMjTgH0s038f$@#zy&K%l5bjlRU+2sFLVVR)t?d z0*#Qx7)sSg*{(vvUtX@xdAEhS4QDa>RKU@>Z!^4+bCacZ3B)76N!Ux$+S@ARA%h^C z(x4GQ^Q3`Jmnbz{fe0RiPCbhqB65)&Bx+9(eY1(qB@IaCQ~~F8PqThIWIw51iF08x zUU=aJdajjDmu53l-t>{QX1&LLOJqQ{8PBai%?v4BTQH{&FLyen)2B;Moj82=XVZ9j z`oxpj3t9W_DqY#0I+11LF4t@%2lv9QBN)KQ-pT-c4-^_UbxP-+)|55a69j&A@w*CdufX?uHHn zE=gRS>54F^MvjjzmOAw{6aIZw(`=xUVNmphZAjdQnVXAeNy$oV>480+Enxl4u0S$@ICYRJ5V>l^ zy#ul{CXr;5>wbj*Fo|ez7`tv=pN{$n>bEEG=>)|O5FF}MLCH`%=*ac2C?f)%gHCP< z*IV3e(5)bUfG}O1OkGbP#cUJly4PJBW3AYDh7en6j%ROAvQ!Yd&q}rX*`oXGh+75` z+)4%S?QQOJkc80*kjUp1=N*yG6|4O=;3 zHpL+1*wF?bI25!W0^7HNd}Ca8FyCHwt^K&RuP|!6LM56NTH_GI#YpclCa87x29=x=%n?hc=>t_qer(MCY;d4Ic8y zyxaA#?d<_~XUt)5z~%NcuslB~sqViQ3b*&7Lx>{y+l99gj1J5S8eyO9r8l8kfBjqJ z35Gp?S5dTl{ZSLBeYaku&{(3^eeYqv6^~LWY~I)vu$xiF_Hi5FR(JKFwh+Ko2oc6G zL;@VR@2h>xmaELZMVT1mkQF-+lr@*_@?}gKM!fsO#m|9RdW1X=$MJRc0oxTY?#M7d zO(j(F0caP_!~Yqy!h6C8Dr{Q&u-g@s1Y70mM?r`r%bQKxJW3@ZMHz2}PoJSLgw}(h8>hnbHDcb-@~e&>=bdI&1ZHq@Nu1t@kt& zs98jK@vvn)JQyY`Q>%IlE4l+oszNg?p1|S|VhbP$5oI+-AxaSW+M~`Sr(c~#Sl)CH zGLbI~hMx=Z1R5@lIP4xxgi-;&ln#p@)Ev>y4OFPuPp!rIfO@fm_?2uf=nE#cPL>fd zCa~c;H(Sk4&b|yH@3#p9PI3hx69N?&%Sof18CZOG(>8iv4F4TC4Mc(PZWY!~YZwdQ zL~s@st!WkeCX>Q5HbrW1)yWWT07tS!sRIGk83Wbk1_(CFMaHx>a2M!?iC27*5~4WQ zj5UP-i^5@K<(@D^oh5W&I?|rmLdZirl-uokwOeN)Rz~25*>QTWXh*8tVHdhk^+YnTLTeIHTHI$Uf+ z1SIZ0O(p^V=fYjX8?T)l#iI;9Ak8Hha3ArHaHTnd$P%V#u1~(<=l-GnO~|J;lFqT` zo_qTFV^2KYAS2P|0P#uh8jN3=*LqIzHnFJJ{8PCSdbOA`X$-MO{$WC>~nbbyaJ2lGw}&RADO{ z6?(dW!pTBo%MFO|v@AoT9N5c^)eH0vq8iy&nOJL}JGBV^E9}3(YA6^{%Kz%P+V$rM zTO3;_wsWGeyZ9j3(4EDB9-ap|jDD3p^a$J_+WnF)d;s7otx3m zGb=~L$dh*9oD~|QSclQ?lrU~U?X?xI`-6v)gL0E!m&a3)+-rt#B2w`?Re}w0zq&v>5$C-`mj!PB=Cec6U6G~i{?Md``KHz$TGEy%PDHFRM zn=&1NU{qSwE7)_!@w9^^B#LP&V1r|XCUa0@nSeL)F41q`S~C{?D_;F;CLd(-i%kA0 z62W~V0SBYzwW`3<3^BSL?*_SnY?nS8<9*zyhtu{qlOTyA)KsD0^rVaECzx#piK?sj zTdPU*%ebB997R~WSU{9ng(VA{I0~{dP!G3Vmr|2O<^hFWx&jSvXkOgXcT3 zy>3TgJ2tB9hx|EGcu0EIacEUH6{qm^z4-nfAdNl69oTG#$kIj845DoQ2+zqX5}yCcuHk2e1(!B zUqCbKy{mr=-Hj9w3mhaipwhbhz$ zUy~P44rjSNNBzw&f=@L*WM*(ZWo}<769iTd<%44)*Cca_=j$M4h^_Vw4~+Fvoakh! zJdfvnh0;En{9@`R@=Lo`S@bXL~=4j09?$=6Bshjgl5A^j02W7 zJMAFH_ve}eR-`KPTqcY7_5_|COk@ZiIjDI~2Z{{7#YL;8vuUPB$$z$^+4>xeUr-6d z0O>b7GqPfTH7m}B7n4mrGlyu9|K`~HNl#r0{p@32st8k5Eu922e{wNBC`Np`4i3s2 z`8HAnW;|?i3Jb-@Tg;6k2Fzwk$WJndf)g<=+);U%krpliUQ$k%OHb_D`*1;PGq!Gw zyUroM41=|UD{DWNBHo$f`kW~DjI@ZxOq1Mn6U6NEju&E%i4}#bg$9QK+lfQ|4I(%E z++<AHlIa&3y_$4H`V8Mx3q4`6YC3%S50q&JQ0@19!!l`*eu+34|8gtbVuvO+8KbZ( z45%AyKNx*fief#={vujF8yxFpo03zdnWqA7#`<4pL#C+fmyT9ly0*J<5QbA}TVYB) zcBn#`!FaDgjogV5GeC+b3z^m@Q|si!%*(FAtweRL+RWndyH%vc0g)8uG`HbRb zJi{nA=IFm6lR{3VjjYhc8X^sLbZARh7?O%@KCq`jeCJjKaevWcC@8mw>q{(`kP&(* z`+@kNwAp&k0(AHfStQ=bNF!Fdx1?o0JZt^SXyR{jEznHj#-Ju2w_UY+z>G|RU4j4P z2;T6=Rjd_3ln9{qUW{MF^AAG+Eam7&2q!`h7s!l&wVZA$C?y%8w!bQUR1UXtw%x*ecpg`5MpdS3{GI%63Y15wQMMVUJQbaa?#XsZmvgL;t&DfVt4Vjuzt-rEO6k(();UQ@$emk*zX=H%_0)20x1{2|m`Z;Q~i3rqprij|i9eVH-`V zJRuDg4E{%45I0KuM8u3^hQQC}7~Zu9dhie+xuV`fQJ}%e=8zDU97Y= zqXD0TjHAS>1ai*?qb4ZY@f=9`Z>wC3IW$6?O}q{ZOaAR9*n)mc+7}dr58x_BZdwh# zs%^Za3eeoZmVvMH#s402+Y@l#r}!Bi%{YZ~^4o_>%5zZk{9Vs;% zByZ;E_J6=LAf|vrVkntcpMa#Rm%8id(=2Ft*$-*a;^PPT*dlL9qp+D1ko# z;48SG&kKASrJw7?iK{Nbwc0C3W{Kka#ldE`1}Rv_>k3>~J*OEi8&=lo%>ixBbrwnxljIxz1d>Uct?;~+9&2Zl1VV9|U^0S+6? zVF*ED5yx$^0WATt(z;PpO4?GonGKhh1YVjm=6O+j9%+sAW#iGVdT zpkWrU=DX<(hx^y@yKGnqSOrbVgn^qF`pY=r)Su+!S7^S|ixPklU68I^rFOryM1x~a z$CE-y7QTL2hhGc+09sgs!~!%b1F58^WQI{y;A9!r(vk%01X!#Di2OmDw809=Ew_zC z|0g$c5qi(%k|2;e7B^gJzm8RtHlB-x$K?`*z1ylW6*T>?uf+Yw0W}L4V;Oj1yMwjc zJ3PaPsRKsu(yifW(arcOI>2NLm(W*RfYJTPl96Yrh=~@GC|!Bk4m7R7VUWnZa};p6zju=>oSZ`vsxNsmG`y5(D z-KULeBbO0n0pFAmV1O_Do)Ftmp10n=3nLcx zDWqWG!#NQp$jX#Xo>(}s;2k~3>mTfT*O(6IBgM8cSMdV;>1R5Ps9dCY)C|1U&I9*QE)TE=ssR8Gg)B*zQ~6H zy@e}v7HmIU?|W+zb-UWX8hx5q-_GPSO#T9szsTfKCX9$-TRwh>S3k_;uQT~^Ce;0E zgGBUmy!tOpexJ#gnWTKLp;ThiXa^HQtft1M0(V2SoSsH&uHct&B*uH=Ea30LGMUq zRK}sY@Nkt=FED%=2khcjN9FQ%pW~sosPtYs&+=kFcZ~1?$M0InC=I9I;t*IIyqiA3 zF}Qegz{NO$S0~}JG#tW<190&z4&lXfoPMkAE#;DKarCX-J{*p|J&3~rrm4A3zA|co zS9z#SH!m}%JJ=SeH5B@Xtjf&}$Vu)cb=(LvLPSJ*#q1O@s z8>a8SyqO5lq)lN8SKiSS)xzv?F$DndWcBxy)HrG^5>gF446KQliZADDU6(E^N zr?pVB$(`8Z^=$Cj^NJWhVzcld!Ekv=CJdEzco{*JOecfxgNekhM#xxX2)M@w>W(XY z>l_y~6+^?eE9>BEQBnsjRo%dwaXs5Z1<#-7|&pg!dnZJ5BP zEz{RrOa2?*hG5g1ZovT%=!IBFTD?*eXKfuhsce)wW@b!fG~es2UZBuJHzU2R(UeZU zfegf1qO>X!N@QZasoe;+Odh)fP5BlbvID>RZREhPAAt%R9!!5G;ZjyBQF;VCH z^~Daq#4kS1Ei$_N z5-u7TYtZF_dj>NJt{Y?j4EK8C@fbH(fV7UjM%Em&hkvH{hVjERTH}sqG0}B`g(~Q? zon=5W5x_j)Qt4b$dZsPNM5aXIfr($YcNthg20HjlGnXmO4F%`$4h8wUh|OIxS2T+j zdd8Y=I+co@;UQnUS|@eXlTxE1@k<&Qo@FawgGHs+p*_W7r3kuMX7oo)7DMSFm%d3$ zh;HKjkU`5XtdAcgw2)DEVrt&!=s|FS6wA8c_VWg>aRcKjZ?x>O z;B|uqjyI!r1IHFjJhA|>2LTDV@&Pgb4J}j(50#1>L{hz6r7}&0f3(VkxK3+Y^Oi+Jj1I9HB0!dn1HI_l zBDXOS2@{`fI0XTfT+Jmy3CA-^p(HwpXSTX=;f5^ak>L8L2oO@aLfuMyzm0!Kw&9R1 z{>?NlUi_1-TPD^7Yw{d-=Z{9rYzdC%fH2B@^Bbl{C z1FDvq=21;DXs3-L@cR(h`t62@ErwDiS=Pxv=Bg!M_=A|H=m@4Mx|dhq%H)eozQkmf z$(NZtizKIpe4fv~fJAE<*4ShS17!&1*ueZUR|-*x+rsk)N?0cd@k$uQ3-Lu-8{~1h zHd3yq$YASS0|w9Eg!g8W!>P|To>Ds)?B7IdGs~rF;S}bApuOOyX#TE1Zba_V3lC=2 zksmQEu4FnAsWCF21V+*T7ebNRKuF8%=1QlT+ftaWH3lxP!3P58g`_H(nA=9vqcwdn zgDMK7giZce;bv3lzzI+&fy!-N1$N0}&ZTPN56qIQLI6J@7nbFrEiJ7Y6g@#xW3g?~ zOzMho=!u1;N}IDDSp>P6=mPqf5cOnZ#O;k;HcmP36Mr&_5Y5+$V+b$i_?AL>bPTg5 z%P15o?cNY#8ZFS@CFD!~+Dshtkf`yFqBmoaVcU$~S^PpUSC41%bXQcF&%sP#9c&7i z=aU!$W3)@K^g}BZkjYsiU5nmt7uH1J8UQo*b z4EiR8ZQ?57x1NR?&Gnibv}SO-E;DjdVOk7wgv|_EfP;le6{J(>>-C^33=(5T5Epr- zb(5X}P+7q-)bj_h+3H2kS%|AEMAU+S3G065DPz=4R8VB^Z2}@$N)rz_e+HL?MzgLE zrwthjX8Zpu0g>%>o4pqdZ@91od~voLhdt2TpFZF?MxC8z(H~o6;enww78jEu%sd2AyGiva&K^fuDY)eIlQrO10tHmx z#8J?)N>iQJ_<~UP8I-5qWFDnTi#X_xVOlzK& z=Zna8HxYgEkBpK7l>HS6#p1d$gT64`u)>y!&GhBBSuX;rf;b9b8MN*m!vlhsqrge$ zN`%PJtq3%1_u#tlpaR+rl$X-y*9CPMBI3MQZGj#J^?{bMBG&K6>CSb8rx8K&G z@+8anPT+yr_Cc~p3K;~!^wf|{k_=BGrjE{OOEF>|i3G*D-&BqxJL7In8j$9AK*#*% zAs9+(U7ViN=^zZ#q1#WLz$3_~_Vm#06Hn$O1Ftcj?#)=wv*=2PkuU9~s_|K7tYE35 z5gseelWL&}gZ|{&$B4e3!SqBYaFtohhfq-^2Hpl?D}jyl(@jo6U4=tx$YT<(0ofT| zdkPn~j%EBi*!FX89LP>J28IKmT`RaQBE&&Ny}l!VhH)2Pdp`p$cAXdi_8vfzIo5H% zU-n=f*kzWrG(04r7lpy%1QbF}5?>(FMJ*#b=J74IpPlOxCR#%=x?Lx4OyKTpayT@u$c(K zAcvOT!BP_J<^IAccGrU`9MUwvyp^bmA!mrFus4L3EQ^zS^3W|Ee|qW=12nu~8#v#_ zYg1ivb{lomo5DvR60+KZ2Iq#9xrb{=z0HMQ4VB6X4((>N(ZL&RH}sWi>)iAscoMNI z(OxF|nBe#S!0kvh?(-~)8e?%UaE zZ~+QEM<2vhHsHD%3R~b$qy1L^v&n~WF@E5^-Ge6K@-ww$up;nJy`O|DUZ`7 zW(=PtzltQvdAh*OR(xDec?o9kj1PpCa$>Tm`8cRzZ~`q9bxrX(IY!DR4KRIhO_7rX z@PF!Va|V(mjob8*Q8D1zK@=2h6B3C6vp|gWs?+q0FjJu>UKb>?ZUO`NMZY{310!>+bdGtFluHU5vE|XjGOpbUVSf;40?wGaF@}fGei@jZP>?!V?haV z{H23Rb0nl!dKO>^!=Q$dQYTBu5*=i62A`T45MVlF-SyaUrPpd!D(Bg4VtJQ!nYU;0 zgNLlT%>D|3LT8!b|AT&#EvXPxE0qiDy2&1-Gy8u@UA54@HtI?=WHd)K;xwQndVvY) z>QIwZ5uJ-1#m#7HN=iAz>xn2=Q*@TSI>%&KsTJwVNp@%p+B-frPFK{CiIM0lxUJ!* zKgeTrr-X}lr#qlBgs9|ak&t~28yg$#tJM=TvzbHN29c73-X>_%p`{mzV3f=%_50ig zLU+xSnm{#Kh>-=x>HVjUP5hVJ)PyE5|=3R#v^!Pc2uc{&-3kBKBE{VCVnI9si^QUDqe_PDix|;E0s@j z0%SYIX-a!x)!;z`)|+*FyHL(c=z0c5x*7`Zf(T`ST_JY?uleG{XmlKHB>?Hq2+|kv zOXxJXF_OVa2jF$V*%n=%v$bOh-hrby*fw)A-z?v9u*4JOdx_hUtysfnGKC@tA`apz znO+?jqt{!r=%0o(+K3zrl?nZ3?M#x)peLLpou)Q$!s^Hqr|@yJ*FeMx+4rQ>gfnd) zSPM#!oDQqk>A??OJKKEhekupon|q+HUp1|1zis8yF;}6fT5%PdFJ*b864tczS*{dg z(odYK7QZJuU?Z6z2R#$0ppktt^;(8b$7+>=pCQV)4bQs4 z-e^=ym*-!);0I~B*+&#bG-eszv?ZB>(;@e$9pE6f4gV*qkj5oL?Z)ka#sd!x;C8^U z;|3mu#=)*ej!Y#Tt&Dw<+6DQt#W)n}kVt|$7Spo;l}O7=`Ks2dv2SE%_&?WU^3RZf z-3OW`$1i0IbXDCK6+{o`ia;~?7!momDL%MqwW!iU>?UMJ#3gtrAtYoc~@!{HdT%ZO;MjC6hC5mT;k z{rlmk0DJ(N(ftK|2Y)C`A{y~J9?wg&lRON(a}I$ZwKVA%+r*ht!A;zQt0Kx_eer)| zBs|w4KwQ6O2Lam_fsg%!DBpGhwMBf!4uv+A#%VErZ#Z*vwOKS0MmDC8KXT$BZ2D>T z!2>>Wb`Lgb!Fxn(=vP1J^$wH8;UhB)hdF&10j`>z8Hz$VJ4ix0-|sCSdoKD-T#58^ ztq?Yz#4mXm35fR_`@9VaJizC4-X|sv9wTxv4=V=)?xNpCqV)kj!MT~oE#MiiC5(mM z3Lq_-_0W*7gu230G%~HbHEbK_X1oYAc38C)(FHX8dpVk1ehz_A8|+k#b5BIg zr$X4T;R34=!*dOmHU!_pwX`$?K}|<|P*YRmKp)0&wG`v6xO%{*_=n+#cQO#MS00{1 z@v~wEG6n%;{6%Ad7ReDH`lR>(kJrRl5V3&`YFTv0g#L6k;yA(ZGGIg*4z$9%isUN=bw1Mo2_1y5Mr*Rh$A%m4>^j*Hlt z{gC%UT0C{CU6-YBU?-2XM1n%C41%7x1B`*bt5rA*dbbL`#iIOT!d=Ai)+!&0WlbdL z&8(g74*=$DZEHL0M3Gxyxw^ODp3(5eVOiV?1DVCZk+b>7cs%! z+~&k$c0T$9pW(tQ68UT>#)6(^#ujJH-}iG!C~P>y#F{Ej?e-Egr;@+3_-O$HP6K7c zqhZ&PlI~P0KgrG!-{f?pX{Xp}bP7uo>o0VTZ*5L>g|(BDOow6;H={||?vM3Ysr*#d zKTpLs60b$d=g}Wwwle?5?}6*eU(`Y}uqFPj zcULl%kyK0jSs&ZtbEMJ7?9eg=53(RbWJ2;S>-QSXBzh1}BQi2kiOIuE4l;R!$)iZ* zljcj;F)P)cZ1&OnnBy=L0+o)Ij~?UI`e!eAy&+ z7}Ur2BIVz`g#(3y#ixqV$d1uTglw4DF~L8R6WjLwiR0gqy}vqM*t>u4ZltgMAG}=m AZvX%Q literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/exceptions.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/exceptions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a32286709391ea4d11d4e6a1b438fe530d072a25 GIT binary patch literal 7721 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 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/filters.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/filters.pyc new file mode 100644 index 0000000000000000000000000000000000000000..767119018d372579bde65996b94daff2979b2c17 GIT binary patch literal 39053 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 KQmg)m|NnoB&<212 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/lexer.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/lexer.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ee27ed11f7ea9641021cafda2329d8f3cc4caa6 GIT binary patch literal 25802 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 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/loaders.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/loaders.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d8b6e37a669827f7f11978df2c719b4eae4a041 GIT binary patch literal 22382 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 z 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 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/optimizer.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/optimizer.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e2f4c1b953bec443d99ab171a2a859e6a21826e GIT binary patch literal 3289 zcmd5;>uwuG6rQy=N$n<0dZVRO)kuIaQe~G^0x3d>CTUQS>Q?JON-9`QcE|BL>lw2% zc4Cz9r~Soy@Rv8?X?Otm&RNHC`vPR8GdpK4XU^q2XQukkO8xEMe#@p5%4^IwOWihgqDD^7B&Ak6X{;wrynERa>o|1Tn&b~ zmbtYOky#Hm7#Yv~5iqqY&sK z0Tx9SME@<2`w)#6;xrI%0&!Lmrxno;#3^tb0Kg>H{ep&Uruga;*ptB}2n|^cARwSt z4s}5%AigjR(MisM%aLNe4-~Bh1_*-ZvJSJcHq8d9<7;SMoF@kxGtOM*8>Fuf(U5Ka zDmvPXv%;DIV#B*;Nz%Zi;KrSy*XkW>Z*A^c6!=&bTD7{^=(R~(f6Y z9P0RS>xUno?@$x(6l$Pp7Z1hjkJi_lk6T^?UC0L48cuxAn(1%7RpxeUrbrX>l>O%e zchGlagQzYC5t*A1Lmx4lAcrsrjgo>&BDl6xs0g8?>{qE2Q75EQ6QbyZC^6yw66gx3 z2C9Ruf|fxmplhI2&>HAE=mzK}=oaWU=mW8TN4yS2)L{oRGDsC7M#c&{fCZosb4@JK z&}K|T1hq11WR%l+w;Td9FPSc|^xzGFpuU@2e{Us{+$eTU$K!mjYia4r^LWv*<-r4&KnN@h+SrcbfVQSp3 zQ~wYmLUHnmIIW89pYMw^xIGm8t9;t>^mLpS{Q8I3!%T-=?`}cwr#UVYLj^k3Dn(wU zy4h|}>^Nnprbb}O;;@<9DoM+BA$kP#}LqurtbPBGO=sGd93zyX>_m?ht zOADTLKZc6#9vTte4OW6`a6ecJt_6$1a;1iLCAe3Ditt6|Y=PV!8UnzqwgzJIa0;+~ zm17?gc7Qa(9^MfszF1GNs&w`Ya+Kh-#BhojPN>MQ@CNBLIOiz(+wa}~xa*qiQQUgk zSkB2dKSLr4_5~8QIHuPyhI%-NN5&T;=XDy@ytK!2+;clG_zALwGNau5qL^Fw(z-dWtqp6YP zZCiLr;c}ZB`A+)`m({x?%KKt2HMel>`Q_Q!J6Z1a{QNG}fD6L_ne-_hmKX8o-v58m z@^$(Eb~vh0iGQUCw| literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/parser.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/parser.pyc new file mode 100644 index 0000000000000000000000000000000000000000..274438adc1219e3c8076b156f6261642313ae4ee GIT binary patch literal 35781 zcmdU&dyrgLUf*xej7BrkNF&RZEZMT$Huie(dL^%H*hQFKY*|_iyR)L@UGJKho>upr znU;FGM}2#w(PBfu4*Lid9t9N3BM`_2s0|5$tt608kOHbU6aflSge3&30)OPeV-r#o z36+q~_xro|_MMUB-Q*vSEccmn&pG$pbI&c`ynXFAEFHR+EyOI}oMd?)1n@-ktCok?!)@G6y zXQFgh(wj}z_9QRvNowidq%)m#b|;;gq%)gz_9Puj=9137q_aQi%qJ^*l2>cVi*t!u z9!NTOB%Omv=gy>aSJF9@tW3L>#)p%1f3nO-?oM7yl2?=DgD=h}og>MGg`*n%kCE)D z^WUXz|5EGJiS^bnONTD``s#msT=d-9dM{l|`=hKrT21Stl9?Nzl9nj9_=FO4?1bKFrmvkNuJLKbK!b_)Y?2d z91ez~!iPTIrn#k4sZT;|Qx)z+eBy171#$4*h%U2Cn6Cdn|s zk)GaN_HZut2JOqE-4vvoqqN`2T)IB&_D9aGwc5jh>%0ASZ-ci|Z_C5M+Gtw6tgX|Z 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 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/runtime.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/runtime.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9ba562b98c3f6d803f5c26db807e8b92744d16c GIT binary patch literal 32008 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 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/tests.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/tests.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ebda02eb5757db2456babddd7950afaabd3f43e GIT binary patch literal 7093 zcmd5>TXP$?6~>B^CDM|7m+izCn6YEJbykkjx*4`^GFI$PJC0|%l$(~5$!fI##g&%3 z>;lwf>~uPlJhrd>2mKNK5&bQB=zH7m94wcrqegD}LdpwZvA7(3IQVeRaqS;Vjj#Xy z*EkmCuZH|%JmycH5K4$HQctKEk$R$w0{+!RIwJ-((X9!O-e*NRD+Y6-JLlf#M0!dL z=0$g23>HLpK@94mTX)|uPD6AXLVIH8v{0wSR~U9t=p~^Sxx6g&8PPo})V%l_v!4@c zfeYt_s&nCjPz^3z6zVh=E(x{Bg%zQexNuphWiDJ1>I@gI3U!tXZwYmd3vUZ`o(tE6 zy1<3&LS5v-4WTY^;igb4T#zC;Cp3h)EFNlzas?R#xrz*8yoC%xyp0SZTtfx{t|Pe4&(ThkSZ7AJ<>SsL_odNVKKteRljof$ zvX>WfkQZ7iZKEVLek1u8e$QJ_EMe!7d>RdhNw)1O>Zo{;Dcwslty-jpma42iu%SI1 zYP*OxV+(ZPcVm}Okz`hH>%!HTGpPCEy^lUuKWu&OBfa<0?U-hxX9mwY9Ieh zaNQ+nX*Tl?l0e&0kx5&Ov`l)u;=QOyqOBC~M&?TS2@RCch_oTX2|tI@UX+fstD_I* z5XowPU)wxS&FX$$?1oXHqt#xKL+DJc?j>1t7(V{VYTS>~RA<{d{9yIPZ$5oWN%*vg z2AX=ja7rboA;2c_jSBW zN)gGUDxs3S#3ZC2I3bbDMuRO~_z60c0MG!8hpnN6?^A=zS;)gGQmtX@u!*`cJmZr? za<5Z8ogB-D$9m$c8L`-5?KeL~%M(p+V;;x|G1zbPOF>k=PS)OUXygz3##B;p! z37jq+srZ)Uee_*8Fat3ZFavkMDFSGa(wiS3Ie}8rd|wxF1aqcT5I#m^S0skNO(8V2 z@qBz(z{j*wlKQxN`TxRZG=xd_U$EhC(~J!Z_={t(If+=_MW17oCg0l8u_gNr)XWCt zQAVLbrx1qW5%R;4?%@X@yIA&3`z# zt{fXCb($snvQDLW%zrrBAsGbegAaT!KVNl0Y19iv<0 ztK4ZS)q6 zc6g~o6s+#yo&&RcpJfZe^E?3D`7IzWQT+m~Pej$|-;XqGB42jO5>7Jw$}#rN|F!+d za&-bjj2yPoxZ)ik@!(-uI#pq~tt}c2!jO07X#~R%TQ0-~+`cJsl<{J*!VdH)(25+Qy0_VMLPg^^v%sj zk2W`}sK|Y`OVKfoGKoPkWN(zp{l3nqtRN&5iY?YMs^UhWnPW?b`*HOBA%Ai1Cn<{aN{O6!o2SMv zt?0X4=?)}xd~@MDm7GjzR`PGq;TRoy_(1=jMZ&!*`6}pBkF14P)`hJ=} z(PU^O%>(7?5zCyc`UnuEP)qb9z29VR+Jr-yZKnt%Wh~U|+E4GV?P_on5KPU6PHY** z;*ZsSHmd8Gw2(=Q9LmGxBlpK=*?BRGc*AZ(6wPCVV9GX}$}_x7?p0ry-^nGc|A7TcVqQ z4go!M>oKSkM;u`-wrS}6n;Z0f3?1p4i>DAZT6vEndd820TT4MT>5O%+@hq~lYF z&xAYN3jRXtq{WIEj=v!q%2z#w0@)fk68kDGGL8VTN>t7~cOh?<4F>kzxWt}{C2P-F z={!PdbaJ&bm>9+J<;^eS-Q$-SN1hB8HxM5Y9;l>0S9Z&3H8B@ggrUk~STMAC|0gI$nN0>RtaP+KBx^LX0Syz7z65kAg3CyF8v2|-H1g@)VnWQu zr-x$lq<94a@CO`#4}MJDDsyGLu7J&9a?Ar7CLlTpXrlrWFd#=aI8Vt1N-k1zl@e0V zKvHsxlG~IJJuvhePdXc&3Bz$|3PSEb8{}$~>Yo!ZW&_D7Z_zu8ziZy&%o%U7cB)pN a~qF)m^N literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/utils.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/jinja2/utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e10413c0010639c58d0b2e28614a6938d05cd96 GIT binary patch literal 23480 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 O!|3G=49?dtU;7ua?Uxh) literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/markupsafe/__init__.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/markupsafe/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8cdb20ae4feea561285b4252a7da88e7088417e GIT binary patch literal 12617 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 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/markupsafe/_native.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/markupsafe/_native.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f37fe76399632d9fdae8576fcd62d5e8b7c8ba1 GIT binary patch literal 1591 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 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/composer.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/composer.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08785b0a9ee8fe2080239ce4276f07f288dad65c GIT binary patch literal 5382 zcmd5=%WfP+6s_tWk3HjYYz&D=2r!Wd41r{Vvj9W{BvB9&u@^nOVirx)Q)7?a(>>|x zNn&JgaFAGK!9VaTY!EyCfGH$LJr5HF!~(^(t6Yy;)phSZ_uT6Ce_yIU`1yx8 zR^^Y6|L>#NFHv>zr`49HHqr1@*H?*F19Uy5*{`U?S09(H3R+qjPxZ9w&Z!4V9V&Hu zbB?>1s*F}Aqw}geuR5&-JfvWCBO44eYw}`grgJmTv%LQ&ep;G>%c$0)eAjeuUt7N= zvu=X37bYsOcOAuYW24ljRzatQwrY8(*?RYy%5|eJ3@JjoWPuD+S6@HN8AzURx z;o9Z3wM$ppg&7Q!s4%uY+$*-TwEVZ$-iroFJ1#A8X}A|q6DnbO?y7!N!`m2l8p6o1 zI2;2Xu;J5TY*gqrHsFYgG^(Y0HsJ*E$mRmQL7AHBE=Z$Jlhv?$%rmg?2scnHJ=9lf zA9fRjbi@Z6&J**PjM8{J%dH!zaEVEJQ_DVKqn7UPr~M)fsf!p_=|>g4fJtb%1ITD~ zs8xPex*l<@)5)CAxyINE)VEkf6>pn(H#B!mS`;hjcM1S!&?%z4xG96Q?v^P^krNY< zn`u`B#C`z{dVFlhXmN_AS=Uf4TScY3WxeD-YQg6*HETh8dTPN=7d9!O<3lc>J%R=* zF;^J|VK<9M1K995T7#iU57HLTqHXDX+CnTrrRGp1Xhvu_OAtIz{XmzdCnJg6U)sX14c#I882$}ms6Bnl2jGDHe zZY8EUHg2<@Hj8c3w1QE42Et#Bie@hxrI1cD%;gi|79klB;sy2H$Wk-)T|gWQZwa$n z!aW>-v*jFuW(mOYlc5R@#&|eBAZMDPTb+@_y9Ba5g-UsKzp9t@vcIewx~gkv)jjby z36jRXfnu+qn);h9Bt@aiLvQSR=cJNKefo18545YZFymny3WQm}m;Y`zs~uk*RMbBHV8n{romcr6 z5&>dO#z95xAd_Kto%QMBsUmKQSY4ZY;1Y0`H2z z%8Y=s-cyp2_U8Z~#?yu+8@cF31e;zzWz;AA$TrXCmLj8~ckwOz+C;278YcZ1mlA|K zvp3}4Y4-ZLEt**zkMi84v9V7<-kLZAD@;dQs~8mqkdVK|$4CNm2&Svuo&sCp20?Mb z8Ei{bb7NUOG-ftwc8!g3%?fj4v*a$WhoqfO93@filIYXukK@D2xWsG0Gj+_J5sy8S zb5G8Sm(y+mPp}>hhakoo`DbS22X5AhlOv*|XKPU(7m#cXaZyC-r?LC+!To?o4d|GF zL~?v$l{R?~1t|zW;I;-?4fR>QDD4J%ReeUE)GKJMPD)+JM#;!X z66@n0-;eu+gD-7BtTNjL=eaduAOR_;aK0B5yv*6-g#u={&rvKRM~UB`)i2=xb0{m$ z(=^P))4!tgA3Xix)YHI$^XTDGH*dLd+-c-(lQQ#m}K} zQ1FAyjo2orTBHL(QXsCCB>f7;3g+)I4-rAZ1xk`^g4bCQB91%d9igP8@hd>^DyD@e z!9BoMz*r5)+U^oYhX|~M7u{t`E>rFpL|E_=s)BcGV)J<2w1O9LtQf^MQH??O9O$PZ zzbl}fRnX80=?U2oeiI1(hR)P?|4KIh9|Z5O9|hkp(p@CxfMs9~K;uDW1lZ#Upay_8 z1e%z|2NDO(JKxO$5`;JZH$alBHXI-YLyrd^`K`=p|BOBNVMUVP1bPBB;xA~k6424| zGhB9=-3gaDO2o&FaM$b!arW5}x(wccXbZ(vPxuo+a1I9*JufK=Z2m U$oDQ4k@u2@x1#I1?w#`g0_vKr!~g&Q literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/constructor.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/constructor.pyc new file mode 100644 index 0000000000000000000000000000000000000000..444deec6f5a771cf7827d0c4b17ca0d1787eed07 GIT binary patch literal 30355 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 So}2uk*FMiiGfa-Fr|{oW5&u#E literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/cyaml.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/cyaml.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05da88f841d61ee27e2b15d73d9f22eaa339191d GIT binary patch literal 5968 zcmeHL-EQkd5FXoYlBP-1pVOWn3LFl95kd`Wh2R1q)E;sL5!#-DPHrq?Z(38wj=Y;w zf_&HWDm)HP!vny4>%>k=k&w7(T1c|v-5Kv@c4uby+i`wx)?fejtMAkFQ{(4XT-1?8 z6!6cYz^1^VV2Ofd3Mv#->9j_D7S$+Np~#}4O?{h&4)qBGU&o(9wo0;LWQ{`Bgf@_^&1B6&)`FUlt^(&^aONva!Do{%bu zUa|6KY8XJtXrL>o=u~>cHrL1yb-}gH*@e_e5~-cA06v_Bhx(A(;@4xMWxZTtnO7t=;cmI?9{k?;ZmcvoxX{kD+i9So>>0`e$@rF^y z2i+S@1Ps5)ML{#N)~%-1#)3^}8uQRR(>ilpcbEj@h?}NUssHUy0;;cbQCRGXecN7Q z*2j1UB52+_YOLQC&k$?iz>&)Jymfzg%<5eC2Z8k!h_;2ZKK6o#Pm|(OYedG^l?G+3 zXOpruy0n}dfF~x`(<@AUFHYjn_aXxx!#I$!*2^ro2m^g)aGH$$BnabE4Oq?yF}ZNZ z+$9O5L2gkPOZP`cl;;}5%AZG3=re*<+Do-TtObkFrorKiTvf>E6Kk)%Q)NaDA|1IKEyzZICA4~VV$umo@Ha?2D5@lQ< z1aMdQ55-0o9`sLQL*TR*AAkU=EL=DslAm+=KOERNW~2VM;UM0Foy~3O{+l=wwXq=@FyXq4NjQsygTqDQ$>h?^_Gc1}euh^KxHeh6?zoWwo3gyUwtai@jSdz8kw6e*)~?{%QaK literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/dumper.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/dumper.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5abbfe9abb4875c798ea6091a20d932bf1395053 GIT binary patch literal 3169 zcmeHJ&2G~`5FR^!&0h$sgsf%-_A!04i{9-&Dab_Pkg8tECRjgA>^i4h;2d_ZfpJAQH1k&_l z5lpltSj9I%X_cQz7Cc0UZQ81k+UU6Qa&JKdT3gz4Y5JoGL-gLEoG7>R8Z3F*#`12_>&lne}}<^53{^&;bI6J*A;PIhq;nwoU%a;Bp+5x<0#V4&?XA@_rE zjQ1unn?*4l_4Kj+v>Pt#G&BAVPjm-<+6i9{BV%OG;f?P{i7f9=1AwzAh@%f;Yl=V#p z5gln$q4!1ew)fbiX{^1yG~4k5S;OmRLWNM{?M6v3@z)-Cy=~!~lL7my-s?B7)*<}$ zEEqE0vR(el!Bh3;=j5_MIk{_C^CLlm8Lvs|F8K>hXrcur?U zcUmLh+V_3Ap5;b_&PC;c!TNNuk^N9?NabOR4P}qf*$Il0^~4EkE2e2*F%P- lkwVr^qY9p$rvt^74^O5A!&5k?aq=&?4aa`ndyDrLzXJ@>imm_v literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/emitter.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/emitter.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e83198ea661c265780ba22a30932c8b3905dfda GIT binary patch literal 36613 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 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/error.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/error.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55f248952d175d1d45f0e69c3cbf79bd81a2863b GIT binary patch literal 3602 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 b&)TJ5f0}d6Msv1V2dy?|np2>282JASvg^&+ literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/loader.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/loader.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5dc225ee6381bfeaf07a91de46b2ddd8eae986f GIT binary patch literal 3631 zcmds3&2G~`5FR@}P0}X)ha=*EWI(D>dZ>^PLaEdfRA@ty$Yo{On>NLIR9mkb=Z&Euup4lD8Gqd0BewDxN*6p9)VMzJ4!p~3KbjKlz_~%gMQdFU+ zN~bj%a8He*I>ios%Qd&qDuq@pv|6FnStC*_q#C4}q*|m_Nv+YaPSFb865SB}7_{-p zdrlov>(;4JIBg)Pdrq4(r)J@_g|P2AZO@!qh0_iad)R5UaN4D4jrv}j>tb3gdVyA- z(;!lrHIFXhxMcQ&;cT?d&iTk1t0##r#zz16^0>%kAl?)+0ISDMZ?aHC1D*jwC`Da(kq-m`Et2Fy519tI;S(+G?ME>O{38u1l;D={H z9IND1$$kIi`%?7r)E_x63G#*;WOO8b+kIZKoL(e(xa-2pNF`M?)c^V6l3o=;crcv~|yZG=E7Jirl z(ST?|pvo3oSc7G3S(h@d1SU>&Sj?y4@zM00<9QfO0xL#rKp^LN&{lig$gxH3a(g1! z!G>MJj@UxIu`Cu7GcQs32X~-F#tiED0+BEOeuHguiSY7vDe;06_4Sj$i`d~b7JXBB zzmy;WS3H=520Zx3u-c9Z~&=ST%~c>$aTYc3-vZ G-T4nNjTVpq literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/nodes.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/nodes.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0de468eaeeea1df912aec04c7d65894c9c4c1e14 GIT binary patch literal 2896 zcmd5;O>fgc5FN)!+Ju&Gf`CgUs1&5ChV;ONBGgK~HHVErBA1o1H)&GG4&H5}NafW2 z6@CuChCjfYNt(2%NaaG3WH!6w-SwNdZ^rh2tyeF8{)i%)eti6YgxMTTOk{{U9>pGA z5S<}FcNrB?k8ZtIF@nptdS zs606KVD>p0Kw=ccOWU}yU~BuNTJ-`hMp3|DKS$2?Dk#EGf z88!nJ@&a_gT%YK>M-H@kbnbB?`3*OkKGC+dOp_H=iHE zLiuN)FJP91L4`>!R=nmURaiz!3L_KOi>LK5H6o^Y2#eRz8t^@XO?6Z*I3{^NLkWvq zFH3LM(v_kvWd)T5=gcaa7xn)m9j3pNWFvhW{XE3vIr$6M&nxErPyKMdN*NOUsQWx* zD(AQtFPaCy^AcuR-H;56sAayLm^3oi1jETL#fL?8wfLaa@HKgE*y&0sK377&hY8CR z^&{Zff=#0K9Ow68I2`uU?!N`Sf`x<0!ex*7383=(#5Crn6llkK%)a(fA>=uv`1}=% fLNP~*7cJ4jiOAkh9_JrevGV>@ds?g3DmDK%ngok* literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/parser.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/parser.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b4727ff3a63904b36f0bdc88165195a35405f5c GIT binary patch literal 17125 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 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/reader.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/reader.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e049176f105b5be7fb25459d36f849bebc7b49b GIT binary patch literal 6770 zcmd5>&uwfd9 z`c-w+tFONIsy6$tvC`8&|H|`J@-K_uZ{dlaK{WAasRtRg2qmMMS=F&r7sZU~X4PU= zS**>ePEIZ6!~%L=E#_0bpcV^C7u4#AYUWiNW~1y;XVkK#ng#V#sZFKsEEf4GU6R_7 zLG2#)y-*v)Na6y7t=*;$<2?iQN*D%V>p%Ec%h0F@ap(OT*QGwrp>)Fy+YMMKHJG7= z>UliTS0J=fix`RGH!&-WjY?M83(}*<&+=jSm+?fWAvP?vp_Bt9D+-DkQ6O`opgu1O zyrM7#ezQ@_L&~Upx2t8a-ijN#UW`d`lD!~m#jU`Xg7&?j+43LA%tP%)fnVcDq=QIz zmhBu$w)lk|+anb0riRCeXboC@<&lnqpcB;}1!3E9(N}#r#8EwfwGlUIdkvK&7FF;9_wzeg#T|Q%Cn$ zq*Hjsu{ci4Z^e#t6na#GP*ySd&!bcLa0=qvB`7hxs?@5b;*8qNsPGckgf&^t+`QT} zHR9pbf>e&E<-D3$033}82N2O}D1D2H>30DqVKz&r+cxx)X~+!a!TVfU)I>5njUFI zEkBA~-_y1Lgu{#CP}VbMAqbnYuEPZvJlRD1Zdq%B&v7tp$9aq6-wUCv{Z=+JY3<8o zGi9qrxF(n&{v9Xg>>Z~YH2WPCZ5C}d98OBK*NS4B2qjZQ9DgBG9P#ig|HuhKBtM4o zzeEBoKDEdtpiS@?b+7^Syy)Oa;Xe>$Qz&n7MCnl#-c!1$R!gcms(|ywJ<6}7HN~W+ zSrV2itL7e2##9sfm~^|B)I}$H93CHz`!b$r3{$}dz}9et@~8;qQAxL#BizjzjLYyG zxZAV>cN<0Mnl>1wu>n;Z1p_h4n2Pt3DdURl<6m;>Y$9)0$N38Lv+x7w95x^HSJFoN zq|smKtfZ0YbyW8Eezgg7`4>_q&ZzhRb$ArM+)O_dAC$(Jku-C*H^xjBYTQAM7KG|k zMB@+_`+iGE0AL3FUg{G7Dk7O(OsZrfMx?Ea%dL*S1kM6z4?zeyHv(UaiBLD%XtxVr zpc7G@UeE&hhGKg&>}%QNI#?F-rT+3V-f=&rcH9@C`^ZUNrA5P4h9*cHEx)PPq|;8z z*V366boyQ2X26sllc`}zfR7dJwVfX3DBNY2X|x}rsWG@Nx^M;|h@*L+V>gb&n4h}p zb|NhSQb@=?fV$zPeZBjY?)fI3Xbxf+ZPKWd{#Fo$#;kFRztA#8>yT)IhQZ$9WM%I( zpsY^__|gCcyd9oexb2@-ImD`VNrl&xWm$kLVim!N_kwU#>}>O~fRB5#(IUEp8tuc- z>`4gW#cNzmlgAKf{azChcbm(PupJ&FUaQLmb3LuwcQBkJ$Y-qyxObl=^BcG`2Lo~E z2Ts7Cv8G0>+9z3`9Ib9t7O3o81V=vmc9GWNTjy@0se*`zjybjvixuOaP% z^52lg1u^@p`G$lQd=hW*RoN!zA6x3-Id!{9PA1owZP6z^m!3a+@#NPpo_sDmJSMVa zD4YKI;tyNWLRR1Y8fu11Z*z~>M=8DvA$gzSs~HrrXGwy)1qz(@au7ap!={ERhZAL0 zt%G1CvQ)(?TgOF~kyd%64L)opJIaG%@BuHjkw;wM3|S-55KBvaXG+W(WElmu@Fk|` z4u3R~<>5yg5;%qRZAJ{6D`B$Joh~18+V0C(M=@r^G^dLbA_I6rTovnxHJ&*#^l%RE z#KV7rvNoGIxg6Hj_6-Q=w-Kf5iN`mwIuEnzHmH$KMt+iKLKCGM2&WbVWI7*vGZ4K< zOD0sZYR(?@@D<~-82?<1$5LaH>WDErM8;)0k?*3DggYzTljKraL()#8Mf^wHV*Pk| z_Vn4=j^18c(h<3b@6MYb#pKAIppb1g1x+HA2~7?%6iGDfH_{h4)P!;Ls1>gy$p|u* zC}y59|KSbi*3GM@&pOwy#OxQJaZtiBAjxW&ahud;r~Uj6`=!)gdSxf)(+*CcgIxzY zyNXd^g;c~iudt!_VlyAY)-D@~b5hyrzlnEu?-xsB)!83BfA;*d*_XfA`p1(evtMle z@t;4z@4r9Y+Pc@j@~RbH-`l9Ycj5lV-TN;;doug-H(U4KzWegG&|trDH?4yS4ASZo zZ%eS@ViOkv^#}@ai$8>BNz@rJ5CH;8;28jaY=|X2IDlIKFt#eF$-}flCa%=s$2p$* zSPz6lFY(p{me?_X`et7J$RbJwm|1+cApnYwLydacYq_1_u{x^a_M++saTS*p!6V(Q zNoqUBW*;`3kL+uWoA1v9Q=Cbp-OyW+eDy&X^m`^82zH057N;#Zm2;lqFm@+*H4-c& zyFv2hN>5!k_EzMaE;lc`BzoA#Fyv1;748b43@{~Y%OEjW+aH3#&Dz4{3={{% z_pD0e#W57NpA6T&Z4HQwYizh~LsH$mitZ(=j@3?cH90c2i|E{1pO)7n=|{~+0G6!! zZbkuCz|rl8H7f^{Fo~{M79e8*Dh4n(3Qs*YaSMk`3>m$?kj~2KjS#|;1iT@! z5Tv01Jr=4YG2)^K-N2|Kay-EvKK-$OC>b4w!)V_0hvQg}>W^^cm3cVjH!-uVrm^3-u6+zsHm0Po$oTHJPdLj=>foi9?CSX$lV9 z{yN1sD5?;0Ex6)FPTz~pNMaspxv=npZVxvs_8D3dr8bw^<~N7)7wxs4fNhLN)$vGN zFYGNIEsvD*gs^!UOcStR@ zoF!*wEix62y3&P<7Dexx3!}YCt_tL;1qu{JZvq5Gi~6EJpg=#+qP_^w-t{7Vp6ATY zEGg0!3IkrFBKq`Vc1w%4P+V4V(MM+%x9w>%*Ks zs0dogpjAFHs0v!mpd%(2F>8lRP~)8UFapgnbFW~Wv}0VLiGI*wfhPMwM+7?B51JBa zx*s$n(6N5dtU!Gs4dQhq!`0I!cv`puN>E8rVnIL&Dk(}V2rr9D`mz>uN}zfBPz%DFq4G>Ws3y?q ze$bFvdv;&wbNfQi>yWjB4=?YKyn-1WBjUju-EAqT8My1^(hn)WPDz=Hh#; z(BJkhytLT3<+s~GxEgpbEWY`}E0Z@#5(D*d)gdQP zpD;~{hUohb2c2itLS1g#v;O|NrvEodaMrn7a7 z3pPNVTz9<_1_>wd+buul4D$r5FAmx(E|=nxs$7oBY3Pe5pOn^HVJq>xDJ(9op)gK0 z`)zPnNMzaW{0168`x;7z+rFa>TEhkv*mOW(+?7Iadq8X!0##zb>14n9d>Lgjh9bkW z*Yp!#c#MOn1zi3(aLIkHxSi{Axt;S|jLSQPVBJJ?hn;3HP^jfzXD|0S8ZqC-IOEQ! zuq(`R<-A1qFQEdQt_r7Hr&tG;FWq>|?11(QhByY|f$t(QO=NE#G1t)3!zytj6nfrG z$k7-AjED}lD2zn=t3l#5+I}2^j_nu`t3@bpZ?xlN2>*4zP|VsOVb-0&@=oBA04K3d zIFC3&Cl{Wf^FvTtKcPmC_9(Gn!f}%Tr$VBoR*TuDF}JHGih76!x=ZGE*+iZor4&9( zq6gY}6BJxIoyiG-{^7K-R^hf~O>E2Bh`C)c(VuIQL)zXNcM)>M?&u6|z!Yde8qad_ zF+KcWb;nq*gFRe&fxH*~soDC7J(q4QnjI|Au5ny9exe)43EXwl_cuQ=_`8PJQ&7bwK3YcLL*tle`|ri61tCtAL1DQkD?i zV>G8|x8elrG=@sm%lI^i;)LWS=sMI!Yj+=6c)8)X{iqIkqcwEHR)eyKYY-c`d_k8w zMAic(lxG)5k&rb9ilt~loyHX}prDMZ6~<9cIupfG;RtF|&T;36^LSwt^=YSq-dWUU z3sc1grAF_%$T_}-0t8HI0y_Su=cLe+1R#f;21`_&!9-CB>Hx7kdP}A)^9fZDd`O?H>PMNuBV*OABQI~wZ##) z)n(ItHiKn&bDtv&*Ps}*39S$!>jCC-(b11Gaxr<1m&k4z6^c&K9Hi{Al;*5Rg-C(K zgd`$eLVFe*ib@cu9S@QJy`JRk!Ov3?mwH4g5hD}QGP;D747;cCSXm~LSGgE~egR$j ztGe?&zugVoMGmE47$}UB_cPYwXF0BdB2FLYa)A3h3lfhezX@HJ`Yzm+7MwY^)ABnc*-r#U1=dIh#tD_q@&%w6hsnLW4s*iVwkeFXsdwc-H!(Bc61MZz<> zcj?>gC3!h^W9$&gQ<|>ZC-0$n_hod6CAd&}*p|WAkYrV#NWa&ohWZAI5s2cP5z@Df z0F0@K`}qJSm^>RAUzQ`t6*DNM3Azjwx<^^iT(=~51~t*I4E^;0!Lz2j!0sg$=UH54 z!KdbEQ09WC^{Hy9R^U~u)Fx}Q4UXgwcl-jb_!lSw zMB@-lMm!G{89J;$720?nG_#H8Aq->Vc?g%;7#@Ou2-;yVf`7w|{B50PXd01xXjEH4 z{U{o@iR|O*&Xvl-`T##sXFE>xN}AL>mG!3qoRL zNTYwC2{2pgaadZA1{Rr#!YIHb9Fy(_0*92CG34DTf=eiFBIYY-D@-&F7K5J*I)IiB_LmI(v5MT-a^5 zyF?2sit&l*1{fWCqK_e>xQvy@dvS_wvNk^nh8;n6kA(?C8 z+olBaygg!~-!YEkeA2(X9?iAV&?h*(%=IeBml`~&gRE5F47r)x2L-^qEn>f9Qwsn4T zSI$eH?;}2-UH7Jqe_RR}1<}!qCWf6%E18lvk1*QM2(`VP4wZp%JZa_Usu`I22mr}q zs^zj%gc=@!dD{Cw4%padu?{vA;wcp~2XD%kgJE_XFKOKC&xj?;4r6ga5t50KlV|`1 z5d^=2+97m~SR|D#3Tq2NWVE^jNCGFSOCnvNn{+B1N%TU@f!Xi}Gc88URf>rg(HYgD zkW_~q$a8~j4VI24{57f_!u=e6h#l{yYAE~;wVk!PNQY8Y_pCaEdx_cMF#n7eBcSOLGw}_yB`QYq#pJEJidj1x`P<)1dY)q zco-IF(VX8LMH~u3M6#yG&O~edAZsT`)ss9ep^H!3!&q{xm`Q=ILA4NrP}tkef;a{ZKEaApcWd$h<1s@WT`c{j!CA#^d)VWv*X5?nbsrjsu1|!? zKN)n?(ap*wJ5fiP_*ITRoFLL-rgr21i|k=R^oh9PN=%RmrwFZe2fu*_xd96uHS&~EVK(LXSc;U# z$G32G^2qZHXK9+JkSHE#B*f$gOLILGyoz8|hL+aF3$V7r`Yzx>r~% zv$)EF;XL<;EUvNOVWayti+5PuVDT=CAF;T}0(dkwL4?MkdkaNQHmZH`UY<+q^AB;s z_GSRLTB(+*6V)O@xW#I*j0B3YLiK2M9IY~XO10qz#_5N5UceO-3t*+sC6Id`^B{}U zhG$0@T&32Ku~R}N6BM6kSW7O%wFAOh2);u5fhiEsf>grc*#TiKoT)KT2I0dM*WEhG zgUpHkh*tM8417?5rfIZ{-hPiWeOj=~{XRzQ7wd9=zz&y%bOuq_r*0+T76Hr2asVij zEO#2j^>ASzKupxmf!YFYQ9(6(!pD8BZ;ycxf9B0OyiHQDc-2~s zKf7NwpmTeJx?k=`~xJ-p4TGC?dMgHtU7tnSOF0+H~^w4*qE2 zSBW6*s>uaPM)x$;Ay6zOTe=jf!tS>eiAurDfY?QqlHiuw;)RoO_fyfvPiM|``Cuz0 zNUzo+l;-3bazYao@{WO`I109$;<&tP#3s>TkpC(pYL^_DK}SD{K>*A^Q3`o{;rgdD zsQthwMVdH~s1ni!*&iTdCLjLPhaGP*6*(FOzs!UMHs!3s-7myl7| zlv4`wz-Ws}Zc0kd%=U1YNisfTReZi7zxvZj$NG=wx+j3;10|Uqv=|0=&WYhT zySsurl-%e(g_=#c;XYYMOK$yF*xY0hu%OgXW|t;m^w1{MoCjQAT;+T%PhV+THtn7~ zoJ6L2b`gr$kfR+X2eG^K*J|}2)8-W*Wd0vYuL(G=Xt}V!Hrfw%l%}c{MNgiz>dG9Uq0di4fS6UCxHntzhMzQUd5M3s z9k>!`?_rR8heeTvY$-Jp+-2TwHa*79~wKcry1igz)GnWsICYf@ry9Aa?_xn;~= zWskDBAs8tdndeZ(*eU!{Xi|6{MU7eC)42Gbm%a<`iy`KbLwa>?o5ebd4vP&IG&kK3 zP~>K$Y6B32A#c)&h^b-_7M!S75db`dFd%|})o13v3b0O_J$wq+PQPXg_zk;a$5k_aI4&w(K6cXc|Q&-7~C_ORR3c!rJRBgxXWAaWmcT zvQT(d?mlC*QuPc2*kJ7&9Pthd@s5JE-(gb>^e%7UGU6an_|_T=iID$JbbX)j9FWdzm0sM--*4Nj6qKySU?@1PeOC{Ri z^VWiXmAHv1E$|(7VFbUm!m+}1ar*t~4dkG~@_4wbhH<<&e)>-ix~n&;|9{o_U*14D Ag#Z8m literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/resolver.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/resolver.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39d33c2b7f1b48b102473a9838b52ec91c711ca3 GIT binary patch literal 7482 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 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/tokens.pyc b/UVM_Framework/UVMF_2022.3/templates/python/python2/yaml/tokens.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7580781b2209d4cbf41458d69da198ac0cabd5b4 GIT binary patch literal 8619 zcmd^ETXWM!6h5+ZHH3r!<`OQUG{sQBG<4c&#|Cfp)|4RQr&v$Ie!jr(nJfIA5cD?&ayWVr%vuBI{O_bjL^SA3#_piv`KXZxy zwTLv4N3?2@w&*R<8=~jS+$oS}30h3i0_mXy9Zu0A>5&8-P0=CJV+lH*qQj(133?<& zM@Sz{(1{csC4DSGCsTBc^i+Z#PtkGG(+PSaMN6blCg`aYJwm#ipr=#xDCsi^dNxHT zNS{m4nG`)n`h0?3NYP2s7ZdbSicXQ9P0-6JdYtqZ33??(r%8XApmQmDg7jAjdNoB) zlCC7^wG=%?`a0DsU$bn@Fjr5*buUQ8&cdcei2WQ_EOUsNFm{rT~p?G4{CUR>SSHfv$f{hF_CJ8i#ez@qpTKf+pVyBRc% zZDXl1mP*#RL!4_?mDE;GiWmKf0+i{cWxzZK|JiFTP)1!@&w zSr(gBt0+SYJnj<4=_1}`zVK|^cvGO&0+lg#k$9?Iwl8_s8m86=?G)v4y#nzriI9c4 zF*tc+HU>Nw|1=lHBhsqO#n&pM-0YI4n=X@=$R*xtnzfEd!pKOY6*dEd0S(VM#zbbE z+qUicP8@d!+IGNvw(SadqC~2w*1c^JKSniIHksiv)`=RMZ7(o!zT_Nv8e-du&~0hSk!aRnEFPfu;saYhaJ)YS5BuGD3k*M$Xk z)n&voKpupym}wo(dmoj7T4hy+_X>z6hDFqLcY;}Q{|n;n6^ux@p-yotS8Tw3c9x5H zPG$m#NSN?2&v+CsP}?`XnXqhX&p33 zzRX4TWGcW}EXfAmXCLAjm%_lypVK(Q%ZIRpgb@oL*=0Hkb8vfsW2kkN<4{=33@`X9 z7y#X6;$c0De(0{(y;qwYWP5uU4V64~!gE~blJEnh2tS@U z8yjqtgRld8M3)`y&Mb$88y9%xH#6LrNVsuu%aE|EqZ5b1FfKBww=<+e5gz&B)<@Wd zf#JN!eFOo2cqcX!b@>$PtL>++IA9GLbHKtAilx|Qn zi9W)Shk=O(5%A62lZ@QxLoP|&g3t^$JSfFCa!)bhl3y|uL#6NeO()(*r9YS$LUyp` zV1|W{KGF5%cW_ebWPkb|FrI@Pv7F1E@KQP_xxLaplIY0a`K`)}evE~K!*Y5UY$c+JC<~4&}rcbcgZ2MjXKbYA)a5n3`r@rNGg-c%c zkriGFUlj76>?8YT1r?Z|za3?sSM@uWREw4>IQkn1AzW$k-4omlscBSrq7YapBoY;p zX$l!6g~W+M3PIsCt#GnbIA$pvIuxRDg& 0 %},{% endif %} + input bit {{clock}}, + input bit {{reset}}{% if sigs|length > 0 %},{% endif %} {% for sig in sigs %} - inout tri {{sig.vector}} {{sig.name}}{{macro.commalist(loop)}} + inout bit {{sig.vector}} {{sig.name}}{{macro.commalist(loop)}} {%- endfor %} ); diff --git a/UVM_Framework/UVMF_2022.3/templates/python/uvmf_gen.pyc b/UVM_Framework/UVMF_2022.3/templates/python/uvmf_gen.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0dd7336a9172fe779545314f4a2b360135abf07e GIT binary patch literal 69703 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 bskMl&Ltd}$uR&g)Qoo8ier#}vZ~y-R7;-3- literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/uvmf_version.pyc b/UVM_Framework/UVMF_2022.3/templates/python/uvmf_version.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e7f664084dca21f482db91998c557c6a1683901 GIT binary patch literal 229 zcmYL@O$x$5427o(Dh2P+m65t|BO)%`=|*(nW*FMk7UxH2rj_o!ipTLZUcihN4CG7l zNO z1Z;wA0=7W50NWtjfE|z>z%Ixx1RU7_a|GA}*#qo@>>t<=%rW2quh?-kX$;2 znxiTznY^4##%HnDSQzDX85euM&TafqZJZ>T&3uxKN#TypF<)$qe#28Kc>=G4=fR8M EFWW!4;Q#;t literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/uvmf_yaml/backup.pyc b/UVM_Framework/UVMF_2022.3/templates/python/uvmf_yaml/backup.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f2a2219602bac697e197eb891aca32671cb2bd5 GIT binary patch literal 925 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 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/uvmf_yaml/regen.pyc b/UVM_Framework/UVMF_2022.3/templates/python/uvmf_yaml/regen.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2993ab6733321c497e3014e34575f06f7b8e52a3 GIT binary patch literal 14610 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 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/uvmf_yaml/validator.pyc b/UVM_Framework/UVMF_2022.3/templates/python/uvmf_yaml/validator.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd11319a034117b2074acf08a54aeea7d4733301 GIT binary patch literal 14683 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 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/voluptuous/__init__.pyc b/UVM_Framework/UVMF_2022.3/templates/python/voluptuous/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05f7620506a9528475a488146fe1a7b00463ad0f GIT binary patch literal 496 zcmYL_PfkKH5XPrGK!d@hXCTJBBE+bPF~&p^7rGJugw3SV%4_IrN!tgq_bML8(|7=# z0%Dtf{dJ~ar)~D#Zhd@xj>oWR4VtfLgm;qV5l8^ZzyJ(4#I{u1QU=3kdk%F~hiMD^ z1Q=towl%IP8P}AIYa*j%@FFu9H9*#3)CAdphfb4<>mOZBoMy7_T8KZ*M( zRfR(MQcS19chBxSJ1LeDVO*$E;A^FgR6e#SG#5ro5uFdQPRlB46Vr2*_s+*XqT6yt zbhBL}&Xo_^S;W-|h@y&x^N1bV4ga$GEnX~Cbj}36aDIxyE5YBqvr$>e=h})TUZ3)D zA&gOWqOi{&pY8@paNtF$l4}*hUbolF`#h?0W<*qh&z4ly^0_nBELN@x98p^x5pzoI b(p@e}Co7{aGvaVSlCjpR@3ZzF)tc-Vxi5AK literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/voluptuous/error.pyc b/UVM_Framework/UVMF_2022.3/templates/python/voluptuous/error.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d9e680a9453485243d2a249d53a6a361dc65557 GIT binary patch literal 13650 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 literal 0 HcmV?d00001 diff --git a/UVM_Framework/UVMF_2022.3/templates/python/voluptuous/validators.pyc b/UVM_Framework/UVMF_2022.3/templates/python/voluptuous/validators.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3470f06eb7da9c41660131e4677089970430301 GIT binary patch literal 42838 zcmd^oYj7M%o>!Jyk}X?)+wyD1Qy1|S(*R*zw@7&ssFKU%afn~Za%NfuLFPI#Sti6x%h9X zqEeaY+EN)SOm9<}w(vToGAX%kQ^j^w>QI>uW%2!#Dt4;UCY9NwN}E+?v$9tIo@8uS z#V%FaqB2`lX{*X?Ri$o~>DDiGsNyzN+O9I&RcVLH>`bnI2WzuQK~p>43@{P^E(^b5NBIsmvi&I;=8>Rp}L#c}108 zRhd^+>4?f4QKi>Z<~3EaRmN7OqbhS$m3mdCSCx*b%rR9ut}@4!b))=`RlC=xmbWPX z=N5i$r*hYA0G_p41Im{A$V;g^CzN|hEq5sYe@W+{bNkhuw8{)9@1)9{QswTjLkA?$ zQg;TGyIFa-7*e02$A{$_iCu}r5#^#IN0qx(Jps0iDYsjB<7xq@vW+R9D)p_*Y2~5x z?aJMuyq)S(%kq$Kr#!ZBt1@RK!!F6Niy7SA=4s}2d9+6!?UqM-!$)r@cVGCip6Fw5 zD(_8|c}uzb!)FJgXKyR-ZIzi&?!oZcq3GGylzTW#eI-hLN4c-^CUaKmaYX8IK@&Ols@y6K)E0p&~Jd+p)f;#BEv<= zkd_Rugc$}B877r`GHlW*NoQ|NDR(eT9g0$?m5UD6JvS1iUQ+I8m^v1vzNg&rF!gkl z`o40}kMB$0zaFK|DEEyp@0(HT*OmKLnEG~<`VHkygsESPQa@1cJ7MbCDD|>(0e4;B z^HJ)oasgMJdLc@^qFlgAr%pzxA1Ze$Or4HWze&b7mwpeNu<(EIn@wA|tdcw4_j4;j zx{bG+aGLV+g;K6q-HGd&^1WQK;9gnr{9LtADW_A+)rr$we#tB4-FM^uQmz<83EPoyu~I2|xpG(v zs~KKz!S#jmYTa$I7~Zn9%eiWPDNJDYYkuAH=~Au`C9pb|3UP&*f2!bzud_TSS6+;2 z$NV4Ws!{oSaX;R&GU52ZqmOUhOpm{Qb9CtS`A6gUb7uaQ`v`x>=Fi`9@qYl# z+&II)!_$v%%^$B4_o}sEDd(4R%gZ@`^sPL>Nm?O91*)$xk5ZpQC|K(IO8A7OK9k$W zmU=|8;|swDcom&<&np**7`E%>Dj@&DhbF0~lZ;s@ba>XKu-OHXH zxpw{XC7!aE{9MW7TauI=9~~bbK0Q+PN-ITBd@!=IT3xD?NA6XMwUuhEQVT{*``Pb! zNL~%Dn_oW9%526-wRKyaR+l9;b(kQHaE{{2>E*4Yu?dpa3M~+f9Y>9Vc2;iN;Y}h$ zv{1-1i9dGfMI6B(P9F3W(b1`$w^NWkfgXX2Hi|ds<Nc1Z537QPbYv`GpC&+%kP%PTF zJ-d|imp#|c1-4_ju$p)vZ)){ zWN^P?8mGRbvp%?(q-idBes!A0;_N0 zVs#fmbVq;&c{g{X{I+TbzpS>Yg*GuKKTt3ynJ1-IV3G)I@3gC)$8A(M0b;yHehdT7 zg&rv!Yc`;26QOWlkmg4eTbz#5UDz|bKO9cqFCWoLl56aXy=;XLF)Hk(KF0!kfa zrL0}n9;?R^Aw~vGNDGvyK^mxu$hu<@vOOW7b~B%7(CNNl&;|mY?ehmT-xrVwf(gqf zNLmfmd~e0iW`RE{Abu%pHqAbC`f;ifG}&ya;?|0!B|gYz-AW$UBqH)I=Oiv1N(E;K zr?`1?^@0VQa~xHg!6DMQb5CbmcSqNzfL$g6!@dvkK)naTM)Qw+F^DjLeI^*dwt|2( z*9qPNoGt``D2GcqqccIE6#^+{5DZ^L(ublx*nw9LLK(NVJ~tCw#pl!Du)?l;XPV#d z1>?>^`>gVV1t=(me4$!gwHIiZX>AR-7u51g6nM~Js;g2~u@F@8z%7XOn)3@D?!0P# z*oLBn>UvOgL`L>XNxeocJXN~&HiNI%Xp7W&ZLLP4@bt}jE!~n$Pv0Cfsko4OKF1G= zt!hAty5!2P9aQW}*@%CBsp_w4OtX1^NkLqkE6hcE-O#+X`OFrkRbr|}SaxnTtd0xI$KJuPU`Od-q& z3h{TWq1*=#(cX0kMvB{rV$y-<*%LIsCO*;i`@~*=`d6v|e_aoTba`BS>0GSW^FujlZavNkx>0Itv!t~Uk21w{(hqQ{ z^_^Wbq5?X+A{FGe_BchT7b!ur$OVfM*axi#{$qbi6e6fKN7l3m48Y>L!3iC zxQ==MHL8wtP=T~D3KGDxPw5??Yba;~n-}i@oB&I;Qm#A%Zt3Q37d_k5#qeEi$uP~Z zmI2DK!kgh|p zf(qruWI_2{0C823IwV+H$i!mIH!iw0F+WB;UNuuj?^v&uNF%YXG9`QVkX&VEe5*q_u2<=)aI2nkAx+5jysQ3hgF-Q)m z7E~iE3k#w{D_5L%nCUDt zk$OZ+izSfU-p+(%URC+y4G%TBU%y&@=BJcu=@26kZ~d>`IJsB49yp>Fg3^8K8@ z7);m~;IydVo4&p5t->b-rOaQfmArCQ^N$s38ekL^saR0EJ*1t1Nmof&vi2&XP)EBL zwFIwd|4Ln(=<1|KDW!+L%%qHr*$LpA?kB4D!&NBQ*gq&#DmoPTRnre`O7k^1Kn8_h z4Gh}GQX;wy;1|((2xRjO{Xl=OInUS{%xPoh)8yOSnES{l(X~-0P`O8cx>`eDA3|XB zQxuYqQgjpic}soVrtbDpOlINZi+lyzz$Ysd-eYP2 z9aso+rLy9T;+b|5kk4rcO&|kSfl!@x7F^;p7Ndzm-bP_9qa=%|`!7*Ht)xIj*{7W{ z1TE`5$!C8bC%^{Yl?Q)YG!aWp&Ce5(tJ?*VG88>`;__w{ zd_q;_QM-bh1_}wU+syTHyYfqXg!1o}6bktW#|=F9e@nh59fLCbU*$^}ZP$9uosQ7W zBQQo6B4ypv?i`4X5r-$js_%}EN1`59Xop20ow{}=3tzB)MR)6dsYDX^V zZ;DXT4|)g}B2EZh^f~~G|8NvB?`+V8Guh$IzF>YpMERhdr>LSXLAnTd9L5Rn&+k$g ztD;^jgQq}=<%-0%X-#6}hzd~u*eEonkb7BmQI zhitwL97!Fml)`2MHU<#BSP>^$QWT&+kQZT)S{3AQuNd9Rk=@Anx2pJSZ(nt)K zJO^>;e28N8unWh&rq~LcLDxj(G1RFtqEGlv9AOy#DwzAsPbBPcKUqWd( zhpPW~99kM~6=}Fx^il~)i{v4@<|6Zv47@KL?63{*CqyD*5puS15uLs zfwi%n=~hrh+RakkH7dHE2_1d*i+!jcP1k`E21YQHZ`T$UJcJdkY1pEC<61|YU)4kW zR4KO#odcsh0_tqOQd&X8pu0w$6XRRW;@SY$8#V<1&IvF>iu>O1%-T*10j{@D4{Y9R zX-*;!k4YjH-F#ZPH%{xL9I(d-eI$!841;Sh&nyIuHq4F9P3|zORnc>}bk4IZqAdJA zoAAffUan!05kew>62tO0_@1yDT(pi1A0UI-%ql_F>`sO}P@W3lKElOnj}hT8vJAZ1 z)Q$41kv;u7BOajTM#e2;8vw-Ms@T#H+wE!vLBLVygTQ)D05lsM#3$Cp$>1oSK9w}I z=}RaJcM%G5PT|(s&XYi%_@MnBq6DyEt;6og_(s?ptS{MpkF^atK&N#e)&ST5>687q z0H`VG;r0_+}s;Q##h_L%z z+&lxTrq2}28#8snz!4Kz6Y*^48cKGq^CX;ts&*1=noY1SnoS6$V4hSfa_(tj*A~<* zMO5UMKt?7iygk+NJ zZp)|?GW#ftW@L@x4Z(0Ngfh7X{R;sVg-G|xm2H^{B(NtPkQWMJeTs|K3IX38^cWIb z-lY6K_DG#tC#ncK0FHSKZ{2ERH!<)vp=?(^qBDoOx9Eexoiz$USnW1ZDs{97LuC;= zB5Gdn30iU8^9u{BdN7q{9oncP0>d_N_z%WZLKFt^*s8QL8K|+LWfmJuVd3?LQjqS= z(S$KE8XRl<%H_TLi!Lz0!0)>c_?6IJ4R1v(%Q(@y0ljA?JVT>~Or|o%&`vxQ%=ZJt zM^qB$f;bBh$ja8|WFh4AGa)`7MoIB$l=9#AEXY017+DXoGq_85e-#WY!Qd#&z}YNCVjChAH4s}wC#ldW3c@py6{!vB;- zW0jGX^6Ksw2kDECa4d4X11-&zzCT3%^?5O&x;7p?D-NN+Mm#a$9Avv+0xM>9pMHY+ z>nUjPH4*A?nh5z+m=7|Ao^g8SF+jmPQ;YGNuR8*(~44W(Nj_5ti*& z0}8-&ztKGO^gTnObrFt9Imx1otcfN^vef$ijy~DzLusp&L;GkcXz=}n7{y!Fjfji3 zfQ(LK6DF6!H(c>ozdB0&3JOi2R8(>^Ud;qkn5{by&!r9L(Kf15$QEOW?vAL~Ml{hy zCc2P~YIo~Z}AcZjo1;kEr>fc5z149T))52Ju6WfRpVvW|SZ}s+b^KSl6eC|4z-@v@4 z*wm}sz5^D;2o|7R&R#_LFXnFn?P&5Ll@K==IHBj>hZB+~7#&<^EtVkyOq{NifE5Wa zI0$8(4gr+K=PWM{Lrqwbmvd-qVw$qnK*mPv0!tcMm_eW9NE_@&JrW10wa)O>89)Mp z9JYWSzJfMOTOf=jEXyOv`>Yt%yg;ON6fYX=!|Tfh`Zy5n!?_G}f3U%N+(bO2eaIt2 zCK4sa+}ih*V!Aj3QGr%;h5jp|AzepwYV2rBI6_HLq7A)|3&0K#S?=O|6#x;p029B<^F5Q(?WJ#AC)$KyA`fR`60d3ze?MzCg!d0h~k<;vbQTsE7%?Z zUAXuc5(f?QU19j>dWxrlY#QMpaDCW}S4;+H1nF@jXBq{}(@I<_EV4fk7*n>#8VgO> z(n-7NX=TcECsSlYMfI$iw1H*_#@vG@Fh&i^6F+&78in1A;X?E4EG~3x23WLk>@032 zGLWJVt1HB!50rqg4Wg+qAatGnn|mN$$z)gRghZt@k7gw_kG{{V2RyCv#C33V7F@JW zI0qr79R-kr`d^+v%MdQui~LP;Y4afFH_5?X(b3i=ZgP+o9QHjN zkvRa%fnN^&QUR7VL>h;FFYv)ho(6ehTxqOr%GHaGCclR&{a3(RSQpm}>9Tfg>e?fk z%VaTETFE1W{MvE8h$9%ssabO|Itv!Ah4QlQ(pbNbccoZ6XNC=*L1&32e5^4@p`tNR zQ=q7;Qw~Olje3BK`1Md{h-V`P=^-PA&C~?8ng`jqkP0n^4dfx%c^DR-LQW^fZ_-#I z7{1{F9=47w8zYjFIV9F%A^->o0m4VP(98nurPw$biZ9$kxZze<3C5qv;c=~}6d>o- zFehdMVtOBL<*CU@8;_JftA{CLR^0Nu_YJ~~J{n~m0b}41@mXSmz-=!s8u)B-btSqA zVnmi11LUg4l#6kxRqeR5gaHxd<+bA;qVmVs4D$5O?#{N|SVKt$81(X~dA5!}(!xa? zUx^)3xxR`B3a-`&@3HvQ>Xj5&ZaF)T^$ajBZ%n&9Kh1-X7PR{RfhSF|Q`X=~k#7A% zK%%$>n6q$^h3G7HuD+aUrtiFg2VOdCwig+Aq*3gaO zBFM#3sLm{cqm+s}x4vtkoJP8B@5cGW3=P+%i<#m#@Rq|sL#?E?Jdd1VA95sIS;s{$ z)#oqGC)s38jw112K1S&f5IA09MhTKq7uXD8l$J2cE{Wa?SC!7Qef*IWF5(DY$Ei+p z#6qfw7zDZDKXgW{hmVVJIaO$sPvH3yhZhMyID^ymrXdMKREcRu9J1iD)?7Oavk`{H z1>g6rp}x{kpL@0M{fWNI6Mb{TeG8drMNU?6lHV|_bfw$y3^X$f{-OOIqQoQ>6j`Eq zYWmWJYad+AUb^C3zHn7!h5oQmrB-CbhyPuCK&RoNb+o;k>_y5Gg=r{}&w>yah+M_R z>LCeb0BZy+Lfa6|d+g+J8WT}u-3%x)oJM-ZL=KYWcB++2p}rHl@;N;v_T~4Zc-@83 z*s07Qf%DPKl+wVYSD(CIP%P|Wxq)|kh28B4d`}^d1eG}Zd36G(mbTg9LkoFg$~uIw zHky^YV%-ssbw6yyMWj1M9)G$hLV`qblb+(1NKimOroozeXG2w&+#g572ul(2}7jZPtHql%V%rCJ*lVN`GqSA!K7iE4C z<0D){#wQhA#c!xo8gkucLjO%<#3=u~+`m5Ov9s5{Fk<=>Wdbv3bniwK&` zKqk;G3&=*wk>(hiNXLd_{J5TD{933|HFFGd>Dhpg&>Vv!ss+7CM5sbXT*GKxeXfnE z*8{>bAE}ZU*<{J3RSHt<5D!2&rVIxO*%6lUY)rz>l|P%G8#SWjSje$W;s65 zl{%E3>vmXJ&ap4edKl9~41cNE&Ue{%9B8|C`4TY_Zad*RpE9jgJ$Bzi<%(=Y#BjiL zu+9k^HB*k*4R0^vXl6HhaPcW?*i&JtXE&k44v`t!D6L?V0a>j@D2=Nn<}GK($fGsQzt;vaOqWOH2{aGEbxcVK1ym2coJv zQzo0&$_`=Cs%p<)W^37`m)AuGql|$&vE|oIeTNi)0K4bMfjC&QE(c<4*mL4Sj*yPn z2`PM1k2%L_NNNpQIf;t=gkaaE+81IzoiBv>aH#bqVLrb_fPN+BLuFC${^j65e~S&q z@e=c&&rtcl%4UR~C*eQ5!3x&0`B3>sb&3Sar~=UeeL_iXPXk zWxOi*5g!L;>oo*WnboW%h8D3_@xUX-EyKEoE28R%rJGnyb$rl{b_@t_qgRuWL17Vb zRPSIU=SXiso$U{aEl+2gV)#Pi`m@s61X{7q_DTf2 zSPr$Q&h|3`^eeH=ZZtN;-q{Sn)Y<0a;t-$&*D4x2${*|`~${i(Teo^jo# zkrDfhTvoIOy=1WJ)0Y-Mg73&GIG7M4>t9Bkk|UZClgur`_(OabIVUzG#Ij&3m9k65 z8Rr+~#|&U^&$mBz!jBS&w_#RIt&44$mC4>wq6|dehj% z3Y&HL(l_Dv=4K*TZk!w6=<|Fc>Ln~7eY1b5g88zmS>NM#v3?B0X>Vf7mYeh8)-)Ss zX{u5h6M)w((bQnWEK;I)Ajy?!I?%uNi(IVx|A}Qk{{?B6)-L06%yQh66-=7M5&Qv8 z@ZUm)VU`6vLh!J{QtJ-J#KEwp{}uz{61j`Pn#k+0I>^mS_&%^O_mAlP;R>P+AE_Gz%9GKsAv_pKFAI;MocaCn zDi-u2NsStphem$0s=+sLg@!Bjz?o$tj+U_90vZX?%FzFgy@-P=LvO_&=NwKlUO+k) zL%LeSuEh>%La(dJz#!49WK%jgiwW(LD)+~1f~Zj2WmVNK8S}qZE@02?Jf6!BdA^G2`6_69 zx*XK7n-b=Vz}E6*Gp1;a9GZrNgt_1pg*@kI(jE(yjw@xXeiFVEP%XK~5HfD(B=NRb zT1hr)3Ti9V2r$DZU6$RLWCC5l8JHrX^>oibFR3Hy876;bv))~-Hel@8ug_hXji)`E z0-@hQA;B7@(Ark9)e}CTXFhV>SD4GV$IxBQ_j9YLGBqa+Juars{co|0U`_Udk|kvI zPJhfCe<;y@ZXp$^D2XYey2#{eDZyI1pdpbPnS_dvTt~$v&F$FCHXje{2Ix=N*y69r z-bRUu4>V30ic0O>pwxcMaO|J2UxOC)mSjv@s@|7H0VR{31-0&1FlpR-aJKj3=wr1q zMp2gpHH^lMy>yzsg#HY{gns1>JQHW;2MpA-^P)d@J0GqE!^@4K*i@4yU^dpGKbN~5 zeL=KG5*d$490BbZt)yVg3F=1}s6&N7J0+M^`*%;^s&xb;IbI3`Z_G<+8kJ%mNLB&E z=2v$b)ecIT3@MF8LrRl+>2`)YLR5x3-(ut))3lHq|IMQ9)WT%lFJ8z44&nbE3;t9o z@HTKVT*FSp_zFbuX97{9?eV+qq8RFr{5HiiKO+0Kn2*Q{;U*wQQSFTp?cwO-Jo|?| zL!odQhYavj`8#2jnfn~7WTy&_b9Z$p1-jzC1SB--f-Fnaqnzt%fk>Uu`5{i?R}eJ| zyDXNa^I!1fi+Z(idx!vNDknHcfNP=)08Juhq@f^29d>Yt4JBU30SnHr@RmBJ9wek0 zFU#zRl8HC7_hc!4xy5I^K+}X!%&#N!3kHyA0iA?P7_G1qS|g@4VP)Pfs~1;C;y@`@ zdXjY}9zlZ)CyQ^!Z72#7%_A)IEiPVoLpj*BCq#gkcWCf0pc#JxTGrap0XUdah)f_G zo90?ap z(65{Si>0o{&1w+YS+l_@oYA$|sxsk@d8*~VPBrNh8Z5s>VDuHBK?>?=Z`op?le0iXbus0$%e?ZP9Cv=1Mf?ccwP zB!@6)RR{hk+snqiy!`byQ2G6A28CKDtWP-bJ0y(iS{d7DV*NEY&j#|xmR`j1m3eFs zd+Q^eM94sfJZt3uaoT#7O{v0q#+a#J`lcS=Ombk8B=&;7j!cIQt+NCNjoKgk#go2p z8cXDriJ{f#zTsPvp0Eb>y=0Q%(oiw~24VX(oFbbeigR0(MA=dj3Ny5F(ZtP`k_Smm zSTG@Bp-^Lqcf@hf!P@Va(Aq9Bjm)@Jx1^dRT54{>)eppm*@F6#Ax`25{uzXJvu`>8 zdyZyPY4#kNCJ|$XQKEHzUVsyAqD4d2{v`44Lva~)(1K~s43~9W+Gg51u%OUO*zoGX z?=TKgzcMxdBk?z5!$}mhMLq6R4?KAsesya8s^maa-)8j)K5|TY!0y`rUfum8&UEFb zmq?fGCowl-m&}detO#t;VOhxY5ti9Ssd()UW|&ArtPhcX;}Nv}pVD5tvrW*YLwxs^ zvhMy=;r|UbON=?#T+7)1@_QC;5hQ-_aaRHes}^R`VEWplE_ud3DRnSzz3k`Z|J=g7 z72;?L`+|+Ax)T1u1|@Jq)W2j!fCS9u#DS+5ZV-8CLo%B1#Bhl3sI1NV0bJWAMjLLE z0(ZO_Tw9pRD#rz2j0$KCPMZLWV<wghXg@t-$Y(eb9mFAFbIv05QH9jO(=T=rctjfj9G|^hCNOZQ#9279d0B^gp z&qS$!y^YLf)L6<3d-{=Q2+Nc!*6v!JcmUGI~i-$KO|hMJDH9kxzm zZGcW}h1H1#CAjhd_X^!+wPUByZB_^F54G(^?B<|6Nm=LH^0df!ki7{DIED+YP|&>( z4@0zpXf&h*>2WNiS^{gKO+Gp4d z(X+Ne&+6zpCVXJFR=Vx^c|4aN30ssbj^TO92nju@v4bmm0p*{x%hblEwYXNS9mMOo*Q+n8giMBBL2!_YIGG5sNyku7j{HM6k{*HdKp z1Qu8iK=wq^Mqm-G{0A=6n zc$p3jzBKBsYk2kzxRY6rv*QWVSI5?2H_`FaXNE_yP?kU>x{VdKFJAhfy;|^!Zq~ry zELTE)>KCUpz#1!(4^=?Y<|KQKjwFafDt5RCr#nEtGDYiuYw3I3#XI^;vUEH3g$ZbjYUS|hmCj&7|4;#Mn=P>i4xJ_nwO&I!8`asOtaxq zcjDdP7#-)*lV1oS$F3_nKlEeqO>bC$>?ybI`+B3C>RwbM3pZUhLjSBreZg$TG-&jW z)i%L#B2cV)IT0D?-77S?W&x+xAqGxyc|u|k7j_4?tT=+P`XgAIi$@m}sAffpzI=na znnuDo*9(b_lt}qa{FMDCfW$0dI3R;XnGKBZs~A|qGg{S4^Ao~~j8$nHl2vD~PvQu` zU7N?jPDJBiZ<(o8n%-7M2tz}$h&RI65A7}(XP{k)c8YH|sjavHbj{WZ+!iUK8AFDe z{PaSQLY*P0NwiKZ(@X~phVqv92>Gpr7+;LtixGisNZfjQG&O0i8<8|+=z|dZBNt?) z7NVnQEkV*T9Tua)fkoa+pL3avuQdT8-qlI zLtNwoN}D)b#9=9Mo8;<6k7E5bRH+g+tP|SgzRs?mu9Q$<0qH6&I(?B1xyI8k;iL!m zRs+!y7HVZ|3{WWs%*Y{Fum{cTxFfwr3t5XoYfjnQwL%fzKt7|5vs+)?P0y~7pp5*4h5o96~KV{wi%<2XwaZ@$`hJ&v^Pi zPe0&^LuJly@bn{|h$F3qw!%N&DOKEB(K|;h3#vGE!}RCBomNj9SC;&7`!=3CxzSA* zhWk3(QXSn`13}KIuKhiI*xdHe;hw{<^^A6=dU|o3=sDQ6>F}Y$dk*iyGaftmx98QK aw|b8B?Ca_2+26Al{|@&Y>lsGs*Zwb=*2(k$ literal 0 HcmV?d00001 From e4b92352b6140309da6b413cadda8548d9ca25c3 Mon Sep 17 00:00:00 2001 From: Dampuru Vinay Kumar Reddy Date: Fri, 23 Dec 2022 23:39:26 +0530 Subject: [PATCH 09/22] template files edited --- .../interface_packages/apb_pkg/.project | 30 -- .../interface_packages/apb_pkg/.svproject | 16 - .../interface_packages/apb_pkg/Makefile | 66 --- .../interface_packages/apb_pkg/apb.compile | 3 - .../interface_packages/apb_pkg/apb_bfm.vinfo | 6 - .../apb_pkg/apb_common.compile | 7 - .../apb_pkg/apb_filelist_hdl.f | 1 - .../apb_pkg/apb_filelist_hvl.f | 1 - .../apb_pkg/apb_filelist_xrtl.f | 3 - .../apb_pkg/apb_hdl.compile | 9 - .../apb_pkg/apb_hvl.compile | 7 - .../interface_packages/apb_pkg/apb_pkg.sv | 77 ---- .../interface_packages/apb_pkg/apb_pkg.vinfo | 4 - .../interface_packages/apb_pkg/apb_pkg_hdl.sv | 38 -- .../apb_pkg/apb_pkg_hdl.vinfo | 2 - .../interface_packages/apb_pkg/apb_pkg_sve.F | 10 - .../interface_packages/apb_pkg/compile.do | 14 - .../apb_pkg/src/apb2reg_adapter.svh | 113 ------ .../apb_pkg/src/apb_agent.svh | 74 ---- .../apb_pkg/src/apb_configuration.svh | 203 ---------- .../apb_pkg/src/apb_driver.svh | 109 ----- .../apb_pkg/src/apb_driver_bfm.sv | 376 ------------------ .../interface_packages/apb_pkg/src/apb_if.sv | 112 ------ .../src/apb_infact_coverage_strategy.csv | 6 - .../apb_pkg/src/apb_macros.svh | 202 ---------- .../apb_pkg/src/apb_monitor.svh | 102 ----- .../apb_pkg/src/apb_monitor_bfm.sv | 216 ---------- .../apb_pkg/src/apb_random_sequence.svh | 65 --- .../apb_pkg/src/apb_responder_sequence.svh | 61 --- .../apb_pkg/src/apb_sequence_base.svh | 114 ------ .../apb_pkg/src/apb_transaction.svh | 229 ----------- .../apb_pkg/src/apb_transaction_coverage.svh | 88 ---- .../apb_pkg/src/apb_typedefs.svh | 20 - .../apb_pkg/src/apb_typedefs_hdl.svh | 21 - .../apb_pkg/yaml/apb_interface.yaml | 125 ------ .../interface_driver_bfm.TMPL | 4 +- .../interface_templates/interface_if.TMPL | 6 +- .../interface_monitor_bfm.TMPL | 4 +- 38 files changed, 7 insertions(+), 2537 deletions(-) delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.project delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.svproject delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/Makefile delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb.compile delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_bfm.vinfo delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_common.compile delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hdl.f delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hvl.f delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_xrtl.f delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hdl.compile delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hvl.compile delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.sv delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.vinfo delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.sv delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.vinfo delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_sve.F delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/compile.do delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb2reg_adapter.svh delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_agent.svh delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_configuration.svh delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver.svh delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver_bfm.sv delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_if.sv delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_infact_coverage_strategy.csv delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_macros.svh delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor.svh delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor_bfm.sv delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_random_sequence.svh delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_responder_sequence.svh delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_sequence_base.svh delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction.svh delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction_coverage.svh delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs.svh delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs_hdl.svh delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/yaml/apb_interface.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.project b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.project deleted file mode 100644 index af8fae51..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.project +++ /dev/null @@ -1,30 +0,0 @@ - - - apb_pkg - - - - - - org.python.pydev.PyDevBuilder - - - - - net.sf.sveditor.core.SVProjectBuilder - - - - - - net.sf.sveditor.core.SVNature - org.python.pydev.pythonNature - - - - UVMF_VIP_LIBRARY_HOME - $%7BPARENT-2-PROJECT_LOC%7D - - - - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.svproject b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.svproject deleted file mode 100644 index e1c28bec..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/.svproject +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/Makefile b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/Makefile deleted file mode 100644 index a9e84894..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/Makefile +++ /dev/null @@ -1,66 +0,0 @@ -# apb interface packages source -# pragma uvmf custom additional begin -# pragma uvmf custom additional end - -apb_PKG = \ - +incdir+$(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg \ - -F $(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg/apb_filelist_hvl.f - -apb_PKG_HDL = \ - +incdir+$(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg \ - -F $(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg/apb_filelist_hdl.f - -apb_PKG_XRTL = \ - +incdir+$(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg \ - -F $(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg/apb_filelist_xrtl.f - -COMP_apb_PKG_TGT_0 = q_comp_apb_pkg -COMP_apb_PKG_TGT_1 = v_comp_apb_pkg -COMP_apb_PKG_TGT = $(COMP_apb_PKG_TGT_$(USE_VELOCE)) - -comp_apb_pkg: $(COMP_apb_PKG_TGT) - -q_comp_apb_pkg: - $(HDL_COMP_CMD) $(apb_PKG_HDL) - $(HVL_COMP_CMD) $(apb_PKG) - $(HDL_COMP_CMD) $(apb_PKG_XRTL) - -v_comp_apb_pkg: - $(HVL_COMP_CMD) $(apb_PKG_HDL) - $(HVL_COMP_CMD) $(apb_PKG) - $(VELANALYZE_CMD) $(apb_PKG_HDL) - $(VELANALYZE_HVL_CMD) $(apb_PKG) - $(HDL_COMP_CMD) $(apb_PKG_XRTL) - -ifeq ($(MTI_VCO_MODE),64) - GCC_COMP_ARCH = -m64 -else - GCC_COMP_ARCH = -m32 -endif - -export apb_IF_DPI_SRC ?= $(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg/dpi - -C_FILE_COMPILE_LIST_apb_pkg = \ - -O_FILE_COMPILE_LIST_apb_pkg = $(notdir $(C_FILE_COMPILE_LIST_apb_pkg:.c=.o)) - -GCC_COMP_ARGS_apb_pkg += -I$(apb_IF_DPI_SRC) \ - -fPIC - -GCC_COMP_ARGS_apb_pkg += $(apb_IF_GCC_COMP_ARGUMENTS) - -GCC_LINK_ARGS_apb_pkg += \ - \ - -o .so - -comp_apb_pkg_c_files: - @echo "--------------------------------" - @echo "Compiling Interface C source" - @echo "--------------------------------" - gcc $(GCC_COMP_ARCH) $(GCC_COMP_ARGS_apb_pkg) $(C_FILE_COMPILE_LIST_apb_pkg) - @echo "--------------------------------" - @echo "Linking Interface C objects into a shared object" - @echo "--------------------------------" - gcc $(GCC_COMP_ARCH) $(GCC_LINK_ARGS_apb_pkg) $(O_FILE_COMPILE_LIST_apb_pkg) - @echo "--------------------------------" - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb.compile b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb.compile deleted file mode 100644 index 65122a00..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb.compile +++ /dev/null @@ -1,3 +0,0 @@ -needs: - - apb_hvl.compile - - apb_hdl.compile diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_bfm.vinfo b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_bfm.vinfo deleted file mode 100644 index 2079586d..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_bfm.vinfo +++ /dev/null @@ -1,6 +0,0 @@ -@use $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.vinfo -@use apb_pkg_hdl.vinfo -+incdir+@vinfodir -src/apb_if.sv -src/apb_driver_bfm.sv -src/apb_monitor_bfm.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_common.compile b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_common.compile deleted file mode 100644 index 576b6d1e..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_common.compile +++ /dev/null @@ -1,7 +0,0 @@ -needs: - - $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.compile -incdir: - - . - - ${uvm_path}/src -src: - - apb_pkg_hdl.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hdl.f b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hdl.f deleted file mode 100644 index 67f8b07b..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hdl.f +++ /dev/null @@ -1 +0,0 @@ -$UVMF_VIP_LIBRARY_HOME/interface_packages/apb_pkg/apb_pkg_hdl.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hvl.f b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hvl.f deleted file mode 100644 index f968ecb1..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_hvl.f +++ /dev/null @@ -1 +0,0 @@ -$UVMF_VIP_LIBRARY_HOME/interface_packages/apb_pkg/apb_pkg.sv \ No newline at end of file diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_xrtl.f b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_xrtl.f deleted file mode 100644 index af0179c5..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_filelist_xrtl.f +++ /dev/null @@ -1,3 +0,0 @@ -$UVMF_VIP_LIBRARY_HOME/interface_packages/apb_pkg/src/apb_if.sv -$UVMF_VIP_LIBRARY_HOME/interface_packages/apb_pkg/src/apb_monitor_bfm.sv -$UVMF_VIP_LIBRARY_HOME/interface_packages/apb_pkg/src/apb_driver_bfm.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hdl.compile b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hdl.compile deleted file mode 100644 index 7d6c731f..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hdl.compile +++ /dev/null @@ -1,9 +0,0 @@ -needs: - - $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.compile - - ./apb_common.compile -incdir: - - . -src: - - src/apb_if.sv - - src/apb_monitor_bfm.sv - - src/apb_driver_bfm.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hvl.compile b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hvl.compile deleted file mode 100644 index fd509f26..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_hvl.compile +++ /dev/null @@ -1,7 +0,0 @@ -needs: - - $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg.compile - - ./apb_common.compile -incdir: - - . -src: - - apb_pkg.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.sv b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.sv deleted file mode 100644 index 61c9106e..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.sv +++ /dev/null @@ -1,77 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// PACKAGE: This file defines all of the files contained in the -// interface package that will run on the host simulator. -// -// CONTAINS: -// - -// - -// - - -// - -// - -// - - -// - -// - -// - - -// - -// - -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -package apb_pkg; - - import uvm_pkg::*; - import uvmf_base_pkg_hdl::*; - import uvmf_base_pkg::*; - import apb_pkg_hdl::*; - - `include "uvm_macros.svh" - - // pragma uvmf custom package_imports_additional begin - // pragma uvmf custom package_imports_additional end - `include "src/apb_macros.svh" - - export apb_pkg_hdl::*; - - - - // Parameters defined as HVL parameters - - `include "src/apb_typedefs.svh" - `include "src/apb_transaction.svh" - - `include "src/apb_configuration.svh" - `include "src/apb_driver.svh" - `include "src/apb_monitor.svh" - - `include "src/apb_transaction_coverage.svh" - `include "src/apb_sequence_base.svh" - `include "src/apb_random_sequence.svh" - - `include "src/apb_responder_sequence.svh" - `include "src/apb2reg_adapter.svh" - - `include "src/apb_agent.svh" - - // pragma uvmf custom package_item_additional begin - // UVMF_CHANGE_ME : When adding new interface sequences to the src directory - // be sure to add the sequence file here so that it will be - // compiled as part of the interface package. Be sure to place - // the new sequence after any base sequences of the new sequence. - // pragma uvmf custom package_item_additional end - -endpackage - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.vinfo b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.vinfo deleted file mode 100644 index f49104d7..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg.vinfo +++ /dev/null @@ -1,4 +0,0 @@ -@use $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg.vinfo -@use apb_pkg_hdl.vinfo -+incdir+@vinfodir -apb_pkg.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.sv b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.sv deleted file mode 100644 index 5fe0e351..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.sv +++ /dev/null @@ -1,38 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// PACKAGE: This file defines all of the files contained in the -// interface package that needs to be compiled and synthesized -// for running on Veloce. -// -// CONTAINS: -// - -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -package apb_pkg_hdl; - - import uvmf_base_pkg_hdl::*; - - // pragma uvmf custom package_imports_additional begin - // pragma uvmf custom package_imports_additional end - - // Parameters defined as HDL parameters - - `include "src/apb_typedefs_hdl.svh" - `include "src/apb_macros.svh" - - // pragma uvmf custom package_item_additional begin - // pragma uvmf custom package_item_additional end - -endpackage - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.vinfo b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.vinfo deleted file mode 100644 index 7826b306..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_hdl.vinfo +++ /dev/null @@ -1,2 +0,0 @@ -@use $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.vinfo -apb_pkg_hdl.sv diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_sve.F b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_sve.F deleted file mode 100644 index 9f2d5506..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/apb_pkg_sve.F +++ /dev/null @@ -1,10 +0,0 @@ -// UVM -+incdir+${UVM_HOME}/src -${UVM_HOME}/src/uvm_pkg.sv - -// Common UVMF files --f ${UVMF_HOME}/common/common_sve.f - -+incdir+. --f ${UVMF_VIP_LIBRARY_HOME}/interface_packages/apb_pkg/apb_filelist_hdl.f --f ${UVMF_VIP_LIBRARY_HOME}/interface_packages/apb_pkg/apb_filelist_hvl.f diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/compile.do b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/compile.do deleted file mode 100644 index ae028fe8..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/compile.do +++ /dev/null @@ -1,14 +0,0 @@ -# Tcl do file for compile of apb interface - -# pragma uvmf custom additional begin -# pragma uvmf custom additional end - - -vlog -sv -timescale 1ps/1ps -suppress 2223,2286 +incdir+$env(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg \ - -F $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg/apb_filelist_hdl.f - -vlog -sv -timescale 1ps/1ps -suppress 2223,2286 +incdir+$env(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg \ - -F $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg/apb_filelist_hvl.f - -vlog -sv -timescale 1ps/1ps -suppress 2223,2286 +incdir+$env(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg \ - -F $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/apb_pkg/apb_filelist_xrtl.f \ No newline at end of file diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb2reg_adapter.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb2reg_adapter.svh deleted file mode 100644 index e5840607..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb2reg_adapter.svh +++ /dev/null @@ -1,113 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: -// This file contains the UVM register adapter for the apb interface. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -class apb2reg_adapter #( - int APB_ADDR_WIDTH = 32, - int APB_DATA_WIDTH = 32 - ) extends uvm_reg_adapter; - - `uvm_object_param_utils( apb2reg_adapter #( - APB_ADDR_WIDTH, - APB_DATA_WIDTH - )) - - // pragma uvmf custom class_item_additional begin - // pragma uvmf custom class_item_additional end - - //-------------------------------------------------------------------- - // new - //-------------------------------------------------------------------- - function new (string name = "apb2reg_adapter" ); - super.new(name); - // pragma uvmf custom new begin - // UVMF_CHANGE_ME : Configure the adapter regarding byte enables and provides response. - - // Does the protocol the Agent is modeling support byte enables? - // 0 = NO - // 1 = YES - supports_byte_enable = 0; - - // Does the Agent's Driver provide separate response sequence items? - // i.e. Does the driver call seq_item_port.put() - // and do the sequences call get_response()? - // 0 = NO - // 1 = YES - provides_responses = 0; - // pragma uvmf custom new end - - endfunction: new - - //-------------------------------------------------------------------- - // reg2bus - //-------------------------------------------------------------------- - virtual function uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw); - - apb_transaction #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ) trans_h = apb_transaction #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - )::type_id::create("trans_h"); - - // pragma uvmf custom reg2bus begin - // UVMF_CHANGE_ME : Fill in the reg2bus adapter mapping registe fields to protocol fields. - - //Adapt the following for your sequence item type - // trans_h.op = (rw.kind == UVM_READ) ? WB_READ : WB_WRITE; - //Copy over address - // trans_h.addr = rw.addr; - //Copy over write data - // trans_h.data = rw.data; - - // pragma uvmf custom reg2bus end - - // Return the adapted transaction - return trans_h; - - endfunction: reg2bus - - //-------------------------------------------------------------------- - // bus2reg - //-------------------------------------------------------------------- - virtual function void bus2reg(uvm_sequence_item bus_item, - ref uvm_reg_bus_op rw); - apb_transaction #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ) trans_h; - if (!$cast(trans_h, bus_item)) begin - `uvm_fatal("ADAPT","Provided bus_item is not of the correct type") - return; - end - // pragma uvmf custom bus2reg begin - // UVMF_CHANGE_ME : Fill in the bus2reg adapter mapping protocol fields to register fields. - //Adapt the following for your sequence item type - //Copy over instruction type - // rw.kind = (trans_h.op == WB_WRITE) ? UVM_WRITE : UVM_READ; - //Copy over address - // rw.addr = trans_h.addr; - //Copy over read data - // rw.data = trans_h.data; - //Check for errors on the bus and return UVM_NOT_OK if there is an error - // rw.status = UVM_IS_OK; - // pragma uvmf custom bus2reg end - - endfunction: bus2reg - -endclass : apb2reg_adapter - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_agent.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_agent.svh deleted file mode 100644 index beabbd7d..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_agent.svh +++ /dev/null @@ -1,74 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: Protocol specific agent class definition -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -class apb_agent #( - int APB_ADDR_WIDTH = 32, - int APB_DATA_WIDTH = 32 - ) extends uvmf_parameterized_agent #( - .CONFIG_T(apb_configuration #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - )), - .DRIVER_T(apb_driver #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - )), - .MONITOR_T(apb_monitor #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - )), - .COVERAGE_T(apb_transaction_coverage #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - )), - .TRANS_T(apb_transaction #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - )) - ); - - `uvm_component_param_utils( apb_agent #( - APB_ADDR_WIDTH, - APB_DATA_WIDTH - )) - -// pragma uvmf custom class_item_additional begin -// pragma uvmf custom class_item_additional end - -// **************************************************************************** -// FUNCTION : new() -// This function is the standard SystemVerilog constructor. -// - function new( string name = "", uvm_component parent = null ); - super.new( name, parent ); - endfunction - -// **************************************************************************** - // FUNCTION: build_phase - virtual function void build_phase(uvm_phase phase); -// pragma uvmf custom build_phase_pre_super begin -// pragma uvmf custom build_phase_pre_super end - super.build_phase(phase); - if (configuration.active_passive == ACTIVE) begin - // Place sequencer handle into configuration object - // so that it may be retrieved from configuration - // rather than using uvm_config_db - configuration.sequencer = this.sequencer; - end - endfunction - -endclass - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_configuration.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_configuration.svh deleted file mode 100644 index c3ade2ce..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_configuration.svh +++ /dev/null @@ -1,203 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: This class contains all variables and functions used -// to configure the apb agent and its bfm's. It gets the -// bfm's from the uvm_config_db for use by the agent. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -class apb_configuration #( - int APB_ADDR_WIDTH = 32, - int APB_DATA_WIDTH = 32 - ) extends uvmf_parameterized_agent_configuration_base #( - .DRIVER_BFM_BIND_T(virtual apb_driver_bfm #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - )), - .MONITOR_BFM_BIND_T( virtual apb_monitor_bfm #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ))); - - `uvm_object_param_utils( apb_configuration #( - APB_ADDR_WIDTH, - APB_DATA_WIDTH - )) - - - // Sequencer handle populated by agent - uvm_sequencer #(apb_transaction #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ) ) sequencer; - - //Constraints for the configuration variables: - - // pragma uvmf custom class_item_additional begin - // pragma uvmf custom class_item_additional end - - covergroup apb_configuration_cg; - // pragma uvmf custom covergroup begin - option.auto_bin_max=1024; - // pragma uvmf custom covergroup end - endgroup - - //******************************************************************* - //******************************************************************* - // Structure used to pass configuration variables to monitor and driver BFM's. - // Use to_struct function to pack variables into structure. - // Use from_struct function to unpack variables from structure. - // This structure is defined in apb_macros.svh - `apb_CONFIGURATION_STRUCT - apb_configuration_s apb_configuration_struct; - //******************************************************************* - // FUNCTION: to_struct() - // This function packs variables into a apb_configuration_s - // structure. The function returns the handle to the apb_configuration_struct. - // This function is defined in apb_macros.svh - `apb_CONFIGURATION_TO_STRUCT_FUNCTION - //******************************************************************* - // FUNCTION: from_struct() - // This function unpacks the struct provided as an argument into - // variables of this class. - // This function is defined in apb_macros.svh - `apb_CONFIGURATION_FROM_STRUCT_FUNCTION - - // **************************************************************************** - // FUNCTION : new() - // This function is the standard SystemVerilog constructor. - // - function new( string name = "" ); - super.new( name ); - // Construct the covergroup for this configuration class - apb_configuration_cg = new; - endfunction - - // **************************************************************************** - // FUNCTION: post_randomize() - // This function is automatically called after the randomize() function - // is executed. - // - function void post_randomize(); - super.post_randomize(); - apb_configuration_cg.sample(); - endfunction - - // **************************************************************************** - // FUNCTION: initialize - // This function causes the configuration to retrieve - // its virtual interface handle from the uvm_config_db. - // This function also makes itself available to its - // agent through the uvm_config_db. - // - // ARGUMENTS: - // uvmf_active_passive_t activity: - // This argument identifies the simulation level - // as either BLOCK, CHIP, SIMULATION, etc. - // - // AGENT_PATH: - // This argument identifies the path to this - // configurations agent. This configuration - // makes itself available to the agent specified - // by agent_path by placing itself into the - // uvm_config_db. - // - // INTERFACE_NAME: - // This argument identifies the string name of - // this configurations BFM's. This string - // name is used to retrieve the driver and - // monitor BFM from the uvm_config_db. - // - virtual function void initialize(uvmf_active_passive_t activity, - string agent_path, - string interface_name); - - super.initialize( activity, agent_path, interface_name); - // The covergroup is given the same name as the interface - apb_configuration_cg.set_inst_name(interface_name); - - // This configuration places itself into the uvm_config_db for the agent, identified by the agent_path variable, to retrieve. - uvm_config_db #( apb_configuration #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ) - )::set( null ,agent_path,UVMF_AGENT_CONFIG, this ); - - // This configuration also places itself in the config db using the same identifier used by the interface. This allows users to access - // configuration variables and the interface through the bfm api class rather than directly accessing the BFM. This is useful for - // accessingthe BFM when using Veloce - uvm_config_db #( apb_configuration #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ) - )::set( null ,UVMF_CONFIGURATIONS, interface_name, this ); - - apb_configuration_cg.set_inst_name($sformatf("apb_configuration_cg_%s",get_full_name())); - -// This code is to aid in debugging parameter mismatches between the BFM and its corresponding agent. -// Enable this debug by setting UVM_VERBOSITY to UVM_DEBUG -// Setting UVM_VERBOSITY to UVM_DEBUG causes all BFM's and all agents to display their parameter settings. -// All of the messages from this feature have a UVM messaging id value of "CFG" -// The transcript or run.log can be parsed to ensure BFM parameter settings match its corresponding agents parameter settings. - `uvm_info("CFG", - $psprintf("The agent at '%s' is using interface named %s has the following parameters: APB_ADDR_WIDTH=%x APB_DATA_WIDTH=%x ", agent_path, interface_name, APB_ADDR_WIDTH ,APB_DATA_WIDTH ), - UVM_DEBUG) - - // pragma uvmf custom initialize begin - // This controls whether or not the agent returns a transaction handle in the driver when calling - // item_done() back into the sequencer or not. If set to 1, a transaction is sent back which means - // the sequence on the other end must use the get_response() part of the driver/sequence API. If - // this doesn't occur, there will eventually be response_queue overflow errors during the test. - return_transaction_response = 1'b0; - - // pragma uvmf custom initialize end - - endfunction - - // **************************************************************************** - // TASK: wait_for_reset - // *[Required]* Blocks until reset is released. The wait_for_reset operation is performed - // by a task in the monitor bfm. - virtual task wait_for_reset(); - monitor_bfm.wait_for_reset(); - endtask - - // **************************************************************************** - // TASK: wait_for_num_clocks - // *[Required]* Blocks until specified number of clocks have elapsed. The wait_for_num_clocks - // operation is performed by a task in the monitor bfm. - virtual task wait_for_num_clocks(int clocks); - monitor_bfm.wait_for_num_clocks(clocks); - endtask - - // **************************************************************************** - // FUNCTION : convert2string() - // This function is used to convert variables in this class into a string for log messaging. - // - virtual function string convert2string (); - // pragma uvmf custom convert2string begin - return $sformatf(""); - // pragma uvmf custom convert2string end - endfunction - - // **************************************************************************** - // FUNCTION: get_sequencer - function uvm_sequencer #(apb_transaction#( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - )) get_sequencer(); - return sequencer; - endfunction - -endclass - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver.svh deleted file mode 100644 index d23d3410..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver.svh +++ /dev/null @@ -1,109 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: This class passes transactions between the sequencer -// and the BFM driver interface. It accesses the driver BFM -// through the bfm handle. This driver -// passes transactions to the driver BFM through the access -// task. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -class apb_driver #( - int APB_ADDR_WIDTH = 32, - int APB_DATA_WIDTH = 32 - ) extends uvmf_driver_base #( - .CONFIG_T(apb_configuration #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ) ), - .BFM_BIND_T(virtual apb_driver_bfm #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ) ), - .REQ(apb_transaction #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ) ), - .RSP(apb_transaction #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ) )); - - `uvm_component_param_utils( apb_driver #( - APB_ADDR_WIDTH, - APB_DATA_WIDTH - )) -//******************************************************************* -// Macros that define structs located in apb_macros.svh -//******************************************************************* -// Initiator macro used by apb_driver and apb_driver_bfm -// to communicate initiator driven data to apb_driver_bfm. -`apb_INITIATOR_STRUCT - apb_initiator_s apb_initiator_struct; -//******************************************************************* -// Responder macro used by apb_driver and apb_driver_bfm -// to communicate Responder driven data to apb_driver_bfm. -`apb_RESPONDER_STRUCT - apb_responder_s apb_responder_struct; - -// pragma uvmf custom class_item_additional begin -// pragma uvmf custom class_item_additional end - -// **************************************************************************** -// This function is the standard SystemVerilog constructor. -// - function new( string name = "", uvm_component parent=null ); - super.new( name, parent ); - endfunction - -// **************************************************************************** -// This function sends configuration object variables to the driver BFM -// using the configuration struct. -// - virtual function void configure(input CONFIG_T cfg); - bfm.configure( cfg.to_struct() ); - endfunction - -// **************************************************************************** -// This function places a handle to this class in the proxy variable in the -// driver BFM. This allows the driver BFM to call tasks and function within this class. -// - virtual function void set_bfm_proxy_handle(); - bfm.proxy = this; endfunction - -// **************************************************************************** -// This task is called by the run_phase in uvmf_driver_base. - virtual task access( inout REQ txn ); -// pragma uvmf custom access begin - if (configuration.initiator_responder==RESPONDER) begin - // Complete current transfer and wait for next transfer - bfm.respond_and_wait_for_next_transfer( - apb_initiator_struct, - txn.to_responder_struct() - ); - // Unpack information about initiated transfer received by this responder - txn.from_initiator_struct(apb_initiator_struct); - end else begin - // Initiate a transfer and get response - bfm.initiate_and_get_response( - txn.to_initiator_struct(), - apb_responder_struct - ); - // Unpack transfer response information received by this initiator - txn.from_responder_struct(apb_responder_struct); - end -// pragma uvmf custom access end - endtask - -endclass - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver_bfm.sv b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver_bfm.sv deleted file mode 100644 index b555ffc8..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_driver_bfm.sv +++ /dev/null @@ -1,376 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: -// This interface performs the apb signal driving. It is -// accessed by the uvm apb driver through a virtual interface -// handle in the apb configuration. It drives the singals passed -// in through the port connection named bus of type apb_if. -// -// Input signals from the apb_if are assigned to an internal input -// signal with a _i suffix. The _i signal should be used for sampling. -// -// The input signal connections are as follows: -// bus.signal -> signal_i -// -// This bfm drives signals with a _o suffix. These signals -// are driven onto signals within apb_if based on INITIATOR/RESPONDER and/or -// ARBITRATION/GRANT status. -// -// The output signal connections are as follows: -// signal_o -> bus.signal -// -// -// Interface functions and tasks used by UVM components: -// -// configure: -// This function gets configuration attributes from the -// UVM driver to set any required BFM configuration -// variables such as 'initiator_responder'. -// -// initiate_and_get_response: -// This task is used to perform signaling activity for initiating -// a protocol transfer. The task initiates the transfer, using -// input data from the initiator struct. Then the task captures -// response data, placing the data into the response struct. -// The response struct is returned to the driver class. -// -// respond_and_wait_for_next_transfer: -// This task is used to complete a current transfer as a responder -// and then wait for the initiator to start the next transfer. -// The task uses data in the responder struct to drive protocol -// signals to complete the transfer. The task then waits for -// the next transfer. Once the next transfer begins, data from -// the initiator is placed into the initiator struct and sent -// to the responder sequence for processing to determine -// what data to respond with. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -import uvmf_base_pkg_hdl::*; -import apb_pkg_hdl::*; -`include "src/apb_macros.svh" - -interface apb_driver_bfm #( - int APB_ADDR_WIDTH = 32, - int APB_DATA_WIDTH = 32 - ) - (apb_if bus); - // The following pragma and additional ones in-lined further below are for running this BFM on Veloce - // pragma attribute apb_driver_bfm partition_interface_xif - -`ifndef XRTL -// This code is to aid in debugging parameter mismatches between the BFM and its corresponding agent. -// Enable this debug by setting UVM_VERBOSITY to UVM_DEBUG -// Setting UVM_VERBOSITY to UVM_DEBUG causes all BFM's and all agents to display their parameter settings. -// All of the messages from this feature have a UVM messaging id value of "CFG" -// The transcript or run.log can be parsed to ensure BFM parameter settings match its corresponding agents parameter settings. -import uvm_pkg::*; -`include "uvm_macros.svh" -initial begin : bfm_vs_agent_parameter_debug - `uvm_info("CFG", - $psprintf("The BFM at '%m' has the following parameters: APB_ADDR_WIDTH=%x APB_DATA_WIDTH=%x ", APB_ADDR_WIDTH,APB_DATA_WIDTH), - UVM_DEBUG) -end -`endif - - // Config value to determine if this is an initiator or a responder - uvmf_initiator_responder_t initiator_responder; - // Custom configuration variables. - // These are set using the configure function which is called during the UVM connect_phase - - tri pclk_i; - tri presetn_i; - - // Signal list (all signals are capable of being inputs and outputs for the sake - // of supporting both INITIATOR and RESPONDER mode operation. Expectation is that - // directionality in the config file was from the point-of-view of the INITIATOR - - // INITIATOR mode input signals - tri [APB_DATA_WIDTH-1:0] prdata_i; - reg [APB_DATA_WIDTH-1:0] prdata_o = 'b0; - tri pready_i; - reg pready_o = 0; - tri pslverr_i; - reg pslverr_o = 0; - - // INITIATOR mode output signals - tri [15:0] psel_i; - reg [15:0] psel_o = 'b0; - tri penable_i; - reg penable_o = 'b0; - tri [APB_ADDR_WIDTH-1:0] paddr_i; - reg [APB_ADDR_WIDTH-1:0] paddr_o = 'b0; - tri [APB_DATA_WIDTH-1:0] pwdata_i; - reg [APB_DATA_WIDTH-1:0] pwdata_o = 'b0; - tri pwrite_i; - reg pwrite_o = 'b0; - tri [3:0] pstrb_i; - reg [3:0] pstrb_o = 'b0; - tri [2:0] pprot_i; - reg [2:0] pprot_o = 'b0; - - // Bi-directional signals - - - assign pclk_i = bus.pclk; - assign presetn_i = bus.presetn; - - // These are signals marked as 'input' by the config file, but the signals will be - // driven by this BFM if put into RESPONDER mode (flipping all signal directions around) - assign prdata_i = bus.prdata; - assign bus.prdata = (initiator_responder == RESPONDER) ? prdata_o : 'bz; - assign pready_i = bus.pready; - assign bus.pready = (initiator_responder == RESPONDER) ? pready_o : 'bz; - assign pslverr_i = bus.pslverr; - assign bus.pslverr = (initiator_responder == RESPONDER) ? pslverr_o : 'bz; - - - // These are signals marked as 'output' by the config file, but the outputs will - // not be driven by this BFM unless placed in INITIATOR mode. - assign bus.psel = (initiator_responder == INITIATOR) ? psel_o : 'bz; - assign psel_i = bus.psel; - assign bus.penable = (initiator_responder == INITIATOR) ? penable_o : 'bz; - assign penable_i = bus.penable; - assign bus.paddr = (initiator_responder == INITIATOR) ? paddr_o : 'bz; - assign paddr_i = bus.paddr; - assign bus.pwdata = (initiator_responder == INITIATOR) ? pwdata_o : 'bz; - assign pwdata_i = bus.pwdata; - assign bus.pwrite = (initiator_responder == INITIATOR) ? pwrite_o : 'bz; - assign pwrite_i = bus.pwrite; - assign bus.pstrb = (initiator_responder == INITIATOR) ? pstrb_o : 'bz; - assign pstrb_i = bus.pstrb; - assign bus.pprot = (initiator_responder == INITIATOR) ? pprot_o : 'bz; - assign pprot_i = bus.pprot; - - // Proxy handle to UVM driver - apb_pkg::apb_driver #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ) proxy; - // pragma tbx oneway proxy.my_function_name_in_uvm_driver - - // **************************************************************************** - // **************************************************************************** - // Macros that define structs located in apb_macros.svh - // **************************************************************************** - // Struct for passing configuration data from apb_driver to this BFM - // **************************************************************************** - `apb_CONFIGURATION_STRUCT - // **************************************************************************** - // Structs for INITIATOR and RESPONDER data flow - //******************************************************************* - // Initiator macro used by apb_driver and apb_driver_bfm - // to communicate initiator driven data to apb_driver_bfm. - `apb_INITIATOR_STRUCT - apb_initiator_s initiator_struct; - // Responder macro used by apb_driver and apb_driver_bfm - // to communicate Responder driven data to apb_driver_bfm. - `apb_RESPONDER_STRUCT - apb_responder_s responder_struct; - - // **************************************************************************** -// pragma uvmf custom reset_condition_and_response begin - // Always block used to return signals to reset value upon assertion of reset - always @( negedge presetn_i ) - begin - // RESPONDER mode output signals - prdata_o <= 'b0; - pready_o <= 0; - pslverr_o <= 0; - // INITIATOR mode output signals - psel_o <= 'b0; - penable_o <= 'b0; - paddr_o <= 'b0; - pwdata_o <= 'b0; - pwrite_o <= 'b0; - pstrb_o <= 'b0; - pprot_o <= 'b0; - // Bi-directional signals - - end -// pragma uvmf custom reset_condition_and_response end - - // pragma uvmf custom interface_item_additional begin - // pragma uvmf custom interface_item_additional end - - //****************************************************************** - // The configure() function is used to pass agent configuration - // variables to the driver BFM. It is called by the driver within - // the agent at the beginning of the simulation. It may be called - // during the simulation if agent configuration variables are updated - // and the driver BFM needs to be aware of the new configuration - // variables. - // - - function void configure(apb_configuration_s apb_configuration_arg); // pragma tbx xtf - initiator_responder = apb_configuration_arg.initiator_responder; - // pragma uvmf custom configure begin - // pragma uvmf custom configure end - endfunction - -// pragma uvmf custom initiate_and_get_response begin -// **************************************************************************** -// UVMF_CHANGE_ME -// This task is used by an initator. The task first initiates a transfer then -// waits for the responder to complete the transfer. - task initiate_and_get_response( - // This argument passes transaction variables used by an initiator - // to perform the initial part of a protocol transfer. The values - // come from a sequence item created in a sequence. - input apb_initiator_s apb_initiator_struct, - // This argument is used to send data received from the responder - // back to the sequence item. The sequence item is returned to the sequence. - output apb_responder_s apb_responder_struct - );// pragma tbx xtf - // - // Members within the apb_initiator_struct: - // bit psel ; - // bit penable ; - // bit [APB_ADDR_WIDTH-1:0] paddr ; - // bit [APB_DATA_WIDTH-1:0] pwdata ; - // bit pwrite ; - // bit [3:0] pstrb ; - // bit [3:0] pprot ; - // APB_DATA_WIDTH prdata ; - // bit pready ; - // bit pslverr ; - // Members within the apb_responder_struct: - // bit psel ; - // bit penable ; - // bit [APB_ADDR_WIDTH-1:0] paddr ; - // bit [APB_DATA_WIDTH-1:0] pwdata ; - // bit pwrite ; - // bit [3:0] pstrb ; - // bit [3:0] pprot ; - // APB_DATA_WIDTH prdata ; - // bit pready ; - // bit pslverr ; - initiator_struct = apb_initiator_struct; - // - // Reference code; - // How to wait for signal value - // while (control_signal == 1'b1) @(posedge pclk_i); - // - // How to assign a responder struct member, named xyz, from a signal. - // All available initiator input and inout signals listed. - // Initiator input signals - // apb_responder_struct.xyz = prdata_i; // [APB_DATA_WIDTH-1:0] - // apb_responder_struct.xyz = pready_i; // - // apb_responder_struct.xyz = pslverr_i; // - // Initiator inout signals - // How to assign a signal from an initiator struct member named xyz. - // All available initiator output and inout signals listed. - // Notice the _o. Those are storage variables that allow for procedural assignment. - // Initiator output signals - // psel_o <= apb_initiator_struct.xyz; // [15:0] - // penable_o <= apb_initiator_struct.xyz; // - // paddr_o <= apb_initiator_struct.xyz; // [APB_ADDR_WIDTH-1:0] - // pwdata_o <= apb_initiator_struct.xyz; // [APB_DATA_WIDTH-1:0] - // pwrite_o <= apb_initiator_struct.xyz; // - // pstrb_o <= apb_initiator_struct.xyz; // [3:0] - // pprot_o <= apb_initiator_struct.xyz; // [2:0] - // Initiator inout signals - // Initiate a transfer using the data received. - @(posedge pclk_i); - @(posedge pclk_i); - // Wait for the responder to complete the transfer then place the responder data into - // apb_responder_struct. - @(posedge pclk_i); - @(posedge pclk_i); - responder_struct = apb_responder_struct; - endtask -// pragma uvmf custom initiate_and_get_response end - -// pragma uvmf custom respond_and_wait_for_next_transfer begin -// **************************************************************************** -// The first_transfer variable is used to prevent completing a transfer in the -// first call to this task. For the first call to this task, there is not -// current transfer to complete. -bit first_transfer=1; - -// UVMF_CHANGE_ME -// This task is used by a responder. The task first completes the current -// transfer in progress then waits for the initiator to start the next transfer. - task respond_and_wait_for_next_transfer( - // This argument is used to send data received from the initiator - // back to the sequence item. The sequence determines how to respond. - output apb_initiator_s apb_initiator_struct, - // This argument passes transaction variables used by a responder - // to complete a protocol transfer. The values come from a sequence item. - input apb_responder_s apb_responder_struct - );// pragma tbx xtf - // Variables within the apb_initiator_struct: - // bit psel ; - // bit penable ; - // bit [APB_ADDR_WIDTH-1:0] paddr ; - // bit [APB_DATA_WIDTH-1:0] pwdata ; - // bit pwrite ; - // bit [3:0] pstrb ; - // bit [3:0] pprot ; - // APB_DATA_WIDTH prdata ; - // bit pready ; - // bit pslverr ; - // Variables within the apb_responder_struct: - // bit psel ; - // bit penable ; - // bit [APB_ADDR_WIDTH-1:0] paddr ; - // bit [APB_DATA_WIDTH-1:0] pwdata ; - // bit pwrite ; - // bit [3:0] pstrb ; - // bit [3:0] pprot ; - // APB_DATA_WIDTH prdata ; - // bit pready ; - // bit pslverr ; - // Reference code; - // How to wait for signal value - // while (control_signal == 1'b1) @(posedge pclk_i); - // - // How to assign a responder struct member, named xyz, from a signal. - // All available responder input and inout signals listed. - // Responder input signals - // apb_responder_struct.xyz = psel_i; // [15:0] - // apb_responder_struct.xyz = penable_i; // - // apb_responder_struct.xyz = paddr_i; // [APB_ADDR_WIDTH-1:0] - // apb_responder_struct.xyz = pwdata_i; // [APB_DATA_WIDTH-1:0] - // apb_responder_struct.xyz = pwrite_i; // - // apb_responder_struct.xyz = pstrb_i; // [3:0] - // apb_responder_struct.xyz = pprot_i; // [2:0] - // Responder inout signals - // How to assign a signal, named xyz, from an initiator struct member. - // All available responder output and inout signals listed. - // Notice the _o. Those are storage variables that allow for procedural assignment. - // Responder output signals - // prdata_o <= apb_initiator_struct.xyz; // [APB_DATA_WIDTH-1:0] - // pready_o <= apb_initiator_struct.xyz; // - // pslverr_o <= apb_initiator_struct.xyz; // - // Responder inout signals - - @(posedge pclk_i); - if (!first_transfer) begin - // Perform transfer response here. - // Reply using data recieved in the apb_responder_struct. - @(posedge pclk_i); - // Reply using data recieved in the transaction handle. - @(posedge pclk_i); - end - // Wait for next transfer then gather info from intiator about the transfer. - // Place the data into the apb_initiator_struct. - @(posedge pclk_i); - @(posedge pclk_i); - first_transfer = 0; - endtask -// pragma uvmf custom respond_and_wait_for_next_transfer end - - -endinterface - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_if.sv b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_if.sv deleted file mode 100644 index 24a87bdb..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_if.sv +++ /dev/null @@ -1,112 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: This interface contains the apb interface signals. -// It is instantiated once per apb bus. Bus Functional Models, -// BFM's named apb_driver_bfm, are used to drive signals on the bus. -// BFM's named apb_monitor_bfm are used to monitor signals on the -// bus. This interface signal bundle is passed in the port list of -// the BFM in order to give the BFM access to the signals in this -// interface. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// This template can be used to connect a DUT to these signals -// -// .dut_signal_port(apb_bus.psel), // Agent output -// .dut_signal_port(apb_bus.penable), // Agent output -// .dut_signal_port(apb_bus.paddr), // Agent output -// .dut_signal_port(apb_bus.pwdata), // Agent output -// .dut_signal_port(apb_bus.pwrite), // Agent output -// .dut_signal_port(apb_bus.pstrb), // Agent output -// .dut_signal_port(apb_bus.pprot), // Agent output -// .dut_signal_port(apb_bus.prdata), // Agent input -// .dut_signal_port(apb_bus.pready), // Agent input -// .dut_signal_port(apb_bus.pslverr), // Agent input - -import uvmf_base_pkg_hdl::*; -import apb_pkg_hdl::*; - -interface apb_if #( - int APB_ADDR_WIDTH = 32, - int APB_DATA_WIDTH = 32 - ) - - ( - input bit pclk, - input bit presetn, - inout bit [15:0] psel, - inout bit penable, - inout bit [APB_ADDR_WIDTH-1:0] paddr, - inout bit [APB_DATA_WIDTH-1:0] pwdata, - inout bit pwrite, - inout bit [3:0] pstrb, - inout bit [2:0] pprot, - inout bit [APB_DATA_WIDTH-1:0] prdata, - inout bit pready, - inout bit pslverr - ); - -modport monitor_port - ( - input pclk, - input presetn, - input psel, - input penable, - input paddr, - input pwdata, - input pwrite, - input pstrb, - input pprot, - input prdata, - input pready, - input pslverr - ); - -modport initiator_port - ( - input pclk, - input presetn, - output psel, - output penable, - output paddr, - output pwdata, - output pwrite, - output pstrb, - output pprot, - input prdata, - input pready, - input pslverr - ); - -modport responder_port - ( - input pclk, - input presetn, - input psel, - input penable, - input paddr, - input pwdata, - input pwrite, - input pstrb, - input pprot, - output prdata, - output pready, - output pslverr - ); - - -// pragma uvmf custom interface_item_additional begin -// pragma uvmf custom interface_item_additional end - -endinterface - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_infact_coverage_strategy.csv b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_infact_coverage_strategy.csv deleted file mode 100644 index 1c218e14..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_infact_coverage_strategy.csv +++ /dev/null @@ -1,6 +0,0 @@ -Global -auto_bin_max, 64 - -Name,Type,Include -rand_fields,coverpoint,=rand *.** - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_macros.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_macros.svh deleted file mode 100644 index 9490a051..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_macros.svh +++ /dev/null @@ -1,202 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: This file contains macros used with the apb package. -// These macros include packed struct definitions. These structs are -// used to pass data between classes, hvl, and BFM's, hdl. Use of -// structs are more efficient and simpler to modify. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// - -// **************************************************************************** -// When changing the contents of this struct, be sure to update the to_struct -// and from_struct methods defined in the macros below that are used in -// the apb_configuration class. -// - `define apb_CONFIGURATION_STRUCT \ -typedef struct packed { \ - uvmf_active_passive_t active_passive; \ - uvmf_initiator_responder_t initiator_responder; \ - } apb_configuration_s; - - `define apb_CONFIGURATION_TO_STRUCT_FUNCTION \ - virtual function apb_configuration_s to_struct();\ - apb_configuration_struct = \ - {\ - this.active_passive,\ - this.initiator_responder\ - };\ - return ( apb_configuration_struct );\ - endfunction - - `define apb_CONFIGURATION_FROM_STRUCT_FUNCTION \ - virtual function void from_struct(apb_configuration_s apb_configuration_struct);\ - {\ - this.active_passive,\ - this.initiator_responder \ - } = apb_configuration_struct;\ - endfunction - -// **************************************************************************** -// When changing the contents of this struct, be sure to update the to_monitor_struct -// and from_monitor_struct methods of the apb_transaction class. -// - `define apb_MONITOR_STRUCT typedef struct packed { \ - bit psel ; \ - bit penable ; \ - bit [APB_ADDR_WIDTH-1:0] paddr ; \ - bit [APB_DATA_WIDTH-1:0] pwdata ; \ - bit pwrite ; \ - bit [3:0] pstrb ; \ - bit [3:0] pprot ; \ - APB_DATA_WIDTH prdata ; \ - bit pready ; \ - bit pslverr ; \ - } apb_monitor_s; - - `define apb_TO_MONITOR_STRUCT_FUNCTION \ - virtual function apb_monitor_s to_monitor_struct();\ - apb_monitor_struct = \ - { \ - this.psel , \ - this.penable , \ - this.paddr , \ - this.pwdata , \ - this.pwrite , \ - this.pstrb , \ - this.pprot , \ - this.prdata , \ - this.pready , \ - this.pslverr \ - };\ - return ( apb_monitor_struct);\ - endfunction\ - - `define apb_FROM_MONITOR_STRUCT_FUNCTION \ - virtual function void from_monitor_struct(apb_monitor_s apb_monitor_struct);\ - {\ - this.psel , \ - this.penable , \ - this.paddr , \ - this.pwdata , \ - this.pwrite , \ - this.pstrb , \ - this.pprot , \ - this.prdata , \ - this.pready , \ - this.pslverr \ - } = apb_monitor_struct;\ - endfunction - -// **************************************************************************** -// When changing the contents of this struct, be sure to update the to_initiator_struct -// and from_initiator_struct methods of the apb_transaction class. -// Also update the comments in the driver BFM. -// - `define apb_INITIATOR_STRUCT typedef struct packed { \ - bit psel ; \ - bit penable ; \ - bit [APB_ADDR_WIDTH-1:0] paddr ; \ - bit [APB_DATA_WIDTH-1:0] pwdata ; \ - bit pwrite ; \ - bit [3:0] pstrb ; \ - bit [3:0] pprot ; \ - APB_DATA_WIDTH prdata ; \ - bit pready ; \ - bit pslverr ; \ - } apb_initiator_s; - - `define apb_TO_INITIATOR_STRUCT_FUNCTION \ - virtual function apb_initiator_s to_initiator_struct();\ - apb_initiator_struct = \ - {\ - this.psel , \ - this.penable , \ - this.paddr , \ - this.pwdata , \ - this.pwrite , \ - this.pstrb , \ - this.pprot , \ - this.prdata , \ - this.pready , \ - this.pslverr \ - };\ - return ( apb_initiator_struct);\ - endfunction - - `define apb_FROM_INITIATOR_STRUCT_FUNCTION \ - virtual function void from_initiator_struct(apb_initiator_s apb_initiator_struct);\ - {\ - this.psel , \ - this.penable , \ - this.paddr , \ - this.pwdata , \ - this.pwrite , \ - this.pstrb , \ - this.pprot , \ - this.prdata , \ - this.pready , \ - this.pslverr \ - } = apb_initiator_struct;\ - endfunction - -// **************************************************************************** -// When changing the contents of this struct, be sure to update the to_responder_struct -// and from_responder_struct methods of the apb_transaction class. -// Also update the comments in the driver BFM. -// - `define apb_RESPONDER_STRUCT typedef struct packed { \ - bit psel ; \ - bit penable ; \ - bit [APB_ADDR_WIDTH-1:0] paddr ; \ - bit [APB_DATA_WIDTH-1:0] pwdata ; \ - bit pwrite ; \ - bit [3:0] pstrb ; \ - bit [3:0] pprot ; \ - APB_DATA_WIDTH prdata ; \ - bit pready ; \ - bit pslverr ; \ - } apb_responder_s; - - `define apb_TO_RESPONDER_STRUCT_FUNCTION \ - virtual function apb_responder_s to_responder_struct();\ - apb_responder_struct = \ - {\ - this.psel , \ - this.penable , \ - this.paddr , \ - this.pwdata , \ - this.pwrite , \ - this.pstrb , \ - this.pprot , \ - this.prdata , \ - this.pready , \ - this.pslverr \ - };\ - return ( apb_responder_struct);\ - endfunction - - `define apb_FROM_RESPONDER_STRUCT_FUNCTION \ - virtual function void from_responder_struct(apb_responder_s apb_responder_struct);\ - {\ - this.psel , \ - this.penable , \ - this.paddr , \ - this.pwdata , \ - this.pwrite , \ - this.pstrb , \ - this.pprot , \ - this.prdata , \ - this.pready , \ - this.pslverr \ - } = apb_responder_struct;\ - endfunction -// pragma uvmf custom additional begin -// pragma uvmf custom additional end diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor.svh deleted file mode 100644 index 216e7e39..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor.svh +++ /dev/null @@ -1,102 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: This class receives apb transactions observed by the -// apb monitor BFM and broadcasts them through the analysis port -// on the agent. It accesses the monitor BFM through the monitor -// task. This UVM component captures transactions -// for viewing in the waveform viewer if the -// enable_transaction_viewing flag is set in the configuration. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -class apb_monitor #( - int APB_ADDR_WIDTH = 32, - int APB_DATA_WIDTH = 32 - ) extends uvmf_monitor_base #( - .CONFIG_T(apb_configuration #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - )), - .BFM_BIND_T(virtual apb_monitor_bfm #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - )), - .TRANS_T(apb_transaction #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ))); - - `uvm_component_param_utils( apb_monitor #( - APB_ADDR_WIDTH, - APB_DATA_WIDTH - )) - -// Structure used to pass data from monitor BFM to monitor class in agent. -// Use to_monitor_struct function to pack transaction variables into structure. -// Use from_monitor_struct function to unpack transaction variables from structure. -`apb_MONITOR_STRUCT - - // pragma uvmf custom class_item_additional begin - // pragma uvmf custom class_item_additional end - -// **************************************************************************** -// This function is the standard SystemVerilog constructor. -// - function new( string name = "", uvm_component parent = null ); - super.new( name, parent ); - endfunction - -// **************************************************************************** -// This function sends configuration object variables to the monitor BFM -// using the configuration struct. -// - virtual function void configure(input CONFIG_T cfg); - bfm.configure( cfg.to_struct() ); - - endfunction - -// **************************************************************************** -// This function places a handle to this class in the proxy variable in the -// monitor BFM. This allows the monitor BFM to call the notify_transaction -// function within this class. -// - virtual function void set_bfm_proxy_handle(); - bfm.proxy = this; endfunction - -// *************************************************************************** - virtual task run_phase(uvm_phase phase); - // Start monitor BFM thread and don't call super.run() in order to - // override the default monitor proxy 'pull' behavior with the more - // emulation-friendly BFM 'push' approach using the notify_transaction - // function below - bfm.start_monitoring(); - endtask - -// ************************************************************************** - -// This function is called by the monitor BFM. It receives data observed by the -// monitor BFM. Data is passed using the apb_monitor_struct. - virtual function void notify_transaction(input apb_monitor_s apb_monitor_struct); - - - trans = new("trans"); - trans.from_monitor_struct(apb_monitor_struct); - trans.start_time = time_stamp; - trans.end_time = $time; - time_stamp = trans.end_time; - - analyze(trans); - endfunction - -endclass - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor_bfm.sv b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor_bfm.sv deleted file mode 100644 index 4720bf30..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_monitor_bfm.sv +++ /dev/null @@ -1,216 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: This interface performs the apb signal monitoring. -// It is accessed by the uvm apb monitor through a virtual -// interface handle in the apb configuration. It monitors the -// signals passed in through the port connection named bus of -// type apb_if. -// -// Input signals from the apb_if are assigned to an internal input -// signal with a _i suffix. The _i signal should be used for sampling. -// -// The input signal connections are as follows: -// bus.signal -> signal_i -// -// Interface functions and tasks used by UVM components: -// monitor(inout TRANS_T txn); -// This task receives the transaction, txn, from the -// UVM monitor and then populates variables in txn -// from values observed on bus activity. This task -// blocks until an operation on the apb bus is complete. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -import uvmf_base_pkg_hdl::*; -import apb_pkg_hdl::*; -`include "src/apb_macros.svh" - - -interface apb_monitor_bfm #( - int APB_ADDR_WIDTH = 32, - int APB_DATA_WIDTH = 32 - ) - ( apb_if bus ); - // The pragma below and additional ones in-lined further down are for running this BFM on Veloce - // pragma attribute apb_monitor_bfm partition_interface_xif - -`ifndef XRTL -// This code is to aid in debugging parameter mismatches between the BFM and its corresponding agent. -// Enable this debug by setting UVM_VERBOSITY to UVM_DEBUG -// Setting UVM_VERBOSITY to UVM_DEBUG causes all BFM's and all agents to display their parameter settings. -// All of the messages from this feature have a UVM messaging id value of "CFG" -// The transcript or run.log can be parsed to ensure BFM parameter settings match its corresponding agents parameter settings. -import uvm_pkg::*; -`include "uvm_macros.svh" -initial begin : bfm_vs_agent_parameter_debug - `uvm_info("CFG", - $psprintf("The BFM at '%m' has the following parameters: APB_ADDR_WIDTH=%x APB_DATA_WIDTH=%x ", APB_ADDR_WIDTH,APB_DATA_WIDTH), - UVM_DEBUG) -end -`endif - - - // Structure used to pass transaction data from monitor BFM to monitor class in agent. -`apb_MONITOR_STRUCT - apb_monitor_s apb_monitor_struct; - - // Structure used to pass configuration data from monitor class to monitor BFM. - `apb_CONFIGURATION_STRUCT - - - // Config value to determine if this is an initiator or a responder - uvmf_initiator_responder_t initiator_responder; - // Custom configuration variables. - // These are set using the configure function which is called during the UVM connect_phase - - tri pclk_i; - tri presetn_i; - tri [15:0] psel_i; - tri penable_i; - tri [APB_ADDR_WIDTH-1:0] paddr_i; - tri [APB_DATA_WIDTH-1:0] pwdata_i; - tri pwrite_i; - tri [3:0] pstrb_i; - tri [2:0] pprot_i; - tri [APB_DATA_WIDTH-1:0] prdata_i; - tri pready_i; - tri pslverr_i; - assign pclk_i = bus.pclk; - assign presetn_i = bus.presetn; - assign psel_i = bus.psel; - assign penable_i = bus.penable; - assign paddr_i = bus.paddr; - assign pwdata_i = bus.pwdata; - assign pwrite_i = bus.pwrite; - assign pstrb_i = bus.pstrb; - assign pprot_i = bus.pprot; - assign prdata_i = bus.prdata; - assign pready_i = bus.pready; - assign pslverr_i = bus.pslverr; - - // Proxy handle to UVM monitor - apb_pkg::apb_monitor #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ) proxy; - // pragma tbx oneway proxy.notify_transaction - - // pragma uvmf custom interface_item_additional begin - // pragma uvmf custom interface_item_additional end - - //****************************************************************** - task wait_for_reset();// pragma tbx xtf - @(posedge pclk_i) ; - do_wait_for_reset(); - endtask - - // **************************************************************************** - task do_wait_for_reset(); - // pragma uvmf custom reset_condition begin - wait ( presetn_i === 1 ) ; - @(posedge pclk_i) ; - // pragma uvmf custom reset_condition end - endtask - - //****************************************************************** - - task wait_for_num_clocks(input int unsigned count); // pragma tbx xtf - @(posedge pclk_i); - - repeat (count-1) @(posedge pclk_i); - endtask - - //****************************************************************** - event go; - function void start_monitoring();// pragma tbx xtf - -> go; - endfunction - - // **************************************************************************** - initial begin - @go; - forever begin - @(posedge pclk_i); - do_monitor( apb_monitor_struct ); - - - proxy.notify_transaction( apb_monitor_struct ); - - end - end - - //****************************************************************** - // The configure() function is used to pass agent configuration - // variables to the monitor BFM. It is called by the monitor within - // the agent at the beginning of the simulation. It may be called - // during the simulation if agent configuration variables are updated - // and the monitor BFM needs to be aware of the new configuration - // variables. - // - function void configure(apb_configuration_s apb_configuration_arg); // pragma tbx xtf - initiator_responder = apb_configuration_arg.initiator_responder; - // pragma uvmf custom configure begin - // pragma uvmf custom configure end - endfunction - - - // **************************************************************************** - - task do_monitor(output apb_monitor_s apb_monitor_struct); - // - // Available struct members: - // // apb_monitor_struct.psel - // // apb_monitor_struct.penable - // // apb_monitor_struct.paddr - // // apb_monitor_struct.pwdata - // // apb_monitor_struct.pwrite - // // apb_monitor_struct.pstrb - // // apb_monitor_struct.pprot - // // apb_monitor_struct.prdata - // // apb_monitor_struct.pready - // // apb_monitor_struct.pslverr - // // - // Reference code; - // How to wait for signal value - // while (control_signal === 1'b1) @(posedge pclk_i); - // - // How to assign a struct member, named xyz, from a signal. - // All available input signals listed. - // apb_monitor_struct.xyz = psel_i; // [15:0] - // apb_monitor_struct.xyz = penable_i; // - // apb_monitor_struct.xyz = paddr_i; // [APB_ADDR_WIDTH-1:0] - // apb_monitor_struct.xyz = pwdata_i; // [APB_DATA_WIDTH-1:0] - // apb_monitor_struct.xyz = pwrite_i; // - // apb_monitor_struct.xyz = pstrb_i; // [3:0] - // apb_monitor_struct.xyz = pprot_i; // [2:0] - // apb_monitor_struct.xyz = prdata_i; // [APB_DATA_WIDTH-1:0] - // apb_monitor_struct.xyz = pready_i; // - // apb_monitor_struct.xyz = pslverr_i; // - // pragma uvmf custom do_monitor begin - // UVMF_CHANGE_ME : Implement protocol monitoring. The commented reference code - // below are examples of how to capture signal values and assign them to - // structure members. All available input signals are listed. The 'while' - // code example shows how to wait for a synchronous flow control signal. This - // task should return when a complete transfer has been observed. Once this task is - // exited with captured values, it is then called again to wait for and observe - // the next transfer. One clock cycle is consumed between calls to do_monitor. - @(posedge pclk_i); - @(posedge pclk_i); - @(posedge pclk_i); - @(posedge pclk_i); - // pragma uvmf custom do_monitor end - endtask - - -endinterface - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_random_sequence.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_random_sequence.svh deleted file mode 100644 index 705307f5..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_random_sequence.svh +++ /dev/null @@ -1,65 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: -// This sequences randomizes the apb transaction and sends it -// to the UVM driver. -// -// This sequence constructs and randomizes a apb_transaction. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -class apb_random_sequence #( - int APB_ADDR_WIDTH = 32, - int APB_DATA_WIDTH = 32 - ) - extends apb_sequence_base #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ); - - `uvm_object_param_utils( apb_random_sequence #( - APB_ADDR_WIDTH, - APB_DATA_WIDTH - )) - - // pragma uvmf custom class_item_additional begin - // pragma uvmf custom class_item_additional end - - //***************************************************************** - function new(string name = ""); - super.new(name); - endfunction: new - - // **************************************************************************** - // TASK : body() - // This task is automatically executed when this sequence is started using the - // start(sequencerHandle) task. - // - task body(); - - // Construct the transaction - req=apb_transaction#( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - )::type_id::create("req"); - start_item(req); - // Randomize the transaction - if(!req.randomize()) `uvm_fatal("SEQ", "apb_random_sequence::body()-apb_transaction randomization failed") - // Send the transaction to the apb_driver_bfm via the sequencer and apb_driver. - finish_item(req); - `uvm_info("SEQ", {"Response:",req.convert2string()},UVM_MEDIUM) - - endtask - -endclass: apb_random_sequence - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_responder_sequence.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_responder_sequence.svh deleted file mode 100644 index aa44a888..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_responder_sequence.svh +++ /dev/null @@ -1,61 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: This class can be used to provide stimulus when an interface -// has been configured to run in a responder mode. It -// will never finish by default, always going back to the driver -// and driver BFM for the next transaction with which to respond. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -class apb_responder_sequence #( - int APB_ADDR_WIDTH = 32, - int APB_DATA_WIDTH = 32 - ) - extends apb_sequence_base #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ); - - `uvm_object_param_utils( apb_responder_sequence #( - APB_ADDR_WIDTH, - APB_DATA_WIDTH - )) - - // pragma uvmf custom class_item_additional begin - // pragma uvmf custom class_item_additional end - - function new(string name = "apb_responder_sequence"); - super.new(name); - endfunction - - task body(); - req=apb_transaction#( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - )::type_id::create("req"); - forever begin - start_item(req); - finish_item(req); - // pragma uvmf custom body begin - // UVMF_CHANGE_ME : Do something here with the resulting req item. The - // finish_item() call above will block until the req transaction is ready - // to be handled by the responder sequence. - // If this was an item that required a response, the expectation is - // that the response should be populated within this transaction now. - `uvm_info("SEQ",$sformatf("Processed txn: %s",req.convert2string()),UVM_HIGH) - // pragma uvmf custom body end - end - endtask - -endclass - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_sequence_base.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_sequence_base.svh deleted file mode 100644 index ddd46184..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_sequence_base.svh +++ /dev/null @@ -1,114 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: -// This file contains the class used as the base class for all sequences -// for this interface. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -class apb_sequence_base #( - int APB_ADDR_WIDTH = 32, - int APB_DATA_WIDTH = 32 - ) extends uvmf_sequence_base #( - .REQ(apb_transaction #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - )), - .RSP(apb_transaction #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ))); - - `uvm_object_param_utils( apb_sequence_base #( - APB_ADDR_WIDTH, - APB_DATA_WIDTH - )) - - // variables - typedef apb_transaction #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ) apb_transaction_req_t; - apb_transaction_req_t req; - typedef apb_transaction #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ) apb_transaction_rsp_t; - apb_transaction_rsp_t rsp; - - // Event for identifying when a response was received from the sequencer - event new_rsp; - - - // pragma uvmf custom class_item_additional begin - // pragma uvmf custom class_item_additional end - - // **************************************************************************** - // TASK : get_responses() - // This task recursively gets sequence item responses from the sequencer. - // - virtual task get_responses(); - fork - begin - // Block until new rsp available - get_response(rsp); - // New rsp received. Indicate to sequence using event. - ->new_rsp; - // Display the received response transaction - `uvm_info("SEQ", {"New response transaction:",rsp.convert2string()}, UVM_MEDIUM) - end - join_none - endtask - - // **************************************************************************** - // TASK : pre_body() - // This task is called automatically when start is called with call_pre_post set to 1 (default). - // By calling get_responses() within pre_body() any derived sequences are automatically - // processing response transactions. Only un-comment this call to get_responses() if you - // have configured the interface driver to utilize the response transaction path by setting - // the configuration variable "return_transaction_response" to 1. Otherwise it is possible - // to impact runtime performance and memory utilization. - // - virtual task pre_body(); - // pragma uvmf custom pre_body begin -// get_responses(); - // pragma uvmf custom pre_body end - endtask - - // **************************************************************************** - // TASK : body() - // This task is called automatically when start is called. This sequence sends - // a req sequence item to the sequencer identified as an argument in the call - // to start. - // - virtual task body(); - // pragma uvmf custom body begin - start_item(req); - finish_item(req); - // pragma uvmf custom body end - endtask - - // **************************************************************************** - // FUNCTION : new() - // This function is the standard SystemVerilog constructor. - // - function new( string name =""); - super.new( name ); - // pragma uvmf custom new begin - req = apb_transaction_req_t::type_id::create("req"); - rsp = apb_transaction_rsp_t::type_id::create("rsp"); - // pragma uvmf custom new end - endfunction - -endclass - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction.svh deleted file mode 100644 index 964aebc3..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction.svh +++ /dev/null @@ -1,229 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: This class defines the variables required for an apb -// transaction. Class variables to be displayed in waveform transaction -// viewing are added to the transaction viewing stream in the add_to_wave -// function. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -class apb_transaction #( - int APB_ADDR_WIDTH = 32, - int APB_DATA_WIDTH = 32 - ) extends uvmf_transaction_base; - - `uvm_object_param_utils( apb_transaction #( - APB_ADDR_WIDTH, - APB_DATA_WIDTH - )) - - rand bit psel ; - rand bit penable ; - rand bit [APB_ADDR_WIDTH-1:0] paddr ; - rand bit [APB_DATA_WIDTH-1:0] pwdata ; - rand bit pwrite ; - rand bit [3:0] pstrb ; - rand bit [3:0] pprot ; - rand APB_DATA_WIDTH prdata ; - rand bit pready ; - rand bit pslverr ; - - //Constraints for the transaction variables: - - // pragma uvmf custom class_item_additional begin - // pragma uvmf custom class_item_additional end - - //******************************************************************* - //******************************************************************* - // Macros that define structs and associated functions are - // located in apb_macros.svh - - //******************************************************************* - // Monitor macro used by apb_monitor and apb_monitor_bfm - // This struct is defined in apb_macros.svh - `apb_MONITOR_STRUCT - apb_monitor_s apb_monitor_struct; - //******************************************************************* - // FUNCTION: to_monitor_struct() - // This function packs transaction variables into a apb_monitor_s - // structure. The function returns the handle to the apb_monitor_struct. - // This function is defined in apb_macros.svh - `apb_TO_MONITOR_STRUCT_FUNCTION - //******************************************************************* - // FUNCTION: from_monitor_struct() - // This function unpacks the struct provided as an argument into transaction - // variables of this class. - // This function is defined in apb_macros.svh - `apb_FROM_MONITOR_STRUCT_FUNCTION - - //******************************************************************* - // Initiator macro used by apb_driver and apb_driver_bfm - // to communicate initiator driven data to apb_driver_bfm. - // This struct is defined in apb_macros.svh - `apb_INITIATOR_STRUCT - apb_initiator_s apb_initiator_struct; - //******************************************************************* - // FUNCTION: to_initiator_struct() - // This function packs transaction variables into a apb_initiator_s - // structure. The function returns the handle to the apb_initiator_struct. - // This function is defined in apb_macros.svh - `apb_TO_INITIATOR_STRUCT_FUNCTION - //******************************************************************* - // FUNCTION: from_initiator_struct() - // This function unpacks the struct provided as an argument into transaction - // variables of this class. - // This function is defined in apb_macros.svh - `apb_FROM_INITIATOR_STRUCT_FUNCTION - - //******************************************************************* - // Responder macro used by apb_driver and apb_driver_bfm - // to communicate Responder driven data to apb_driver_bfm. - // This struct is defined in apb_macros.svh - `apb_RESPONDER_STRUCT - apb_responder_s apb_responder_struct; - //******************************************************************* - // FUNCTION: to_responder_struct() - // This function packs transaction variables into a apb_responder_s - // structure. The function returns the handle to the apb_responder_struct. - // This function is defined in apb_macros.svh - `apb_TO_RESPONDER_STRUCT_FUNCTION - //******************************************************************* - // FUNCTION: from_responder_struct() - // This function unpacks the struct provided as an argument into transaction - // variables of this class. - // This function is defined in apb_macros.svh - `apb_FROM_RESPONDER_STRUCT_FUNCTION - // **************************************************************************** - // FUNCTION : new() - // This function is the standard SystemVerilog constructor. - // - function new( string name = "" ); - super.new( name ); - endfunction - - // **************************************************************************** - // FUNCTION: convert2string() - // This function converts all variables in this class to a single string for - // logfile reporting. - // - virtual function string convert2string(); - // pragma uvmf custom convert2string begin - // UVMF_CHANGE_ME : Customize format if desired. - return $sformatf("psel:0x%x penable:0x%x paddr:0x%x pwdata:0x%x pwrite:0x%x pstrb:0x%x pprot:0x%x prdata:0x%x pready:0x%x pslverr:0x%x ",psel,penable,paddr,pwdata,pwrite,pstrb,pprot,prdata,pready,pslverr); - // pragma uvmf custom convert2string end - endfunction - - //******************************************************************* - // FUNCTION: do_print() - // This function is automatically called when the .print() function - // is called on this class. - // - virtual function void do_print(uvm_printer printer); - // pragma uvmf custom do_print begin - // UVMF_CHANGE_ME : Current contents of do_print allows for the use of UVM 1.1d, 1.2 or P1800.2. - // Update based on your own printing preference according to your preferred UVM version - $display(convert2string()); - // pragma uvmf custom do_print end - endfunction - - //******************************************************************* - // FUNCTION: do_compare() - // This function is automatically called when the .compare() function - // is called on this class. - // - virtual function bit do_compare (uvm_object rhs, uvm_comparer comparer); - apb_transaction #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ) RHS; - if (!$cast(RHS,rhs)) return 0; - // pragma uvmf custom do_compare begin - // UVMF_CHANGE_ME : Eliminate comparison of variables not to be used for compare - return (super.do_compare(rhs,comparer) - &&(this.penable == RHS.penable) - &&(this.paddr == RHS.paddr) - &&(this.pwdata == RHS.pwdata) - &&(this.pwrite == RHS.pwrite) - &&(this.pstrb == RHS.pstrb) - &&(this.pprot == RHS.pprot) - &&(this.prdata == RHS.prdata) - &&(this.pready == RHS.pready) - &&(this.pslverr == RHS.pslverr) - ); - // pragma uvmf custom do_compare end - endfunction - - //******************************************************************* - // FUNCTION: do_copy() - // This function is automatically called when the .copy() function - // is called on this class. - // - virtual function void do_copy (uvm_object rhs); - apb_transaction #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ) RHS; - assert($cast(RHS,rhs)); - // pragma uvmf custom do_copy begin - super.do_copy(rhs); - this.psel = RHS.psel; - this.penable = RHS.penable; - this.paddr = RHS.paddr; - this.pwdata = RHS.pwdata; - this.pwrite = RHS.pwrite; - this.pstrb = RHS.pstrb; - this.pprot = RHS.pprot; - this.prdata = RHS.prdata; - this.pready = RHS.pready; - this.pslverr = RHS.pslverr; - // pragma uvmf custom do_copy end - endfunction - - // **************************************************************************** - // FUNCTION: add_to_wave() - // This function is used to display variables in this class in the waveform - // viewer. The start_time and end_time variables must be set before this - // function is called. If the start_time and end_time variables are not set - // the transaction will be hidden at 0ns on the waveform display. - // - virtual function void add_to_wave(int transaction_viewing_stream_h); - `ifdef QUESTA - if (transaction_view_h == 0) begin - transaction_view_h = $begin_transaction(transaction_viewing_stream_h,"apb_transaction",start_time); - end - super.add_to_wave(transaction_view_h); - // pragma uvmf custom add_to_wave begin - // UVMF_CHANGE_ME : Color can be applied to transaction entries based on content, example below - // case() - // 1 : $add_color(transaction_view_h,"red"); - // default : $add_color(transaction_view_h,"grey"); - // endcase - // UVMF_CHANGE_ME : Eliminate transaction variables not wanted in transaction viewing in the waveform viewer - $add_attribute(transaction_view_h,psel,"psel"); - $add_attribute(transaction_view_h,penable,"penable"); - $add_attribute(transaction_view_h,paddr,"paddr"); - $add_attribute(transaction_view_h,pwdata,"pwdata"); - $add_attribute(transaction_view_h,pwrite,"pwrite"); - $add_attribute(transaction_view_h,pstrb,"pstrb"); - $add_attribute(transaction_view_h,pprot,"pprot"); - $add_attribute(transaction_view_h,prdata,"prdata"); - $add_attribute(transaction_view_h,pready,"pready"); - $add_attribute(transaction_view_h,pslverr,"pslverr"); - // pragma uvmf custom add_to_wave end - $end_transaction(transaction_view_h,end_time); - $free_transaction(transaction_view_h); - `endif // QUESTA - endfunction - -endclass - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction_coverage.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction_coverage.svh deleted file mode 100644 index 0fa185e4..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_transaction_coverage.svh +++ /dev/null @@ -1,88 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: This class records apb transaction information using -// a covergroup named apb_transaction_cg. An instance of this -// coverage component is instantiated in the uvmf_parameterized_agent -// if the has_coverage flag is set. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -class apb_transaction_coverage #( - int APB_ADDR_WIDTH = 32, - int APB_DATA_WIDTH = 32 - ) extends uvm_subscriber #(.T(apb_transaction #( - .APB_ADDR_WIDTH(APB_ADDR_WIDTH), - .APB_DATA_WIDTH(APB_DATA_WIDTH) - ))); - - `uvm_component_param_utils( apb_transaction_coverage #( - APB_ADDR_WIDTH, - APB_DATA_WIDTH - )) - - T coverage_trans; - - // pragma uvmf custom class_item_additional begin - // pragma uvmf custom class_item_additional end - - // **************************************************************************** - covergroup apb_transaction_cg; - // pragma uvmf custom covergroup begin - // UVMF_CHANGE_ME : Add coverage bins, crosses, exclusions, etc. according to coverage needs. - option.auto_bin_max=1024; - option.per_instance=1; - psel: coverpoint coverage_trans.psel; - penable: coverpoint coverage_trans.penable; - paddr: coverpoint coverage_trans.paddr; - pwdata: coverpoint coverage_trans.pwdata; - pwrite: coverpoint coverage_trans.pwrite; - pstrb: coverpoint coverage_trans.pstrb; - pprot: coverpoint coverage_trans.pprot; - prdata: coverpoint coverage_trans.prdata; - pready: coverpoint coverage_trans.pready; - pslverr: coverpoint coverage_trans.pslverr; - // pragma uvmf custom covergroup end - endgroup - - // **************************************************************************** - // FUNCTION : new() - // This function is the standard SystemVerilog constructor. - // - function new(string name="", uvm_component parent=null); - super.new(name,parent); - apb_transaction_cg=new; - `uvm_warning("COVERAGE_MODEL_REVIEW", "A covergroup has been constructed which may need review because of either generation or re-generation with merging. Please note that transaction variables added as a result of re-generation and merging are not automatically added to the covergroup. Remove this warning after the covergroup has been reviewed.") - endfunction - - // **************************************************************************** - // FUNCTION : build_phase() - // This function is the standard UVM build_phase. - // - function void build_phase(uvm_phase phase); - apb_transaction_cg.set_inst_name($sformatf("apb_transaction_cg_%s",get_full_name())); - endfunction - - // **************************************************************************** - // FUNCTION: write (T t) - // This function is automatically executed when a transaction arrives on the - // analysis_export. It copies values from the variables in the transaction - // to local variables used to collect functional coverage. - // - virtual function void write (T t); - `uvm_info("COV","Received transaction",UVM_HIGH); - coverage_trans = t; - apb_transaction_cg.sample(); - endfunction - -endclass - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs.svh deleted file mode 100644 index 43d85640..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs.svh +++ /dev/null @@ -1,20 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: -// This file contains defines and typedefs to be compiled for use in -// the simulation running on the host server when using Veloce. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// - - -// pragma uvmf custom additional begin -// pragma uvmf custom additional end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs_hdl.svh b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs_hdl.svh deleted file mode 100644 index 74738c8c..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/src/apb_typedefs_hdl.svh +++ /dev/null @@ -1,21 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// -// DESCRIPTION: -// This file contains defines and typedefs to be compiled for use in -// the simulation running on the emulator when using Veloce. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// - - - -// pragma uvmf custom additional begin -// pragma uvmf custom additional end - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/yaml/apb_interface.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/yaml/apb_interface.yaml deleted file mode 100644 index c3de1222..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/uvmf_template_output/verification_ip/interface_packages/apb_pkg/yaml/apb_interface.yaml +++ /dev/null @@ -1,125 +0,0 @@ -uvmf: - interfaces: - apb: - clock: pclk - config_constraints: [] - config_vars: [] - existing_library_component: 'True' - gen_inbound_streaming_driver: 'False' - hdl_pkg_parameters: [] - hdl_typedefs: [] - hvl_pkg_parameters: [] - hvl_typedefs: [] - parameters: - - name: APB_ADDR_WIDTH - type: int - value: '32' - - name: APB_DATA_WIDTH - type: int - value: '32' - ports: - - dir: output - name: psel - reset_value: '''b0' - width: '16' - - dir: output - name: penable - reset_value: '''b0' - width: '1' - - dir: output - name: paddr - reset_value: '''b0' - width: APB_ADDR_WIDTH - - dir: output - name: pwdata - reset_value: '''b0' - width: APB_DATA_WIDTH - - dir: output - name: pwrite - reset_value: '''b0' - width: '1' - - dir: output - name: pstrb - reset_value: '''b0' - width: '4' - - dir: output - name: pprot - reset_value: '''b0' - width: '3' - - dir: input - name: prdata - reset_value: '''b0' - width: APB_DATA_WIDTH - - dir: input - name: pready - reset_value: '0' - width: '1' - - dir: input - name: pslverr - reset_value: '0' - width: '1' - reset: presetn - reset_assertion_level: 'False' - transaction_constraints: [] - transaction_vars: - - comment: '' - iscompare: 'False' - isrand: 'True' - name: psel - type: bit - unpacked_dimension: '' - - comment: '' - iscompare: 'True' - isrand: 'True' - name: penable - type: bit - unpacked_dimension: '' - - comment: '' - iscompare: 'True' - isrand: 'True' - name: paddr - type: bit [APB_ADDR_WIDTH-1:0] - unpacked_dimension: '' - - comment: '' - iscompare: 'True' - isrand: 'True' - name: pwdata - type: bit [APB_DATA_WIDTH-1:0] - unpacked_dimension: '' - - comment: '' - iscompare: 'True' - isrand: 'True' - name: pwrite - type: bit - unpacked_dimension: '' - - comment: '' - iscompare: 'True' - isrand: 'True' - name: pstrb - type: bit [3:0] - unpacked_dimension: '' - - comment: '' - iscompare: 'True' - isrand: 'True' - name: pprot - type: bit [3:0] - unpacked_dimension: '' - - comment: '' - iscompare: 'True' - isrand: 'True' - name: prdata - type: APB_DATA_WIDTH - unpacked_dimension: '' - - comment: '' - iscompare: 'True' - isrand: 'True' - name: pready - type: bit - unpacked_dimension: '' - - comment: '' - iscompare: 'True' - isrand: 'True' - name: pslverr - type: bit - unpacked_dimension: '' - use_dpi_link: 'False' diff --git a/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_driver_bfm.TMPL b/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_driver_bfm.TMPL index 2883d5e7..225c66dd 100644 --- a/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_driver_bfm.TMPL +++ b/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_driver_bfm.TMPL @@ -96,8 +96,8 @@ end {{config.type}} {{config.name}} {{config.unpackedDim}}; {% endfor %} - tri {{clock}}_i; - tri {{reset}}_i; + logic {{clock}}_i; + logic {{reset}}_i; // Signal list (all signals are capable of being inputs and outputs for the sake // of supporting both INITIATOR and RESPONDER mode operation. Expectation is that diff --git a/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_if.TMPL b/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_if.TMPL index 03047f42..3d302e65 100644 --- a/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_if.TMPL +++ b/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_if.TMPL @@ -28,11 +28,11 @@ import {{name}}_pkg_hdl::*; interface {{name}}_if {{macro.paramDeclare(paramDefs)|indent(2)}} ( - input bit {{clock}}, - input bit {{reset}}{% if sigs|length > 0 %},{% endif %} + input logic {{clock}}, + input logic {{reset}}{% if sigs|length > 0 %},{% endif %} {% for sig in sigs %} - inout bit {{sig.vector}} {{sig.name}}{{macro.commalist(loop)}} + {{sig.dir}} logic {{sig.vector}} {{sig.name}}{{macro.commalist(loop)}} {%- endfor %} ); diff --git a/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_monitor_bfm.TMPL b/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_monitor_bfm.TMPL index c346a492..b9d7f416 100644 --- a/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_monitor_bfm.TMPL +++ b/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_monitor_bfm.TMPL @@ -87,8 +87,8 @@ end {{config.type}} {{config.name}} {{config.unpackedDim}}; {% endfor %} - tri {{clock}}_i; - tri {{reset}}_i; + logic {{clock}}_i; + logic {{reset}}_i; {% for sig in sigs %} tri {{sig.vector}} {{sig.name}}_i; {% endfor %} From a455f03a0e60ac35f6311d43efa0ef1b8978bc5a Mon Sep 17 00:00:00 2001 From: John Shahid Shaik Date: Sat, 24 Dec 2022 00:01:41 +0530 Subject: [PATCH 10/22] initial for merge --- .../challenge_3/block_b/axi_intf.yaml | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/axi_intf.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/axi_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/axi_intf.yaml new file mode 100644 index 00000000..b16e337c --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/axi_intf.yaml @@ -0,0 +1,165 @@ +uvmf: + interfaces: + axi: + clock: axi_clk + reset: rst + reset_assertion_level: "False" + veloce_ready: "True" + parameters: + - name: "awwidth" + type: "int" + value: "32" + - name: "len" + type: "int" + value: "8" + - name: "data_width" + type: "int" + value: "32" + - name: "x" + type: "int" + value: "16" + ports: + # write address channel + - name: awvalid + dir: input + width: "1" + - name: awready + dir: output + width: "1" + - name: awaddr + dir: input + width: "awwidth" + - name: awsize + dir: input + width: "3" + - name: awburst + dir: input + width: "2" + - name: awcache + dir: input + width: "4" + - name: awprot + dir: input + width: "3" + - name: awid + dir: input + width: "x" + - name: awlen + dir: input + width: "len" + - name: awlock + dir: input + width: "1" + - name: awqos + dir: input + width: "4" + - name: awregion + dir: input + width: "4" + - name: awuser + dir: input + width: "x" + # write data channel + - name: wvalid + dir: input + width: "1" + - name: wready + dir: output + width: "1" + - name: wlast + dir: input + width: "1" + - name: wdata + dir: input + width: "data_width" + - name: wstrb + dir: input + width: "data_width/8" + - name: wid + dir: input + width: "x" + - name: wuser + dir: input + width: "x" + # write response channel + - name: bwvalid + dir: output + width: "1" + - name: bwready + dir: output + width: "1" + - name: bresp + dir: input + width: "2" + - name: bid + dir: output + width: "x" + - name: buser + dir: output + width: "x" + #read address channel + - name: arvalid + dir: input + width: "1" + - name: aready + dir: output + width: "1" + - name: araddr + dir: input + width: "awwidth" + - name: arsize + dir: input + width: "3" + - name: arburst + dir: input + width: "2" + - name: arcache + dir: input + width: "4" + - name: arprot + dir: input + width: "3" + - name: arid + dir: input + width: "x" + - name: arlen + dir: input + width: "len" + - name: arlock + dir: input + width: "1" + - name: arqos + dir: input + width: "4" + - name: aregion + dir: input + width: "4" + - name: aruser + dir: input + width: "x" + #read data channel + - name: rvalid + dir: output + width: "1" + - name: rready + dir: input + width: "1" + - name: rlast + dir: output + width: "1" + - name: rdata + dir: output + width: "data_width" + - name: rid + dir: output + width: "x" + - name: ruser + dir: output + width: "x" + - name: rresp + dir: output + width: "2" + + + + From 5e5700aa83f920c36ece04115fb07fdfc99415c7 Mon Sep 17 00:00:00 2001 From: VINUTHNA-SRI Date: Sat, 24 Dec 2022 00:06:03 +0530 Subject: [PATCH 11/22] Adding intfs --- .../UVMF_2022.3/challenge_3/wb_master.yaml | 81 ++++++++++--------- .../UVMF_2022.3/challenge_3/wb_slave.yaml | 68 ++++++++-------- 2 files changed, 73 insertions(+), 76 deletions(-) diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml index d6f4a232..a0210cb5 100644 --- a/UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml @@ -1,14 +1,13 @@ uvmf: interfaces: - wb: - clock: clk + wb_slave: + clock: "clock" + reset: "reset" + reset_assertion_level: 'True' # gen_inbound_streaming_driver: 'False' - hdl_pkg_parameters: [] # hdl_typedefs: # - name: wb_op_t # type: enum {WB_RESET, WB_WRITE, WB_READ} - hvl_pkg_parameters: [] - hvl_typedefs: [] parameters: -name: WB_ADDR_WIDTH type: int @@ -21,52 +20,54 @@ uvmf: #name: inta #reset_value: '''b0' #width: '1' + - dir: input + name: din + reset_value: '''b0' + width: WB_DATA_WIDTH - dir: output - name: cyc - reset_value: '0' + name: dout + reset_value: '''b0' + width: WB_DATA_WIDTH + - dir: input + name: "TGD_I" + - dir: output + name: "TGD_O" + - dir: output + name: ack + reset_value: 1'b0 width: '1' - #- dir: output - # name: stb - # reset_value: '0' - # width: '1' - dir: output name: adr reset_value: '''b0' width: WB_ADDR_WIDTH - dir: output - name: we + name: cyc reset_value: '0' width: '1' - - dir: output - name: dout - reset_value: '''b0' - width: '32' - - dir: input - name: din - reset_value: '''b0' - width: WB_DATA_WIDTH - dir: input name: err reset_value: '''b0' width: '1' - #- dir: output - # name: rty - # reset_value: '''b0' - # width: '1' + - dir: output + name: we + reset_value: '0' + width: '1' + - dir: output + name: stb + reset_value: '0' + width: '1' - dir: output name: sel reset_value: '''b0' width: WB_DATA_WIDTH/8 + #- dir: output + # name: rty + # reset_value: '''b0' + # width: '1' #- dir: input # name: q # reset_value: '''b0' # width: WB_DATA_WIDTH - - dir: input - name: ack - reset_value: 1'b0 - width: '1' - reset: rst - reset_assertion_level: 'True' #response_info: # data: [] # operation: 1'b1 @@ -84,14 +85,14 @@ uvmf: unpacked_dimension: '' - iscompare: 'True' isrand: 'True' - name: addr - type: bit [WB_ADDR_WIDTH-1:0] + name: byte_select + type: bit [(WB_DATA_WIDTH/8)-1:0] unpacked_dimension: '' - - isrand: "True" - name: select - type: bit [WB_DATA_WIDTH/8-1:0] - #- iscompare: 'True' - # isrand: 'True' - # name: byte_select - # type: bit [(WB_DATA_WIDTH/8)-1:0] - # unpacked_dimension: '' + - iscompare: "True" + isrand: "True" + name: WrENB + type: "bit" + - iscompare: "True" + isrand: "True" + name: selslv + type: "bit" diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_slave.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/wb_slave.yaml index 71db8a67..4ffcf021 100644 --- a/UVM_Framework/UVMF_2022.3/challenge_3/wb_slave.yaml +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_slave.yaml @@ -1,14 +1,13 @@ uvmf: interfaces: - wb: - clock: clk - #gen_inbound_streaming_driver: 'False' - hdl_pkg_parameters: [] + wb_slave: + clock: "clock" + reset: "reset" + reset_assertion_level: 'True' + # gen_inbound_streaming_driver: 'False' # hdl_typedefs: # - name: wb_op_t # type: enum {WB_RESET, WB_WRITE, WB_READ} - hvl_pkg_parameters: [] - hvl_typedefs: [] parameters: -name: WB_ADDR_WIDTH type: int @@ -22,51 +21,53 @@ uvmf: #reset_value: '''b0' #width: '1' - dir: input - name: cyc - reset_value: '0' + name: din + reset_value: '''b0' + width: WB_DATA_WIDTH + - dir: output + name: dout + reset_value: '''b0' + width: WB_DATA_WIDTH + - dir: input + name: "TGD_I" + - dir: output + name: "TGD_O" + - dir: output + name: ack + reset_value: 1'b0 width: '1' - #- dir: output - # name: stb - # reset_value: '0' - # width: '1' - dir: input name: adr reset_value: '''b0' width: WB_ADDR_WIDTH - dir: input - name: we + name: cyc reset_value: '0' width: '1' - - dir: output - name: dout - reset_value: '''b0' - width: '32' - - dir: input - name: din - reset_value: '''b0' - width: WB_DATA_WIDTH - dir: output name: err reset_value: '''b0' width: '1' - #- dir: output - # name: rty - # reset_value: '''b0' - # width: '1' + - dir: input + name: we + reset_value: '0' + width: '1' + - dir: input + name: stb + reset_value: '0' + width: '1' - dir: input name: sel reset_value: '''b0' width: WB_DATA_WIDTH/8 + #- dir: output + # name: rty + # reset_value: '''b0' + # width: '1' #- dir: input # name: q # reset_value: '''b0' # width: WB_DATA_WIDTH - - dir: output - name: ack - reset_value: 1'b0 - width: '1' - reset: rst - reset_assertion_level: 'True' #response_info: # data: [] # operation: 1'b1 @@ -84,11 +85,6 @@ uvmf: unpacked_dimension: '' #- iscompare: 'True' # isrand: 'True' - # name: addr - # type: bit [WB_ADDR_WIDTH-1:0] - # unpacked_dimension: '' - #- iscompare: 'True' - # isrand: 'True' # name: byte_select # type: bit [(WB_DATA_WIDTH/8)-1:0] # unpacked_dimension: '' From 7e1b0b1594d1565d28ef89f0d5dae41c6f825b16 Mon Sep 17 00:00:00 2001 From: vineethkumarv Date: Sat, 24 Dec 2022 00:54:14 +0530 Subject: [PATCH 12/22] block_a modified --- .../UVMF_2022.3/challenge_3/block1_env.yaml | 52 +++++++++++++++++++ .../UVMF_2022.3/challenge_3/spi_m_intf.yaml | 36 +++++++++++++ .../UVMF_2022.3/challenge_3/spi_s_intf.yaml | 36 +++++++++++++ .../interface_templates/interface_if.TMPL | 6 +-- 4 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block1_env.yaml create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_m_intf.yaml create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/spi_s_intf.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block1_env.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block1_env.yaml new file mode 100644 index 00000000..d19ef677 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block1_env.yaml @@ -0,0 +1,52 @@ +uvmf: + benches: + "block_1" : + top_env: "block_1" + clock_half_period: "5ns" + reset_assertion_level: "True" + reset_duration: "200ns" + active_passive: + - bfm_name: "apb_master" + value: "ACTIVE" + - bfm_name: "axi_master1" + value: "ACTIVE" + - bfm_name: "axi_master2" + value: "ACTIVE" + - bfm_name: "spi_slave" + value: "PASSIVE" + environments: + "block_1" : + agents : + - name: "apb_master" + type: "apb" + initiator_responder: "INITIATOR" + - name: "axi_master1" + type: "axi_m" + initiator_responder: "INITIATOR" + - name: "axi_master2" + type: "axi_m" + initiator_responder: "INITIATOR" + - name: "spi_slave" + type: "pkt" + initiator_responder: "RESPONDER" + analysis_components : + - name: "block_1_pred" + type: "block_1_predictor" + - name: "block_1_sb" + type: "block_1_scoreboard" + tlm_connections: + - driver: "apb_master.monitored_ap" + receiver: "block_1_pred.apb_ae" + - driver: "axi_master1.monitored_ap" + receiver: "block_1_pred.axi_1_ae" + - driver: "axi_master2.monitored_ap" + receiver: "block_1_pred.axi_2_ae" + - driver: "spi_slave.monitored_ap" + receiver: "block_1_sb.spi_ae" + - driver: "block_1_pred.pred_to_sco_ap" + receiver: "block_1_sb.sco_from_pred_ae" + config_vars : + - name: "has_scoreboard" + type : "bit" + isrand : "False" + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_m_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/spi_m_intf.yaml new file mode 100644 index 00000000..3f2fe239 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_m_intf.yaml @@ -0,0 +1,36 @@ +uvmf: + interfaces: + "spi_m": + clock: "sck" + reset: "rst" + reset_assertion_level: "True" + ports: + - name: "sclk" + dir: "output" + width: "1" + reset_value: "'b0" + - name: "ss" + dir: "output" + width: "1" + reset_value: "'b0" + - name: "mosi" + dir: "output" + width: "bit [7:0]" + reset_value: "'b0" + - name: "miso" + dir: "input" + width: "bit [7:0]" + reset_value: "'b0" + transaction_vars: + - iscompare: "True" + isrand: "True" + name: "ssel" + type: "bit" + - iscompare: "True" + isrand: "True" + name: "mosi" + type: "bit [7:0]" + - iscompare: "True" + isrand: "False" + name: "miso" + type: "bit [7:0]" diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/spi_s_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/spi_s_intf.yaml new file mode 100644 index 00000000..f69e1aaa --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/spi_s_intf.yaml @@ -0,0 +1,36 @@ +uvmf: + interfaces: + "spi_s": + clock: "sck" + reset: "rst" + reset_assertion_level: "True" + ports: + - name: "sclk" + dir: "input" + width: "1" + reset_value: "'b0" + - name: "ss" + dir: "input" + width: "1" + reset_value: "'b0" + - name: "mosi" + dir: "input" + width: "bit [7:0]" + reset_value: "'b0" + - name: "miso" + dir: "output" + width: "bit [7:0]" + reset_value: "'b0" + transaction_vars: + - iscompare: "True" + isrand: "False" + name: "ssel" + type: "bit" + - iscompare: "True" + isrand: "False" + name: "mosi" + type: "bit [7:0]" + - iscompare: "True" + isrand: "True" + name: "miso" + type: "bit [7:0]" diff --git a/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_if.TMPL b/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_if.TMPL index 95cfb328..bb711aca 100644 --- a/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_if.TMPL +++ b/UVM_Framework/UVMF_2022.3/templates/python/template_files/interface_templates/interface_if.TMPL @@ -28,11 +28,11 @@ import {{name}}_pkg_hdl::*; interface {{name}}_if {{macro.paramDeclare(paramDefs)|indent(2)}} ( - input tri {{clock}}, - input tri {{reset}}{% if sigs|length > 0 %},{% endif %} + input logic {{clock}}, + input logic {{reset}}{% if sigs|length > 0 %},{% endif %} {% for sig in sigs %} - inout tri {{sig.vector}} {{sig.name}}{{macro.commalist(loop)}} + inout logic {{sig.vector}} {{sig.name}}{{macro.commalist(loop)}} {%- endfor %} ); From ff8c27eadeaa0a92712b401966ecd7181585d9e5 Mon Sep 17 00:00:00 2001 From: Dampuru Vinay Kumar Reddy Date: Sat, 24 Dec 2022 01:05:40 +0530 Subject: [PATCH 13/22] block_a --- .../apb_intf.yaml => block_a/apb_m_intf.yaml} | 19 +++++---- .../challenge_3/block_a/block_a_env.yaml | 28 +++++++++++++ .../challenge_3/block_a/block_a_utils.yaml | 41 +++++++++++++++++++ .../challenge_3/block_a/spi_s_intf.yaml | 36 ++++++++++++++++ 4 files changed, 116 insertions(+), 8 deletions(-) rename UVM_Framework/UVMF_2022.3/challenge_3/{block_b/apb_intf.yaml => block_a/apb_m_intf.yaml} (91%) create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_env.yaml create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_utils.yaml create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_a/spi_s_intf.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/apb_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_a/apb_m_intf.yaml similarity index 91% rename from UVM_Framework/UVMF_2022.3/challenge_3/block_b/apb_intf.yaml rename to UVM_Framework/UVMF_2022.3/challenge_3/block_a/apb_m_intf.yaml index a1b70e5a..76d76274 100644 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/apb_intf.yaml +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_a/apb_m_intf.yaml @@ -2,6 +2,9 @@ uvmf: interfaces: apb: clock: "pclk" + reset: "presetn" + veloce_ready: "True" + reset_assertion_level: 'False' parameters: - name: "APB_ADDR_WIDTH" type: int @@ -9,6 +12,9 @@ uvmf: - name: "APB_DATA_WIDTH" type: int value: '32' + - name: "STRB_LEN" + type: int + value: APB_ADDR_WIDTH/8 ports: - dir: "output" name: "psel" @@ -33,7 +39,7 @@ uvmf: - dir: "output" name: "pstrb" reset_value: '''b0' - width: '4' + width: 'STRB_LEN' - dir: "output" name: "pprot" reset_value: '''b0' @@ -50,9 +56,6 @@ uvmf: name: "pslverr" reset_value: '0' width: '1' - reset: "presetn" - veloce_ready: "True" - reset_assertion_level: 'False' transaction_vars: - iscompare: 'False' isrand: 'True' @@ -77,20 +80,20 @@ uvmf: - iscompare: 'True' isrand: 'True' name: "pstrb" - type: "bit [3:0]" + type: "bit [STRB_LEN:0]" - iscompare: 'True' isrand: 'True' name: "pprot" type: "bit [3:0]" - iscompare: 'True' - isrand: 'True' + isrand: 'False' name: "prdata" type: "APB_DATA_WIDTH" - iscompare: 'True' - isrand: 'True' + isrand: 'False' name: "pready" type: "bit" - iscompare: 'True' - isrand: 'True' + isrand: 'False' name: "pslverr" type: "bit" diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_env.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_env.yaml new file mode 100644 index 00000000..6ec7d644 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_env.yaml @@ -0,0 +1,28 @@ +uvmf: + benches: + "block_1" : + ## Specify the top-level block + top_env: "block_1" + clock_half_period: "5ns" + reset_assertion_level: "True" + reset_duration: "200ns" + environments: + "block_1" : + agents : + - name: "apb_master" + type: "apb" + initiator_responder: "INITIATOR" + - name: "axi_master1" + type: "axi_m" + initiator_responder: "INITIATOR" + - name: "axi_master2" + type: "axi_m" + initiator_responder: "INITIATOR" + - name: "spi_slave" + type: "pkt" + initiator_responder: "RESPONDER" + analysis_components : + - name: "block_1_pred" + type: "block_1_predictor" + - name: "block_1_sb" + type: "block_1_scoreboard" diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_utils.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_utils.yaml new file mode 100644 index 00000000..12eb277f --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_utils.yaml @@ -0,0 +1,41 @@ +uvmf: + util_components: + block_1_predictor: + analysis_exports: + - name: apb_ae + type: 'apb_transaction #(.APB_DATA_WIDTH(APB_DATA_WIDTH), .APB_ADDR_WIDTH(APB_ADDR_WIDTH))' + - name: axi_1_ae + type: 'axi_transaction #(.AW_WIDTH(AW_WIDTH), .LEN(LEN), .DATA_WIDTH(DATA_WIDTH), .X(X))' + - name: axi_2_ae + type: 'axi_transaction #(.AW_WIDTH(AW_WIDTH), .LEN(LEN), .DATA_WIDTH(DATA_WIDTH), .X(X))' + analysis_ports: + - name: pre_to_sco_ap + type: 'spi_s_transaction' + existing_library_component: 'True' + parameters: + - name: APB_DATA_WIDTH + type: int + value: '32' + - name: APB_ADDR_WIDTH + type: int + value: '32' + - name: AW_WIDTH + type: int + value: '32' + - name: DATA_WIDTH + type: int + value: '32' + - name: LEN + type: int + value: '32' + - name: X + type: int + value: '16' + type: predictor + block_1_scoreboard: + analysis_exports: + - name: spi_ae + type: 'spi_s_transaction' + - name: sco_from_pre_ae + type: 'spi_s_transaction' + type: scoreboard diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_a/spi_s_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_a/spi_s_intf.yaml new file mode 100644 index 00000000..f69e1aaa --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_a/spi_s_intf.yaml @@ -0,0 +1,36 @@ +uvmf: + interfaces: + "spi_s": + clock: "sck" + reset: "rst" + reset_assertion_level: "True" + ports: + - name: "sclk" + dir: "input" + width: "1" + reset_value: "'b0" + - name: "ss" + dir: "input" + width: "1" + reset_value: "'b0" + - name: "mosi" + dir: "input" + width: "bit [7:0]" + reset_value: "'b0" + - name: "miso" + dir: "output" + width: "bit [7:0]" + reset_value: "'b0" + transaction_vars: + - iscompare: "True" + isrand: "False" + name: "ssel" + type: "bit" + - iscompare: "True" + isrand: "False" + name: "mosi" + type: "bit [7:0]" + - iscompare: "True" + isrand: "True" + name: "miso" + type: "bit [7:0]" From 1ca56bd2b03f704636c74d754a4e440605ffbce5 Mon Sep 17 00:00:00 2001 From: John Shahid Shaik Date: Sat, 24 Dec 2022 01:10:20 +0530 Subject: [PATCH 14/22] axi master and slave interfaces --- .../challenge_3/block_a/axi_master_intf.yaml | 396 ++++++++++++++++++ .../challenge_3/block_a/axi_slave_intf.yaml | 396 ++++++++++++++++++ 2 files changed, 792 insertions(+) create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_a/axi_master_intf.yaml create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_a/axi_slave_intf.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_a/axi_master_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_a/axi_master_intf.yaml new file mode 100644 index 00000000..9e823364 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_a/axi_master_intf.yaml @@ -0,0 +1,396 @@ +uvmf: + interfaces: + axi: + clock: axi_clk + reset: rst + reset_assertion_level: "False" + veloce_ready: "True" + parameters: + - name: "AW_WIDTH" + type: "int" + value: "32" + - name: "LEN" + type: "int" + value: "8" + - name: "DATA_WIDTH" + type: "int" + value: "32" + - name: "X" + type: "int" + value: "16" + ports: + # write address channel + - name: awvalid + dir: output + width: "1" + - name: awready + dir: input + width: "1" + - name: awaddr + dir: output + width: "AW_WIDTH" + - name: awsize + dir: output + width: "3" + - name: awburst + dir: output + width: "2" + - name: awcache + dir: output + width: "4" + - name: awprot + dir: output + width: "3" + - name: awid + dir: output + width: "X" + - name: awlen + dir: output + width: "LEN" + - name: awlock + dir: output + width: "1" + - name: awqos + dir: output + width: "4" + - name: awregion + dir: output + width: "4" + - name: awuser + dir: output + width: "X" + # write data channel + - name: wvalid + dir: output + width: "1" + - name: wready + dir: input + width: "1" + - name: wlast + dir: output + width: "1" + - name: wdata + dir: output + width: "DATA_WIDTH" + - name: wstrb + dir: output + width: "data_width/8" + - name: wid + dir: output + width: "X" + - name: wuser + dir: output + width: "X" + # write response channel + - name: bwvalid + dir: input + width: "1" + - name: bwready + dir: output + width: "1" + - name: bresp + dir: input + width: "2" + - name: bid + dir: input + width: "X" + - name: buser + dir: input + width: "X" + #read address channel + - name: arvalid + dir: output + width: "1" + - name: aready + dir: input + width: "1" + - name: araddr + dir: output + width: "AW_WIDTH" + - name: arsize + dir: output + width: "3" + - name: arburst + dir: output + width: "2" + - name: arcache + dir: output + width: "4" + - name: arprot + dir: output + width: "3" + - name: arid + dir: output + width: "X" + - name: arlen + dir: output + width: "LEN" + - name: arlock + dir: output + width: "1" + - name: arqos + dir: output + width: "4" + - name: aregion + dir: output + width: "4" + - name: aruser + dir: output + width: "X" + #read data channel + - name: rvalid + dir: input + width: "1" + - name: rready + dir: output + width: "1" + - name: rlast + dir: input + width: "1" + - name: rdata + dir: input + width: "DATA_WIDTH" + - name: rid + dir: input + width: "X" + - name: ruser + dir: input + width: "X" + - name: rresp + dir: input + width: "2" + transaction_vars: + #write address channel + - name: "awvalid" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "awready" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "awaddr" + type: "bit [AW_WIDTH-1:0]" + isrand: "True" + iscomapre: "False" + + - name: "awsize" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "awburst" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "awcache" + type: "bit" + isrand: "true" + iscomapre: "False" + + - name: "awprot" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "awid" + type: "bit [X-1:0]" + isrand: "True" + iscomapre: "False" + + - name: "awlen" + type: "bit [LEN-1:0]" + isrand: "True" + iscomapre: "False" + + - name: "awlock" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "awqos" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "awregion" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "awuser" + type: "bit [X-1:0]" + isrand: "true" + iscomapre: "False" + + #write data channel + - name: "wvalid" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "wready" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "wlast" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "wdata" + type: "bit [DATA_WIDTH-1:0]" + isrand: "True" + iscomapre: "False" + + - name: "wstrb" + type: "bit [DATA_WIDTH/8-1]" + isrand: "True" + iscomapre: "False" + + - name: "wid" + type: "bit [X-1:0]" + isrand: "False" + iscomapre: "False" + + - name: "wuser" + type: "bit [X-1:0]" + isrand: "True" + iscomapre: "False" + + #write response channel + - name: "bwvalid" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "bwready" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "bresp" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "bid" + type: "bit [X-1:0]" + isrand: "False" + iscomapre: "False" + + - name: "buser" + type: "bit [X-1:0]" + isrand: "True" + iscomapre: "False" + + #ready address channel + - name: "arvalid" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "aready" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "araddr" + type: "bit [AW_WIDTH-1:0]" + isrand: "True" + iscomapre: "False" + + - name: "arsize" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "arburst" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "arcache" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "arprot" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "arid" + type: "bit [X-1:0]" + isrand: "True" + iscomapre: "False" + + - name: "arlen" + type: "bit [LEN-1:0]" + isrand: "True" + iscomapre: "False" + + - name: "arlock" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "arqos" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "aregion" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "aruser" + type: "bit [X-1:0]" + isrand: "True" + iscompare: "False" + + #ready data channel + + - name: "rvalid" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "rready" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "rlast" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "rdata" + type: "bit [DATA_WIDTH-1:0]" + isrand: "True" + iscomapre: "False" + + - name: "rid" + type: "bit [X-1:0]" + isrand: "True" + iscomapre: "False" + + - name: "ruser" + type: "bit [X-1:0]" + isrand: "True" + iscompare: "False" + + - name: "rresp" + type: "bit" + isrand: "True" + iscomapre: "False" + + + + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_a/axi_slave_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_a/axi_slave_intf.yaml new file mode 100644 index 00000000..1f59f78e --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_a/axi_slave_intf.yaml @@ -0,0 +1,396 @@ +uvmf: + interfaces: + axi: + clock: axi_clk + reset: rst + reset_assertion_level: "False" + veloce_ready: "True" + parameters: + - name: "AW_WIDTH"" + type: "int" + value: "32" + - name: "LEN" + type: "int" + value: "8" + - name: "DATA_WIDTH" + type: "int" + value: "32" + - name: "X" + type: "int" + value: "16" + ports: + # write address channel + - name: awvalid + dir: input + width: "1" + - name: awready + dir: output + width: "1" + - name: awaddr + dir: input + width: "AW_WIDTH"" + - name: awsize + dir: input + width: "3" + - name: awburst + dir: input + width: "2" + - name: awcache + dir: input + width: "4" + - name: awprot + dir: input + width: "3" + - name: awid + dir: input + width: "X" + - name: awlen + dir: input + width: "LEN" + - name: awlock + dir: input + width: "1" + - name: awqos + dir: input + width: "4" + - name: awregion + dir: input + width: "4" + - name: awuser + dir: input + width: "X" + # write data channel + - name: wvalid + dir: input + width: "1" + - name: wready + dir: output + width: "1" + - name: wlast + dir: input + width: "1" + - name: wdata + dir: input + width: "DATA_WIDTH" + - name: wstrb + dir: input + width: "data_width/8" + - name: wid + dir: input + width: "X" + - name: wuser + dir: input + width: "X" + # write response channel + - name: bwvalid + dir: output + width: "1" + - name: bwready + dir: output + width: "1" + - name: bresp + dir: input + width: "2" + - name: bid + dir: output + width: "X" + - name: buser + dir: output + width: "X" + #read address channel + - name: arvalid + dir: input + width: "1" + - name: aready + dir: output + width: "1" + - name: araddr + dir: input + width: "AW_WIDTH"" + - name: arsize + dir: input + width: "3" + - name: arburst + dir: input + width: "2" + - name: arcache + dir: input + width: "4" + - name: arprot + dir: input + width: "3" + - name: arid + dir: input + width: "X" + - name: arlen + dir: input + width: "LEN" + - name: arlock + dir: input + width: "1" + - name: arqos + dir: input + width: "4" + - name: aregion + dir: input + width: "4" + - name: aruser + dir: input + width: "X" + #read data channel + - name: rvalid + dir: output + width: "1" + - name: rready + dir: input + width: "1" + - name: rlast + dir: output + width: "1" + - name: rdata + dir: output + width: "DATA_WIDTH" + - name: rid + dir: output + width: "X" + - name: ruser + dir: output + width: "X" + - name: rresp + dir: output + width: "2" + transaction_vars: + #write address channel + - name: "awvalid" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "awready" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "awaddr" + type: "bit [AW_WIDTH-1:0]" + isrand: "False" + iscomapre: "False" + + - name: "awsize" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "awburst" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "awcache" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "awprot" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "awid" + type: "bit [X-1:0]" + isrand: "False" + iscomapre: "False" + + - name: "awlen" + type: "bit [LEN-1:0]" + isrand: "False" + iscomapre: "False" + + - name: "awlock" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "awqos" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "awregion" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "awuser" + type: "bit [X-1:0]" + isrand: "False" + iscomapre: "False" + + #write data channel + - name: "wvalid" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "wready" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "wlast" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "wdata" + type: "bit [DATA_WIDTH-1:0]" + isrand: "False" + iscomapre: "False" + + - name: "wstrb" + type: "bit [DATA_WIDTH/8-1]" + isrand: "False" + iscomapre: "False" + + - name: "wid" + type: "bit [X-1:0]" + isrand: "False" + iscomapre: "False" + + - name: "wuser" + type: "bit [X-1:0]" + isrand: "False" + iscomapre: "False" + + #write response channel + - name: "bwvalid" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "bwready" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "bresp" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "bid" + type: "bit [X-1:0]" + isrand: "False" + iscomapre: "False" + + - name: "buser" + type: "bit [X-1:0]" + isrand: "True" + iscomapre: "False" + + #ready address channeli + - name: "arvalid" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "aready" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "araddr" + type: "bit [AW_WIDTH-1:0]" + isrand: "True" + iscomapre: "False" + + - name: "arsize" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "arburst" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "arcache" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "arprot" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "arid" + type: "bit [X-1:0]" + isrand: "True" + iscomapre: "False" + + - name: "arlen" + type: "bit [LEN-1:0]" + isrand: "True" + iscomapre: "False" + + - name: "arlock" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "arqos" + type: "bit" + isrand: "True" + iscomapre: "False" + + - name: "aregion" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "aruser" + type: "bit [X-1:0]" + isrand: "False" + iscompare: "False" + + #ready data channel + + - name: "rvalid" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "rready" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "rlast" + type: "bit" + isrand: "False" + iscomapre: "False" + + - name: "rdata" + type: "bit [DATA_WIDTH-1:0]" + isrand: "True" + iscomapre: "False" + + - name: "rid" + type: "bit [X-1:0]" + isrand: "True" + iscomapre: "False" + + - name: "ruser" + type: "bit [X-1:0]" + isrand: "True" + iscompare: "False" + + - name: "rresp" + type: "bit" + isrand: "True" + iscomapre: "False" + + + + From 8f4821a0c7ff43d0917e73204e387ee654a2fdc6 Mon Sep 17 00:00:00 2001 From: John Shahid Shaik Date: Sat, 24 Dec 2022 01:24:40 +0530 Subject: [PATCH 15/22] block_a --- .../challenge_3/{block_a => }/apb_m_intf.yaml | 0 .../axi_master_intf.yaml => axi_m_intf.yaml} | 0 .../axi_slave_intf.yaml => axi_s_intf.yaml} | 0 .../UVMF_2022.3/challenge_3/block1_env.yaml | 52 ------ .../challenge_3/block_a/spi_s_intf.yaml | 36 ---- .../challenge_3/block_b/axi_intf.yaml | 165 ------------------ 6 files changed, 253 deletions(-) rename UVM_Framework/UVMF_2022.3/challenge_3/{block_a => }/apb_m_intf.yaml (100%) rename UVM_Framework/UVMF_2022.3/challenge_3/{block_a/axi_master_intf.yaml => axi_m_intf.yaml} (100%) rename UVM_Framework/UVMF_2022.3/challenge_3/{block_a/axi_slave_intf.yaml => axi_s_intf.yaml} (100%) delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block1_env.yaml delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_a/spi_s_intf.yaml delete mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_b/axi_intf.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_a/apb_m_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/apb_m_intf.yaml similarity index 100% rename from UVM_Framework/UVMF_2022.3/challenge_3/block_a/apb_m_intf.yaml rename to UVM_Framework/UVMF_2022.3/challenge_3/apb_m_intf.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_a/axi_master_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/axi_m_intf.yaml similarity index 100% rename from UVM_Framework/UVMF_2022.3/challenge_3/block_a/axi_master_intf.yaml rename to UVM_Framework/UVMF_2022.3/challenge_3/axi_m_intf.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_a/axi_slave_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/axi_s_intf.yaml similarity index 100% rename from UVM_Framework/UVMF_2022.3/challenge_3/block_a/axi_slave_intf.yaml rename to UVM_Framework/UVMF_2022.3/challenge_3/axi_s_intf.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block1_env.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block1_env.yaml deleted file mode 100644 index d19ef677..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block1_env.yaml +++ /dev/null @@ -1,52 +0,0 @@ -uvmf: - benches: - "block_1" : - top_env: "block_1" - clock_half_period: "5ns" - reset_assertion_level: "True" - reset_duration: "200ns" - active_passive: - - bfm_name: "apb_master" - value: "ACTIVE" - - bfm_name: "axi_master1" - value: "ACTIVE" - - bfm_name: "axi_master2" - value: "ACTIVE" - - bfm_name: "spi_slave" - value: "PASSIVE" - environments: - "block_1" : - agents : - - name: "apb_master" - type: "apb" - initiator_responder: "INITIATOR" - - name: "axi_master1" - type: "axi_m" - initiator_responder: "INITIATOR" - - name: "axi_master2" - type: "axi_m" - initiator_responder: "INITIATOR" - - name: "spi_slave" - type: "pkt" - initiator_responder: "RESPONDER" - analysis_components : - - name: "block_1_pred" - type: "block_1_predictor" - - name: "block_1_sb" - type: "block_1_scoreboard" - tlm_connections: - - driver: "apb_master.monitored_ap" - receiver: "block_1_pred.apb_ae" - - driver: "axi_master1.monitored_ap" - receiver: "block_1_pred.axi_1_ae" - - driver: "axi_master2.monitored_ap" - receiver: "block_1_pred.axi_2_ae" - - driver: "spi_slave.monitored_ap" - receiver: "block_1_sb.spi_ae" - - driver: "block_1_pred.pred_to_sco_ap" - receiver: "block_1_sb.sco_from_pred_ae" - config_vars : - - name: "has_scoreboard" - type : "bit" - isrand : "False" - diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_a/spi_s_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_a/spi_s_intf.yaml deleted file mode 100644 index f69e1aaa..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_a/spi_s_intf.yaml +++ /dev/null @@ -1,36 +0,0 @@ -uvmf: - interfaces: - "spi_s": - clock: "sck" - reset: "rst" - reset_assertion_level: "True" - ports: - - name: "sclk" - dir: "input" - width: "1" - reset_value: "'b0" - - name: "ss" - dir: "input" - width: "1" - reset_value: "'b0" - - name: "mosi" - dir: "input" - width: "bit [7:0]" - reset_value: "'b0" - - name: "miso" - dir: "output" - width: "bit [7:0]" - reset_value: "'b0" - transaction_vars: - - iscompare: "True" - isrand: "False" - name: "ssel" - type: "bit" - - iscompare: "True" - isrand: "False" - name: "mosi" - type: "bit [7:0]" - - iscompare: "True" - isrand: "True" - name: "miso" - type: "bit [7:0]" diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/axi_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_b/axi_intf.yaml deleted file mode 100644 index b16e337c..00000000 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_b/axi_intf.yaml +++ /dev/null @@ -1,165 +0,0 @@ -uvmf: - interfaces: - axi: - clock: axi_clk - reset: rst - reset_assertion_level: "False" - veloce_ready: "True" - parameters: - - name: "awwidth" - type: "int" - value: "32" - - name: "len" - type: "int" - value: "8" - - name: "data_width" - type: "int" - value: "32" - - name: "x" - type: "int" - value: "16" - ports: - # write address channel - - name: awvalid - dir: input - width: "1" - - name: awready - dir: output - width: "1" - - name: awaddr - dir: input - width: "awwidth" - - name: awsize - dir: input - width: "3" - - name: awburst - dir: input - width: "2" - - name: awcache - dir: input - width: "4" - - name: awprot - dir: input - width: "3" - - name: awid - dir: input - width: "x" - - name: awlen - dir: input - width: "len" - - name: awlock - dir: input - width: "1" - - name: awqos - dir: input - width: "4" - - name: awregion - dir: input - width: "4" - - name: awuser - dir: input - width: "x" - # write data channel - - name: wvalid - dir: input - width: "1" - - name: wready - dir: output - width: "1" - - name: wlast - dir: input - width: "1" - - name: wdata - dir: input - width: "data_width" - - name: wstrb - dir: input - width: "data_width/8" - - name: wid - dir: input - width: "x" - - name: wuser - dir: input - width: "x" - # write response channel - - name: bwvalid - dir: output - width: "1" - - name: bwready - dir: output - width: "1" - - name: bresp - dir: input - width: "2" - - name: bid - dir: output - width: "x" - - name: buser - dir: output - width: "x" - #read address channel - - name: arvalid - dir: input - width: "1" - - name: aready - dir: output - width: "1" - - name: araddr - dir: input - width: "awwidth" - - name: arsize - dir: input - width: "3" - - name: arburst - dir: input - width: "2" - - name: arcache - dir: input - width: "4" - - name: arprot - dir: input - width: "3" - - name: arid - dir: input - width: "x" - - name: arlen - dir: input - width: "len" - - name: arlock - dir: input - width: "1" - - name: arqos - dir: input - width: "4" - - name: aregion - dir: input - width: "4" - - name: aruser - dir: input - width: "x" - #read data channel - - name: rvalid - dir: output - width: "1" - - name: rready - dir: input - width: "1" - - name: rlast - dir: output - width: "1" - - name: rdata - dir: output - width: "data_width" - - name: rid - dir: output - width: "x" - - name: ruser - dir: output - width: "x" - - name: rresp - dir: output - width: "2" - - - - From a4c3263ea73573a7656cade441add2626107beec Mon Sep 17 00:00:00 2001 From: Dampuru Vinay Kumar Reddy Date: Sat, 24 Dec 2022 14:52:49 +0530 Subject: [PATCH 16/22] predictors and scoreboards --- .../challenge_3/vinay/block_b_util.yaml | 18 ++++++++++++++++++ .../challenge_3/vinay/block_c_util.yaml | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/vinay/block_b_util.yaml create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/vinay/block_c_util.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/vinay/block_b_util.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/vinay/block_b_util.yaml new file mode 100644 index 00000000..ebf62361 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/vinay/block_b_util.yaml @@ -0,0 +1,18 @@ +uvmf: + util_components: + block_2_predictor: + analysis_exports: + - name: spi_ae + type: 'spi_m_transaction' + analysis_ports: + - name: pre_to_sco_ap + type: 'wb_s_transaction' + existing_library_component: 'True' + type: predictor + block_2_scoreboard: + analysis_exports: + - name: wb_ae + type: 'wb_s_transaction' + - name: sco_from_pre_ae + type: 'wb_s_transaction' + type: scoreboard diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/vinay/block_c_util.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/vinay/block_c_util.yaml new file mode 100644 index 00000000..46afb7b2 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/vinay/block_c_util.yaml @@ -0,0 +1,18 @@ +uvmf: + util_components: + block_3_predictor: + analysis_exports: + - name: wb_ae + type: 'wb_m_transaction' + analysis_ports: + - name: pre_to_sco_ap + type: 'axi_s_transaction' + existing_library_component: 'True' + type: predictor + block_3_scoreboard: + analysis_exports: + - name: axi_ae + type: 'axi_s_transaction' + - name: sco_from_pre_ae + type: 'axi_s_transaction' + type: scoreboard From c94d67e7a7ad2192a51be56748bd963142eb8efb Mon Sep 17 00:00:00 2001 From: VINUTHNA-SRI Date: Sat, 24 Dec 2022 15:21:21 +0530 Subject: [PATCH 17/22] wb --- UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml index a0210cb5..8412e176 100644 --- a/UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml @@ -1,6 +1,6 @@ uvmf: interfaces: - wb_slave: + wb_master: clock: "clock" reset: "reset" reset_assertion_level: 'True' From b5d5875bd5b78a4330a25c7742f78ceab87d4b96 Mon Sep 17 00:00:00 2001 From: vineethkumarv Date: Sat, 24 Dec 2022 15:37:07 +0530 Subject: [PATCH 18/22] added block2 and few edits --- .../UVMF_2022.3/challenge_3/apb_m_intf.yaml | 10 ++--- .../challenge_3/block_2/block2_env.yaml | 38 +++++++++++++++++++ .../block2_util.yaml} | 0 .../challenge_3/block_a/block_a_env.yaml | 2 +- .../UVMF_2022.3/challenge_3/wb_master.yaml | 2 +- .../UVMF_2022.3/challenge_3/wb_slave.yaml | 2 +- 6 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/block_2/block2_env.yaml rename UVM_Framework/UVMF_2022.3/challenge_3/{vinay/block_b_util.yaml => block_2/block2_util.yaml} (100%) diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/apb_m_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/apb_m_intf.yaml index 76d76274..097ef17a 100644 --- a/UVM_Framework/UVMF_2022.3/challenge_3/apb_m_intf.yaml +++ b/UVM_Framework/UVMF_2022.3/challenge_3/apb_m_intf.yaml @@ -1,20 +1,20 @@ uvmf: interfaces: - apb: + "apb": clock: "pclk" reset: "presetn" veloce_ready: "True" reset_assertion_level: 'False' parameters: - name: "APB_ADDR_WIDTH" - type: int + type: "int" value: '32' - name: "APB_DATA_WIDTH" - type: int + type: "int" value: '32' - name: "STRB_LEN" - type: int - value: APB_ADDR_WIDTH/8 + type: "int" + value: "APB_ADDR_WIDTH/8" ports: - dir: "output" name: "psel" diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_2/block2_env.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_2/block2_env.yaml new file mode 100644 index 00000000..3934e4d9 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_2/block2_env.yaml @@ -0,0 +1,38 @@ +uvmf: + benches: + "block_2" : + top_env: "block_2" + clock_half_period: "5ns" + reset_assertion_level: "True" + reset_duration: "200ns" + active_passive: + - bfm_name: "spi_master" + value: "ACTIVE" + - bfm_name: "wb_slave" + value: "PASSIVE" + environments: + "block_2" : + agents : + - name: "spi_master" + type: "spi_m" + initiator_responder: "INITIATOR" + - name: "wb_slave" + type: "wb_s" + initiator_responder: "RESPONDER" + analysis_components : + - name: "block_2_pred" + type: "block_2_predictor" + - name: "block_2_sb" + type: "block_2_scoreboard" + tlm_connections: + - driver: "spi_master.monitored_ap" + receiver: "block_2_pred.spi_ae" + - driver: "wb_slave.monitored_ap" + receiver: "block_2_sb.wb_ae" + - driver: "block_2_pred.pred_to_sco_ap" + receiver: "block_2_sb.sco_from_pred_ae" + config_vars : + - name: "has_scoreboard" + type : "bit" + isrand : "False" + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/vinay/block_b_util.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_2/block2_util.yaml similarity index 100% rename from UVM_Framework/UVMF_2022.3/challenge_3/vinay/block_b_util.yaml rename to UVM_Framework/UVMF_2022.3/challenge_3/block_2/block2_util.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_env.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_env.yaml index 6ec7d644..ffb0cf6d 100644 --- a/UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_env.yaml +++ b/UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_env.yaml @@ -19,7 +19,7 @@ uvmf: type: "axi_m" initiator_responder: "INITIATOR" - name: "spi_slave" - type: "pkt" + type: "spi_s" initiator_responder: "RESPONDER" analysis_components : - name: "block_1_pred" diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml index 8412e176..5336f27b 100644 --- a/UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_master.yaml @@ -1,6 +1,6 @@ uvmf: interfaces: - wb_master: + wb_m: clock: "clock" reset: "reset" reset_assertion_level: 'True' diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/wb_slave.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/wb_slave.yaml index 4ffcf021..8bdef3e0 100644 --- a/UVM_Framework/UVMF_2022.3/challenge_3/wb_slave.yaml +++ b/UVM_Framework/UVMF_2022.3/challenge_3/wb_slave.yaml @@ -1,6 +1,6 @@ uvmf: interfaces: - wb_slave: + wb_s: clock: "clock" reset: "reset" reset_assertion_level: 'True' From 0a1f52f3b211cdc4bfd49984f16a3b06dac6d208 Mon Sep 17 00:00:00 2001 From: Dampuru Vinay Kumar Reddy Date: Sat, 24 Dec 2022 15:48:03 +0530 Subject: [PATCH 19/22] directory names changed --- .../{block_a/block_a_env.yaml => block_1/block1_env.yaml} | 0 .../{block_a/block_a_utils.yaml => block_1/block1_util.yaml} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename UVM_Framework/UVMF_2022.3/challenge_3/{block_a/block_a_env.yaml => block_1/block1_env.yaml} (100%) rename UVM_Framework/UVMF_2022.3/challenge_3/{block_a/block_a_utils.yaml => block_1/block1_util.yaml} (100%) diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_env.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_1/block1_env.yaml similarity index 100% rename from UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_env.yaml rename to UVM_Framework/UVMF_2022.3/challenge_3/block_1/block1_env.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_utils.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/block_1/block1_util.yaml similarity index 100% rename from UVM_Framework/UVMF_2022.3/challenge_3/block_a/block_a_utils.yaml rename to UVM_Framework/UVMF_2022.3/challenge_3/block_1/block1_util.yaml From 0e122bff5b860a8e53270a07b86a6e772464a7c3 Mon Sep 17 00:00:00 2001 From: VINUTHNA-SRI Date: Sat, 24 Dec 2022 15:52:06 +0530 Subject: [PATCH 20/22] Adding subsytem env and utils --- .../UVMF_2022.3/challenge_3/subsystem.yaml | 26 +++++++++++++++++++ .../challenge_3/subsystem_utils.yaml | 19 ++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/subsystem.yaml create mode 100644 UVM_Framework/UVMF_2022.3/challenge_3/subsystem_utils.yaml diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/subsystem.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/subsystem.yaml new file mode 100644 index 00000000..cadba2b2 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/subsystem.yaml @@ -0,0 +1,26 @@ +uvmf: + environments: + "subsys": + subenvs: + - name: "BLOCK_1" + type: "block_1" + - name: "BLOCK_2" + type: "block_2" + analysis_components: + - name: "SUBSYS_PREDICTOR" + type: "subsys_predictor" + - name: "SUBSYS_SCOREBOARD" + type: "subsys_scoreboard" + tlm_connections: + - driver: "block_1.block_1_predictor.pre_to_sco_ap" + receiver: "subsys_predictor.subsys_ae" + - driver: "subsys_predictor.subsys_ap" + receiver: "subsys_scoreboard.subsys_sb_ap" + - driver: "block_2.block_2_predictor.pre_to_sco_ap" + receiver: "subsys_scoreboard.subsys_sb_ap" + + + + + + diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/subsystem_utils.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/subsystem_utils.yaml new file mode 100644 index 00000000..4c32ba49 --- /dev/null +++ b/UVM_Framework/UVMF_2022.3/challenge_3/subsystem_utils.yaml @@ -0,0 +1,19 @@ +uvmf: + util_components: + "subsys_predictor": + - type: "predictor" + analysis_exports: + - name: "subsys_ae" + type: "block_1_pred" + analysis_ports: + - name: "subsys_ap" + type: "subsys_scoreboard" + "subsys_scoreboard": + - type: "scoreboard" + analysis_ports: + - name: "subsys_sb_ap" + type: "block_2_sb" + + + + From 47081987321e84a9b2d5bf72d8c37542177a4dbd Mon Sep 17 00:00:00 2001 From: VINUTHNA-SRI Date: Sat, 24 Dec 2022 16:18:16 +0530 Subject: [PATCH 21/22] subsytem files --- UVM_Framework/UVMF_2022.3/challenge_3/subsystem_utils.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/subsystem_utils.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/subsystem_utils.yaml index 4c32ba49..cb279399 100644 --- a/UVM_Framework/UVMF_2022.3/challenge_3/subsystem_utils.yaml +++ b/UVM_Framework/UVMF_2022.3/challenge_3/subsystem_utils.yaml @@ -12,7 +12,7 @@ uvmf: - type: "scoreboard" analysis_ports: - name: "subsys_sb_ap" - type: "block_2_sb" + type: "wb_master_transaction" From 1d26ca7046636b857e4a91038f98aceb4f0b3633 Mon Sep 17 00:00:00 2001 From: Dampuru Vinay Kumar Reddy Date: Sat, 24 Dec 2022 17:08:25 +0530 Subject: [PATCH 22/22] axi iscompare --- .../UVMF_2022.3/challenge_3/axi_m_intf.yaml | 86 +++++++++---------- .../UVMF_2022.3/challenge_3/axi_s_intf.yaml | 86 +++++++++---------- 2 files changed, 86 insertions(+), 86 deletions(-) diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/axi_m_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/axi_m_intf.yaml index 9e823364..cf5b3c82 100644 --- a/UVM_Framework/UVMF_2022.3/challenge_3/axi_m_intf.yaml +++ b/UVM_Framework/UVMF_2022.3/challenge_3/axi_m_intf.yaml @@ -164,190 +164,190 @@ uvmf: - name: "awvalid" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "awready" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "awaddr" type: "bit [AW_WIDTH-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "awsize" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "awburst" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "awcache" type: "bit" isrand: "true" - iscomapre: "False" + iscompare: "False" - name: "awprot" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "awid" type: "bit [X-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "awlen" type: "bit [LEN-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "awlock" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "awqos" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "awregion" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "awuser" type: "bit [X-1:0]" isrand: "true" - iscomapre: "False" + iscompare: "False" #write data channel - name: "wvalid" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "wready" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "wlast" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "wdata" type: "bit [DATA_WIDTH-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "wstrb" type: "bit [DATA_WIDTH/8-1]" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "wid" type: "bit [X-1:0]" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "wuser" type: "bit [X-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" #write response channel - name: "bwvalid" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "bwready" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "bresp" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "bid" type: "bit [X-1:0]" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "buser" type: "bit [X-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" #ready address channel - name: "arvalid" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "aready" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "araddr" type: "bit [AW_WIDTH-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arsize" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arburst" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arcache" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arprot" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arid" type: "bit [X-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arlen" type: "bit [LEN-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arlock" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arqos" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "aregion" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "aruser" type: "bit [X-1:0]" @@ -359,27 +359,27 @@ uvmf: - name: "rvalid" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "rready" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "rlast" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "rdata" type: "bit [DATA_WIDTH-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "rid" type: "bit [X-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "ruser" type: "bit [X-1:0]" @@ -389,7 +389,7 @@ uvmf: - name: "rresp" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" diff --git a/UVM_Framework/UVMF_2022.3/challenge_3/axi_s_intf.yaml b/UVM_Framework/UVMF_2022.3/challenge_3/axi_s_intf.yaml index 1f59f78e..61431731 100644 --- a/UVM_Framework/UVMF_2022.3/challenge_3/axi_s_intf.yaml +++ b/UVM_Framework/UVMF_2022.3/challenge_3/axi_s_intf.yaml @@ -164,190 +164,190 @@ uvmf: - name: "awvalid" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "awready" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "awaddr" type: "bit [AW_WIDTH-1:0]" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "awsize" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "awburst" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "awcache" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "awprot" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "awid" type: "bit [X-1:0]" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "awlen" type: "bit [LEN-1:0]" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "awlock" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "awqos" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "awregion" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "awuser" type: "bit [X-1:0]" isrand: "False" - iscomapre: "False" + iscompare: "False" #write data channel - name: "wvalid" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "wready" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "wlast" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "wdata" type: "bit [DATA_WIDTH-1:0]" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "wstrb" type: "bit [DATA_WIDTH/8-1]" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "wid" type: "bit [X-1:0]" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "wuser" type: "bit [X-1:0]" isrand: "False" - iscomapre: "False" + iscompare: "False" #write response channel - name: "bwvalid" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "bwready" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "bresp" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "bid" type: "bit [X-1:0]" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "buser" type: "bit [X-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" #ready address channeli - name: "arvalid" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "aready" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "araddr" type: "bit [AW_WIDTH-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arsize" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arburst" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arcache" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arprot" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arid" type: "bit [X-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arlen" type: "bit [LEN-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arlock" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "arqos" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "aregion" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "aruser" type: "bit [X-1:0]" @@ -359,27 +359,27 @@ uvmf: - name: "rvalid" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "rready" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "rlast" type: "bit" isrand: "False" - iscomapre: "False" + iscompare: "False" - name: "rdata" type: "bit [DATA_WIDTH-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "rid" type: "bit [X-1:0]" isrand: "True" - iscomapre: "False" + iscompare: "False" - name: "ruser" type: "bit [X-1:0]" @@ -389,7 +389,7 @@ uvmf: - name: "rresp" type: "bit" isrand: "True" - iscomapre: "False" + iscompare: "False"