IC Design Basic


数字IC设计整个流程

一、前言

想起一句话叫“一叶障目不见泰山”,所以要想对一个事物有全面的认识,必须得了解它的整体面貌。学习数字IC验证也是同理,我们要清楚了解数字IC验证在数字IC设计全流程中所处的位置!

本节我们将要学习以下几个方面的内容

  • 1、数字IC设计的「流程」
  • 2、数字IC设计流程中每个阶段主要「做哪些工作」
  • 3、数字IC设计流程中每个阶段「使用的主要EDA工具有哪些」

二、集成电路产业链

三、常见的SoC芯片架构图

SoC芯片组成,四大部分:

  • 1、核(CORE)
  • 2、存储(MEM)
  • 3、外设(IO)
  • 4、总线(BUS)

四、数字IC设计流程

  • 1、确定项目需求

    • 确定芯片的具体指标:功能、功耗、性能、IO外设等
    • 市场来提出需求,研发来评估需求
  • 2、系统级设计

    • 用系统建模语言对各个模块描述
    • 由系统工程师完成
  • 3、前端设计【逻辑】

    • RTL设计、RTL仿真(EDA仿真验证)、硬件原型验证(FPGA硬件原型验证)、电路综合(RTL代码映射(MAP)成门级网表(STD CELL))
  • 4、后端设计【物理】

    • 版图设计、物理验证、后仿真等

五、数字IC设计具体指标

  • 1、物理实现

    • 制作工艺(代工厂及工艺尺寸)
    • 裸片面积(DIE大小,DIE由功耗、成本、数字/模拟面积共同影响)
    • 封装(封装越大,散热越好,成本越高)
  • 2、性能指标

    • 速度(时钟频率)
    • 功耗
  • 3、功能指标

    • 功能描述
    • 接口定义

六、基于标准单元(STD CELL)的ASIC设计流程

  • 网表:在电子线路设计中,网表(netlist)是用于描述电路元件相互之间连接关系的,一般来说是一个遵循某种比较简单的标记语法的文本文件。
  • GDSII流格式:常见的缩写GDSII,是一个数据库文件格式。它用于集成电路版图的数据转换,并成为事实上的工业标准。GDSII是一个二进制文件,其中含有集成电路版图中的平面的几何形状,文本或标签,以及其他有关信息并可以由层次结构组成。GDSII数据可用于重建所有或部分的版图信息。它可以用作制作光刻掩膜版。

