EnChip Microelectronics

又一个WordPress站点

EnChip Microelectronics

又一个WordPress站点

ASIC流程

如果您已经有2年以上的实战经验,下面这些雕虫小技就不太值得您去浪费时间了。

先说说作为一个有经验的后端(暫不包括DFT工程师和layout工程师)工程师,需要掌握哪些知识
4个级别:
1)知道一些基本概念,
2)简单地掌握这门技术,
3)熟练
4)精通

半导体工艺–2
RTL coding — 2
综合 — 2
时序约束 — 3
APR — 3
DFT — 2
DRC/LVS — 3
仿真 — 2
形式验证 — 2

以下是FAQ分类:
2楼:时序约束,STA
3楼:综合DC/RC
4楼:APR (floorplan, place, CTS,route)
5楼:验证(LEC,DRC,LVS等)
6楼:DFT
7楼:低功耗
8楼:面试
9楼:名词解释
apr , FAQ , 后端 , 面试 , 时序

2#
楼主| 发表于 2011-12-14 13:45:06 | 只看该作者
时序约束,STA
本帖最后由 陈涛 于 2011-12-15 15:39 编辑

(1) clock
Q1.1 什么是同步时钟?
时钟频率是整倍数,并且相互之间的相位是固定而且相差可预知的,才可以称得上是同步时钟。其他的都算异步时钟。
比如,
5M,10M是同步
2M,3M一般算异步
一个时钟,输出到另一个芯片中,转一圈后,以同样的频率返回到自己的芯片,因为无法确定时钟在另一个芯片里面的latency,所以输出的时钟与输入的时钟算异步
一个时钟进到2个PLL,就算那2个PLL的输出频率相同,一般也算是异步时钟,除非你de-skew

Q1.2 如何处理同步时钟?
  设计要求严格的公司,就算是同步时钟,数据在同步时钟间传送时,依然要用meta-stability FF,可以set_false_path
  如果放松要求,不用meta-stability FF,则同步时钟之间是real path,做CTS时,同步时钟要clock tree balance。
  注意不同频率的同步时钟的最小时间间隔被用来检查setup
  如果上升下降沿混用的话,setup的时间间隔就只有半个时钟周期了

Q1.3 如何处理异步时钟?
   很简单,set_false_path
    注意要from A to B,同时要from B to A

Q1.4 如何定义时钟?
  create_clock 如果指定某个pin/port,就是实时钟,如果没有指定pin和port,就是虚拟时钟
  巧妙利用waveform选项可以做出不同波形的时钟
  被定义成时钟的net,在综合时,自动带有ideal network和dont_touch的属性。但是当它被用作data计算延迟时,ideal net的属性会自动消失
  时钟会自动穿过逻辑单元,停在时序单元的时钟端,所以用FF产生的分频时钟要再用create_generated_clock定义一次

Q1.5 如何处理多选一时钟?
  在实际应用当中,如果这几个时钟不会同时出现的话,则在定义时钟时,只选择最快频率的就可以了
  如果是多个时钟同时出现,可以用set_case_analysis选一个,
  也可以放它们全都过去,但是在MUX后面把它们之间set_false_path

Q1.6 巧妙定义时钟
  直接在分频FF的Q端定义generated clock时,有时会把分频FF的时序打掉,解决办法是在分频FF的Q端加一个时钟buf,从那个buf的输出端定义generated clock,从而保证分频FF自身的时序完整
  如果从source clock到generated clock之间有多条路径,你希望PT用指定的一条路径来计算时序的话,可以用set_case_analysis, set_disbale_timing 或者一级一级地定义generated clock来引导PT达到你的要求

  分频器时序约束问题
  时序分析中同一时钟的不同路径问题
  请教如下要求的clock在pt中应该怎么create
  怎样设set_case或者别的,才能让pt选择同一条clock path

Q1.7 什么时候需要设置latency?
  latency分为source latency 和 network latency 两种。 source latency是源时钟自带的,network latency就是CTS后的clock tree insertion delay。
  在综合时,一般不需要latency,
  除非,
  已知不同clock带有不同的source latency,并且它们之间有时序要求
  预知不同clock会有不同的clock tree insertion delay,不想平衡它们,但是要满足他们之间的时序要求

  做完CTS后,要把network latency去掉

  请问set_clock_latency 设太大会有什么不好

