本文简单总结、介绍芯片设计产业链全流程。
更新:2023 / 7 / 2
文章目录
- 集成电路产业链
- 常见的芯片架构图
- 数字IC设计
- 流程
- 概略版
- 详解版
- 前后端
- 前端:RTL -> Netlist
- 后端:Netlist -> Layout
 
- 示例:基于标准单元(STD CELL)的ASIC设计流程
 
- 指标
 
- 参考链接
集成电路产业链

常见的芯片架构图
此处以 SoC 芯片为例,
 其组成为:
其组成为:
- 核( Core);
- 存储( MEM);
- 外设( IO);
- 总线( BUS);
数字IC设计
数字IC是传递、加工、处理数字信号的 IC,是近年来应用最多、发展最快的 IC 品种。可分为通用数字IC和专用数字IC。1
流程
概略版
-  确定项目需求
 市场进行调研,确定芯片的规格(功能、功耗、性能、IO外设等指标),对研发提出需求;
 研发来评估实现需求的可行性;
-  系统级设计
 根据对芯片规格的要求,对功能进行算法设计,拿出设计解决方案和具体实现架构,划分模块功能;
-  前端设计(逻辑)
 前端以设计架构为起点,以生成可以布局布线的网表为终点,目标是设计电路来实现想法。
 主要包括:RTL编程和仿真(EDA仿真验证 )、IC系统设计、验证、逻辑综合、STA、逻辑等值验证(equivalence check)、硬件原型验证(FPGA原型验证 )。
-  后端设计(物理)
 后端以布局布线为起点,以生成可以送交foundary进行流片的GDS2文件为终点,目标是将设计的电路制造出来,在工艺上实现想法。
 主要包括:P & R(比如芯片封装和管脚设计)、floorplan、电源布线和功率验证、线间干扰及其预防和修正、时序收敛、自动布局布线、STA、DRC、LVS等。要求掌握和熟悉多种EDA工具以及IC生产厂家的具体要求。
详解版

-  Marketing Request(市场需求)
 市场进行调研,确定芯片的规格(功能、功耗、性能、IO外设等指标),对研发提出需求;
 研发来评估实现需求的可行性;
-  Architecture Spec(产品结构说明书)
 在需求确定后,开始撰写架构的文档。
 文档包括两个部分:整体架构规格书(Top Architecture Spec)和具体功能规格书(Project Function Spec)。
 整体架构规格书指的是要有什么模块,诸如CPU、SRAM、DMA、AMBA等。
 具体功能规格书指的是具体的指标,诸如DMA模块有多少个通道、总的时钟频率多少兆、支持的模式有几种等。
 该部分通常由架构工程师(Architecture Engineer)完成,或被称为系统工程师(System Engineer,SE)。该类工程师一般是较为资深的工程师。
-  Arch / Algorithm Emulation
 在设计好架构后就可以做架构、算法方面的仿真了。
 通常使用的是C、C++或者MATLAB。
 该部分通常由算法工程师(Algorithm Engineer)完成。
-  Design Spec
 做设计并不是一开始拿到算法就去写代码,而是要做一个设计规格书。
 类比盖楼,在正式砌砖之前也是先要把图纸规划好,该部分通常包括接口定义(Interface)、时序处理方案(Timing)、关键电路绘制(Circuit)。
 该部分通常由设计工程师(Design Engineer)完成。
-  RTL Coding
 在设计规格书编写完毕后,就可以进行以硬件描述语言分模块以待吗来描述实现了。通常有VHDL、Verilog、SystemVerilog3种编程语言可供选择。
 该部分通常由设计工程师(Design Engineer)完成。
 对于RTL Coding部分,又可细分为以下3个部分,关系见下图:

 ① IP Level RTL Coding
 先有小的 IP,才能有大的 SoC。
 前面做设计是由顶向下,先有架构再有各个模块。
 后面具体实现是由底向上,先有最小的 IP 级别的代码,才能集成更高层次的代码。
