setup environment for VERDI

本文详细介绍了如何在Verdi环境中进行调试配置,包括添加必要的编译定义、设置环境变量、在测试平台中加入FSDB变量转储代码以及指定PLI库路径。通过遵循这些步骤,可以有效地使用Verdi进行波形和GUI调试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. verdi.f, for gui and waveform debug

+define+ADD_TO_VERDI

-timescale "1ps/1ps"
-sv
-2001
-autoalias
-syntaxerrormax 200000
+define+AVERY_AXI_MASTER
+define+AVERY_AXI_SLAVE
+define+AVERY_MONITOR_ON
+define+AVERY_MS
+define+Turbo
+libext+.v
+incdir+/proj/usb/nianfeng.liu/avy_tb/corigine_bench/rtl
-y /proj/usb/nianfeng.liu/avy_tb/corigine_bench/rtl
/proj/usb/nianfeng.liu/avy_tb/corigine_bench/rtl/design_lib.v
/proj/usb/nianfeng.liu/avy_tb/corigine_bench/rtl/usb_ip_top.v
/proj/usb/nianfeng.liu/avy_tb/corigine_bench/rtl/xhci_top.v

+libext+.v
+incdir+/proj/usb/nianfeng.liu/avy_tb/corigine_bench/testbench
-y      /proj/usb/nianfeng.liu/avy_tb/corigine_bench/testbench
/proj/usb/nianfeng.liu/avy_tb/corigine_bench/testbench/axhci_top_axi_corigine.sv
 
2. PATH, set them in the bashrc
export VERDI_HOME=/tools/synopsys/verdi/K-2015.09
export LD_LIBRARY_PATH=${VERDI_HOME}/share/PLI/MODELSIM/LINUX64:${LD_LIBRARY_PATH}
 
3. add below code to tb_top.v
initial begin
  $fsdbDumpvars(0, tb_top);
  $fsdbDumpon;
  //#1ns $fsdbDumpflush;
  $dumpon;
 end
 
4. add this to simulation command:
-pli "/tools/synopsys/verdi/K-2015.09/share/PLI/MODELSIM/LINUX64/novas_fli.so

  

转载于:https://www.cnblogs.com/sosliunf/p/10437539.html