七、Digital IC Design Flow(总结版)

  • 1、Marketing Request:市场人员提出需求,研发人员参与讨论需求的可实现性讨论,毕竟有些东西是矛盾,如:性能与功耗,要求性能高,功耗低,这显然是矛盾的,是需要评估的,是否可以达到预期要求。需求确定好之后,再去改就会比较复杂,所以在这个阶段必须确定好,后续基本不动!

  • 2、Artitecture Spec.:需求确定好之后,会去写架构的文档,包括两个部分:整体架构规格书(Top Artitecture Spec.)和具体功能规格书(Project Function Spec.)。其中,整体架构规格书指的是要有什么模块,诸如:CPU、SRAM、DMA、AMBA等。具体功能规格书指的是具体的指标,诸如:DMA模块有多少个通道、总的时钟频率多少兆、支持的模式有几种等。

    • 该部分通常用架构工程师(Artitecture Engineer)完成,在有一些公司也称之为系统工程师(System Engineer,简称SE)。该类工程师一般是较为资深的工程师。
  • 3、Arch/Algorithm Emulation:设计好架构之后,就可以做架构/算法方面的仿真。该部分通常使用的工具是C/C++/MATLAB。

    • 该部分通常用算法工程师(Algorithm Engineer)完成。
  • 4、Design Spec.:做设计并不是一开始拿到算法就去写代码,而是要做一个设计规格书。类比盖楼,我们正式砌砖之前也是先要把图纸规划好。该部分通常包括接口定义(Interface)、时序处理方案(Timing)、关键电路绘制(Circuit)。

  • 5、RTL Coding:在上一部分的设计规格书编写完成之后,就可以进行编程了。通常有VHDL/Verilog/SystemVerilog三种编程语言可供选择!

    • ①、IP Level RTL Coding:先有小的IP,才能有大的SoC。前面做设计是由顶向下,先有架构再有各个模块。但是实现的时候是由底向上的,先有最小的IP级别的代码,才会集成更高层次的代码。
    • ②、IP Level RTL Simulation和IP Level Verification:设计好IP Level代码之后,我们就可以就行仿真验证了,小的IP的话通常是Design Engineer自己做的,但是当IP比较大的时候,就会有专门的验证人员来做!在验证时,我们会用到一些脚本,如Makefile。用到的仿真工具,主要有三大EDA厂商的:Cadence:Incisive;Synopsys:VCS;Mentor: QuestaSim。「其中VCS最为主流」,QuestaSim用在小的FPGA开发上面,因为它的功能不是很强大!验证用到的语言有:C/C++/SystemC/SystemVerilog/UVM几种。在做验证的时候也会做验证的Spec文档,想清楚要验什么哪些点。完毕之后才会搭环境,跑用例!「验证的核心是:验证的完备性」,所以要清楚IP Level这个目标模块的DUT,要测的功能点都有哪些,得分解全。【以后验证工程师也是从事这一块的工作,初级验证工程师一般都是做IP Level Verification】
    • ③、Unit/Chip Level RTL Simulation和Unit/Chip Level Verification:上面IP Level没有问题后,合成大模块Unit/Chip Level,再来做验证!这一部分的验证工程师一般叫:Full Chip Verification Engineer,需要工作个4~5年才会让做!
    • 通常,Design Spec和RTL Coding这两部分工作,都是由Design Engineer一个人完成的!对于RTL Coding部分,又可细分为以下三个部分,关系见下图:【下图中标注砖红色部分是验证工程师所处的位置!】

  • 6、Logic Synthesis和Gate Level Verification:Coding 设计和验证没有问题后,此时会进行综合,会综合出网表。同时也会对门级网表做验证,称之为Gate Level Verification。这个阶段更主要的是调试我们的验证环境,为后端物理实现之后的网表做准备。当前阶段的网表含有的信息较少,物理参数没有,跑起来会更快,调试会方便一点。网表「逻辑功能正确性的验证是通过FM去保证的」,并不是Gate Level Verification去保证的,这一点要特别注意!关于FM下面也会介绍到。对于综合工具,当前主流的是Synopsys:Design Compiler(DC)。

    • 逻辑综合就是把设计实现的RTL代码映射到特定的工艺库,输出成门级网表的Netlist。【「根据Load、Driver映射工艺库」…】
    • 逻辑综合需要基于特定的综合库,不同的库中,门电路基本标准单元(Standard Cell)的面积,「时序参数会不一样」
  • 7、Formal Verification:逻辑综合和验证之后,会进行「形式验证」,即Formal Verification,简称为FM。形式验证也可称之为等价性检查(Equivalence Check)。遍历所有到“锥底”的点的组合,假如到“锥底”的点有2个,那么组合有4个:00 01 10 11。这时候就会看门级网表“锥底”的结果是4个中哪个,而RTL的结果是4个结果中的哪个,对比是否一样,称之为形式验证!形式验证的工具有:Cadence:Conformal;Synopsys:Formality。

    • 从功能上(STA是时序上)对综合后的网表进行验证。常用的方法是等价性检查方法,以功能验证后的HDL设计为参考,对比综合后的网表功能,他们是否在功能上存在等价性。这样做是为了保证「在逻辑综合过程中没有改变原先HDL描述的电路功能」
  • 8、STA(Static Timing Analysis):综合的网表除了要做逻辑的等效之外,还需要做静态时序分析!电路的结构是RTL级别的,有组合逻辑(与或非门)和时序逻辑(D触发器)两种。对于时序逻辑有Setup/Hold(建立时间/保持)要求,组合逻辑的延时会影响到这两个参数,有可能造成延时太长,造成违例。通常有几种解决办法:①、把延迟大的组合逻辑的CELL驱动换的大一点,让其延时减小。②、在组合逻辑中插入时序逻辑,即添加流水线的方式!

    • 静态时序分析,这也属于验证范畴,它主要属于验证范畴,它主要是在时序上对电路进行验证,检查电路是否存在建立时间(Setup Time)和保持时间(Hold Time)的违例(Violation)。
    • STA以及综合通常都会用脚本实现,用的比较多的脚本是TCL!
    • STA Timing满足,才能得到最终的Netlist。
  • 9、DFT(Design For Test):wafer在制作过程中,因为工艺参数的偏差,造成功能不正确。这个时候会在前端进行一个DFT设计,比如在电路中插入SCAN Chain,这样的话可以通过外部灌激励,把内部所有的时序路径作为一个链串起来!比如:外部灌1010,对比输出序列与预期序列,验证正确性,得出是否有制造缺陷!当然还可以通过MemBist这种内建自测试,验证MEM是否有缺陷,它跟SCAN Chain一样,不需要外部灌激励,相当于在MEM外围建立好了测试电路,它的partner可以通过测试电路自己产生,所以叫内建自测试!DFT一般是在网表基础上去插入的!

  • 10、版图生成,自动布局布线(PR):以上工作没问题后,便可以交给后端团队进行布局布线!如:CELL放在哪个位置,一个chip通常把模拟放在四周,中间放数字逻辑!

  • 11、时钟树插入:STA是理想时钟网路,到每一个D触发器的clk是同时的,但实际上是有Wire Delay的,甚至有时距离远还会插入buffer,所以不同的位置D触发器的相位是有差异的!但是分析的时候,不同D触发器,想让Delay尽可能的一致,这时候就需要插入时钟树(插入buffer)。

  • 12、DRC/LVS(Design Route Check):上述完成只有会进行一个DRC检查,而LVS是跟网表的一个对比。

  • 13、Post_Layout STA:这个时候时序的信息就是真实的,时钟、CELL等等的时序信息是真实的,最终的STA,最终的timing分析!

  • 14、生成最终的GDSII

  • 15、Tap-Out流片

八、数字IC设计全流程总览图

九、前端设计深入(RTL -> Netlist)

RTL -> Netlist:RTL代码到网表

  • Design Spec.:写设计文档

  • RTL Coding:写代码

    • RTL(Register Transfer Level)设计利用硬件描述语言,如VHDL/Verilog/SystemVerilog,对电路以寄存器之间的传输为基础进行描述
  • 语法检查:除了语法检查,还有代码风格检查,要确保语法没有问题才进行下一步仿真。常用的工具有Nlint和Spyglass。

  • 功能仿真(「迭代的过程」):使用诸如VCS/QuestaSim等EDA工具,编写测试用例,去验证代码是否满足预期「功能」。该功能验证是前端中的验证,不同于后期芯片回来之后的「制造验证」(DFT验证)。有BUG(可能是DUT的bug,也可能是验证环境TB的bug),在迭代修改!

  • 逻辑综合:仿真基本功能没有问题后,进行逻辑综合,将RTL的描述映射成门级网表。

    • 将RTL级设计中所得的程序代码翻译成实际电路的各种元器件以及他们之间的连接关系,可以用一张表来表示,称为门级网表(Netlist)
  • 形式验证(FM):综合后的网表和RTL功能是否等价,

  • 综合后仿真(「迭代的过程」):简称后仿,「这一步并不是验证网表的逻辑功能」,该步更多的是进行「调试验证环境」,为后端阶段的后仿做准备。(后端后仿主要是仿一些功耗数据,此时的实际仿真,翻转率才是更真实的,此时的功耗数据是更真实的,说白了就「是为仿功耗做准备」)当然此时也会顺便看一下Netlist是否有一些最基础的问题,通常这个后仿跑的是比较简单的系统级别(System Level)的用例,不是IP Level的,是层级比较高的用例。后仿有问题,也会返回修改脚本(约束某条路径,让工具优化的更好些)或者代码(组合逻辑时延修改,让其满足我们的要求)!

  • STA(Staic Timing Analysis,静态时序分析):套用特定的时序模型(Timing Model),针对特定电路分析及其是否违反设计者给定的时序限制(Timing Constraint)。

    • 在时序上对电路进行验证,检查电路是否存在建立时间(Setup Time)和保持时间(Hold Time)的违例(Violation)。