② IP Level RTL Simulation 和 IP Level Verification
 设计好 IP 级别代码后就可以进行仿真验证了。小的 IP 的话通常是 Design Engineer 自己做的,但当 IP 较大时会有专门的验证人员来做。
 在验证时,我们会用到一些脚本,比如 Makefile,用到的仿真工具主要有3大 EDA 厂商的 Cadence 的 Incisive、Synopsys 的 VCS 和 Mentor 的 QuestaSim,其中 VCS 最为主流而 QuestaSim 用在小的 FPGA 开发上面。
 在验证时用到的语言有 C、C++、SystemC、SystemVerilog 还有 UVM 这么几种。
 在做验证时也会做验证的 Spec 文档,想清楚验哪些点之后才会搭建环境、跑测例。
 验证的核心是验证的完备性,所以要清楚 IP 级这个目标模块的 DUT,要测的功能点都有哪些,得分解全。
③ Unit / Chip Level RTL Simulation 和 Unit / Chip Level Verification
 在 IP 级别没有问题后,合成大模块 Unit / Chip Level,再来进行验证。
 该部分通常由全流程验证工程师( Full Chip Verification Engineer )完成。
-  Logic Synthesis和Gate Level Verification
 RTL Coding设计和验证没有问题后,此时会进行综合、会综合出网表。同时也会对门级网表做验证,称之为Gate Level Verification。这个阶段更主要的是调试我们的验证环境,为后端物理实现之后的网表做准备。
 当前阶段的网表含有的信息较少,物理参数没有,跑起来会更快,方便于调试。
 网表的逻辑功能正确性的验证是通过Formal Verification去保证的,而不是Gate Level Verification去保证的。
 对于综合工具,当前主流的是Synopsys的Design Complier(DC)。
-  逻辑综合就是把设计实现的 RTL代码映射到特定的工艺库,输出门级网表的Netlist【根据Load、Driver映射工艺库】。
-  逻辑综合要基于特定的综合库。不同的库中,门电路基本单元( Standard Cell)的面积、时序参数会不一样。
-  Formal Verification
 逻辑综合和验证之后会进行形式验证,即Formal Verification,简称为FM。形式验证也可称之为等价性检查(Equivalence Check)。遍历所有到 ”锥底“ 的点的组合,加入到 ”锥底“ 的点有2个,那么组合有4个:00011011。这时候就会看门级网表 ”锥底“ 的结果是4个中的哪个,而RTL的结果是4个结果中的哪个,对比是否一样,称之为形式验证。
 形式验证的工具有Cadence的Conformal,Synopsys的Formality。
 从功能上(STA是时序上)对综合后的网表进行验证,常用的方法是等价性检查方法。
 以功能验证后的HDL设计为参考,对比综合后的网表功能是否在功能上存在等价性。这样做是为了保证在逻辑综合过程中没有改变原先HDL描述的电路功能。
-  STA(Static Timing Analysis)
 综合的网表除了要做逻辑等效之外,还需要做静态时序分析。
 电路的结构是RTL级别的,有组合逻辑(与或非门)和时序逻辑(D触发器)两种。
 对于时序逻辑有Setup/Hold(建立时间 / 保持)要求,组合逻辑的延时会影响到这两个参数,有可能造成延时太长,造成违例。
 通常有几种解决方法:
 ① 把延迟大的组合逻辑的CELL驱动换的大一点,让其延时减小。
 ② 在组合逻辑中插入时序逻辑,即添加流水线的方式。
 静态时序分析也属于验证范畴,主要是在时序上对电路进行验证,检查电路是否存在建立时间(Setup Time)和保持时间(Hold Time)的违例(Violation)。
 STA以及综合通常都会用脚本实现,用的比较多的脚本是TCL。
 STATiming满足,才能得到最终的Netlist(网表)。
-  DFT(Design for Test)
 ——为什么需要DFT?
 芯片制作是在一个wafer上面完成的,这个wafer实现逻辑电路通常会通过光刻、腐蚀等一系列流程,把CMOS管子在wafer上给做出来。在这个过程中,不可避免地会出现一些问题,比如腐蚀剂的量多了一点、光刻深度多了一点,导致CMOS功能可能不是按照我们正常的功能在运行,或者有些走线 stuck、短路等故障,所以需要做DFT电路。
 ——如何实现DFT?
 DFT一般在网表基础上去插入的扫描链,将非扫描单元(如寄存器)变为扫描单元。
 ①ScanChain
 在芯片回片后,通过DFT的ATPG(Automatic Test Pattern Generation)自动产生测试Pattern,然后通过芯片的IO把Pattern灌入,这样就会把整个芯片里面的D触发器串成一个链,再把Pattern输出。通过对比输入Pattern和 输出Pattern以验证正确性,得出是否存在制造缺陷。
 那么,D触发器一方面要实现要求的逻辑功能,一方面要实现测试(ATE),此时会在D触发器的输入接一个MUX,这个MUX有两路功能,MUX的使能端是SE(Scan enable),测试的输入端ATE是SI(Scan Input)。示意如如下所示,

