行业观察 | 芯片设计产业链:上游至下游

news/2024/11/23 9:27:56/

本文简单总结、介绍芯片设计产业链全流程。

更新:2023 / 7 / 2


文章目录

  • 集成电路产业链
  • 常见的芯片架构图
  • 数字IC设计
    • 流程
      • 概略版
      • 详解版
      • 前后端
        • 前端:RTL -> Netlist
        • 后端:Netlist -> Layout
      • 示例:基于标准单元(STD CELL)的ASIC设计流程
    • 指标
  • 参考链接


集成电路产业链

在这里插入图片描述


常见的芯片架构图

此处以 SoC 芯片为例,

在这里插入图片描述其组成为:

  1. 核( Core );
  2. 存储( MEM );
  3. 外设( IO );
  4. 总线( BUS );

数字IC设计

数字IC是传递、加工、处理数字信号的 IC,是近年来应用最多、发展最快的 IC 品种。可分为通用数字IC和专用数字IC。1


流程

概略版

确定项目需求
系统级设计
前端设计
后端设计
  • 确定项目需求
    市场进行调研,确定芯片的规格(功能、功耗、性能、IO外设等指标),对研发提出需求;
    研发来评估实现需求的可行性;
  • 系统级设计
    根据对芯片规格的要求,对功能进行算法设计,拿出设计解决方案和具体实现架构,划分模块功能;
  • 前端设计(逻辑)
    前端以设计架构为起点,以生成可以布局布线的网表为终点,目标是设计电路来实现想法。
    主要包括:RTL 编程和仿真( EDA 仿真验证 )、IC 系统设计、验证、逻辑综合、STA、逻辑等值验证( equivalence check )、硬件原型验证( FPGA 原型验证 )。
  • 后端设计(物理)
    后端以布局布线为起点,以生成可以送交 foundary 进行流片的 GDS2 文件为终点,目标是将设计的电路制造出来,在工艺上实现想法。
    主要包括:P & R(比如芯片封装和管脚设计)、floorplan、电源布线和功率验证、线间干扰及其预防和修正、时序收敛、自动布局布线、STADRCLVS 等。要求掌握和熟悉多种 EDA 工具以及 IC 生产厂家的具体要求。

详解版

在这里插入图片描述

  • Marketing Request(市场需求)
    市场进行调研,确定芯片的规格(功能、功耗、性能、IO外设等指标),对研发提出需求;
    研发来评估实现需求的可行性;

  • Architecture Spec(产品结构说明书)
    在需求确定后,开始撰写架构的文档。
    文档包括两个部分:整体架构规格书Top Architecture Spec )和 具体功能规格书Project Function Spec )。
    整体架构规格书 指的是要有什么模块,诸如 CPUSRAMDMAAMBA 等。
    具体功能规格书 指的是具体的指标,诸如 DMA 模块有多少个通道、总的时钟频率多少兆、支持的模式有几种等。
    该部分通常由架构工程师( Architecture Engineer )完成,或被称为系统工程师( System Engineer, SE )。该类工程师一般是较为资深的工程师。

  • Arch / Algorithm Emulation
    在设计好架构后就可以做架构、算法方面的仿真了。
    通常使用的是 CC++ 或者 MATLAB
    该部分通常由算法工程师( Algorithm Engineer )完成。

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

  • RTL Coding
    在设计规格书编写完毕后,就可以进行以硬件描述语言分模块以待吗来描述实现了。通常有 VHDLVerilogSystemVerilog 3种编程语言可供选择。
    该部分通常由设计工程师( Design Engineer )完成。
    对于 RTL Coding 部分,又可细分为以下3个部分,关系见下图:

在这里插入图片描述
IP Level RTL Coding
先有小的 IP,才能有大的 SoC
前面做设计是由顶向下,先有架构再有各个模块。
后面具体实现是由底向上,先有最小的 IP 级别的代码,才能集成更高层次的代码。