Q1.8 如何设置uncertAInty
  clock uncertainty分为setup和hold,preCTS和postCTS几种不同的情况
  一般的处理原则是:
  preCTS,setup: uncertainty = PLL jitter + 预估的clock skew
  preCTS,hold: uncertainty = 预估的clock skew

  postCTS,set_propagate_clock [all_clocks]
  postCTS,setup: uncertainty = PLL jitter
  postCTS,hold: uncertainty = 0
  有时fundry要求hold uncertainty保留一定的量,这时就把那个保留量加到上面的公式中

  sdc文件中对clk的uncertainty、transition、latency的设置

(2) IO端口的约束
Q2.1 如何加IO端口的约束?
最普通的方法是
对输入端,set_input_delay, set_driving_cell (也有用set_input_transition的,但是不多见)
对输出端,set_output_delay,set_load
对时钟端,set_clock_transition

  dc综合时的clock transition应该参考什么设定?
  set_drive ,set_load

Q2.2 哪些端口不需要约束?
  静态信号可以set_false_path,比如reset,test_mode,function_mode_select
  不能真的什么约束都不加

Q2.3 什么样的reset信号可以set_false_path?
  如果在工作时,reset信号有效时,时钟信号不翻转,就可以set_false_path
  如果reset信号动作时,时钟也有动作的话,就不能set_false_path

Q2.4 像reset那样的high fanout信号需要设定为ideal net吗?
  如果是false path的话,可以设为ideal net
  一般不需要设为ideal net,让DC加入buffer tree后,有利于估算功耗和面积

Q2.5 如果有一组输出信号,需要他们之间对齐,但是不太在乎有多大的延迟,这时应该如何约束?
  如果有输出时钟的话,在那个输出时钟端口定义一个generated_clock,其它信号的output_delay都相对于这个generated_clock而定。只要有max和min,就可以把所有信号卡在一个范围之内
  如果没有输出时钟的话,用set_output_delay -reference_pin

Q2.6 如何计算input和output delay?
  如果是block的input和output delay,可以预先分配,比如输出端,输入端各1/3,中间的连接1/3
  block的端口最好都flop-in,flop-out
  如果是chip IO,要度其他芯片的IO时序和电路板上面的延迟,比较麻烦

  set_input_delay的时间设置

(3) DRV
DRV有时也加DRC,与物理检测的DRC不是一个概念
DRV包括,
set_max_transition 与工艺相关,65nm的话,在0.6ns左右
set_max_fanout 与工艺相关,一般在12~20之间
set_max_capacitance
set_max_power
set_max_area

(4) false path,multicycle path
Q4.1 什么情况下需要set_false_path?
异步时钟之间,
到meta-stability 的第一个FF路径,
静态信号

Q4.2 何时会用到multicycle_path?
  太长的path,
  不会每个周期都变的信号
  注意:在RTL中,前端一定要多周期工作一次的功能

  一般set_multicycle_path -setup <n周期>
  要同时写set_multicycle_path -hold <n-1周期>

(5) wire load model
wire load model是一种简单地根据fanout来估算wire delay的方法,在综合时,一般根据设计的大小选择对应的WLM
有时也会用zero wire load model,这时的clock period要相应减小15~25%,或者clock uncertainty增加15~25%

  set_wire_load_model 两种模式top和enclosed到底有什么区别?

  更加准确的计算wire delay的方法是DC topo和RC physical,
  他们在综合时会粗略地做个place,然后根据距离来计算延迟

(6) clock gating
Q6.1 如何加clock gating?
局部的clock gating在综合时,会自动加进去。加clock gating后,不但会减小功耗,还会改善时序,因为本来到D端的逻辑,一部分被移到CK端了,简化了D端的逻辑
整个block的clock gating,一般直接在RTL里面加,因为DC没有那么聪明

Q6.2 需要对clock gating加什么特别的约束吗?
  如果使用标准库里面的ICG单元,不需要附加任何特别的约束,前后端的工具都认得它
  如果用latch+and自己搭的clock gating,你要对那个and单元set_disable_clock_gating_check,还要告诉后端,一定把latch和and摆在一起
  一般只在没有动态切换时钟时,才可以用一个and/or做clock gating,这时也要set_disable_clock_gating_check

  clock gating cell约束
  某个domain的clk通过gating关断重启后,对这个domain做复位有没有必要?