② MemBist
 做逻辑的话我们会遇到大量的逻辑存储单元( 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,只需要给它一个使能信号,让它自己测就可以了。
通过 MemBist 这种内建自测试来验证 MEM 是否有缺陷。它跟 SCAN Chain 一样,不需要外部灌激励,相当于在 MEM 外围建立好了测试电路,它的 partner 可以通过测试电路自己产生,所以叫内建自测试。
-  版图生成、自动布局布线(PR)
 在以上工作没问题后,便可以交给后端团队进行布局布线。比如,一个chip通常把模拟放在四周,中间放数字逻辑。
-  时钟树插入 
 STA是理想时钟网路,到每一个D触发器的clk是同时的,但实际上是有Wire Delay的,甚至有时距离远还会插入buffer,所以不同的位置D触发器的相位是有差异的。
 但是分析时如果想要不同的D触发器的Delay尽可能地一致,就需要插入时钟树(插入buffer)。
 由于时钟信号在数字芯片的全局指挥作用,它的分布应该是对称式的连到各个寄存器单元,从而使时钟从同一个时钟源到达各个寄存器时,时钟延迟差异最小。这也是为什么时钟信号需要单独布线的原因。
-  DRC / LVS(Design Route Check)
 上述完成只会进行一个DRC检查,而LVS是跟网表的一个对比。
-  Post_Layout STA
 这个时候时序的信息就是真实的。
-  生成最终的 GDSII
-  Tape-Out流片
前后端

 工艺库 中的器件我们都称之为 Standard CELL,是由流片厂商( Fab )提供的。
 逻辑库 体现的是逻辑功能的信息。
 物理库 体现的是 CELL 的物理特性和电气特性信息,包含了 逻辑库 的逻辑信息。2
在前端阶段,我们使用的是一个逻辑库,CELL 能体现的是某个逻辑功能(与或非)。
 在后端阶段,CELL 更多的是体现它的物理特性和电气特性,比如 CELL 的工作电压、负载、电容容抗 CAP、功耗等特性。
前端:RTL -> Netlist

 从设计角度来讲,前端设计的目的是得到芯片的门级网表电路。
-  Design Spec
 设计芯片规格书。
 在设计规格书阶段,需要关注速度(时钟频率能跑多高)和功耗(是否可以达到要求)。速度和功耗也是一对需要平衡的指标,速度高则功耗肯定就较大,因此需要设计来做一个平衡折中(tradeoff)。
-  RTL Coding
 RTL(Register Transfer Level),设计利用硬件描述语言,如VHDL、Verilog、SystemVerilog,对电路以寄存器之间的传输为基础进行描述。
 在RTL阶段会做一些低功耗设计,此时更多的是做一个门控(Clock Gating)时钟的工作,主要是通过代码的风格来保证。
-  语法检查 
 除了语法检查,还有代码风格检查。要确保语法没有问题,才进行下一步仿真。
 常用的工具有Nlint和Spyglass。
-  功能仿真 
 从芯片架构书出来后就可以开始进行功能仿真了。会去写参考模型、测试规划(Test Plan)和分解各个测试点,同时根据架构书的功能点,梳理出要验证哪些功能点,然后根据这些功能点搭建环境。环境搭建完毕后,还需要调试环境。
 功能仿真是为了保证我们的RTL代码的设计与芯片规格书保持一致,所以有时候功能仿真也会回头对比,设计出许多验证的边界(这些边界在最开始书写设计规格书期间是体现不出来的),甚至更改设计规格书。此时,会针对设计本身的边界去构造一些用例和测试点。
 在RTL代码出来之后,才会把RTL代码(DUT)集成到验证环境下,进行功能验证。先进行模块级仿真(IP Level),再放在一起进行片级仿真(chip level)。
 当功能验证通过之后,才会正式的去做逻辑综合。在实际工程操作时,会给一些初步的代码给综合工程师。但是仅仅是为了调试环境,并不是正式交付。
 设计和仿真验证都是反复迭代的过程,直到验证结果显示完全符合规格标准。该部分称为前仿真。
-  逻辑综合 
 逻辑综合指将HDL代码映射成描述实际电路的各种元器件以及他们之间的联系关系的门级网表(Netlist)。
 这一阶段中,需要设定时序约束和低功耗约束(Universial Power FOrmat,简称UPF),即原本时钟跑的是100M,但是做逻辑综合时可能按照更高的频率120M去约束,留个20M的余量。因为逻辑综合这个阶段的时序是一个负载模型,即CELL的位置、CELL的距离、走线延时等信息都不是真实的,而是用一个假的模型来代替,因此会做一些过约束以留下一些余量。低功耗约束是描述整个的power划分,通过划分在进行综合的时候,也是对综合结果的一个约束。
 逻辑综合完毕后,在上述的两个约束条件下,生成综合时序报告和功耗分析报告,再根据报告来迭代修改约束甚至代码。
 逻辑综合需要基于特定的综合库,不同的库中门电路基本单元(Standard Cell)的面积、时序参数是不一样的,所以综合库不一样综合出来的电路在时序、面积上是有差异的。
-  形式验证( Formality)
 STA从时序上对逻辑综合后的网表进行验证。Formality则是从功能上对其进行验证,进一步保证综合后的网表(Netlist)和RTL之间的逻辑一致性。
 常用的是等价性检查方法,以功能验证后的HDL设计为参考,对比综合后的网表功能,查看是否在功能上存在等价性,以确保逻辑综合过程中没有改变原先HDL描述的电路功能。
-  逻辑综合后仿真 
 简称后仿。这一步并不是验证网表的逻辑功能,这一步更多地是进行调试验证环境,为后端阶段的后仿作准备。
 后端后仿主要是仿一些功耗数据,此时的功耗数据才是更真实的。当然,也会顺便看一下网表是否有一些基础问题。
 通常这个后仿跑的是比较简单的系统级别(System Level)的用例,不是IP Level的,是层级比较高的用例。后仿有问题,也会返回修改脚本(约束某条路径,让工具优化的更好些)或者代码(组合逻辑时延修改,让其满足我们的要求。)
-  STA(Static Timing Analysis,静态时序分析)
 套用特定的时序模型(Timing Model),针对特定电路分析,检查电路是否存在建立时间(Setup Time)和保持时间(Hold Time)的违例,是否违反设计者给定的时序限制(Timing Constraint)。
 如果一个寄存器出现建立时间和保持时间的违例时,是无法正确采样数据和输出数据的,那么芯片的功能肯定会出现问题。
-  DFT验证
 DFT验证与上面的功能仿真验证是类似的,但是没有其做的复杂,因为它的电路结构一般比较固定,所以一般直接集成先前项目的DFT验证环境直接跑就可以,并且它的功能也没有RTL那么复杂。
整个设计流程都是一个迭代的过程,在任何一步中若无法满足要求,都需要重复之前的步骤,甚至重新设计 RTL 代码。
后端:Netlist -> Layout

 后端大部分工作由工具自动完成,前端的 RTL Code 以及功能仿真环境用例,都需要人去分析需求规格,去写测试点,写测试策略测试方案。
-  Auto Place and Route(APR)
 由工具自动化完成自动布局布线。
 尤其在当前大规模集成电路、集成度上亿门级别的背景下,手动来搞肯定是费力不讨好的。工具会自动把Standard Cell根据我们限定的范围区域放置好,手动摆一些Hard单元在同一个Die上(大型芯片),几个硬核一起做,形成多个sub-chip。如果chip规模太大,工具是有点吃不消的,所以会做成小的hard单元,把这些小的hard单元集成在一起。对于一个hard单元,会手动摆一些MEM、模拟IP,并将其放置到边上。数字部分用工具自动地布局布线放在周围。
 当然,虽然是自动布局布线,如果设计考虑不周到,也会出现走线拥塞Congestion。这个时候有可能会去考虑修改RTL,工具布线布不够,可能会是设计的组合逻辑的密度太大,也可能是设计的电路结构上有一些交叉结构cross,绕来绕去,导致工具绕不开。
 在自动布局布线后,也会做形式验证。此时是为了保证布局布线之后的网表与综合的网表逻辑是一致的,而综合的网表逻辑要求与RTL逻辑功能一致,这样就能确保布局布线之后的版图逻辑功能与RTL一致。
-  Extract RC和STA
 前端的STA使用的是理想的时序模型(Timing Model),即认为线之间是有负载的,同时时钟也会做一个过约束(正常是跑100M,但是在前端中国呢会以120M等更高的频率进行约束),实际上并没有实际的时序信息。实际Cell摆在哪里,两个Cell之间的走线延时等信息都是没有的,因为这个时候还没有布局布线,两个的位置都是不确定的,自然就没有这些信息。
 当位置确定后,进入后端后再做STA时才会真正的去提取这些延时信息(Extract RC)。由于导线本身存在的电阻,相邻导线之间的互感、耦合电容在芯片内部会产生信号噪声、串扰和反射。这些效应会产生信号完整性问题,导致信号电压波动和变化。如果严重,会导致信号失真错误。
 然后再做布局布线之后的STA,此时时钟的时序路径就是更真实的。包括时钟,也是插了时钟树之后真正的时钟走线,时钟路径的延时也是更真实的。
 如果布局布线之后还有不满足时序的地方,也会退回去前面的阶段进行修改。例如,作CELL的替换后看看某些路径或者CELL的时序余量(Margin),如果余量很大,那么就会替换成CELL比较小的,比如从x4换成x2。驱动越小,CELL的延时就会越大,越难满足Setup和Hold。
 该阶段的低功耗分析主要是替换CELL的类型,将时序比较好的CELL替换成功耗比较低的CELL,但是这个阶段的系统角度上的功耗收益一般不大,也就 5% 左右,因此,低功耗设计主要还是依靠最初的设计架构和工艺选项。
-  DRC
 时序timing满足之后,接下来会做设计规则检查(Design Rule Check,简称DRC),检查连线间距、连线宽度是否满足工艺要求。
-  LVS(Layout Versus Schematic)
 DRC没有问题之后,会做一个版图和电路图一致性检查(Layout Versus Schematic,简称LVS),相当于整个版图布完之后与Netlist的一个对比,类似跟RTL对比用了一个Formality一样,这里就是进行一个后端要交付的版图与前面进来的网表进行逻辑性功能对比。
 也会再做时序收敛(Timing Signoff),检查短路和开路等电器规则违例。只要有任何一个点的Timing不满足,那么前面的逻辑功能做的再好,最后芯片也还是会有缺陷。功能上需要保证逻辑性(Logic),性能傻姑娘的Timing确保物理实现(Timing是对D触发器的CELL的要求,即对物理器件的要求。)
-  后仿真 
 后仿真更多的是仿功耗,看电源的完整性。PR会把电源网络加入进去,看电源网络,诸如IR Drop是否过大,某处 Standard Cell 某处的密度过大,导致散热不均,时间长了会把芯片烧毁,对器件寿命有影响,加速器件老化。
示例:基于标准单元(STD CELL)的ASIC设计流程

-  网表( Netlist)
 在电子线路设计中,网表是用来描述电路元件相互之间连接关系的。一般来说它是遵循某种比较简单的标记语法的文本文件。
-  GDSII流格式:
 GDSII是一个数据库文件格式。它用于集成电路版图的数据转换,并成为事实上的工业标准。
 GDSII是一个二进制文件,其中含有集成电路版图中的平面几何形状、文本或标签,以及其他有关信息可以由层次结构组成。
 GDSII数据可用于重建所有或部分的版图信息,可以用来制作光刻掩模版。
指标
以下的一些指标可以指示当前的设计是否足够好:
| 指标 | 说明 | 
|---|---|
| 物理实现 | 1. 制作工艺(代工厂及工艺尺寸) 2. 裸片面积( DIE大小,DIE由功耗、成本、数字/模拟面积共同影响 )3. 封装(封装越大、散热越好、成本越高) | 
| 性能指标 | 1. 速度(时钟频率) 2. 功耗 | 
| 功能指标 | 1. 功能描述; 2. 接口定义; | 
参考链接
- 数字IC前端后端的区别,数字IC设计流程与设计工具 ↩︎ 
- 数字IC设计流程 ↩︎ 



