IP Level RTL SimulationIP Level Verification
设计好 IP 级别代码后就可以进行仿真验证了。小的 IP 的话通常是 Design Engineer 自己做的,但当 IP 较大时会有专门的验证人员来做。
在验证时,我们会用到一些脚本,比如 Makefile,用到的仿真工具主要有3大 EDA 厂商的 CadenceIncisiveSynopsysVCSMentorQuestaSim,其中 VCS 最为主流而 QuestaSim 用在小的 FPGA 开发上面。
在验证时用到的语言有 CC++SystemCSystemVerilog 还有 UVM 这么几种。
在做验证时也会做验证的 Spec 文档,想清楚验哪些点之后才会搭建环境、跑测例。
验证的核心是验证的完备性,所以要清楚 IP 级这个目标模块的 DUT,要测的功能点都有哪些,得分解全。

Unit / Chip Level RTL SimulationUnit / Chip Level Verification
IP 级别没有问题后,合成大模块 Unit / Chip Level,再来进行验证。
该部分通常由全流程验证工程师( Full Chip Verification Engineer )完成。

  • Logic SynthesisGate Level Verification
    RTL Coding 设计和验证没有问题后,此时会进行综合、会综合出网表。同时也会对门级网表做验证,称之为 Gate Level Verification。这个阶段更主要的是调试我们的验证环境,为后端物理实现之后的网表做准备。
    当前阶段的网表含有的信息较少,物理参数没有,跑起来会更快,方便于调试。
    网表的逻辑功能正确性的验证是通过 Formal Verification 去保证的,而不是 Gate Level Verification 去保证的。
    对于综合工具,当前主流的是 SynopsysDesign ComplierDC )。

  • 逻辑综合就是把设计实现的 RTL 代码映射到特定的工艺库,输出门级网表的 Netlist 【根据 LoadDriver 映射工艺库】。

  • 逻辑综合要基于特定的综合库。不同的库中,门电路基本单元( Standard Cell )的面积、时序参数会不一样。

  • Formal Verification
    逻辑综合和验证之后会进行形式验证,即 Formal Verification,简称为 FM。形式验证也可称之为 等价性检查Equivalence Check )。遍历所有到 ”锥底“ 的点的组合,加入到 ”锥底“ 的点有2个,那么组合有4个:00 01 10 11。这时候就会看门级网表 ”锥底“ 的结果是 4 个中的哪个,而 RTL 的结果是 4 个结果中的哪个,对比是否一样,称之为形式验证。
    形式验证的工具有 CadenceConformalSynopsysFormality
    从功能上( STA 是时序上)对综合后的网表进行验证,常用的方法是等价性检查方法。
    以功能验证后的 HDL 设计为参考,对比综合后的网表功能是否在功能上存在等价性。这样做是为了保证在逻辑综合过程中没有改变原先 HDL 描述的电路功能。

  • STAStatic Timing Analysis
    综合的网表除了要做逻辑等效之外,还需要做静态时序分析。
    电路的结构是 RTL 级别的,有 组合逻辑(与或非门)和 时序逻辑(D触发器)两种。
    对于 时序逻辑Setup / Hold(建立时间 / 保持)要求,组合逻辑 的延时会影响到这两个参数,有可能造成延时太长,造成违例。
    通常有几种解决方法:
    ① 把延迟大的 组合逻辑CELL 驱动换的大一点,让其延时减小。
    ② 在 组合逻辑 中插入 时序逻辑,即添加流水线的方式。
    静态时序分析 也属于验证范畴,主要是在时序上对电路进行验证,检查电路是否存在建立时间( Setup Time )和保持时间( Hold Time )的违例( Violation)。
    STA 以及综合通常都会用脚本实现,用的比较多的脚本是 TCL
    STA Timing 满足,才能得到最终的 Netlist(网表)。

  • DFTDesign for Test
    ——为什么需要DFT
    芯片制作是在一个 wafer 上面完成的,这个 wafer 实现逻辑电路通常会通过光刻、腐蚀等一系列流程,把 CMOS 管子在 wafer 上给做出来。在这个过程中,不可避免地会出现一些问题,比如腐蚀剂的量多了一点、光刻深度多了一点,导致 CMOS 功能可能不是按照我们正常的功能在运行,或者有些走线 stuck、短路等故障,所以需要做 DFT 电路。
    ——如何实现 DFT
    DFT 一般在网表基础上去插入的扫描链,将非扫描单元(如寄存器)变为扫描单元。
    ScanChain
    在芯片回片后,通过 DFTATPGAutomatic Test Pattern Generation )自动产生测试 Pattern,然后通过芯片的 IOPattern 灌入,这样就会把整个芯片里面的 D触发器 串成一个链,再把 Pattern 输出。通过对比输入 Pattern 和 输出 Pattern 以验证正确性,得出是否存在制造缺陷。
    那么,D触发器 一方面要实现要求的逻辑功能,一方面要实现测试( ATE ),此时会在 D触发器 的输入接一个 MUX,这个 MUX 有两路功能,MUX 的使能端是 SEScan enable ),测试的输入端 ATESIScan Input )。示意如如下所示,