(7) case_analysis
set_case_analysis可以强制某个node为0/1
这个0/1会沿着纯逻辑组合单元向前传送,如果没有特别设定的话,会停在时序单元上
注意,只是是向前传,不会向左右2边和向后传
举例:
如果设在输出端上,那么所有fanin端都会被强制为0/1
如果只设在某个输入端上,与之相连的输出端和其他输入端都不受影响

(8) ideal net/network
ideal_net只作用于这条net
ideal_network会把这个属性传送下去
clock net自动带有ideal net属性
其他net,何时需要设定ideal net?见Q2.4

综合脚本的样本现在到处都是,最好找一个,照猫画虎改改用

建议把时序约束脚本与综合脚本分开存放,这样时序约束可以单独使用。

(1)综合的注意事项
Q1.1 需要fix hold吗?
不需要,hold交由后端去做就好了。
所以综合时,不需要读入min.lib,不用设wc_bc等复杂的选项

Q1.2 综合出来的网表如何验证?
  如RTL做形式验证
  gate-sim (网表仿真)。不要用延迟。
  不需要从DC输出SDF,因为那个根本不准,而且它也无法保证没有hold违反

Q1.3 如何让DC自动插入clock gating
  在脚本中加入
  set power_cg_always_enable_registers true
  set_max_leakage_power 0.0
  set_max_dynamic_power 0.0
  set_clock_gating_style (指定ICG)

  insert_clock_gating
  replace_clock_gates

Q1.4 综合时要检查哪些项目?
  最最起码要做,
  综合前,check_design,check_timing,保证所有的path都有约束(含timing exception)
  综合后,report_timing, report_constraint,report_area,report_power,report_qor

Q1.5  如何解决综合后setup的违法?
  多综合几遍
  检查约束是否合理
  最后只好改RTL了

Q1.6 如何判断约束是否合理?
  什么是合理的约束还真不好说,但是下面是一些不合理的情况,遇到了一定得解决
      2#楼里面所列约束项目不完整的
      startpoint或endpoint的clock cycle特别大的,说明那是异步时钟
      某个cell或net延迟很大的,可能是clock net当作signal用了,设了dont_touch

Q1.7  如何得到更好的网表?
  对于DC,一般人们都喜欢把clock period调小一点(10~25%),那样DC会给你个timing比较好的网表,但是代价的面积的增大和功耗的增加。当然,你调clock uncertainty也有同样的效果

SDF的读入问题 STA

输出verilog netlist如何设置大小写不敏感?

dc综合后的一些警告

ungroup使用

DC的UPF和operating_condition问题

这节太大了,不知道从何说起,也不知道要说多少,
真正详细完整的介绍应该是Synopsys和Cadence的教程和userguide

就捡一些教程里面没有的东西吧

(1) 文件的准备和网表的检验
Q1.1 后端都需要什么样的库文件?
因为现在的APR工具尽量把所有的功能都整合进去,所以需要的库文件也是五花八门,杂乱繁复,
(Synopsys会把这些文件整合到一起,存在milkyway里面)
physical: LEF 和 GDS
timing: LIB, (分为NLDM, CCS 和 ECSM 三种,有一个基本上就可以了)
RC delay: capTable, QRC tech, QRC lib 或者 TLU+
route rule: tech lef 或者 tech file
xtalk: cdb 或者
power: VoltageStorm tech, VoltageStorm lib 或者

Q1.2 与设计有关的文件要哪些?
  网表,时序约束,IO file, scan DEF

Q1.3 时序约束需要修改吗?
  有时需要,
  如果综合时使用了过小的clock period,要还原回来
  可以去掉SDC里面的wire load, operation condition, ideal net, max area
  有些为综合而设置的dont_touch, dont_use
  有些为综合而设置的clock latency

Q1.4 APR之前要做什么样的检验?
  检查所有库是否一致,版本是否一样,使用单位是否一样,是否有重名
  用zero wire load model 来 report timing,结果应该和同样条件下DC/RC的结果非常一致
  check timing 保证所有的单元都有约束
  check design,不能看到任何input悬空,不能有3态门以外的ouput短路

(2) 一个好的floorplan
如果问我APR里面那步最重要的话,我会选floorplan。因为它的好坏,可以直接影响到timing,congestion,IR-drop,以及芯片的大小和价格。