整个ASIC设计流程都是一个「迭代」的过程,在任何一步不能满足要求,都需要重复之前的步骤,甚至重新设计RTL代码。模拟电路设计的迭代次数甚至更多!

十、后端设计深入(Netlist -> Layout)

Netlist -> Layout:网表到版图

  • Auto Place and Route(APR):自动布局布线,这个是工具自动化完成的,尤其在当前大规模集成电路,集成度上亿门级别的背景下,手动来搞肯定是费力不讨好的!工具是自动把Std Cell根据我们限定的范围区域放置好,当然在PR时,我们会「手动」摆一些Hard单元在同一个Die上(大型芯片),几个硬核一起做,形成多个sub-chip。如果chip规模太大,工具是有点吃不消的,所以是做成小的hard单元,把这些小的hard单元集成在一起。对于一个hard单元,会「手动」摆一些MEM、模拟IP,并将其放置到边上。数字部分用工具自动地布局布线放在周围。当然虽然是自动布局布线,如果我们的设计考虑不周到,也会出现「走线拥塞」(Congestion),这个时候也有可能会去考虑修改RTL,工具布线布不够,可能会是设计的组合逻辑的密度太大,也可能会是设计的电路结构上有一些「交叉结构」(cross),绕来绕去,导致工具绕不开!

  • Extrat RC和STA:前面综合去STA的话,用的是一个理想的时序模型(Timing Model)去做的,这个实际上并没有实际的时序信息,实际CELL摆在哪里,两个CELL之间的走线延时等信息都是没有的,因为这个时候还没有布局布线,两个的位置都是不确定的,自然没有这些信息。当位置确定之后,才会真正的去提取这些延时信息(Extrat RC) ,然后再做布局布线之后的STA,此时的STA相较于综合时的STA,拿到的延时信息就是更真实的!包括时钟,也是插了时钟树之后真正的时钟走线,时钟路径的延时也是更真实的。如果布局布线之后还有不满足时序的地方,也会退回去前面的阶段进行修改。

    • 时序成功之后,这时候才是最真实的,前面综合的话相当于是一个负载模型,相当于认为线之间是有一个负载的,同时时钟也会做一个“过约(正常要跑100M,但是综合以120M等更高的频率进行约束)”,因为这个时候线负载是按照一个理想模型的,到了后端之后,则会按照真实的100M去跑了,线负载跟真实之间有一点差异的的话,那么还有20M的余量来消除gap。
  • DRC:时序timing满足之后,接下来会做设计规则检查(Design Rule Check,简称DRC),这个也是工具自动完成的!

  • LVS:DRC没有问题之后,会做一个版图电路图一致性检查(Layout Versus Schematic,简称LVS),相当于整个版图布完之后与Netlist的一个对比,类似跟RTL对比用了一个FM一样,这里就是进行一个:「后端要交付的版图与前面进来的网表进行逻辑性功能对比」

  • 后仿真:这里更多的是「仿功耗」,看「电源的完整性」,PR会把电源网络加入进去,看电源网络诸如「IR DROP」是否过大,某处std cell某处的密度过大,导致散热不均匀,时间长了会把芯片烧毁,对器件寿命有影响。

后端大部分工作由工具自动完成,前端的RTL Code以及功能仿真环境用例,都需要人去分析需求规格,去写测试点,写测试策略测试方案,后端来讲主要是一个Netlist,是一个比较死的东西,大部分工作都是由工具完成!

十一、VLSI设计流程(再次总结)

  • 首先再来详细介绍下「前端设计中的DFT实现」:DFT实现是在网表中插入,主要做两件事情:①、插ScanChain ②、插MBist。为芯片流片之后的「制造测试」做准备,芯片制作是在一个wafer上面完成的,这个wafer实现逻辑电路通常会通过光刻、腐蚀等一系列流程,把CMOS管子在wafer上给做出来。这个过程不可避免的出现一些问题,比如腐蚀的剂量多了一点、光刻深度多了一点,导致CMOS功能就可能不是按照我们正常的功能在运行了,或者有些走线stuck,短路等故障,所以需要做DFT电路。

    • ①、 ScanChain :在芯片回来之后,通过DFT的ATPG(Automatic Test Pattern Generation)自动产生测试Pattern ,然后通过芯片的IO,把 Pattern 灌进去,这样也就会把整个芯片里面的D触发器串成一个链,然后再把Pattern 输出。那么D触发器一方面要实现要求的逻辑功能,一方面要实现测试(ATE),此时会在D触发器的输入会接一个MUX,这个MUX有两路这两路功能。MUX的使能端是SE(Scan Enable),测试的输入端ATE是SI(Scan Input)。
    • ②、MBist:内建自测试,做逻辑的话我们会遇到大量的逻辑存储单元(Memory),数字电路的逻辑单元有两种方式可以实现:①、通过D触发器来搭,但是面积会比较大 ②、定制Memory,但是是模拟的IP。通常对于D触发器我们可以进行ScanChain这样一个测试,那么对于Memory这个模拟IP,我们会进行Mbist(Memory Burn-In Scan Test)测试,Burn-In表示天生的,即整个Pattern 是Memory自己外面包了一层可以自己产生向量的电路,它会对Memory所有空间会进行一个遍历性测试。它跟D触发器的ScanChain 不一样,ScanChain 是接到芯片的IO的,需要通过外面的测试基台,给他灌激励完成这个测试,但是Memory是不需要外部基台灌激励的,它是内部的电路自己产生的测试Pattern ,只需要给它一个使能信号,让它自己测就可以了!

从上述的《VLSI设计流程图》中我们可以看出,整个ASIC设计与实现的「每个阶段都是需要做相应的验证工作」的!甚至包括设计规格书书写完毕后也要进行一个Review环节进行验证。整个设计流程是先有市场需求,这也是最主要的,芯片能不能两场,能不能卖的好,没有市场需求评估,芯片做的再好也无济于事。接下来是编写芯片架构规格书,紧接着从以下三个方面并行开展工作:I、功能验证;II、ASIC设计与实现;III、性能指标

I、功能验证

