数字IC设计流程以及FPGA开发和数字芯片设计关系
给出结论:
数字芯片设计包括:数字前端和数字后端,具体划分:数字前端、数字验证、DFT(Design For Test)和数字后端。
数字IC设计和FPGA开发的关系:数字IC设计前端(和你具体的是数字IC前端的设计部分,也就是芯片功能代码编写部分)和可以理解为FPGA开发;同时还有一些嵌入式FPGA开发工程师,专门用FPGA实现某一场景的功能,也是一种职业。
其实很多人都会有疑问,我们做FPGA开发到底和数字芯片设计有什么关系,或者说两者有什么区别,最近我做了一些调研,因为我个人打算做数字IC前端设计,所以后端的内容可能讲的会浅一些,OK!大概分以下几方面为大家阐述:
- FPGA和数字ASIC的区别
- 做FPGA开发转ASIC需要补充哪些学习内容
- 做数字IC工程师需要具备哪些技能
一:FPGA和数字ASIC的区别
先上一张图,然后展开讲解:
层面 | FPGA) | ASIC |
---|---|---|
时钟设计 | 推荐同步时钟设计;全局时钟驱动 | 异步时钟设计;全局门控时钟树驱动 |
布线方式 | 布线较为局限 | 布线很灵活 |
功耗 | 较高 | 较低 |
设计频率 | 相对较低 | 相对较高 |
设计周期 | 短 | 长 |
开发成本 | 低 | 高 |
产品价格 | 高 | 低 |
灵活性 | 易于修改,可重复编程 | 不可修改,不能重复编程 |
应用 | 适合于不断演进的标准 | 高速、复杂、低功耗设计 |
- 时钟设计
首先同步几个概念:
同步时钟:当两个时钟间的相位是固定关系的,则可以称这两个时钟为同步时钟(synchronous clock)。一般同源,如同一个MMCM or PLL产生的两个时钟可以称为同步时钟,因此可以将主时钟和与之对应的衍生时钟约束成同一个时钟组。简单理解就是假如一个时钟1G,一个时钟是2G,2G/1G = 2(整数),为同步时钟。
异步时钟:无法判定两个时钟间相位时,则可以称这两个时钟为异步时钟(asynchronous clocks)。通常情况下设计中不同的主时钟一定是异步时钟,因此可以将这两个主时钟及其衍生时钟约束成不同的时钟组。简单理解就是假如一个时钟1G,一个时钟是1.5G,1.5G/1G != 整数,为异步时钟。
时钟树:由许多缓冲单元(buffer cell)平衡搭建的网状结构,有一个源点,一般是时钟输入端(clock input port),也有可能是design内部某一个单元输出脚(cell output pin),然后就是由一级一级的缓冲单元搭建而成,具体的多少级,根据你的设置以及所使用的单元而定,目的就是使所用终点的clock skew(一般最关心这个)、insertion delay以及transition了,满足设计要求。
门控时钟:在数据无效时,将寄存器时钟关闭的技术,能够有效降低功耗,是低功耗设计的重要方法之一。门控时钟是一个逻辑模块,在寄存器的输入数据无效时,将寄存器的输入时钟置为0,而此时寄存器值保持不变,此时没有时钟翻转,避免了动态功耗。
(1)FPGA时钟管理
在FPGA设计中采用全局时钟(同步时钟)资源驱动设计的主时钟,目的达到最低的时钟抖动和延迟。FPGA 全局时钟资源一般使用全铜层工艺实现,并设计了专用时钟缓冲与驱动结构,从而使全局时钟到达芯片内部的所有可配置单元(CLB)、I/O单元(IOB)和选择性块RAM(Block Select RAM)的时延和抖动都为最小,如下图所示。为了适应复杂设计的需要,Xilinx的FPGA中集成的专用时钟资源与数字延迟锁相环(DLL)的数目不断增加。

FPGA的时钟包括三种,附一张A7的FPGA时钟图:

1)全局时钟
2)区域时钟
3)IO时钟
这里不详细介绍FPGA时钟管理,下面的文章讲的还不错。
(2)ASIC的是时钟设计

总结:
FPGA推荐采用同步时钟设计,但是有时避免不了跨时钟域操作,下面的FPGA跨时钟域的说明
其实两者最大的区别是:
(1)FPGA时钟树已经给定,我们只需要配置,而ASIC需要后端设计人员设计时钟树。
2. 布线方式
(1)FPGA的布局布线
(2)ASIC的布局布线

