网志好读版:
https://reurl.cc/k0oyxb
(with自制解说图XD)
整理目前从系统厂担任BSP RD转职到IC design house担任Firmware engineer
一年半以来的心得...
希望透过由浅入深的介绍,说明我们这个行业是在做什么...
更希望给有心想要转职到firmware engineer的朋友或是新人们,
给予一个很基本的概念分享~
以下正文开始:
会想写这篇文章是因为最近有人问我担任系统厂的BSP RD,
后来能不能到Design house担任firmware engineer的这个问题...XD
目前我从系统厂换到design house已经超过1年半...
想说也可以整理一下这期间我自己的心得为何
也想说顺便介绍一下IC设计的大概流程,
以及到底之前在系统厂担任BSP学习到的什么能力,
可以应用在design house的firmware engineer
首先最一开始,先了解一下IC到底在我们的日常生活中,会在什么地方出现
从下图可知道,其实目前想像得到的电子产品,基本上都会有IC的存在...
"IC is everywhere..."
因此,我认为就工作机会的角度看来,从事IC设计的行业是一个不错的选择
好的,接下来就进入正题了~
IC有非常多种,而现在目前市面上的主流,就是所谓的SoC (system on chip) IC
意思是说,一颗IC可以被看作是一个拥有多种功能的系统
如下图举例,这颗SoC IC可能同时支援有display,audio,bluetooth等等的能力,
甚至是这几年很红的AI,也可以被嵌入在一个SoC里面
这边特别提到一下到底软件工程师在SoC IC的开发之中,到底扮演着什么样的角色?
由下图当作一个范例,假设SoC中有支援speaker(喇叭)跟recorder(录音)这两个硬件元件
那么这两个硬件元件如何才能够起作用呢?
答案就是需要SW firmware engineer根据HW designer的设计
透过软件的方式,产生相对应的程式码,去达到能够启动speaker跟recorder的目的
这样的程式码,我们称之为driver(驱动)。
上述所提到的程式码,最后会被build成一个档案,也就是我们俗称的firmware(韧体)
而这个韧体最后会在SoC中被执行。
有了HW component跟SW driver的存在,这样我们就可以开发一些我们熟知的软件应用
举例来说,音乐播放器中可以透过speaker driver去使用speaker
而录音机可以透过recorder driver去使用recorder
接下来就我目前所知的,来描述一下一颗IC从无到有的流程...如下图所示
(可能会有不完善的地方.. 请多包涵.. 小弟目前在design house资历尚浅XD)
(1) 订定spec
通常要做一颗IC,或著说要做IC中的某一个元件,或著功能(又称作IP)
第一件事情就是需要了解到底要做什么,以及如何去做
这样的过程,我们可以称之为叫做spec的定义
Designer必须要在这个过程把spec规格开出来,
并且详细地写成一份文件让相关人员review
(2) RTL coding
接着,就是进入到所谓RTL coding的阶段
也就是digital designer撰写程式的阶段
(3) FPGA verification
当RTL写到一个程度,通常就会透过FPGA (Field Programmable Gate Array)这样的平台,进行相关的验证
来验证自己写的RTL code是否正确
通常在实际的FPGA上面跑RTL code之前,会经过一个叫做跑simulation(模拟)的动作
来验证function上面是否work
举例来说,硬件预期2乘以3要等于6
那么在simulation stage上,就必须要得到6才行
(4) FPGA validation
FPGA verification基本上是以验证功能性为主
但是它毕竟是一个模拟的环境,而且速度很慢
执行同样的程式码,在IC执行1秒钟,有可能在simulation会跑好几个小时
实际在FPGA平台上面run code,基本上就是在做FPGA validation
这时候验证的流程会越来越偏向软件,因此firmware engineer从这个stage开始
参与开发的比重也会越来越高
基本上就是写一些测试的程式码,尽可能地压力测试硬件的功能
以上(2)~(4),我觉得应该是数位设计主要的范畴
(5) Placement layout
当数位设计的部分已经被验的差不多了
在请晶圆代工厂帮忙生产IC前
接下来会针对physical design的部分,进行一些优化的动作
这时候通常会请APR部门帮忙
因为像是IC的timing, performance等等的调整,都可以在这个stage做调整
(6) Tapeout
这个阶段就是真正请晶圆代工公司 (ex: UMC/TSMC)
根据我们开出来的制程(28奈米, 14奈米, 7奈米...)去真正将IC给生产出来
这样的IC,通常称之为ASIC (Application Specific Integrated Circuit)
每一次的tapeout,动辄都是花几千万,甚至上亿
而且如果IC生产之后才发现有硬件上的bug,也回不去了...
因此,在tapeout之前,每家IC设计公司都会尽可能的做很详尽的验证
(7) Packing & testing
生产完IC后,接下来通常会经过封装测试相关的公司
来帮忙验证说这颗生产出来的IC是否有什么问题,以及将它给封装好
最后再回到原厂,或是客户手上
介绍完生产一颗IC的流程之后,接下来针对firmware engineer的部分
自问自答三个问题,当作这篇的收尾:
1. Firmware engineer在IC design house要做的事情是什么?
2. Firmware engineer会学习到的东西是什么?
3. 踏入IC design house前的软件工程师(or新人)可以做什么准备?
1. Firmware engineer在IC design house要做的事情是什么?
如果要一言以敝之...我认为是...
"能够协助一颗IC开发所有可能的软件行为"
应该就是firmware engineer要做的事情
这可能包含:
a. 协助硬件在订定spec过程中的一些evaluation
假设有3种方法可以做,但是透过软件像是写Python, C++等程式语言帮忙分析
会比较迅速, 这时候软件工程师可以帮忙跟designer co-work来帮忙做评估
b. 写driver来驱动硬件
这部分当然算是firmware工程师的主菜
Driver我认为又可以分作是:
*without OS的driver
*with OS的driver
这边的OS,近年来最为人所知的,就是Linux kernel
一旦涉略到OS,通常需要follow这个OS的rule
像是driver init的方式,memory management的方式,interrupt的注册...等等
c. 整合软件的环境
在开发过程中,可能会有tool A, tool B, tool C
会有机会为了方便,需要将ABC三种tool整合成一个tool
因此,system integration的需求也是很有可能的
2. Firmware engineer会学习到的东西是什么?
这部分我认为每个人因应不同的职责,而会有所不同
因此可能会就我目前所学所看到的,比较主观的叙述这个part
*Knowledge of boot sequence
对我而言,一直以来是比较偏向负责系统整合的部分
所以我看到的范围,会相对比较广一些
用下图举例来说,我会看到芯片开机过程的行为
上电Power on之后,被烧死在芯片里面的某一块内存上面的开机程式
(称之为boot rom),就会开始运行了
接着它可能会带起第二个bootloader,进而把OS带起来,
最后变成我们熟知的user使用环境
用Android手机来举例的话,就是:
按电源键