「功能」上确保每一步设计与实现的流程转换时,能够保证它的逻辑不要变形,所以在《II、ASIC设计与实现》各个阶段都对应有不同的验证手段和工作。

  • 本专栏主要学习的验证是图中的「功能仿真」部分,但是这个功能仿真并不是等代码出来才进行,而是从架构书出来就有了,会去「写参考模型、测试规划(Test Plan)和分解各个测试点」,同时根据架构书的功能点,梳理出要去验证哪些功能点,然后根据这些功能点搭建环境,搭建完毕之后,还需要把环境给调试好。这个时候,RTL代码出来之后,才会把RTL代码(DUT)集成到验证环境下,进行功能验证,「当功能验证通过之后,才会正式的去做逻辑综合」。但是在实际工程操作的时候,会给一些初步的代码给综合工程师,但是那个综合仅仅是为了调试环境,并不是正式交付。
  • 「功能仿真」是保证我们的RTL Code与规格的Spec保持一致,所以有时功能仿真也会回头对比甚至更改设计规格书.,因为此时会设计出很多验证的边界,这些边界是在最开始书写设计规格书期间是体现不出来的,此时会针对设计本身的边界去构造一些用例和测试点。
  • 「形式验证」是进一步保证综合后的Netlist与RTL之间的逻辑一致性,所以每一步转换都要做一些验证性的工作,保证每一步转换的逻辑是等效的,以防出现问题,影响后续环节!
  • 另外逻辑综合后也会做一些「门级仿真」,但是这个门级仿真只是跑少量的用例,不会通过它来保证整个的逻辑功能,因为综合网表跑起来很慢,网标级的描述即门级描述,基于门级的话,DUT信息就很多了!要EDA工具去跑的话,会非常慢!
  • 接下来是「DFT验证」,确保DFT本身的电路是没有问题的,DFT验证与上面的功能仿真验证时类似的,当然DFT的验证没有功能验证做的那么复杂,因为它的电路结构一般比较固定,所以一般直接集成先前项目的DFT验证环境直接跑就可以,并且他的功能也没有RTL那么复杂。
  • 接下来当进行自动布局布线后,也会去做「形式验证」。此时是为了确保布局布线之后的网表与综合的网表逻辑是一致的,而综合的网表逻辑要求与RTL逻辑功能一致,这样就能确保布局布线之后的版图逻辑功能与RTL一致。
  • 同时自动布局布线后,也会去做「后仿」。但是此时最主要的并不是为了看我们的功能,而是看我们的「功耗和电源分布」,是否有过热的点,IR DROP是否可以满足等。
  • 最后还有一个「版图验证(LVS)」,保证最终要流片的东西,与布局布线的网表功能是一致的。

II、性能指标

更多的是从「性能」的维度,来看看我们在《II、ASIC设计与实现》的每个阶段,需要去做哪些事情。

  • 在设计规格书阶段,需要去关注速度(时钟频率能跑多高)和功耗(是否可以达到预期要求),当然了,速度和功耗也是一对tradeoff(性价比)的东西,速度高,功耗肯定就比较大。这就需要设计来做一个平衡折中(tradeoff)。

  • 在RTL Coding阶段,会去做一些低功耗设计,当然在设计规格书阶段也会把(低)功耗的策略考虑进去,此时更多的是做一个门控时钟的工作(Clock Gating),主要是通过「代码的风格」来保证!

  • 在逻辑综合阶段,就会涉及到时序约束和低功耗约束(Universal Power Format,简称UPF),即本来时钟是跑的100M,但是综合的时候可能会按照更高的频率120M去约束,会留个20M的余量,因为综合这个阶段的时序是一个负载模型,即CELL的位置、CELL的距离、走线延时等信息都不是真实的,这个时候是用的一个假的模型来代替的,很简单的模型。所以会做一些「过约束」,留下一些余量。

    • 低功耗约束(UPF)是描述整个的power划分,通过划分在进行综合的时候,也是对综合结果的一个约束。
  • 综合完毕后,在上述两个约束条件下, 生成综合时序报告和功耗分析报告。根据报告再去迭代修改约束甚至代码。

  • 对于后端自动布线的阶段也会做静态时序分析,主要是针对不同的阶段。一个时序分析是在Pre-Layout,即Layout之前;一个时序分析是在插了时钟树(Clock Tree,简称CTS)之后,此时时钟的时序路径就更真实了;最后一个时序分析是在Post-Layout,即版图固定好了。同时也会进行一个低功耗的分析,在后端做低功耗更多的是一个CELL的替换,看看某些路径或CELL的时序余量(Margin),如果余量(margin)很大,那么会替换成cell比较小的,如:从“x4”换成“x2”。驱动越小,CELL的延时会越大,对于setup hold的满足就会越困难。通过timing分析发现它的时序是有余量的,我们将其降成“x2”也可以满足的话,我们就换替换cell。即该阶段的低功耗分析主要是替换cell的类型,将时序路径比较好的cell替换成功耗比较低的cell。但是这个阶段的功耗收益一般不大,能有5%。所以低功耗设计的最主要的还是最初的设计架构,工艺选型,Power Format的划分,需求的优化控制,这些对功耗影响很大。对于后端阶段,虽然也会去做低功耗,但是从系统角度来讲,优化的收益比例不是那么大。

  • 对于版图的话,会再去做最后的时序收敛(Timing Signoff),所以Timing这个东西其实很关键,因为只要有任何一个点Timing不满足,那么前面逻辑功能做的再好,最后芯片还是有缺陷。所以除了功能要OK,性能上的Timing也要OK。功能上保证了逻辑性(Loigc),Timing保证了物理实现。【Timing是D触发的CELL的要求,即物理期间的要求】

  • 最后也会看功耗/IR Drop的分析,主要看IR Drop,即不能有过热的点,IR Drop过大,会导致整个散热不均匀,器件长期运行会烧毁或缩短寿命,加速它的老化等。

最后再来看一下《VLSI设计流程图》最右侧的工艺库

工艺库中的器件,我们都称之为std cell,这个工艺库是流片厂商(Fab)提供的!

  • 在前端阶段我们使用的是一个逻辑库,CELL能体现的是某个「逻辑」功能(与或非)。
  • 在后端阶段,CELL更多体现的是它的「物理」特性和电气特性,如CELL的工作电压、负载、电容容抗cap、功耗等特性。当然这里物理库是包含了逻辑库的逻辑信息的!

十二、复习回顾

1、详细介绍数字集成电路设计的流程?