3. 功耗
4. 设计频率
实现同样的功能,做成ASIC的频率至少高于FPGA实现的2~3倍,这里简单说明ASIC的频率为什么会比ASIC的设计频率高:
FPGA内部是门、查找表、触发器,每个硬件单元的位值固定,为了实现我们的功能,进行搭积木的操作,这就会出现以下问题:
(1)布局方面(器件导致的延迟),FPGA无法改变每个硬件资源的位置,增加了布线的长度,ASIC相对比较灵活,可以根据需求摆放逻辑单元的位置。
(2)布线方面(走线延迟),FPGA由于逻辑单元的位置增加布线长度,还有本身的LUT结构,也会增大信号传输的时延。
详细可以参考:
5. 设计周期
这里给出两张图


大概可以看出,ASIC开发周期要比FPGA长很多,主要的时间差还差在ASIC设计中验证和后端。
6. 开发成本
ASIC比FPGA开发成本高主要有以下几点原因:
(1)ASIC开发周期比FPGA开发周期长,会投入更多的人力资源。
7. 产品价格
上面阐述实现同样功能,FPGA相对于ASIC有大量的资源冗余,或者说FPGA结构更为复杂,导致相同的产品做成FPGA的价格要高于ASIC。
8. 灵活性
FPGA(Field Programmable Gate Array)
9. 应用
(1)因为FPGA具有灵活性,所以用到适合于不断演进的标准中,或者是用量比较小的场景。
二:做FPGA开发转ASIC需要补充哪些学习内容
首先先同步几个概念:
亚稳态和跨时钟域的概念:
建立时间:时钟沿到来之前数据所要保持稳定的时间。
保持时间:时钟沿到来之后数据所要保持稳定的时间。
DVFS:DVFS 即动态电压频率调整,动态技术则是根据芯片所运行的应用程序对计算能力的不同需要,动态调节芯片的运行频率和电压(对于同一芯片,频率越高,需要的电压也越高),从而达到节能的目的。
STA:静态时序分析,对建立时间和保持时间的分析。
- 数字IC流程讲解
在这里大概再总结以下数字IC设计,根据下图进行讲解:

(2)高级算法建模与仿真
(3)软硬件的划分和任务的分配
(4)软硬件接口的定义
(5)进一步的精确分析,编写出芯片的spec(说明书)。
下面主要介绍数字IC前端、验证、DFT和后端的设计,流程下图所示(每个公司设计流程主要是在验证和STA方面有差异,越大的公司分工越细,验证和STA操作越多):

(1)RTL设计。编写VHDL、Verilog或System Verilog硬件描述语言对寄存器之间的传输进行描述。
(2)功能仿真,编写test bench,对照spec进行电路功能进行验证。
(3)逻辑综合、DFT。逻辑综合将RTL代码生成门级电路——逻辑网表(和我们做PCB设计类似,逻辑网表相当于原理图,上面通过网络标号将各个部件连接,这里会编写约束文件{FPGA开发中的xdc文件类似}进行逻辑综合);DFT:在进行电路的前端设计时,就预先规划、设计出如何在样片中进行电路的测试方案和办法,并通过逻辑综合过程完成芯片内部专用测试结构的插入,一遍在芯片形成后能按照预先制定的方案进行相应的电路功能测试的一种设计方法。也就是进行可测性设计,就是在原有的电路中插入专门测试的电路(插入电路)。
(4)形式验证。对设计过程中不同阶段的输出结果进行逻辑功能一致性的对比,根据电路的结构,判断两个设计在逻辑功能上是否对等。下面这篇文章将形式验证讲的很清楚:
(5)STA。通过EDA工具,提取电路中所以路径的延迟信息进行分析,计算出信号在路径上的延时,检查时序是否满足设定的时序约束要求。
(6)版图物理规划。通过对EDA工具进行输入标准单元库、标准I/O库、综合后的网表、各种约束文件等,规划好让EDA工具完成各模块的位置摆放、电源网络的设定、I/O信号出口位置、同时确定面积、封装、工艺、噪声、负载能力等参数。
(7)功耗分析。确定电源引脚的位置和电源线的宽度是否满足要求。对整个版图进功耗分析,即要进行动态功耗分析跟静态功耗分析,找出主要的功耗单元或者模块,以供优化。
(8)单元布局与优化。根据floor-plan中的布局规划,摆放网表中调用的所以标准单元,EDA工具自动对时序约束、布线面积、布线拥堵等综合考虑标准单元的摆放,从而依靠EDA工具完成电路的布局设计跟优化(Floor Plan主要目的是要确定design的形状大小,出Pin的位置已经所有macro的摆放)。
(9)时钟树综合(clock tree synthesis,CTS)。EDA工具按照约束,插入buffer,使时钟的源头(时钟根节点)到达各个需要时钟驱动的器件(各叶子节点,如触发器)的时间基本一致的过程。
(10)自动布线。完成模块、节点的相互连线。
(11)STA。这一次的STA比较重要,结果也是最准确的,作用与上述相同。
(12)DRC(设计规则检查)。检查连线间距,连线宽度等是否满足工艺要求。
(13)LVS(版图电路图一致性检查)。检查芯片的功能是否和设计预期一致,同时分析性能是否满足需求。
总结:
(1)可以看出整个芯片设计的流程战线拉得很长,每一部分在公司中都会有对应的职业,Verilog代码编写只占一小部分,对于ASIC设计过程中编写的Verilog根据前面的建模仿真和后端的需求来编写。
(2)在项目启动,做好spec后,此时验证、DFT、后端同时进行,设计方面开始根据spec编写Verilog;验证根据spec搭建UVM验证;DFT工程师也会搭建一系列测试框架;后端编写一系列的脚本文件。
2. 做FPGA开发转数字ASIC补充学习内容
1)ASIC时序更为复杂(时序优化问题,STA或DFT):性能评估和性能优化的各种优化手段,以及针对建立时间和保持时间的计算和优化。
2)功耗:ASIC存在各种优化功耗手段(系统级、架构级、代码级、综合、布局布线、版图等),门控时钟,门控电压,DVFS等。
3. 建议参考文献:
(1)Bhasker J, Chadha R. Static timing analysis for nanometer designs: A practical approach[M]. Springer Science & Business Media, 2009.
做STA分析的经典书籍(前端设计和后端设计都需要掌握,非常重要)
(2)这本书主要讲DC(Design compiler,synopsys公司的综合工具),synopsys公司一家独大!!




