IC设计后端流程初学必看.docx
- 文档编号:23361635
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:49
- 大小:1.57MB
IC设计后端流程初学必看.docx
《IC设计后端流程初学必看.docx》由会员分享,可在线阅读,更多相关《IC设计后端流程初学必看.docx(49页珍藏版)》请在冰豆网上搜索。
IC设计后端流程初学必看
基本后端流程(漂流&雪拧)
—-—--2010/7/3———2010/7/8
本教程将通过一个8*8的乘法器来进行一个从verilog代码到版图的整个流程(当然只是基本流程,因为真正一个大型的设计不是那么简单就完成的),此教程的目的就是为了让大家尽快了解数字IC设计的大概流程,为以后学习建立一个基础。
此教程只是本人探索实验的结果,并不代表内容都是正确的,只是为了说明大概的流程,里面一定还有很多未完善并且有错误的地方,我在今后的学习当中会对其逐一完善和修正。
此后端流程大致包括以下内容:
1.逻辑综合(逻辑综合是干吗的就不用解释了把?
)
2.设计的形式验证(工具formality)
形式验证就是功能验证,主要验证流程中的各个阶段的代码功能是否一致,包括综合前RTL代码和综合后网表的验证,因为如今IC设计的规模越来越大,如果对门级网表进行动态仿真的话,会花费较长的时间(规模大的话甚至要数星期),这对于一个对时间要求严格(设计周期短)的asic设计来说是不可容忍的,而形式验证只用几小时即可完成一个大型的验证.另外,因为版图后做了时钟树综合,时钟树的插入意味着进入布图工具的原来的网表已经被修改了,所以有必要验证与原来的网表是逻辑等价的。
3.静态时序分析(STA),某种程度上来说,STA是ASIC设计中最重要的步骤,使用primetime对整个设计布图前的静态时序分析,没有时序违规,则进入下一步,否则重新进行综合.(PR后也需作signoff的时序分析)
4.使用cadence公司的SOCencounter对综合后的网表进行自动布局布线(APR)
5.自动布局以后得到具体的延时信息(sdf文件,由寄生RC和互联RC所组成)反标注到网表,再做静态时序分析,与综合类似,静态时序分析是一个迭代的过程,它与芯片布局布线的联系非常紧密,这个操作通常是需要执行许多次才能满足时序需求,如果没违规,则进入下一步.
6.APR后的门级功能仿真(如果需要)
7.进行DRC和LVS,如果通过,则进入下一步。
8.用abstract对此8*8乘法器进行抽取,产生一个lef文件,相当于一个hardmacro。
9.将此macro作为一个模块在另外一个top设计中进行调用。
10.设计一个新的ASIC,第二次设计,我们需要添加PAD,因为没有PAD,就不是一个完整的芯片,具体操作下面会说。
11.重复第4到7步
1.逻辑综合
1)设计的8*8verilog代码如下
modulemux(clk,clr,data1,data2,dataout);
inputclk,clr;
input[7:
0]data1,data2;
outputreg[15:
0]dataout;
always@(posedgeclk)
begin
if(!
clr)
begin
dataout〈=0;
end
else
begin
dataout〈=data1*data2;
end
end
endmodule
2)综合之前,我们要选取库,写好约束条件,修改dc的启动文件synopsys_dc。
setup,目标库选择TSMC(此设计都是用TSMC18的库)的typical。
db。
(选择max库会比较好)
Dc的命令众多,但是最基本的命令差不多,此设计的约束文件命令如下:
create_clock-period10[get_portsclk]//用于时钟的创建
set_clock_latency—source-max0。
2[get_portsclk]//外部时钟到core的clk连线延时
set_clock_latency—max0.1[get_portsclk]//core的clk到寄存器clk端的net连线延时
set_clock_uncertainty-setup2[get_portsclk]//时钟延时的不确定性,求setup违规时会被计算进去
set_clock_uncertainty–hold1【all_clocks】
set_input_delay—max0。
5—clockclk[get_ports[list[remove_from_coll[all_inputs]clk]]//输入延时,外部信号到input端的连线延时
set_output_delay-max0。
5-clockclk[all_outputs]//输出延时
set_driving_cell-lib_cellINVX4[all_inputs]//输入端的驱动强度
set_load-pin_load0.0659726[all_outputs]//输出端的驱动力
set_wire_load_model—nametsmc18_wl10-librarytypical//内部net的连线模型
set_wire_load_modeenclosed//定义建模连线负载相关模式
set_max_area0
compile
report_timing
report_constraint
change_names—ruleverilog–hier
set_fix_multiple_ports_net–all
write—formatverilog-hier—outputmux。
sv//输出网表,自动布局布线需要
write—formatddc—hier—outputmux。
ddc//输出ddc
write_sdfmux.sdf//输出延时文件,静态时序分析时需要
write_sdcmux.sdc//输出约束信息,自动布局布线需要
3)逻辑综合
启动design_vision。
Read—>mux。
v
输入约束文件.File—〉excutescript—〉verti。
con
之后会产生mux.sv,mux.sdc,mux.sdf,mux。
ddc等文件
4)时序分析
综合以后我们需要分析一下时序,看时序是否符合我们的要求,综合实际上是一个setup时间的满足过程,但是我们综合的时候,连线的负载只是库提供的(即上面的wire_load),并不是实际的延时,所以一般做完综合以后,时间余量(slack)应该为时钟的30%(经验值),以便为后面实际布局布线留下充足的延时空间。
因为如果slack太小,甚至接近于0,虽然我们看起来是没有时序违规的,但是实际布局以后,时序肯定无法满足。
使用report_timing命令,可以查看时序分析报告:
****************************************
Report:
timing
—pathfull
-delaymax
-max_paths1
—sort_bygroup
Design:
mux
Version:
D—2010。
03-SP1
Date:
FriJul212:
29:
442010
****************************************
OperatingConditions:
typicalLibrary:
typical(模型库)
WireLoadModelMode:
enclosed
Startpoint:
data2[4](inputportclockedbyclk)
Endpoint:
dataout_reg_15_
(risingedge—triggeredflip—flopclockedbyclk)
PathGroup:
clk
PathType:
max
Des/Clust/PortWireLoadModelLibrary
————-—————---—-----——---—-—--——--—-——————-——--——
muxtsmc18_wl10typical(线载模型及库)
PointIncrPath
————-—-———-——--—-—--—-—--—-——-—----———--———-———--—--————-—-—-——-—--———--—-
clockclk(riseedge)0。
000.00
clocknetworkdelay(ideal)0.000.00
inputexternaldelay0.500.50f
data2[4](in)0.010.51f
mult_14/b[4](mux_DW_mult_uns_0)0.000。
51f
mult_14/U131/Y(INVX1)0。
541.05r
mult_14/U161/Y(NOR2X1)0。
141。
18f
mult_14/U39/S(CMPR42X1)0.681.87f
mult_14/U12/CO(ADDFX2)0.322。
19f
mult_14/U11/CO(ADDFX2)0。
232.42f
mult_14/U10/CO(ADDFX2)0.232.65f
mult_14/U9/CO(ADDFX2)0.232。
88f
mult_14/U8/CO(ADDFX2)0.233.10f
mult_14/U7/CO(ADDFX2)0。
233。
33f
mult_14/U6/CO(ADDFX2)0。
233.56f
mult_14/U5/CO(ADDFX2)0。
233.79f
mult_14/U4/CO(ADDFX2)0.234.02f
mult_14/U3/CO(ADDFX2)0。
234。
25f
mult_14/U2/CO(ADDFX2)0。
224。
47f
mult_14/product[15](mux_DW_mult_uns_0)0。
004。
47f
dataout_reg_15_/RN(DFFTRXL)0。
004。
47f
dataarrivaltime4.47
clockclk(riseedge)10。
0010.00
clocknetworkdelay(ideal)0。
3010。
30
clockuncertainty-0.1010.20
dataout_reg_15_/CK(DFFTRXL)0.0010。
20r
librarysetuptime—0。
1910.01
datarequiredtime10.01
--—--—-----——----—-—-——---—--————-——-——-—--—--——-——-----—--—---—-——--——-——
datarequiredtime10.01
dataarrivaltime—4。
47
—-—--——-—--——----———-—--—-———--——---——-------———-——————-—-—-—----————-—-——
slack(MET)5。
55
我们来看以上报告,dc报告的时候会显示出关键路径,即延时最大的路径,时序分析包括两段,前面一段是信号的延迟时间,即dataarrivaltime为4.47,下面是计算要求时间,也即相对于时钟,设计所能忍受的最大延时,由于到达寄存器clk端延时,即clocknetworkdelay,所以设计增加了0。
30的余量,同样由于时钟的不确定度(可能提前也可能延后0。
1),我们取最坏情况,就是时钟超前0。
1,则时间余量减去0.1,最后一个是门的建立时间要求,是0.19,最后得到数据的要求时间。
Slack是要求时间减去到达时间的差值,slack越大越好。
越大说明留给布局布线的时序越宽松.从报告中我们看出,时序余量为5.55,说明时序达到了要求,足够满足我们以后布局布线的时序要求。
当然,我们有专门的时序分析工具,primetime,下面会稍微介绍。
2.形式验证
1)怎么保证综合前和综合后的网表逻辑功能是一致的呢,对门级网表进行动态仿真,又太浪费时间,于是,一款强大的验证工具formality,给了我们很好的帮助。
2)形式验证数据准备:
综合前RTL代码,综合后的网表,综合所用到的库.
3)验证过程如下:
1.首先我们打开formality,命令为fm_shell(命令行界面),formality(图形界面)。
初学者一般使用图形界面,使用图形界面的时候,工具会自动产生一个log文件,记录命令,我们可以将这个文件内容做一个fms格式,这样在下次验证的时候可以使用命令界面.
2.打开formality如下
第一步:
首先我们加入原RTL代码,reference—>read_designfile->verilog—〉mux。
v,选择好以后loadfile
第二步:
然后选择库,没加库之前,FM会自动加载与工艺无关的库,所以我们要自己把自己的目标库加上去,reference->readDBlibarary—〉DB,选择typical。
db
第三步:
设置top名reference->settopdesign我们选择mux为top名
同样的方法对网表进行设置(第二个菜单栏implementation)
然后转到第四栏,点击runmatching
最后转到第五栏,verify,如果网表无错,会显示验证通过。
3静态时序分析
静态时序分析主要针对大型ASIC设计,
4自动布局布线
1)数据准备
第一:
需要综合后的网表以及时序约束文件mux.sv,mux.sdc
第二:
需要自动布局布线的物理库(lef文件,这里用到tsmc18_6lm_cic.lef,tsmc18_6lm_antenna_cic.lef)
为了能够了解lef文档的作用,这里对lef做简单的介绍,lef一般分为两种:
一种是技术物理库,主要包含工艺信息,设计规则信息,金属通孔信息等。
下例是对金属一层的定义,TYPE指明METAL1是可布线层,WIDTH定义的是METAL1的默认布线宽度,SPACING用于设定METAL1布线间距。
DIRECTIONHORIZONTAL指明METAL1是用于水平走线,当然这并不意味着它不能垂直走线,在一些布线资源较少的区域,还是可以选择垂直布线的。
具体介绍,可以参考相关技术文档.
LAYERMETAL1
TYPEROUTING;
WIDTH0.230;
MAXWIDTH9。
9;
AREA0.202;
SPACING0.230;
SPACING0.6RANGE10.0100000。
0;
PITCH0。
560;
DIRECTIONHORIZONTAL;
EDGECAPACITANCE9。
1090e-05;
ENDMETAL1
另外一种就是单元物理库,定义了单元库中各单元的信息,文件又有两部分一种是SITE语句对布局(placement)最小单位的定义,另一部分是采用MACRO语句对单元属性及几何形状的描述,下例是对一个与门为例来看看lef是如何描述它的。
MACRO是单元定义的关键字,每一个MACRO代表一个单元。
CLASScore说明该单元是用于芯片的核心区,SIZE确定了单元的面积大小,比如5.04是代表该单元的高度,后面我们做单元供电route的时候,可以看到它们的宽度就是这个数值.再后面就是定义引脚A,B,Y,VDD,VSS等。
MACROAND2X1
CLASSCORE;
FOREIGNAND2X10.0000.000;
ORIGIN0.0000。
000;
LEQAND2XL;
SIZE2。
640BY5。
040;
SYMMETRYxy;
SITEtsm3site;
PINY
DIRECTIONOUTPUT;
PORT
LAYERMETAL1;
RECT2.3552。
3802。
5002。
660;
END
ENDY
PINB
DIRECTIONINPUT;
PORT
LAYERMETAL1;
RECT0.8002。
3151。
2152。
895;
END
ENDB
PINA
DIRECTIONINPUT;
PORT
LAYERMETAL1;
RECT0.1501.8200。
5652.315;
END
ENDA
PINVSS
DIRECTIONINOUT;
USEground;
SHAPEABUTMENT;
PORT
LAYERMETAL1;
RECT1。
790—0。
4002.6400。
400;
RECT1。
450—0.4001.7900。
575;
RECT0。
000—0。
4001.4500。
400;
END
ENDVSS
PINVDD
DIRECTIONINOUT;
USEpower;
SHAPEABUTMENT;
PORT
LAYERMETAL1;
RECT1.7554.6402.6405。
440
END
ENDVDD
OBS
LAYERMETAL1;
RECT1.8351.9351。
8852。
355;
END
ENDAND2X1
第三:
时序库文件,typical.lib,也就是时序文件,定义了门的各种时序信息,某种意义来讲,这个和综合使用的db库是等价的.
2)布局布线过程:
第一步:
打开encounter把数据输入,另外在advanced栏的Power相应位置填上VDD,和VSS。
如下图,设置完以后,记得把设置的配置文件做一个save以便于下次使用
第二步:
打开以后,我们可以看到芯片区域,左边粉红色的就是标准单元,中间那个就是我们要设计的区域,64%是指cell面积的占有率,一般来说控制在70%左右,布线的时候不会引起拥塞。
另外我们需要对芯片进行稍微的更改,Floorplan—>specifyfloorplan.,将coretoIO那些项都填上45,留给电源环的放置。
第三步:
添加电源环
设置如下图,
NET填写VDD和VSS,layer选择顶层的两层金属,宽度设置为20(这个不定,可以根据实际设计来定),offset选择centerinchannel,则电源环会被设置在IO与core之间。
之后电源环就加进去了,当然这是一个小电路,电源规划比较简单,对于一个复杂的电路,还需要横竖添加stripes,降低IRdrop。
第四步:
自动布局以及布置标准单元,因为此设计较小,并没有block,所以可以直接进行标准单元的放置。
Place—〉standardcellsandblocaks—〉OK
然后我们发现标准单元已经被加进去了:
第五步:
布置好了以后,我们需要将电源,地,等接口先连接起来,首先我们在floorplan中选择globalnetconnection,分别将VDD,VSS等都连接起来.
然后我们需要specifyroute将电源和地线先连接起来,选择route—〉specifyroute
因为我们这个设计只有标准单元,所以我们只要选择标准单元的布线即可:
完成以后,点击OK,会得到下面的图:
每行的row都有线连接到外面的电源环
第六步:
时钟树综合(CTS),这是一个APR设计中最重要的一环,为什么要进行时钟树综合呢,简单地说,因为信号传输的延时,我们需要让相应路径的时钟路径的也具有同样的延时,通过添加时钟缓冲器的方法,来消除各路径的建立时间,具体请参考相关书籍和资料.
添加好时钟树以后的版图如下:
加了时钟树以后的版图密集了很多,因为加了很多buf。
时钟树的脚本:
AutoCTSRootPinclk
Period10ns
MaxDelay500ps#set_clock_latency
MinDelay0ps#set_clock_latency
MaxSkew100ps
SinkMaxTran400ps
BufMaxTran400ps
ObstructionNO
DetailReportYES
PadBufAfterGateNO
RouteClkNetNO
PostOptYES
OptAddBufferYES
OptAddBufferLimit100
NoGatingNO
BufferCLKBUFX1CLKBUFXLCLKBUFX2CLKBUFX3CLKBUFX4CLKBUFX8CLKBUFX12CLKBUFX16CLKBUFX20CLKINVXLCLKINVX1CLKINVX2CLKINVX3CLKINVX4CLKINVX8CLKINVX12CLKINVX16CLKINVX20
END
然后将脚本选中,并进行时钟树综合。
第七步:
优化设计,命令optDesign–postCTS,然后report_timing查看时序报告,确定无违规,再进行完全布线。
第八步:
完全布线,route—〉nanoroute-〉route
之后得到的版图如下所示:
第九步:
保存设计,提取需要的数据。
这里特别注意提取gds文件的时候,需要指定库文件中的streamOut。
map文件,和mergegds(tsmc18_core.gds)文件,如图所示
保存网表,并将此版图提取的网表做一次formality,与原代码匹配成功。
再提取def文件,保存为mux。
def
5第二次静态时序分析
用版图实际提取的延时文件进行
6APR后仿真
用modelsim对版图提取的网表和sdf文件进行仿真。
7用calibre对版图进行DRC及其LVS验证
在做这步之前,我们需要把相关的文档拷贝到icfb的工作目录下
Encounter导出的gds文档:
这里是mux8.gds(注意merge库的map文件)
技术文档如:
0.18um_Virtuoso4.4.tf,可以在厂家提供的库中去找
显示文件:
display。
drf
Caliber验证文件:
drc,lvs文档
第一步:
将encounter的版图数据导入virtuoso,打开icfb&,选择file-〉import—>stream
然后将版图信息和技术文件填入:
导入成功以后会出现我们所做的库,mux就是我们encounter中所画的版图。
我们把版图打开:
这就是我们所画的版图然后在此进行drc,和lvs,通过以后再进行下面的工作.
第二步:
drc检查
此处有错,并不是逻辑有问题,是因为密度不够的问题,需要在encounter阶段加FILLER,FILLER是与逻辑无关的,因为代工厂的流片加工要求,需要加的,密度不够,加工容易引起问题。
所以如果DRC报类似错误,如果是需要流片的版图,除非代工厂同意,否则必须清除这些错误.
第三步:
lvs检查
1)Lvs检查之前,我们需
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IC 设计 后端 流程 初学
![提示](https://static.bdocx.com/images/bang_tan.gif)