Q2.1  什么是一个好的floorplan?
  简单讲就是让上面几条都过得去的。
  一个好的floorplan应该是macro摆放井然有序,走线密度刚好达到congestion可以承受的上限,标准单元的摆放不可过于松散,标准单元的区域最好是大片相连的,IO的排放按照功能分类,顺序与其他芯片的顺序一致,没有供电困难的死角。

Q2.2 做floorplan时要考虑哪些因素?
  IO的排放顺序
  power和IR-drop
  模拟信号与数字信号的隔离
  内部数据的流程
  macro的面积和连接
  critical timing模块的距离
  congestion模块的走线资源

Q2.3 如何得到一个好的floorplan?
  与系统工程师讨论IO的排放
  和前端工程师商量内部数据的流向,critical timing模块
  向mix signal工程师请教模拟模块的位置,间隔

  然后让APR工具摆几个方案,以供参考
  最后还是要自己手动调整。对绝大多数设计来讲,把macro放在四周,中间留给标准单元

  大macro放外圈,小macro放内圈
  大的macro之间一般要留一些空间给标准单元,因为clock buffer,signal repeater等跨过大macro的信号需要那些空间插入buffer
  小的macro之间可以没有空间,几个小的可以挤在一堆,堆与堆之间留出一点空间就可以了

(3) 时序收敛
这是后端的核心任务之一,也是判断一个工具好坏的重要标准。各家EDA公司为之努力了几十年,至今也没有得到圆满的解决。初学者经常会问,如何让ICC时序收敛啊?为什么做了optDesign,encounter还有setup violation啊?建议以后就别这么问了,如果有一个好方法,可以从头跑到尾,自动把时序收敛了,那家公司就可以一统天下。到时,我们也就都可以下岗了!

  每个EDA工具都有一定的局限性,我们要做的不是去挑战它的极限,而是为它准备一个好的条件,让它达到我们的要求。

  这节不用问答的形式

3.1 了解每个工具的特性,预测最后的结果,在开始时预留一定的余量。
      APR大致分为3步,place,CTS 和route,每步都有相应的时序优化,每一步,不同的工具会给出不同的的结果。以ICC为例,place (如果没有特别说明,以后所说每步均包含相应的优化)后,会比综合的时序差一点,CTS后会更差,route后会比CTS好一些,但是达不到place后的水平。encounter是一路向下。Azuro (现在已经被cadence购买)的CTS会把时序拉回来。所以ICC的place + Azuto CTS + ICC route可以得到比较好的结果。
      知道了这个特点,在place时,如果有可能的话,多留些余量,也就是把时序设得更紧一些

3.2 MMMC
      每个设计可能会有多个function mode,还有多个DFT mode,还有foundry建议的不同PVT,加不同RC的setup和hold的检查,这种组合出来的timing mode有几十上百种,要收敛这么多的时序,绝不是一件容易的事,所以出现了MMMC。EDA公司号称为我们迎接挑战,已经准备好了需要的工具,但是可信吗?我们搭得起这么多的运行时间吗?所以还是不要把这么多的mode全丢给工具,仔细的选几个最困难的setup和hold mode给工具,其他mode的时序基本上会被这几个选上的mode涵盖的。 有一个帖子讨论过选哪几个mode。
      有一种比较高超的技巧,经过仔细分析各个mode下,时钟的关系,可以把其中几个合并成一个,比如function和mbist。但是这种方法并不是放之四海而皆准的,而且要求精通SDC命令的使用。

3.3 每步都干什么?
      place之后,只优化setup。使用粗糙的RC抽取,global route
      CTS之后,可以只优化setup,也可以优化setup和hold。使用粗糙的RC抽取,global route,如果clock net 已经route过了,clock就用detail route的结果。 时钟走线要double width和double space,高速(>500MHz)时钟要shielding
      route之后,要优化setup和hold
      可以试着多做几次优化,从中挑一个最好的结果,但是,一般情况下,不要重复(同样的命令和选项)超过3次。

3.4 出现congestion怎么办?
      congestion说明走线太多,要把那一块的cell推开一些; 避免使用端口太多(>6个)太密的组合逻辑单元; 不要把单元放在M2的power mesh下; macro边上不要放单元; 使用congestion driven的place和opt; 遇到十分严重的congestion时,减小global route可以使用的资源,比如在encounter里面可以让trail route在若干条走线后,空出一根走线。