class getEnvVariableWork(): def __init__(self): self.msgCtrlObj = setEnvMsg("Start to check work directory valid or not") def getWorkDir(self): self.curWorkPath = os.getcwd() reInfo = "(.*)\/" + options.vrfDirName + "\/(\w+)\/(.*)$" curWorkObj = re.match(reInfo,self.curWorkPath) if curWorkObj: self.curProjPath = curWorkObj.group(1) self.curBlockPath= curWorkObj.group(2) self.curWrokPath = curWorkObj.group(3) if self.curWrokPath != "work" and options.localSimCtrl==False: self.msgCtrlObj.warnMsgPrint("the normal project, simulation start excute from work directory") os.environ[options.projTopName] = self.curProjPath elif options.selfDefineWork: self.msgCtrlObj.infoMsgPrint("Simulation scripts will current directory excute") elif options.pathCheckCtrl: self.curProjPath = os.getenv(options.projTopName) else: self.msgCtrlObj.errorMsgPrint("no surport excute the scripts in current directory, if you want, please enable --self=Ture") def getEnvInfo(self): return self.curProjPath+"/"+options.vrfDirName+"/"+self.curBlockPath, self.curBlockPath, self.curWorkPath def setSynEnv(self): self.envPath = os.getenv("PATH") self.vcsHome = "/edatools/synopsys/VCS" self.verdiHome = "/edatools/synopsys/Verdi" self.setPathStr = self.vcsHome + "/bin:" + self.envPath self.setVerdiPathStr = self.verdiHome + "/bin:" + self.envPath os.environ["VCS_HOME"] = self.vcsHome os.environ["NOVAS_HOME"] = self.verdiHome os.environ["VERDI_HOME"] = self.verdiHome os.environ["PATH"] = self.setPathStr os.environ["PATH"] = self.setVerdiPathStr def setCdnEnv(self): self.envPath = os.getenv("PATH") self.ldPath = os.getenv("LD_LIBRARY_PATH") self.cdsLicFile = "/edatools/tools_setup/lic/cadence_20240819.dat" self.xlmHome = "/edatools/cadence/XCELIUM" self.verdiHome = "/edatools/synopsys/Verdi" self.setXlmStr = self.xlmHome + "/bin:" + self.xlmHome + "/tools/bin:" + self.xlmHome + "/tools/dfII/bin:" self.setPathStr = self.setXlmStr + self.envPath self.setLdPathStr= self.xlmHome + "%0s/tools/lib:%0s/share/PLI/IUS/linux64:%0s"%(self.xlmHome,self.verdiHome,self.ldPath) os.environ["CDS_LIC_FILE"] = self.cdsLicFile os.environ["PATH"] = self.setPathStr os.environ["LD_LIBRARY_PATH"] = self.setLdPathStr def setResourceLimit(self): resource.setrlimit(resource.RLIMIT_STACK,(resource.RLIM_INFINITY,resource.RLIM_INFINITY)) resource.setrlimit(resource.RLIMIT_AS,(resource.RLIM_INFINITY,resource.RLIM_INFINITY)) resource.setrlimit(resource.RLIMIT_DATA,(resource.RLIM_INFINITY,resource.RLIM_INFINITY)) # TODO generate random seed class genRandSeed(): def __init__(self): self.randDataVal = random.randint(1,1000000000) self.randSymbol = random.randint(0,1) def genRandData(self): if self.randSymbol: self.randDataVal = -self.randDataVal; return self.randDataVal # TODO Testcase or Testlist anaysis class genTestcaselist(): def __init__(self,pjPath): self.testCaselist = [] self.testCfglist = [] self.msgCtrlObj = setEnvMsg("Analysis testcase and testlist infomation") self.projPath = pjPath self.cfgObj = getTestConfig() self.testCount = 0 self.waveCtrl = False self.seedWorkCtrl = False self.compVarList = [] self.compvarCount = 0 def genTestcase(self): if options.testCfgName!=None: for cfgName in options.testCfgName: if cfgName not in self.testCfglist: self.testCfglist.append(cfgName) if options.countCtrl: self.waveCtrl = False self.seedWorkCtrl = True if len(self.testCfglist)==0: self.testCfglist.append(options.caseCfgName) for testName in options.testNameCtrl: if os.path.exists(self.projPath+"/"+testName)==False and options.testCheckCtrl==1: self.msgCtrlObj.fatalMsgPrint("No exist " + testName + " in " + self.projPath) else: for cfgName in self.testCfglist: if options.testCheckCtrl==0: self.cfgObj.getCfgInfo(self.projPath+"/",cfgName) else: self.cfgObj.getCfgInfo(self.projPath+"/"+testName,cfgName) curCompVar = self.cfgObj.getCompOpts() if self.compVarList.count(curCompVar)==0: self.compVarList.append(curCompVar) self.compvarCount = self.compVarList.index(curCompVar) curTestCfgName = self.cfgObj.getCfgFileName() simVarList = self.cfgObj.getSimOpts() preVarList = self.cfgObj.getPreSimProc() postVarList = self.cfgObj.getPostSimProc() falseErrVarList = self.cfgObj.getFalseErr() expectErrVarList = self.cfgObj.getExpectErr() falseWarnVarList = self.cfgObj.getFalseWarn() expectWarnVarList = self.cfgObj.getExpectWarn() for curCountVal in range(0,options.countCtrl): if options.seedCtrl: curSeedData = options.seedCtrl.pop(0) else: randSeedObj = genRandSeed() curSeedData = randSeedObj.genRandData() curTestcaseInfo = [testName,curSeedData,curTestCfgName,self.compvarCount,self.compVarList[self.compvarCount],simVarList,preVarList,postVarList,falseErrVarList,expectErrVarList,falseWarnVarList,expectWarnVarList] self.testCaselist.append(curTestcaseInfo) self.testCount += 1 else: testNameList = options.testNameCtrl[:] testcaseCount = len(testNameList) if options.seedCtrl!=None: seedCount = len(options.seedCtrl) else: seedCount = 1 if len(self.testCfglist)==0: self.testCfglist.append(options.caseCfgName) testCfgCount = len(self.testCfglist) if testcaseCount == 1: self.waveCtrl = options.waveCtrl curTestcase = testNameList.pop(0) if os.path.exists(self.projPath+"/"+curTestcase)==False and options.testCheckCtrl==1: self.msgCtrlObj.fatalMsgPrint("No exist " + curTestcase + " in " + self.projPath) else: seedCountCtrl = int(math.ceil(float(seedCount)/float(testCfgCount))) for cfgName in self.testCfglist: if options.testCheckCtrl==0: self.cfgObj.getCfgInfo(self.projPath+"/",cfgName) else: self.cfgObj.getCfgInfo(self.projPath+"/"+curTestcase,cfgName) curCompVar = self.cfgObj.getCompOpts() if self.compVarList.count(curCompVar)==0: self.compVarList.append(curCompVar) self.compvarCount = self.compVarList.index(curCompVar) curTestCfgName = self.cfgObj.getCfgFileName() simVarList = self.cfgObj.getSimOpts() preVarList = self.cfgObj.getPreSimProc() postVarList = self.cfgObj.getPostSimProc() falseErrVarList = self.cfgObj.getFalseErr() expectErrVarList = self.cfgObj.getExpectErr() falseWarnVarList = self.cfgObj.getFalseWarn() expectWarnVarList = self.cfgObj.getExpectWarn() for seedIdx in range(0,seedCountCtrl): if options.seedCtrl: curSeedData = options.seedCtrl.pop(0) else: randSeedObj = genRandSeed() curSeedData = randSeedObj.genRandData() curTestcaseInfo = [curTestcase,curSeedData,curTestCfgName,self.compvarCount,self.compVarList[self.compvarCount],simVarList,preVarList,postVarList,falseErrVarList,expectErrVarList,falseWarnVarList,expectWarnVarList] self.testCaselist.append(curTestcaseInfo) self.testCount += 1 if self.testCount>1: self.seedWorkCtrl = True else: self.seedWorkCtrl = options.seedWorkCtrl else: self.waveCtrl = options.waveCtrl for testName in options.testNameCtrl: if os.path.exists(self.projPath+"/"+testName)==False and options.testCheckCtrl==1: self.msgCtrlObj.fatalMsgPrint("No exist " + testName + " in " + self.projPath) else: if len(self.testCfglist): cfgName = self.testCfglist.pop(0) else: cfgName = options.caseCfgName if options.testCheckCtrl==0: self.cfgObj.getCfgInfo(self.projPath+"/",cfgName) else: self.cfgObj.getCfgInfo(self.projPath+"/"+testName,cfgName) curCompVar = self.cfgObj.getCompOpts() if self.compVarList.count(curCompVar)==0: self.compVarList.append(curCompVar) self.compvarCount = self.compVarList.index(curCompVar) curTestCfgName = self.cfgObj.getCfgFileName() simVarList = self.cfgObj.getSimOpts() preVarList = self.cfgObj.getPreSimProc() postVarList = self.cfgObj.getPostSimProc() falseErrVarList = self.cfgObj.getFalseErr() expectErrVarList = self.cfgObj.getExpectErr() falseWarnVarList = self.cfgObj.getFalseWarn() expectWarnVarList = self.cfgObj.getExpectWarn() if options.seedCtrl: curSeedData = options.seedCtrl.pop(0) else: randSeedObj = genRandSeed() curSeedData = randSeedObj.genRandData() curTestcaseInfo = [testName,curSeedData,curTestCfgName,self.compvarCount,self.compVarList[self.compvarCount],simVarList,preVarList,postVarList,falseErrVarList,expectErrVarList,falseWarnVarList,expectWarnVarList] self.testCaselist.append(curTestcaseInfo) self.testCount += 1 if self.testCount>1: self.seedWorkCtrl = True else: self.seedWorkCtrl = options.seedWorkCtrl def genTestlist(self): curTestname = "" curCount = "" curTestCfg = "" curCompVar = "" simVar = "" seedVar = "" lineInfo = "" fileHandle = open(options.testListFile,'r') self.waveCtrl = False self.seedWorkCtrl = True while True: lineContext = fileHandle.readline() if not lineContext: break lineInfo = lineContext.strip() if len(lineInfo)==0: continue reInfo = "^\s*#.*" lineObj= re.match(reInfo,lineContext) if lineObj: continue else: testInfoQueue = lineContext.split(";") if len(testInfoQueue)<=2: self.msgCtrlObj.fatalMsgPrint("Regression list include testcase and count, current line: %0s"%(lineContext)) curTestname = testInfoQueue[0].strip() curCount = testInfoQueue[1].strip() if len(testInfoQueue)>2: curTestCfg = testInfoQueue[2].strip() if len(testInfoQueue)>3: curCompVar = testInfoQueue[3].strip() if len(testInfoQueue)>4: simVar = testInfoQueue[4].strip() #support multi seed if len(testInfoQueue)>5: seedVar = testInfoQueue[5].strip() seedTempVar = re.sub(' +',' ',seedVar) seedVarList = seedTempVar.split(' ') if os.path.exists(self.projPath+"/"+curTestname)==False and options.testCheckCtrl==1: self.msgCtrlObj.fatalMsgPrint("No exist " + curTestname + " in " + self.projPath) else: testMacroVarList = [] noMacroVarList = [] compMacroVar = "" compNoMacroVar = "" if curTestCfg: testCfgFile = curTestCfg elif options.testCfgName!=None: testCfgFile = options.testCfgName.pop(0) else: testCfgFile = options.caseCfgName if options.testCheckCtrl==0: self.cfgObj.getCfgInfo(self.projPath+"/",testCfgFile) else: self.cfgObj.getCfgInfo(self.projPath+"/"+curTestname,testCfgFile) #test.cfg compile parameter testCompVar = self.cfgObj.getCompOpts() compOptsVar = re.sub(' +',' ',testCompVar) CompVarList = compOptsVar.split(' ') CompVarList.sort() for macroVar in CompVarList: if macroVar: macroObj = re.match('\+define\+',macroVar) if macroObj: macroTmpVar = re.sub('\+define\+','',macroVar) macroVarList = macroTmpVar.split('+') macroVarList.sort() for compVar in macroVarList: if compVar not in testMacroVarList: testMacroVarList.append(compVar) else: compVar = re.sub(':',' ',macroVar) noMacroVarList.append(compVar) #List compile parameter testCompVar = curCompVar compOptsVar = re.sub(' +',' ',testCompVar) CompVarList = compOptsVar.split(' ') CompVarList.sort() for macroVar in CompVarList: if macroVar: macroObj = re.match('\+define\+',macroVar) if macroObj: macroTmpVar = re.sub('\+define\+','',macroVar) macroVarList = macroTmpVar.split('+') macroVarList.sort() for compVar in macroVarList: if compVar not in testMacroVarList: testMacroVarList.append(compVar) else: compVar = re.sub(':',' ',macroVar) noMacroVarList.append(compVar) #Merge all compile parameter if len(testMacroVarList): compMacroVar = "+define+" + "+".join(testMacroVarList) if len(noMacroVarList): compNoMacroVar = " ".join(noMacroVarList) if compMacroVar or compNoMacroVar: compMacroVar = compMacroVar + " " + compNoMacroVar if self.compVarList.count(compMacroVar)==0: self.compVarList.append(compMacroVar) self.compvarCount = self.compVarList.index(compMacroVar) #Sim paramter simVarList = self.cfgObj.getSimOpts() if simVar: simVarList = simVarList.strip() + " " + simVar curTestCfgName = self.cfgObj.getCfgFileName() preVarList = self.cfgObj.getPreSimProc() postVarList = self.cfgObj.getPostSimProc() falseErrVarList = self.cfgObj.getFalseErr() expectErrVarList = self.cfgObj.getExpectErr() falseWarnVarList = self.cfgObj.getFalseWarn() expectWarnVarList = self.cfgObj.getExpectWarn() for curCountVal in range(0,int(curCount)): if curCountVal>=len(seedVarList): randSeedObj = genRandSeed() curSeedData = randSeedObj.genRandData() elif seedVarList[curCountVal]: curSeedData = int(seedVarList[curCountVal]) else: randSeedObj = genRandSeed() curSeedData = randSeedObj.genRandData() curTestcaseInfo = [curTestname,curSeedData,curTestCfgName,self.compvarCount,self.compVarList[self.compvarCount],simVarList,preVarList,postVarList,falseErrVarList,expectErrVarList,falseWarnVarList,expectWarnVarList] self.testCaselist.append(curTestcaseInfo) self.testCount += 1 fileHandle.close() def getTestList(self): return self.testCaselist def getWaveCtrl(self): return self.waveCtrl def getSeedPathCtrl(self): return self.seedWorkCtrl def getTestcaseCount(self): return self.testCount def getCompVar(self): return self.compVarList
06-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值