陈锋 2018-1-18
1. 在原理图目录,运行icfb。 2. 选Tools->LibraryManager…
3. 在Library找到要提取的库(一般是项目名称),这里选NV3030A1P_GRAM。在Cell里选要提取的顶层模块,这里选GRAM。View里选schematic,并右击选open
4. 在打开的原理图VirtiosoSchematic菜单里,选Tools->Simulation->NC-Verilog
5. 在设置窗口里,RunDirectory手工填入提取Verilog网表的目录名,比如xxx/GRAM_run6
6. 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. 一般来说,我们网表提取到此结束。 14.
但有时,我们还需要修改自动提取的网表。比如: 用以下命令检查网表有无语法错误。
a) 删除共用的逻辑单元模块,因为这些模块很可能已经手动写好verilog形为级模型。
b) 修改部分模块的精度,因为某些延时模块希望精确到100ps。
下面是一个用python写的示例脚本。
使用方法 importsys importos importre importgetopt #解析命令参数 try:
opts,args=getopt.getopt(sys.argv[1:],\"hi:o:\\"ofile=\"])
exceptgetopt.GetoptError:
print('simplify_sram_netlist.py-i print('simplify_sram_netlist.py-i elifoptin(\"-i\ifileName=arg elifoptin(\"-o\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={} #分离成单个module allmodule=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:#如果是指定要删掉的模块,则丢掉 continue else: ifmName==\"rwckts0\":#处理时间单位和精度 strTimescale=\"`timescale1ns/100ps\\n\" elifmName==\"inoutbuf\": strTimescale=\"`timescale1ns/10ps\\n\" else: 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语句。 因篇幅问题不能全部显示,请点此查看更多更全内容