参考书籍下载地址:
三:做数字IC工程实需要具备你哪些技能
- 前端设计(数字芯片设计工程师)
紫光展锐:

总结主要工作:
(1)读文档和写文档。两个文档分别叫Function spec和Design spec。所有工程师都需要写很多文档,依照文档去做设计。读文档主要包含很多各种各样的协议,比如USB协议,SD卡协议等,文档占了前端设计工程师很大的工作量。
(2)编写代码。主要用到的语言是Verilog,有时候也会用到C语言和C++。写出的代码叫RTL,有经验的工程师写出的代码风格都比较好,因为代码最终都要变成电路,他们更加了解每句话最终变成电路是什么样的,这是比较核心的技能。如果是做SOC的工程师,那么对CPU也需要了解。
(3)Debug。非常重要的一个环节,对于前端设计工程师来说,大约20%的时间用来写代码,80%的时间用来debug,且前端设计工程师的debug会贯穿整个流程。
2. 数字验证

(1)读文档和写文档。两个文档分别称:Verification spec、Test plan。
(2)编程搭建验证平台:通常是用Systemverilog/UVM,如果做SOC,则用到C或C++。验证工程师也需要学习很多脚本语言,如Perl、Makefile、python等。
(3)Debug。创建测试用例,跑仿真。
(4)support。同样验证工程师也需要提供一些技术支持。
数字前端设计工程师和数字验证工程师的核心能力:
(1)学习各种标准/文档的能力。
(2)编程能力。
3. DFT(做DFT没有明确的划分)
(1)EDA工具使用。将DFT技术,常见的如Scan,Mbist,Boundary Scan技术,实现到设计中。
(2)编程。产生测试向量并验证测试向量,编程其实相对较少,基本是在原来的模板上去修改,对编程技能要求没有那么高,能做基本编程即可。根据实际情况,有些公司DFT也分为DFT Design和DFT Verification两个岗位。
(3)协助后端工程师完成test模式的时序收敛。
4. 数字后端

(1)逻辑综合。把写的代码综合成网表,当然,逻辑综合后面还有一些小流程,包括形式验证。
(2)自动布局布线。将把网表转化为版图。
(3)静态时序分析(STA)。数字后端非常核心的一个环节,怎样做好STA,怎样修掉timing至关重要。
(4)物理验证:最终变成版图之后,还需要做一些物理验证,主要是做一些DR,CR,LBS。
(5)功耗分析:对功耗做预估,后续对芯片做酵母分析的时候需要用到这些值
综上,后端设计工程师要做的事情是非常多的,但每家公司对后端的要求都不同,有些大公司里,上面5个步骤,每个步骤都有专门的人做,小点的公司可能就要多做几个步骤,甚至全部都要做,有的小公司可能不会去做功耗分析。
核心技能要求:
(1)EDA工具使用:需要掌握Innovus/Encounter,ICC/ICC2,DC等等多种工具。
(2)脚本语言:TCL、Perl、Python等。
(3)分析报告。
(4)修错误。
以上是本人最近调研的总结,欢迎大家一起交流讨论,有问题请指正。
刚开始学习数字IC设计时,应经常完善verilog和sv语法体系!
附上新手刷题网站:
日常巩固和入职前刷题网站:
verilog入门书籍(这本书挺薄的,讲的也比较基础):
芯片验证书籍推荐: