IC前端设计指逻辑设计,前端主要负责逻辑实现,通常是使用verilog/VHDL之类语言,进行行为级的描述,当然,也会要使用一些仿真软件;IC后端设计指物理设计,主要负责将前端的设计变成真正的schematic&layout,流片,量产;后端设计需要的则会更加多一些了,包括综合,到P&R,以及最后的STA,这些工具里candence和synopsys都有一整套系统的。打个比喻来说,前端就像是做蓝图的,可以功能性,结构性的东西,而后端则是将蓝图变成真正的高楼。
除了RTL编程和仿真这两个基本要求外,前端设计还可以包括IC系统设计、验证(verification)、综合、STA、逻辑等值验证(equivalence check)。其中IC系统设计最难掌握,它需要多年的IC设计经验和熟悉那个应用领域,就像软件行业的系统架构设计一样,而RTL编程和软件编程相当。适合作为IC设计的入门。还有一些即可以属于前端也可以属于后端的灰色领域,比如DFT(design for test)。
后端设计简单说是P&R,但是包括的东西不少,像芯片封装和管脚设计,floorplan,电源布线和功率验证,线间干扰的预防和修正,时序收敛,STA,DRC,LVS等,要求掌握和熟悉多种EDA工具以及IC生产厂家的具体要求。
(1) 阅读各种SPEC
最重要的一份spec是architecture spec,就是和你一起合作的架构设计工程师写的设计文档,比如下面这种:
其中需要重点了解的内容是:
features:这个模块需要支持的性能列表。
IO ports:这个模块对外的IO端口。
operation mode:这个模块的主要工作模式。
除了这份详细的设计文档之外,如果这个IP需要用到很多协议,那你自然还要去阅读一些协议文档,比如AMBA总线协议,MIPI协议,DDR协议等;
2. 撰写design spec
公司里面,工程师做事情之前都需要出一份详细的设计实现文档,设计工程师也不例外,你要出的文档叫做design spec,其中主要的内容包括:
设计平台架构:以SoC设计架构为例
IP设计架构:
3. 编写代码,搭建设计环境
design spec完成之后,接下来就要开始编写代码了,使用各种设计语言去搭建设计环境,常用的硬件描述语言有:Verilog, VHDL, SystemVerilog。以现在主流的IP设计平台为例:大概要去编写类似这样的文件:
好的设计平台是检验工程师优秀的一个重要标准,要考虑可重用性,可扩展性。好消息是,公司里面有很多已有的设计环境,你可以模仿,在已有的基础上进行修改就可以了。
4. 创建test cases,进行功能仿真
根据前面完成的详细test plan去创建设计需要用的test cases,每家公司对test cases的命名有一定规则,比如长这样的:
5. debug调试能力
设计和仿真用例都搭建好了,下一步重点就是进行功能仿真和问题调试(debug)了。前面的设计时间其实大概只占20%,debug才是最花时间的。
仿真所用到的工具主要有:
Cadence:IES
Synopsys:VCS
Mentor:QuestaSim
几款工具一个比一个好,当然价格也是一个比一个贵。工欲善其事必先利其器,要想提高你的仿真和debug效率,工具里面好的功能也要好好研究下。
debug的主要目的是寻找RTL的bug,当然前面搭建的验证平台也会存在很多bug,最终的目标就是所有的test cases都能完全仿真通过。
最主要的debug手段有:
查看log文件:仿真结束会生成很多结果文件。
看波形:最常用的工具就是verdi了
每家公司对于设计工程师debug的要求不尽相同,终极目标都是要求设计工程师能找到最终的root cause,共提出最终的解决方案;
6. support
上面讲到的,属于设计工程师的常规任务差不多就完成了,support属于进阶版的。比如项目用的database出问题了,跑仿真用的flow碰到问题了,经常就会叫设计工程师去support,帮忙解决问题;
support的问题不是强制要求解决的,但是如果你经常能帮同事解决这些问题,那你在公司的地位就能与日俱增,升职加薪就更有筹码了;
所以总结来说,数字IC设计工程师做的最重要的两件事情是:
RTL Coding
Bug Fix
由于芯片设计过程中的关联性,数字前端工程师的一些工作需要和其他工程师配合完成:
数字IC前端设计工程师打交道最多的就是前端验证工程师,一起讨论问题,经常一起debug case,目的就是让写的RTL(Register Transfer Level)代码没有bug。
还需要经常和架构工程师打交道,去了解更多芯片的整体架构和功能属性;如果你也负责后仿gatelevel simulation的话,那还经常需要和后端工程师打交道,因为后仿的网表是他提供给你的。
DFT工程师经常也会来找你,因为他也需要做测试和设计,很多时候他的仿真环境经常就是从你的设计仿真平台移植过去的;FPGA工程师也经常会打交道,因为FPGA设计也是数字设计的一种。
当然,如果你是在一家大公司的话,分工就非常明确,你也就不需要和这么多人打交道了,比如如果你只负责IP level的设计,那基本只要和前端验证工程师打交道就可以了。
现阶段,数字设计的方向很多,主要的有:
l CPU设计:Intel、AMD、ARM、兆芯、海光、
l GPU设计:Nvidia、AMD、ARM、Imagination
l MCU设计:基于ARM Cortex M系列的MCU是主流
l 音视频编解码设计:H.264, H.265
l 接口设计:DDR、HDMI、USB
l 手机芯片:高通、联发科、展讯
l 整机芯片方案:APPLE、华为海思、三星、
l 等等其他专业方向
每个专业设计领域需要你掌握的技能会有一定差别。一个初级工程师想全部掌握这些技能很难,很多时候设计工程师是沿着一个专业方向一直往下做,比如CPU,GPU设计等。
一个真正合格的数字IC设计工程师,需要不断学习更加先进的知识和技术。这边列举了目前数字IC设计工程师的一些技能。
Verilog: 目前的主流硬件描述语言,是设计工程师必须掌握的核心
学习Verilog的时候,很多时候我们并不是在学习这门语言本身,而是学习其对应的电路特征,以及如何对这个电路进行描述。
VHDL:军工领域用的多
SystemVerilog: 未来的趋势,SV将设计、验证和断言统一在一起
UPF: 电源描述,是低功耗设计的核心技术
Makefile
Perl
Python
Shell
Tcl
设计工程师经常需要流程的自动化,掌握一门得心应手的脚本语言将对你工作效率的提升帮助极大;
仿真工具:NCVerilog/ VCS/ ModelSim
波形查看工具:SimVision/ DVE/ Verdi
文本编辑器:Vim/ Emacs
“版本管理”工具:SVN/ CVS/ Git
Microsoft Office
在芯片设计的过程中,需要运用一些工具进行辅助和提高工作效率;
Windows
Linux
OS X
对于专业的数字IC前端设计人员而言,工作的方便程度,由方便到困难分别是:Linux > Windows > OS X;
ARM CPU架构
AMBA 总线协议
MIPI协议
DDR协议
PCI-E协议
熟悉一些协议和架构,对数字前端设计工程师是有很大帮助的;
MATLAB
ISE/ Synplify/ Vivado/ Quartus
LEC/Formality
VMM/ UVM
ESL
ZeBu Server
JIRA/ Confluence
C/ Assembly Language
Computer Architecture/ ARM Architecture/ MIPS Architecture
所有的技术类岗位,主要看的两点就是:专业技能(skills)和项目经验(experience)。所以除了上面列的这些技能,你能实际做过一两个项目,哪怕是IP级别的设计项目,也是很重要的,尤其是做项目过程中积攒的debug经验;