在这里插入图片描述

MemBist
做逻辑的话我们会遇到大量的逻辑存储单元( Memory ),数字电路的逻辑单元有两种方式可以实现,一是通过 D触发器 来搭建,但是面积会比较大,二是通过定制 Memory 但是是模拟的 IP。通常对于 D触发器 我们可以进行 ScanChain 这样一个测试,那么对于 Memory 这个模拟 IP,我们会进行 MbistMemory Burn-In Scan Test )测试,Burn-In 表示天生的,即整个 PatternMemory 自己外面包了一层可以自己产生向量的电路,它会对 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 / LVSDesign 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
    RTLRegister Transfer Level),设计利用硬件描述语言,如 VHDLVerilogSystemVerilog,对电路以寄存器之间的传输为基础进行描述。
    RTL 阶段会做一些低功耗设计,此时更多的是做一个门控( Clock Gating )时钟的工作,主要是通过代码的风格来保证。

  • 语法检查
    除了语法检查,还有代码风格检查。要确保语法没有问题,才进行下一步仿真。
    常用的工具有 NlintSpyglass

  • 功能仿真
    从芯片架构书出来后就可以开始进行功能仿真了。会去写参考模型、测试规划( 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 的,是层级比较高的用例。后仿有问题,也会返回修改脚本(约束某条路径,让工具优化的更好些)或者代码(组合逻辑时延修改,让其满足我们的要求。)

  • STAStatic Timing Analysis,静态时序分析)
    套用特定的时序模型( Timing Model ),针对特定电路分析,检查电路是否存在建立时间( Setup Time)和保持时间( Hold Time )的违例,是否违反设计者给定的时序限制( Timing Constraint )。
    如果一个寄存器出现建立时间和保持时间的违例时,是无法正确采样数据和输出数据的,那么芯片的功能肯定会出现问题。

  • DFT 验证
    DFT 验证与上面的功能仿真验证是类似的,但是没有其做的复杂,因为它的电路结构一般比较固定,所以一般直接集成先前项目的 DFT 验证环境直接跑就可以,并且它的功能也没有 RTL 那么复杂。

整个设计流程都是一个迭代的过程,在任何一步中若无法满足要求,都需要重复之前的步骤,甚至重新设计 RTL 代码。


后端:Netlist -> Layout