3.4 仔细分析timing violation,再找解决方法
      出现timing violation后的第一步是分析那条path,找出违反的原因,然后才是解决办法。造成timing violation的原因很多,随便列几个常见的,
      clock tree不平衡:CTS的定义有错误;不合理的FF位置,比如,放在了一个很细很长的通道中。利用useful skew消除setup违反
      起始FF与终点FF的距离太长:用group把它们拉近
      xtalk的干扰:加大线间距离,不要用infinit timing window算xtalk
      detour走线造成的大的延迟:解决congestion问题
      fanout太大:忘记set_max_fanout,或者设定不合理,或者对某些net set_dont_touch了
      单元的驱动能力太小:去掉大驱动能力cell的dont_use属性,检查是否局部placement太密,没有空间sizeup了
      hold timing violation与setup violation同时存在,工具无法做了。这种情况多半是SDC的问题,很少是真的,除非那是一个非常特殊的IO timing

(4) 低功耗
低功耗与高速度是相互矛盾的,要事先确定你更想要哪个,可以牺牲哪个.
后端对低功耗可以做的事情并不是很多,power island,multiple supply voltage,DVFS等都不是由后端决定的。
后端能主导的有,
Multi-Vth单元的替换:建议先不要用LVT单元
ICG单元在CTS里的位置:当然是在时序容许的条件下,越靠近clock root越好。
最后在时序收敛后,再做一次power优化

(5) ECO
ECO分为post mask ECO 和pre mask ECO,也就是只修改metal layer的ECO和任何layer都可以动到的ECO
post mask ECO是利用预先留好的备用单元,做的逻辑修改。现在的标准单元库中,有些FILL cell是带transister,只要用metal1/2把它们连起来,就可以搭成需要的逻辑单元。这种ECO受限与spare cell的位置,如果附近找不到的话,就比较麻烦了,所以它的修改规模十分有限。
pre mask ECO比post mask的要灵活得多。在tapeout之前,如果发现有修改的地方,就是用这种方法。它可以改几百个,甚至上千个单元。
ECO修改组合逻辑比较容易,如果动到FF的话,有格外小心,因为它有可能影响clock tree,进而造成大量的时序违反。
做ECO要前端后端联手完成,如何单反的一意孤行,不会得到正确的结果。前端找到要修改的逻辑单元 ==> 后端找到相应的物理位置,检查周围是否有足够的spare cell或者空间做ECO ==》 检查时序,预估ECO后的时序 ==》后端建议使用的ECO cell ==》 前端修改netlist ==》 后端做ECO place/route ==》 … …

astro 准备的文件?

ICC timing setting

ICC resize floorplan

在CTS后,如果ICG放在离clock root很近(clock insertion delay很短)的地方,为什么enable信号的setup不容易收敛?

多个时钟CTS问题(encounter)

带MUX的CTS问题求证

CTS求帮助

2个clock tree从选择器开始复用

encounter IPO

Partition的问题

paritition和flat implement的两个概念

soc encounter 如何对设计分区

ICC read_verilog报错,读不成功

用ICC分析SI,需要导入噪声模型吗?

在不修改代码和不插入DFF的情况下,还能修setup time 吗?

route之后还有100个左右的violation

绕线后hold的优化

fix hold用DLY cell好还是用buffer cell好,为什么?

怎样操作,才能使已经做好的floorplan移植到新的网表呢?

提前一个flop的clock,又不影响其他flop的clock balance 请教怎样处理

0.35chart库中的tf文档中DesignRule中Enclosure是什么意思?

ICC后期DRC, LVS, ANTENNA等问题的处理

Astro能自己通过跳线法修改天线效应吗?

请问Multi-Voltage design的LVS怎么设置?

SDF 中没有typical值

请问ets提取出来的sdf文件中延时值会有负的么?

反标SDF文件时报错# ** Error: (vsim-SDF-3251)

hold_time violation?

Modelsim反标sdf文件成功后,后仿真时报错$setup

stream out gds through icfb

请教形式验证遇到的几个问题。。。。。

calibre在做LVS的时候,power net找不到,然后就abort operation了

插入scan-chain之后,怎么做形式验证?

dft中not controlled表示什么意思

在DFT用一个function_clock一个test_clock,做作DFT时用fuction_clock不可以吗?

ASIC流程
Scroll to top