本节讲述了一个简单流程、一个复杂流程、以及前端和后端的详细展开、最后还有一张总结的图。

2、详细介绍数字设计流程中每个阶段主要做哪些工作?

3、详细介绍数字设计流程中每个阶段使用的主要EDA工具有哪些?

4、画出数字IC电路设计流程以及使用的相关EDA工具?

5、画出SoC芯片架构图,熟悉该芯片的应用场景和数据流?

芯片设计中的ECO是什么?

什么是ECO?

ECO,即Engineering Change Order的缩写,指工程改变命令。

什么意思呢?简单来说就是手动修改集成电路的过程,换句话说,就是直接手动修改netlist。

一般应用于数字芯片版图设计。

对于数字IC设计而言,ECO这一步实际上是正常设计流程的一个例外。它是对设计的layout进行局部的小范围的修改和重新布线,而不影响到设计的其它部分的布局布线,所以其它部分的时序信息没有改变。

根据功能的不同,ECO可以分为功能改变和非功能改变。功能改变是指由于来自客户对设计的追加需求(spec改变)或者设计的最后阶段发现芯片存在 bug 的情况下进行的 ECO;而非功能改变则是为了在不改变 RTL 网表的基础上修复部分时序以及串扰等问题而做的 ECO。

说到底,ECO的目的就是省钱省时间。

那么在不同阶段,进行ECO,有什么样的区别呢?

在阶段上,数字IC设计中的ECO大体可以分为:tapeout前的ECO,tapeout过程的ECO,tapeout后的ECO。

Tapeout前的ECO

在RTL freeze后,tapeout前这一阶段,RTL已经没法修改,但是好歹也没有进入tapeout,还有补救的机会。

此时数字前端负责写coding的工程师需要在final RTL的基础上,通过写ECO脚本的方式来实现功能上的ECO。

ECO代价:时间成本,相对较小

Tapeout过程中的ECO

当数字后端实现后的design,timing已经符合signoff标准,DRC已经clean,LVS已经pass,IR drop,MVRC,Formality,DRCPLUS等都已经pass。

但是,数字前端设计工程师还没来得及做完大部分case的后仿,而且芯片又面临着Timing-TO-Market的压力。此时,进入tapeout阶段。

为什么不给自己留更多余地呢?因为foundary会先做base layer的加工。只要后期仿真发现的问题,不需要再添加额外的cell,就不耽误之前的tapeout(此处有点像流水线)。即使发现需要新加几个cell,这个时候仍然可以通过替换后端实现过程中所加的ECO cell或者spare cell来实现。

ECO代价:时间成本较大

Tapeout后的ECO

当芯片已经tapeout回来,我们在测试过程中却发现了必须修复的bug。这个时候做ECO的代价相对前面两种,就要大很多。

改动少的可能仅需要改几层Metal layer,改动大的话可能需要动十几层Metal layer,甚至重新流片。在此阶段,前端设计工程师需要出具ECO方案,同时让后端工程师进行评估,主要评估需要改动的层数,timing 是否能快速收敛等方面的风险。

在一次次确认后,敲定方案,进行ECO。

ECO代价:时间与金钱成本巨大

由此可见,即使ECO能够亡羊补牢,但是为了节省更多的时间和金钱成本,还是尽早发现问题,尽早解决吧。

关于ECO的分类:

常见的ECO可以分为pre mask ECOpost mask ECO,也就是任何layer都可以动到的ECO和只修改metal layer的ECO。

两者的区别在于,pre mask ECO的晶体管和布线层都还没有开始做出mask,此时可以往netlist里面添加cell。而post mask ECO的晶体管层已经开始进行加工了,但是布线层还没有加工,还能修改,可以通过ECO改变各种已有cell的连线关系,但是不能添加新的cell,有一定局限。

换句话说,从freeze到tapeout之间的ECO叫pre mask ECO;tapeout之后,已经加工完芯片的晶体管,但是还没有做晶体管连线期间的ECO叫做post mask ECO。

Pre mask ECO:

Pre mask ECO比Post mask ECO要灵活得多。在tapeout之前,如果发现有任何需要修改的地方,都可以用这种方法。它可以改成百上千个单元。该操作主要是针对静态时序分析和后仿真中出现的问题,对电路的网表直接进行修改,待网表修改完毕之后反馈到PR工具中对标准单元的布局和连线进行小范围的改动。当然,直接对网表进行修改是存在风险的,所以之后一定要进行形式验证(formal verification),确保功能实现。

Post mask ECO:

Post mask ECO是利用预先留好的备用单元(Spare Cell),做的逻辑修改。如果后期发现Timing存在问题(或者想小动Function),可以利用附近的Spare Cell搭配上层金属连线来修改电路结构。比起Pre mask ECO,这种ECO受限于Spare Cell的位置,所以它的修改规模十分有限。

Spare Cell:

Foundry提供一种服务,允许客户在wafer加工到poly以及M1层的时候,让大部分wafer暂时停止加工,而少量wafer继续加工直至完成。之后可以对这些完成了的wafer上的die进行测试,如果发现存在功能或者时序上的问题,那么可以通过利用那些预布在die上的spare cell来解决。

由于绝大部分的金属层都没有加工,因此在不修改标准单元布局的情况下,只用改动几层金属的mask并利用spare cell去修复这些问题。如此一来,也大大降低了流片的风险。而Post mask ECO则提供了一种根据silicon测试结果进行Debug的方法。

Post mask ECO 可行的前提是设计里有足够的可供新功能实现的cell, 如Spare cell, Freed cell, GA cell。

Freed cell,这些cell原本服务于原始的逻辑功能,但是因为逻辑功能更改,被释放出来,既然已被释放故可以用于来实现新的功能。GA cell,是内部晶体管没有链接的cell,是可以被“编程”的cell,在做ECO 时,通常用最底层金属如M1 将GA cell 内部的晶体管链接起来,以实现对应的逻辑功能,如:与或非、选择器、寄存器等。

而Post mask ECO的修复则受制于这些cell的位置,可以说是不太灵活了。