在这里插入图片描述
后端大部分工作由工具自动完成,前端的 RTL Code 以及功能仿真环境用例,都需要人去分析需求规格,去写测试点,写测试策略测试方案。

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

  • Extract RCSTA
    前端的 STA 使用的是理想的时序模型( Timing Model ),即认为线之间是有负载的,同时时钟也会做一个过约束(正常是跑100M,但是在前端中国呢会以120M等更高的频率进行约束),实际上并没有实际的时序信息。实际 Cell 摆在哪里,两个 Cell 之间的走线延时等信息都是没有的,因为这个时候还没有布局布线,两个的位置都是不确定的,自然就没有这些信息。
    当位置确定后,进入后端后再做 STA 时才会真正的去提取这些延时信息( Extract RC )。由于导线本身存在的电阻,相邻导线之间的互感、耦合电容在芯片内部会产生信号噪声、串扰和反射。这些效应会产生信号完整性问题,导致信号电压波动和变化。如果严重,会导致信号失真错误。
    然后再做布局布线之后的 STA,此时时钟的时序路径就是更真实的。包括时钟,也是插了时钟树之后真正的时钟走线,时钟路径的延时也是更真实的。
    如果布局布线之后还有不满足时序的地方,也会退回去前面的阶段进行修改。例如,作 CELL 的替换后看看某些路径或者 CELL 的时序余量( Margin ),如果余量很大,那么就会替换成 CELL 比较小的,比如从 x4 换成 x2。驱动越小,CELL 的延时就会越大,越难满足 SetupHold
    该阶段的低功耗分析主要是替换 CELL 的类型,将时序比较好的 CELL 替换成功耗比较低的 CELL,但是这个阶段的系统角度上的功耗收益一般不大,也就 5% 左右,因此,低功耗设计主要还是依靠最初的设计架构和工艺选项。

  • DRC
    时序 timing 满足之后,接下来会做设计规则检查( Design Rule Check,简称 DRC ),检查连线间距、连线宽度是否满足工艺要求。

  • LVSLayout 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. 接口定义;

参考链接


  1. 数字IC前端后端的区别,数字IC设计流程与设计工具 ↩︎

  2. 数字IC设计流程 ↩︎


http://www.ppmy.cn/news/688592.html

相关文章

微信亲戚备注分组名称_【微信分组备注名称大全】qq分组备注名称大全

当我们运用qq查找朋友时,发现qq里面的朋友太多,名字也差不多,不确定谁是谁时,那么好友的备注分组名称就会体现出来很重要,不管对方如何改网名还是怎么的,你怎么知道他是谁。以下是烟花美文网www.39394.com …

对list进行分组

//对map集合分组List<Map<String, Object>> list new ArrayList<>();for (int i 0; i < 20; i) {Map<String, Object> map new HashMap<>();map.put("key", (int) (Math.random() * 10));map.put("value", i);list.ad…

微信公众号开发之用户分组

具体参照微信官方文档。 创建用户分组 /*** 创建分组* param groupName 分组名* return Integer 分组ID*/ public static Integer createPrizeDrawGroup(String groupName){String url "https://api.weixin.qq.com/cgi-bin/groups/create?access_token"getGlobalT…

List 分组 GroupBy

List也可以和数据表DataTable 一样按照对象的属性进行分组。 首先先穿件一个实体类 Goods 如下&#xff1a; public class Goods{/// <summary>/// 商品编码/// </summary>public string No { get; set; }/// <summary>/// 商品名称/// </summary>pub…

设置分组

这里暂时分成后台、前台 在app目录下 分别创建 admin index 目录 并且在子目录创建如下目录 │ ├─controller 控制器目录 │ ├─model 模型目录 │ ├─view 视图目录 │ ├─ ... 更多类库目录 │ │ │ ├─command.php …

MySQL中的数据分组

数据组&#xff08;group by&#xff09; 可以根据需要将查询到的结果集信息划分为较小的组&#xff0c;用 GROUP BY 子句实现。 一、Group by语法 GROUP BY 子句&#xff1a;GROUP BY 子句可以把表中的行划分为组。然后可以用组函数返 回每一组的摘要信息。 二、 使用分组原则…

对List的数据进行分组

对List的数据进行分组 一&#xff1a;我们平常在工作的时候可能会遇到要对List里面的数据进行分组,在jdk1.8中有方法帮我们解决,而在1.8之前我们要实现这样的功能就需要自己手动实现分组 我们先定义一个User类 public class User {private int id;private String contractNa…

分组+分页...

分组: /* * 1) 先搭建查询架子 select * from stu ---- 分析题干-------------- * 2) 使用 where 排除不参与运算的数据 * 3) 确定那个字段分组 写在 group by 后 * 4) 确定返回的数据 * select 后面的字段要么出现在 group by 后,要么出现在聚合函数中,否…