您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 模拟电路提取Verilog模型的方法
模块电路提取Verilog模型的方法总结陈锋2018-1-181.在原理图目录,运行icfb。2.选Tools-LibraryManager…3.在Library找到要提取的库(一般是项目名称),这里选NV3030A1P_GRAM。在Cell里选要提取的顶层模块,这里选GRAM。View里选schematic,并右击选open4.在打开的原理图VirtiosoSchematic菜单里,选Tools-Simulation-NC-Verilog5.在设置窗口里,RunDirectory手工填入提取Verilog网表的目录名,比如xxx/GRAM_run66.TopLevelDesign里,点Browser…,选择要提取的顶层,我们这里选择与第3步相同的Library、Cell和View。如下图,选好后点Close。7.点左边“跑步的人”来InitialDesign。会看到“三个勾”(GenerateNetlist)的图标显示出来了。8.选Setup-Netlist…9.设置提取参数。我们需要修改“NetlistTheseViews”和“StopNetlistingatViews”,如下图设置。另外时间和精度也可以在此设置,默认是1ns/1ns,是全局的设置。我建议不要修改,在生成VerilogNetlist后,手工修改一些特殊模块来提高精度即可。设置好后,点Apply,OK。10.点击“三个勾”生成VerilogNetlist。稍等片刻后,第三个图标“模块图”显示出来,说明网表也生成好。11.我们进入GRAM_run6目录,并进入子目录ihnl。会看到很cdsxx开头的文件夹,再看cdsxx目录里面有个netlist文件。用文本编辑器打开netlist,你就看到了提取出来的Verilog网表了。12.我们在GRAM_run6目录里,用如下的命令来合并各个模块的Verilog网表。find会查找到所以的名叫“netlist”的文件,用cat显示出这些文件的内容,再重定向到nv3030_sram.v。13.用以下命令检查网表有无语法错误。verdi-2001–nologonv3030_sram.v一般来说,我们网表提取到此结束。14.但有时,我们还需要修改自动提取的网表。比如:a)删除共用的逻辑单元模块,因为这些模块很可能已经手动写好verilog形为级模型。b)修改部分模块的精度,因为某些延时模块希望精确到100ps。下面是一个用python写的示例脚本。使用方法simplify_sram_netlist.py-iinputfile-ooutputfile#!/home/verify8/chenf/eda/Python-3.6.2/pythonimportsysimportosimportreimportgetopt#解析命令参数try:opts,args=getopt.getopt(sys.argv[1:],hi:o:,[ifile=,ofile=])exceptgetopt.GetoptError:print('simplify_sram_netlist.py-iinputfile-ooutputfile')sys.exit(2)foropt,arginopts:ifopt=='-h':print('simplify_sram_netlist.py-iinputfile-ooutputfile')sys.exit()elifoptin(-i,--ifile):ifileName=argelifoptin(-o,--ofile):ofileName=arg#读入待修改的Verilog网表infile=open(ifileName,'r')sfile=infile.read()infile.close()#此处指定要删除的模块名libMod=[nand2_lv,delay3n,nand3_lv,ldecv4,nor3_lv,inv_lv,delay5n,delay500p,nand4_lv,tg_lv,dff_rl,bushold,dff_fl,mux2,delay1n,nor2_lv,rwckt,sramcell,inoutbuf]sMod={}#分离成单个moduleallmodule=re.findall(r'(module.*?endmodule)',sfile,re.S)ifnotallmodule:print(Cannotfindanymodule!)else:forminallmodule:searchModName=re.search(r'module\s([\w_]+)\s',m,re.S)mName=searchModName.group(1)ifmNameinlibMod:#如果是指定要删掉的模块,则丢掉continueelse:ifmName==rwckts0:#处理时间单位和精度strTimescale=`timescale1ns/100ps\nelifmName==inoutbuf:strTimescale=`timescale1ns/10ps\nelse:strTimescale=`timescale1ns/1ns\n#处理结束后,存入到sMode列表sMod[mName]=strTimescale+m+'\n\n'#对处理完的模块,按模块名排序sModKeys=list(sMod.keys())sModKeys.sort()#把结果写到新文件outfile=open(ofileName,'w')forkinsModKeys:outfile.write(sMod[k])outfile.flush()outfile.close()15.注意:a)如果模拟电路里有functionalView,则需要检查提取的对应模块是网表和自己写的verilog模型。b)需要检查Verilog网表里的晶体管级的模型,如nmos、pmos、cmos、tran等。并确认是否是必须的,如果不是请替换成形为级模型。因为晶体管级模型仿真会慢很多。c)确认是否包含没有逻辑功能的驱动Buffer(如,两级反相器)。一般模块电路里会包含大量的这种驱动buffer。d)确认DFF的模型已经替换成形为级模型。e)确认必要的延时信息是否已经加入。因为直接提取不到电容、电阻的RC延时,必要时请手动加上。否则可能造成逻辑不正确。f)确认Verilog网表里是否有上拉的电路,很可能需要把rpmos替换成pullup语句。
本文标题:模拟电路提取Verilog模型的方法
链接地址:https://www.777doc.com/doc-5484577 .html