从逻辑和物理来看,ECO又可以分为Logic ECO和Physical ECO。Logic ECO是对网表的逻辑功能的修改。在芯片设计的后期阶段,前端工程师可能会发现设计上的某些bug,进而需要对电路做修改,而此时的schedule已经不允许进行重新综合,因此会选择在PR的网表上进行逻辑修改,一般情况是会增加一些逻辑或者将某些逻辑的net重新连接;而Physical ECO主要是针对PR工具无法完全修复的问题进行手动修正。一般包括Timing ECO,drc fix等。

ECO的实际运用与技巧

对于版图工程师来说,经常会碰到一些function ECO的需求:

从上图可以看到,为了保证数据库有优先级的收敛,最后的timing ECO会分为几个主要步骤

  • 功能模式的时序修复:function mode
  • 存储器自测模式的时序修复:mbist mode
  • 其他测试模式的时序修复:test mode
  • 芯片接口时序修复:IO mode

功能模式的重要性、工作量和难度都是最大的,需要尽早修复,然后是其他的模式。整个流程基本上是按照步骤和优先级完成整个芯片的时序修复的。

改变功能的ECO被称之为function ECO,但是实际上,这种ECO可能是针对真正的function mode的,也有可能是针对mbist 逻辑的,或者有可能是针对at-speed test mode的。

由于function ECO会引起潜在的timing arc的变化,因此带入function ECO的时间点是有讲究的。一般来讲,只会在一种模式的timing修复告一段落的时候,才会带入这个模式的function ECO。

假如在时间节点Pre-B,前端准备好了一个比较大的function ECO,这个ECO是给mbist服务的。通常需要先验证这个脚本的正确性,如果脚本本身没问题,在这个Pre-B的时候并不带入,因为这个时候整个mbist的时序还不够稳定。

等到了Pre-C的时间节点,mbist的时序修复基本完成的阶段,这时可以代入这个ECO。理论上讲,新出来的timing violation都是由于这个脚本引起的。

增量设计工作模式,是ECO阶段的重重之重,任何违背增量设计方案的举动,都会造成局部损耗,甚至更糟的结果。

功能ECO的脚本生成的探究和技巧

后端一般会在最终layout的节点,给前端分享最终layout版本的网表。一般为了阅读方便,后端都是给前端一个不带PG信息的netlist。前端同学在完善数据库的过程中,同时也会对各种问题进行评估,最终给出解决方案:

  • 软件改动
  • 约束用户行为
  • 硬件改动

如果有任何需要在硬件方面做的功能修改,前端会先保证RTL修改、验证完成后,对相应的final layout的网表进行修改。

综上所述,一个function ECO的诞生过程大抵如下:

前端主要关注功能,后端主要关注实现,对于下面的几个主题的关注度,这里展示一下:

前端基于final layout的网表,改出来一版带function ECO的功能网表,这个流程基本就算大功告成了。

ECO版图实现的技巧和经验

在ECO中,版图的实现是非常重要的步骤。是否能完成STA的脚本期望,是数据库能否走向收敛的关键点。一般的STA对应的ECO和相应的修复方法如下:

ECO的物理实现就是两种情形

  • size_cell
  • add buffer

这里边最会产生的影响其实是面积器件的位置变动(dis-placement)

器件的位置变动带来的影响都可能导致ECO无法如期进行,因为原有数据库的cell的放置被调整,之前的绕线需要做相应的调整,同时带来更多的timing/驱动能力的问题,这样就会给数据库带来不期望的抖动。

为了尽可能保证原有数据库的状态,这里引入一个新名词:Minimal Physical Impact Flow(MPI)。

较小的dis-placement带来更为稳定的版图数据,绕线的挑战也比较小,这是MPI的核心思想。

ECO收尾阶段的风险和注意点

在ECO收尾阶段,所有决策和行动都需要慎重,否则出了问题就叫苦不迭了。

先说结论,兼顾metal fill,MCMM以及VT cell的灵活使用,是ECO后期成功收敛的关键要素。

MCMM,全称为:multi_corner和multi_mode。

multi_corner(PVT):process/voltage/tmperature。

multi_mode:function/scan_shift/scan_capture。

看到它的全称,想必你就明白它的重要性了。

至于metal fill,先进工艺是需要fill的支持,来保证流片的物理需求,fill是基于绕线和布局的,如果绕线或者布局改变了,就需要重新跑fill。所以在先进工艺,一定不能忽略fill对timing的影响,tapeout之前,一定要保证fill的信息完全和真实的数据库匹配,这样跑出来的timing才完整可信。

ECO的时序信息通常是增量示的,除非你改变了绕线。这是需要在ECO后期阶段牢记的一点。

对于一个数据库,经常会遇到在接近TO的ECO的迭代中,会冒出一些和修复timing没有关系的微小的setup/hold violation。这个大多是由于绕线的细微改变,而导致的时序变化。这个时候,VT cell就会派上用场。

时间是TO前最值钱的,使用VT cell进行ECO,最大的方便时省略了ECO 绕线、寄生参数的抽取和STA的re-run。这三个步骤的时间是非常长的。有了VT cell的帮忙,这些时间统统可以省略。

经历了这么一系列流程与注意事项,我们终于可以完成ECO,确保tapeout顺利,获得一块good chip。

FPGA设计的8大重点

1、面积与速度的平衡与互换

这里的面积指一个设计消耗FPGA/CPLD的逻辑资源的数量,对于FPGA可以用消耗的FF(触发器)和LUT(查找表)来衡量,更一般的衡量方式可以用设计所占的等价逻辑门数。

速度指设计在芯片上稳定运行所能达到的最高频率,这个频率由设计的时序状况来决定,以及设计满足的时钟要求:PAD to PAD time 、Clock Setup Time、Clock Hold Time、Clock-to-Output Delay等众多时序特征量密切相关。

面积和速度这两个指标贯穿FPGA/CPLD设计的时钟,是设计质量的评价的终极标准 —— 面积和速度是一对对立统一的矛盾体。

要求一个同时具备设计面积最小、运行频率最高是不现实的。更科学的设计目标应该是在满足设计时序要求(包括对设计频率的要求)的前提下,占用最小的芯片面积。或者在所规定的面积下,是设计的时序余量更大、频率跑的更高。这两种目标充分体现了面积和速度的平衡的思想。

作为矛盾的两个组成部分,面积和速度的地位是不一样的。相比之下,满足时序、工作频率的要求更重要一些,当两者冲突时,采用速度优先的准则。

