您的当前位置:首页正文

模拟电路提取Verilog模型的方法

2023-02-05 来源:榕意旅游网
模块电路提取Verilog模型的方法总结

陈锋 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-o') sys.exit(2) foropt,arginopts: ifopt=='-h':

print('simplify_sram_netlist.py-i-o') sys.exit()

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语句。

因篇幅问题不能全部显示,请点此查看更多更全内容