本文简单总结、介绍芯片设计产业链全流程。
更新: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
、SystemVerilog
3种编程语言可供选择。
该部分通常由设计工程师(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个:00
01
10
11
。这时候就会看门级网表 ”锥底“ 的结果是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
。
STA
Timing
满足,才能得到最终的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设计流程 ↩︎