从理论上讲,如果一个设计时序余量较大,所能跑的速度远远高于设计要求,那么就通过功能模块的复用来减少整个设计消耗的芯片面积,这就是用速度的优势换取面积的节约。反之,如果一个设计的时序要求很高,普通方法达不到设计频率,那么一般可以通过将数据流串并转换,并行复制多个操作模块,对整个设计采取乒乓操作和串并转换的思想运行。

2、硬件原则

硬件原则主要针对HDL代码编写而言:Verilog是采用了C语言形式的硬件的抽象,它的本质作用在于描述硬件,它的最终实现结果是芯片内部的实际电路。所以评判一段HDL代码的优劣的最终标准是:其描述并实现的硬件电路的性能,包括面积和速度两个方面。

评价一个设计的代码水平较高,仅仅是说这个设计是由硬件想HDL代码这种表现形式的转换更加流畅、合理。而一个设计最终性能,在更大程度上取决于设计工程师所构想的硬件实现方案的效率以及合理性。(HDL代码仅仅是硬件设计的表达形式之一)

初学者片面追求代码的整洁、简短,是错误的,是与HDL的标准背道而驰的。正确的编码方法,首先要做到对所需实现的硬件电路胸有成竹,对该部分的硬件的结构和连接十分清晰,然后再用适当的HDL语句表达出来即可。

另外,Verilog作为一种HDL语言,是分层次的。系统级–算法级–寄存器传输级–逻辑级–门级–开关级。构建优先级树会消耗大量的组合逻辑,所以如果能够使用case的地方,尽量使用case代替if…..else……

3、系统原则

系统原则包含两个层次的含义:更高层面上看,是一个硬件系统,一块单板如何进行模块花费和任务分配,什么样的算法和功能适合放在FPGA里面实现,什么样的算法和功能适合放在DSP/CPU里面实现,以及FPGA的规模估算数据接口设计等。具体到FPGA设计就要对设计的全局有个宏观上的合理安排,比如时钟域、模块复用、约束、面积、速度等问题,在系统上模块的优化最为重要。

一般来说实时性要求高,频率快的功能模块适合FPGA实现。而FPGA和CPLD相比,更适合实现规模较大、频率较高、寄存器较多的设计。使用FPGA/CPLD设计时,应该对芯片内部的各种底层硬件资源,和可用的设计资源有一个较深刻的认识。

比如FPGA一般触发器资源丰富,CPLD的组合逻辑资源更加丰富。FPGA/CPLD一般是由底层可编程硬件单元、BRAM、布线资源、可配置IO单元、时钟资源等构成。

底层可编程硬件单元一般由触发器和查找表组成。Xilinx的底层可编程硬件资源较SLICE,由两个FF和2个LUT构成。Altera的底层硬件资源叫LE,由1个FF和1个LUT构成。使用片内RAN可以实现单口RAM、双口RAM、同步/异步FIFO、ROM、CAM等常用单元模块。

4、同步设计原则

异步电路的逻辑核心是用组合逻辑电路实现,比如异步的FIFO/RAM读写信号,地址译码等电路。电路的主要信号、输出信号等并不依赖于任何一个时钟性信号,不是由时钟信号驱动FF产生的。异步时序电路的最大缺点是容易产生毛刺,在布局布线后仿真和用逻辑分析仪观测实际信号时,这种毛刺尤其明显。

同步时序电路的核心逻辑用各种各样的触发器实现,电路的主要信号、输出信号都是由某个时钟沿驱动触发器产生出来的。同步时序电路可以很好的避免毛刺,布局布线后仿真,和用逻辑分析仪采样实际工作信号都没有毛刺。

  • 是否时序电路一定比异步电路使用更多的资源呢?从单纯的ASCI设计来看,大约需要7个门来实现一个D触发器,而一个门即可实现一个2输入与非门,所以一般来说,同步时序电路比异步电路占用更大的面积。(FPGA/CPLD中不同,主要是因为单元块的计算方式)

  • 如何实现同步时序电路的延时?异步电路产生延时的一般方法是插入一个Buffer、两级与非门等,这种延时调整手段是不适用同步时序设计思想的。首先要明确一点HDL语法中的延时控制语法,是行为级的代码描述,常用于仿真测试激励,但是在电路综合是会被忽略,并不能启动延时作用。

    同步时序电路的延时一般是通过时序控制完成的,换句话说,同步时序电路的延时被当做一个电路逻辑来设计。对于比较大的和特殊定时要求的延时,一般用高速时钟产生一个计数器,通过计数器的计数控制延迟;对于比较小的延时,可以用D触发器打一下,这种做法不仅仅使信号延时了一个时钟周期,而且完成了信号与时钟的初次同步,在输入信号采样和增加时序约束余量中使用。

  • 同步时序电路的时钟如何产生?时钟的质量和稳定性直接决定着同步时序电路的性能。输入信号的同步时序电路要求对输入信号进行同步化,如果输入数据的节拍和本级芯片的处理时钟同频,并且建立保持时间匹配,可以直接用本级芯片的主时钟对输入数据寄存器采样,完成输入数据的同步化。如果输入数据和本级芯片的处理时钟是异步的,特别是频率不匹配的时候,则要用处理时钟对输入数据做两次寄存器采样,才能完成输入数据的同步化。

  • 是不是定义为Reg型,就一定综合成寄存器,并且是同步时序电路呢?答案的否定的。Verilog中最常用的两种数据类型Wire和Reg,一般来说,Wire型指定书数据和网线通过组合逻辑实现,而reg型指定的数据不一定就是用寄存器实现。

5、乒乓操作

“ 乒乓操作 ” 是一个常常应用于数据流控制的处理技巧,乒乓操作的处理流程为:输入数据流通过 “ 输入数据选择单元 ” 将数据流等时分配到两个数据缓冲区,数据缓冲模块可以为任何存储模块,比较常用的存储单元为双口 RAM(DPRAM) 、单口 RAM(SPRAM) 、 FIFO 等。

  • 在第一个缓冲周期,将输入的数据流缓存到 “ 数据缓冲模块 1” ;在第 2 个缓冲周期,通过 “ 输入数据选择单元 ” 的切换,将输入的数据流缓存到 “ 数据缓冲模块 2” ,同时将 “ 数据缓冲模块 1” 缓存的第 1 个周期数据通过 “ 输入数据选择单元 ” 的选择,送到 “ 数据流运算处理模块 ” 进行运算处理;在第 3 个缓冲周期通过 “ 输入数据选择单元 ” 的再次切换,将输入的数据流缓存到 “ 数据缓冲模块 1” ,同时将 “ 数据缓冲模块 2” 缓存的第 2 个周期的数据通过 “ 输入数据选择单元 ” 切换,送到 “ 数据流运算处理模块 ” 进行运算处理。如此循环。

