数字ic前端和后端等学习路线是什么?
24 个回答
——来自公众号【TechDiary】
芯片从设计到实现的过程大致可以分为 前端(逻辑设计) 与 后端(物理设计) 工作。其中:
- 逻辑设计:将声明功能与特性的设计书转化为芯片的门级网表
- 物理设计:将门级网表转化为可以直接交付给代工厂的物理版图,进入流片过程
个人认为,如果有电路PCB设计经验的朋友可以将逻辑设计的产出理解为电路设计中的原理图,仅有电路单元与连接关系;而物理设计的产出就如同PCB文件,是经过布局布线后的文件;我们将PCB文件交给制板厂进行制作后就可以得到实际电路板,芯片的流片也是类似。
本文的主要内容是前端逻辑设计的流程,将分为以下几点介绍:
- 功能声明与架构文档的制定
- RTL设计
- 仿真验证
- 逻辑综合
- 静态时序分析
- 形式验证
一、明确功能,划分职责——功能声明与架构文档的制定
芯片逻辑设计的第一步就是要明确芯片需要实现的功能,以及一些对频率、面积、功耗的需求。在结合实际情况与以往经验的情况下,设计之初会形成一个明确的功能spec文档,接下来的所有工作将会围绕这个文档展开,其重要性可见一斑。
根据功能声明的文档,会根据以往经验提出相应的解决方案,进行架构的设计以及模块的划分,在这一步会确定系统的构成以及子模块的输入输出。
以上两个文档是整个芯片开发流程中的核心文档,描述出了芯片的“骨架”,通常需要经验丰富的工程师讨论制定。
二、心中有电路,手上有代码——RTL设计
在架构文档完成后,需要将划分出的模块逐一进行RTL的设计。
形成RTL的设计不仅仅是Verilog的编写,更重要,也更考验IC设计工程师能力的是对电路的掌控能力。也就是那句常说的话,“心中有电路,手上有代码”,所有的HDL语言 仅仅是 用来描述电路的,而不是设计电路的,新手时常犯这样本末倒置的错误,包括笔者自己。解决方法,笔者认为一个是在设计模块前都会预先大概画一下电路图,综合后再与综合出的门电路进行对照,可以锻炼自己的电路设计能力,还有就是多参考前人的经典设计,最近的推送的公众号文章也是出于这样的考虑。
书籍资料: 关于RTL的设计资料,首先是我们常用的硬件描述语言Verilog HDL的语言标准文件:
- 《IEEE Standard Verilog Hardware Description Language (1364-2001)》
如果需要加强数字电路基础可以参考下面这一本经典书籍,上半部分介绍数字电路,下半部分介绍MIPS体系结构,也有一版是介绍ARM体系结构,读者可按需采购:
- 《数字设计和计算机体系结构》
再推荐个人比较喜欢的一本书,从RTL层级描述电路设计建模,适合初入门的同学对建立对RTL设计的整体认识:
- 《轻松成为设计高手——Verilog HDL实用精解》(EDA先锋工作室)
下面这本书介绍了数字电路中的经典电路设计,也值得一看:
- 《硬件架构的艺术——数字电路的设计方法与技术》(Mohit Arora著 李海东等译)
如果对CPU设计有兴趣的同学可以尝试以下的书籍,从一条指令的CPU实现开始为你打开新世界的大门:
- 《自己动手写CPU》(雷思磊)
三、以汝之矛,攻汝之盾——仿真验证
芯片开发中的仿真验证是保证设计能够满足功能的一个重要部分。FPGA当中也会进行仿真验证,但是相比芯片开发缺乏一定的验证标准,当然FPGA可重复性编程的特点也注定了在验证方面花费过多的精力是难以获得等价的回报的。芯片的难点就在于一次流片代价极大,耗费的人力物力财力是不可估量的,因此芯片开发当中渐渐形成了仿真验证的体系。目前常用的验证方法学为UVM,验证语言为System Verilog。
System Verilog(简称SV)是Verilog语言的发展,相比于Verilog添加了面向对象编程的部分,对验证的支持更完善。
UVM是一个经过实践检验的验证方法学,它可以理解为一个函数库,经过库的封装和一些固定用法提高了验证平台的可重用性,使我们可以在改动很小一部分代码后实现新的仿真激励。UVM验证的核心在于随机激励,抛开验证方法学和语言来讲,验证的目的就是从各个角度测试系统的正确性与稳定性,随机激励是能够满足现实条件与测试要求的一种方法。
那么什么时候验证就算完成了呢?验证有评价进度的指标, 一方面是代码覆盖率 ,包含行覆盖率、翻转覆盖率、分支覆盖率、条件覆盖率、有限状态机覆盖率,可以看出这些指标是客观评价代码的。 另一方面是功能覆盖率 ,功能覆盖率是指当前设计能够满足的功能点占比,功能点则是之前功能文档中的人为设定的。
代码覆盖率是 客观 上的评价,功能覆盖率是 主观 上的评价。当代码覆盖率接近100%(通常达不到100%),功能覆盖率为100%(必须达到100%)时,验证的工作就结束了。此时通过验证测试的RTL具有一个特性:RTL内所有的代码都是有效的且经过了测试,并且功能能够达到文档中列及的功能点。
**书籍资料:**验证方面的书籍资料较少,相应的选择也少,给大家推荐最经典最受欢迎的书籍:
首先是要学习System Verilog语言,业内经典书籍绿皮书:
- 《System Verilog验证——测试平台编写指南》(克里斯·斯皮尔著 张春等译)
之后要学习UVM方法学的话推荐下面的书籍,开篇也是直截了当逐步构造了一个典型的验证平台,之后仔细详解平台中的每个组件:
- 《UVM实战(卷I)》(张强)
下面这本书籍也是非常受欢迎的,但是由于笔者没有拜读过,因此不做过多评价:
- 《芯片验证漫游指南》(刘斌)
同时,最重要最权威的还是要研读UVM的标准手册:
- 《Universal Verification Methodology(UVM) 1.2 Class Reference》
EDA软件:
常用的仿真验证EDA软件有VCS、Verdi、QuestaSim、NC-Verilog等,分属于不同的公司,仿真EDA只要学会一种就可以了,其他的也大同小异。
四、把萝卜放到坑里——逻辑综合
逻辑综合的主要作用,是将RTL代码描述的电路映射到目标库中的电路单元,在映射过程中,还会根据目标库电路单元的特性优化改变电路结构。逻辑综合现在已经被EDA软件承担了绝大部分的工作,工程师需要做的是为EDA软件指路——设定约束,对面积、时序等关键参数进行人为的干预,使综合出来的结果能够满足要求。这里需要提的是进行到逻辑综合步骤时,设计已经经过了功能仿真验证,进入到逻辑综合的RTL设计已经不会再变。
书籍资料:
逻辑综合软件大多使用Synopsys公司的Design Compiler(DC),关于综合的指令大家还是要参考官方的用户指导,上面有非常详细的介绍:
- 《Design Compiler User Guide》
关于逻辑综合需要的知识是方方面面的,尤其是时序方面的知识,这一部分的书籍可以参考后面静态时序分析的推荐书籍,在此就不再赘述。
EDA软件:
主流逻辑综合软件 Design Compiler
五、时间管理——静态时序分析
逻辑综合之后生成的带门延时的网表文件如何能够保证与RTL的设计具有相等的功能表现呢?在FPGA当中,我们经常使用综合后仿真结果检查设计是否还能够与功能仿真一样完成既定功能,但是有过这样经历的朋友肯定对仿真速度有着相当深刻的印象。相比功能仿真,综合后仿真由于加入了更多运算信息,仿真的速度大大下降。
因此芯片开发中换了一种思路,那就是 静态时序分析+形式验证 。
- 静态时序分析保证了网表设计不存在时序违例的情况
- 形式验证保证了网表文件与RTL设计具有相同的电路功能
静态时序分析是数字电路中的核心部分,建议大家都学习一下相关的知识。如果需要了解建立时间保持时间的概念,可以参考之前的文章《一文解决建立保持时间的大部分困惑》
书籍资料:
首先是静态时序分析EDA软件的用户手册:
- 《PrimeTime User Guide 2016》
讲解时序分析及时序约束的书籍首推还是下面这本:
- 《综合与时序分析的设计约束》
EDA软件:
Synopsys公司的 PrimeTime
六、大家来找茬——形式验证
前面提到过了,形式验证的目的是确保综合出来的网表文件与RTL的设计功能一致。在这里提一下,进入到形式验证的网表须是已经经过静态时序分析之后的网表。经过形式验证过后的网表才是一个真正能交给后端物理设计的网表。经过了这么多层次的设计验证,才能够保证生成一个能够达到目标功能点、满足设计特性的网表文件,可想而知芯片开发的流程是多么复杂又严谨,一枚小小的芯片中蕴藏了多少工程师的智慧与心血啊!
书籍材料:
《Formality User Guide 2016》
EDA软件:
Synopsys公司的 Formality
公众号【TechDiary】,专注技术分享
谢邀。
数字前端主要有开发和验证。
对开发来说,基本的电路知识,rtl coding是必须熟练掌握的。看看数字电路设计,最重要的是自己动手写代码,仿真,以及调试。
建议先从一些基本模块入手,分频器,异步fifo,状态机,找块fpga开发版,实际调试下。fpga里面有很多资源,各种宏模块,熟悉下原理。
然后多熟悉下常用接口和总线协议。比如串口,iic,spi,amba等。
后面就是针对具体业务的各项标准和协议。这也是数字前端有意思的地方。虽然底层大家都一样,到涉及到业务方向就是隔行如隔山,做通信跟做多媒体就差别很大,做通信又有有线和无线,数字前端就是把各项标准协议算法翻译成电路的过程。
所以说从事哪方面业务,对什么产品感兴趣才是前端开发最重要的。
如果要做验证,rtl编码能力要求倒不是太高,但也要熟悉业务标准和协议,验证最重要的工作是搭建一个完备的验证平台,以及创建各种case,这个需要会uvm,system verilog,c++。趋于面向对象开发。
另外一个很重要的就是调试能力。小工程可能fpga随便跑跑,抓几个信号就看出来了,但对于一些大工程,编译版本都需要很久的,就需要能够设计合适的调试节点,能够快速的定位出问题。
以上是前端,对于后端来说,我觉得最重要的就是芯片实现原理,脚本知识,以及eda工具的使用。
从逻辑综合开始到pr,以及时序分析,功耗分析等,随便一本书都有整个流程介绍。
芯片东西还是挺多的,要讲的也太多。
慢慢学吧。
祝好运。