乒乓操作的最大特点是,通过输入数据选择单元和输出数据选择单元、进行运算和处理。把乒乓操作模块当成一个整体,站在两端看数据,输入数据和输出数据流都是连续不断的,没有任何停顿,因此非常适合对数据流进行流水线式处理。所以乒乓操作常常应用于流水线式算法,完成数据的无缝缓冲和处理。

乒乓操作的第二个优点是可以节约缓冲区空间。比如在WCDMA基带应用中,1帧是由15个时隙组成的,有时需要将1整帧的数据延时一个时隙后处理,比较直接的方法就是将这帧数据缓存起来,然后延时一个时隙,进行处理。这时缓冲区的长度为1帧的数据长,假设数据速率是3.84Mb/s,1帧10ms,此时需要缓冲区的长度是38400bit,如果采用乒乓操作,只需定义两个缓冲1时隙的数据RAM,当向一个RAM写数据时,从另一块RAM读数据,然后送到处理单元处理,此时每块RAM的容量仅需2560bit,2块加起来5120bit的容量。

另外,巧妙运用乒乓操作还可以达到用低速模块处理高速数据流的效果。如图 2 所示,数据缓冲模块采用了双口 RAM ,并在 DPRAM 后引入了一级数据预处理模块,这个数据预处理可以根据需要的各种数据运算,比如在 WCDMA 设计中,对输入数据流的解扩、解扰、去旋转等。假设端口 A 的输入数据流的速率为 100Mbps ,乒乓操作的缓冲周期是 10ms 。

6、串并转换设计技巧

串并转换是 FPGA 设计的一个重要技巧,它是数据流处理的常用手段,也是面积与速度互换思想的直接体现。串并转换的实现方法多种多样,根据数据的排序和数量的要求,可以选用寄存器、 RAM 等实现。

前面在乒乓操作的图例中,就是通过 DPRAM 实现了数据流的串并转换,而且由于使用了 DPRAM ,数据的缓冲区可以开得很大,对于数量比较小的设计可以采用寄存器完成串并转换。如无特殊需求,应该用同步时序设计完成串并之间的转换。比如数据从串行到并行,数据排列顺序是高位在前,可以用下面的编码实现:prl_temp<={prl_temp,srl_in}。

其中, prl_temp 是并行输出缓存寄存器, srl_in 是串行数据输入。对于排列顺序有规定的串并转换,可以用 case 语句判断实现。对于复杂的串并转换,还可以用状态机实现。串并转换的方法比较简单,在此不必赘述。

7、流水线操作设计思想

首先需要声明的是,这里所讲述的流水线是指一种处理流程和顺序操作的设计思想,并非 FPGA 、 ASIC 设计中优化时序所用的 “Pipelining” 。

流水线处理是高速设计中的一个常用设计手段。如果某个设计的处理流程分为若干步骤,而且整个数据处理是 “ 单流向 ” 的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以考虑采用流水线设计方法来提高系统的工作频率。

流水线设计的结构示意图如图所示。其基本结构为:将适当划分的 n 个操作步骤单流向串联起来。流水线操作的最大特点和要求是,数据流在各个步骤的处理从时间上看是连续的,如果将每个操作步骤简化假设为通过一个 D 触发器 ( 就是用寄存器打一个节拍 ) ,那么流水线操作就类似一个移位寄存器组,数据流依次流经 D 触发器,完成每个步骤的操作。

流水线设计的一个关键在于整个设计时序的合理安排,要求每个操作步骤的划分合理。如果前级操作时间恰好等于后级的操作时间,设计最为简单,前级的输出直接汇入后级的输入即可;如果前级操作时间大于后级的操作时间,则需要对前级的输出数据适当缓存才能汇入到后级输入端;如果前级操作时间恰好小于后级的操作时间,则必须通过复制逻辑,将数据流分流,或者在前级对数据采用存储、后处理方式,否则会造成后级数据溢出。

在 WCDMA 设计中经常使用到流水线处理的方法,如 RAKE 接收机、搜索器、前导捕获等。流水线处理方式之所以频率较高,是因为复制了处理模块,它是面积换取速度思想的又一种具体体现。

8、数据接口的同步方法

数据接口的同步是 FPGA/CPLD 设计的一个常见问题,也是一个重点和难点,很多设计不稳定都是源于数据接口的同步有问题。在电路图设计阶段,一些工程师手工加入 BUFT 或者非门调整数据延迟,从而保证本级模块的时钟对上级模块数据的建立、保持时间要求。

还有一些工程师为了有稳定的采样,生成了很多相差 90 度的时钟信号,时而用正沿打一下数据,时而用负沿打一下数据,用以调整数据的采样位置。这两种做法都十分不可取,因为一旦芯片更新换代或者移植到其它芯片 组的芯片上,采样实现必须重新设计。而且,这两种做法造成电路实现的余量不够,一旦外界条件变换 ( 比如温度升高 ) ,采样时序就有可能完全紊乱,造成电路瘫痪。

  • 输入、输出的延时 ( 芯片间、 PCB 布线、一些驱动接口元件的延时等 ) 不可测,或者有可能变动的条件下,如何完成数据同步?对于数据的延迟不可测或变动,就需要建立同步机制,可以用一个同步使能或同步指示信号。另外,使数据通过 RAM 或者 FIFO 的存取,也可以达到数据同步目的。

    设计数据接口同步是否需要添加约束?建议最好添加适当的约束,特别是对于高速设计,一定要对周期、建立、保持时间等添加相应的约束。这里附加约束的作用有两点:提高设计的工作频率,满足接口数据同步要求;获得正确的时序分析报告。

参考

文章


文章作者: 杰克成
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 杰克成 !
评论
  目录