作者agmoagmo (小铭)
看板Tech_Job
标题[心得]从系统厂BSP RD到猪屎屋Firmware engineer
时间Fri Oct 16 08:58:35 2020
网志好读版:
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手机来举例的话,就是:
按电源键 --> power on --> boot rom --> bootloader --> Linux kernel
--> Android OS --> Framework & Application
上面是我所认为的基本开机顺序
必须每个关卡都顺利,才能开机成功
在这之中,如果有硬体任何元件有错误
(像是UART, sd card, timer, interrupt controller...etc)
都有可能会造成开机失败
这时候有可能要去查看log以及相对应的spec,才能找出root cause
*程式码的整合
如同上一个part所提到的,firmware engineer很有可能会涉略到软体方面系统整合的工作
这可能会牵涉到:
如何去build code
了解到如何撰写makefile,使得可以build出想要的firmware
了解到cross compiler的使用
如何maintain code base
和同事间一起开发/分工的过程
git的使用 (我自己主要是用git)
*和designer的合作
这应该是我觉得比较难得的部分
通常designer会出一份programming guide请软体按照上面的spec
撰写出HW元件相对应的driver
但有时候不一定会按照上面所写的运作
这时就需要请designer拉讯号出来做debugging的动作
软体帮忙找出好复制的方式试着模拟情境,让HW的人方便找到root cause
因为需要密切合作,其实firmware engineer也会比更上层的软体工程师了解硬体运作的原理
像是软硬体之间的沟通方式,interrupt需要怎麽设定,register如何填写等等的
是我觉得最核心关键的地方
3. 踏入IC design house前的软体工程师(or新人)可以做什麽准备?
如果有心想要往IC设计公司的firmware engineer发展的话
我认为可以做以下这些准备:
纯技术部份:
*将C语言练得更熟一些
通常在写driver的时候,程式语言都是用C
因此,我觉得将C练得更滚瓜烂熟,是有帮助的
重点其实也是常常面试考题会考的部分 (pointer, structure, function call, ... etc)
*作业系统的概念
这也是要做嵌入式系统方面的工作,必定要复习的部分了...
重点一样也是面试常考的那些 (interrupt, synchronization的处理...etc)
*如何在Linux kernel系统中撰写一个driver
虽然我觉得这可以进公司再学,不过事先学好也是很不错
重点在於dts, platform driver, interrupt handler (又称ISR)...etc
其他辅助部分:
*Presentation的能力
跟之前在系统厂时相比,在IC设计公司工程师开会讨论spec或是问题的频率高非常多
为了降低来回沟通的次数,我觉得清楚表达的能力很重要
这里指的清楚表达,不仅仅是口头上的清楚
有的时候可能是透过一张架构图,抑或是一张投影片让对方了解自己的想法
尤其是设计初期,在如何做之前,
常常会有一个brainstorming的阶段,
需要寻找灵感,也就是要做什麽。
*英文
这应该...就不用多做说明了XD
虽然目前没什麽用到英听跟口说的机会
但是至少reading跟writing的部分能有加强也是建议加强~
目前以来的心得:
相较於之前在系统厂担任BSP RD,我觉得在IC设计里面担任firmware engineer,
最大的差别,应该是在於有更多事情需要靠自己去study,trace code
看原厂spec,看网路相关的论坛 (ex: stackoverflow),才能够去解决
跨部门的同事都很忙,其实不一定能够帮你,凡事靠自己,觉得是练功的好所在。
之前在系统厂,还能够开issue问vendor
但是现在自己就是vendor,很多know-how都需要自己去发掘了
因此,到现在,我都还是常常觉得东西永远学习不完,
每天都有新的东西要学的感觉... 但,目前我还是享受这种感觉的。
如果是为了赚更多钱,确实,来IC设计薪水会比台湾的系统厂高上一个level
但对於未来生涯规划,想持续精进自己的技术力
我认为这也才是IC设计公司的一大卖点~
以上
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.116.224.31 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Tech_Job/M.1602809917.A.861.html
1F:推 ianwind: 推 10/16 09:00
2F:推 robert0934: 推 10/16 09:05
3F:推 jason61206: 推 我问的我自首 10/16 09:05
4F:推 z22622003: 推一个 10/16 09:15
5F:→ agmoagmo: 三楼XD 10/16 09:18
6F:推 specialrain: 推 10/16 09:20
7F:推 freedls: 分享推 10/16 09:21
8F:推 ToshiieMaeda: 推 谢谢分享! 10/16 09:22
9F:推 q3331333131: 推 谢谢分享~ 10/16 09:24
10F:推 aassdd55: 推 10/16 09:28
11F:推 caeserhaha: 推推 10/16 09:29
12F:推 BingLing: 推 10/16 09:31
13F:推 boss0405: 推 不过个人认为,底层FW作久了可以往上层的Host Driver 10/16 09:33
14F:→ boss0405: 走,ㄧ来可以更了解整个大系统架构,二来不愿帮HW背锅XD 10/16 09:33
15F:推 transforman: 只能推惹 10/16 09:37
16F:推 ggBird: 推 10/16 09:46
17F:推 bloodrain: 好文, 认真分享推 10/16 09:49
18F:推 ShofTequil4: 推 10/16 09:55
19F:推 sxbear: 强 10/16 09:58
20F:推 cml0123: 详细推 感谢分享 10/16 10:06
21F:推 hongwl030: 推好心又详细 10/16 10:07
22F:推 s5517821: 满详细的 10/16 10:08
23F:推 jackcomtw: 推心得 10/16 10:13
24F:推 heerodream: 推 10/16 10:15
25F:推 heerodream: 如果还在系统厂深蹲 并且常接触IC vendor的 请记得所 10/16 10:17
26F:→ heerodream: 有问题都要挖到root cause 不要得过且过 对以後跳IC d 10/16 10:17
27F:→ heerodream: esign是很有帮助的 10/16 10:17
28F:→ agmoagmo: 推楼上 确实多trace code是有帮助的~ 10/16 10:18
29F:推 julie4377: 感谢分享~ 10/16 10:19
30F:推 WJHinbbs: 写的详尽清楚 10/16 10:19
31F:推 alibodawahah: 推推 10/16 10:21
32F:推 edwardlu0325: 推 10/16 10:33
33F:推 pig5212tw110: 推 10/16 10:44
34F:推 Riiku: 推 10/16 10:50
35F:推 nelso: 给推 IC设计原厂真的要学很多 10/16 10:52
36F:推 gank9527: 推 10/16 10:53
37F:推 BaaaSwin: 好久没看到分享文了 10/16 10:57
38F:推 kevin925: 推推 10/16 11:02
39F:推 misomochi: 好文推 10/16 11:04
40F:推 agod10823: 推 10/16 11:12
41F:推 L7N: 推推推 10/16 11:17
42F:→ dslite: 台湾走asic, fw都填一填register就会动了 10/16 11:18
43F:推 yslj8255: 推 10/16 11:25
44F:推 massrelay: 推 10/16 11:26
45F:推 j02850: 推好闻 10/16 11:33
46F:推 cory1221: 推 10/16 11:33
47F:推 guo1111: 推 10/16 11:34
48F:推 st903202xp: 推 10/16 11:45
49F:推 kk6401allen: 推 10/16 11:51
50F:推 tpegioe: 推,详细的人体入门介绍 10/16 11:54
51F:→ tpegioe: 更正:推,详细的韧体入门介绍 10/16 11:55
52F:推 iamala: 推分享 10/16 11:56
53F:推 bena5mail13: 真的用心 推推 10/16 11:59
54F:推 boomga78940: 推 好文分享 10/16 12:04
55F:推 krizarlid: IC厂韧体真的很充实。。。。 10/16 12:09
56F:推 mdmmd: 推 10/16 12:12
57F:推 smartQ: 推 10/16 12:12
58F:推 ttuys: 推 10/16 12:16
59F:推 violetalan: 给100个赞 10/16 12:29
60F:推 bb159372468: 太感谢前辈了,对我这个新鲜人来说真的太有帮助了, 10/16 12:35
61F:→ bb159372468: 自己在面试过程中以及自己爬文找到的资料都是很大概 10/16 12:35
62F:→ bb159372468: 念的flow,这个详细太多了,万分感谢! 10/16 12:35
63F:推 cajole145: 推。这篇可以M 10/16 12:35
64F:推 change5278: 推 10/16 12:37
65F:→ labbat: 测试的方式好寒酸 操作的流程好缓慢 10/16 12:41
66F:→ labbat: 原来不能改fpga 难怪 10/16 12:43
67F:推 licg4210: 推详细 10/16 12:43
68F:推 weilun911: 推 10/16 12:44
69F:推 cscjp6: 推 10/16 12:44
70F:→ sc1: board support package BSP蛤 10/16 12:46
71F:推 HHH555JJJ: 推 10/16 12:48
72F:推 kjay: 谢谢前辈 10/16 12:49
73F:推 yaote: 好文推 10/16 12:54
74F:推 fatcall: 推 10/16 12:55
75F:推 gosh717: 推 10/16 12:56
76F:推 leo850319: 感谢分享 10/16 12:57
77F:推 uj2003: 同意boss FW要帮HW擦屎 有功是HW的 有锅FW要背 10/16 12:57
78F:推 confucamus: 推 10/16 12:59
79F:推 Jacal: 清流好文,推一个! 10/16 12:59
80F:推 yuffieAK47: 推 10/16 13:03
81F:推 javy0521: 推 10/16 13:03
82F:推 bluemkevin: 大型SOC等级的FPGA 要达到 IC 的操作频率是不可能的 10/16 13:04
83F:推 cocochris: 推推 10/16 13:07
84F:推 kfrog7040: 推 10/16 13:08
85F:推 james732: 推认真文,不过之後客户买产品後出问题应该也要支援? 10/16 13:23
86F:推 dajike: 推 10/16 13:24
87F:推 Eric0605: 推 10/16 13:29
88F:推 Fiesta5566: FPGA不能说它是个模拟的环境, 它跟ASIC的运作是一样的 10/16 13:53
89F:→ Fiesta5566: 只是FPGA是给你一堆既有的基本元素 你把它们接起来 10/16 13:53
90F:→ Fiesta5566: 位置跟走线规划都远差於ASIC 这是同制程还是慢的原因 10/16 13:53
91F:推 as891339: 推 10/16 14:09
92F:推 kentin: 好文m起来 10/16 14:12
93F:推 Jiraya: 推 整理的很好 10/16 14:16
95F:推 h0910299349: 写的很详细 10/16 14:40
96F:推 jerboaa: 推 笔记 10/16 14:57
97F:推 charliebitme: TL;DR 10/16 15:04
98F:推 edwardhsu: 我还是继续在系统厂开issue就好 我就烂o_o b 10/16 15:08
99F:推 bluemkevin: FPGA 一般来说叫 Emulation 除了FPGA 板,还有其他 Em 10/16 15:13
100F:→ bluemkevin: ulator 10/16 15:13
101F:推 rancilio: 感谢分享,虽然跟我不同行,但是多了解上游也是不错 10/16 15:20
102F:推 testUI: 好文 10/16 15:27
103F:推 KCer: 推推 10/16 15:54
104F:推 Consun: 推 10/16 16:13
105F:推 Byzantin: Victor哥又帅又强 10/16 16:26
106F:推 gofunfull: 推 10/16 16:32
107F:推 clforever: 推 10/16 16:36
108F:推 benedict76: firmware缺点就是google 查不到什麽资料,知识都要靠 10/16 16:42
109F:→ benedict76: 问的才有办法学到。 10/16 16:42
110F:推 yi24: 请问 without OS 的 driver 是指直接将适当的值填入 IC 的 r 10/16 16:48
111F:→ yi24: egister 就能带起相关的硬体功能吗? 10/16 16:49
112F:推 iamwolf: 借问 理工科系怎样能当系统厂rd 10/16 16:51
113F:推 Fiesta5566: 直接去GG就好 10/16 16:57
114F:推 abc127845: 推 10/16 17:07
115F:推 Brioni: 推 10/16 17:14
116F:推 benedict76: 会c,物件导向,java,design pattern系统厂随便你选 10/16 17:15
117F:→ benedict76: ,然後记得要有国立硕士。 10/16 17:15
118F:推 beatmaniadj: 认真文,推 10/16 17:51
119F:→ bcew: 回楼上,没OS就是了解CPU上电後怎麽开始跑startup.s,然後 10/16 18:07
120F:→ bcew: 跳到main()後可以用c code,对chip各IP填register做初始化让 10/16 18:07
121F:→ bcew: 它们动起来,再来就根据各IP的规格,处理各IP的事件。 10/16 18:07
122F:推 ymcee: 推 谢谢前辈指引 10/16 18:08
123F:推 s9001055: 推 10/16 18:12
124F:推 mlbay: 推 10/16 18:17
125F:→ lingerptt: 谢谢详细介绍分享 10/16 18:36
126F:推 jdchbo: 感谢超棒的分享 10/16 18:40
127F:推 jomaysong05: 详细推 10/16 18:57
128F:推 yi24: 谢谢 119 楼 b 大解说 10/16 19:02
129F:推 seal46825: NAND Controller fw就没os 10/16 19:02
130F:→ seal46825: 但是很多演算法要学也不容易 10/16 19:02
131F:推 questioner: 推ㄒㄧㄤˊㄒㄧˋ 10/16 19:16
132F:推 yeihow: 推 10/16 19:26
133F:→ agmoagmo: 感谢119楼b大补充~ 10/16 19:38
134F:推 superex: 推 10/16 19:40
135F:推 hpeng: 赞 10/16 20:49
136F:推 ricebb: 感谢您的高抬贵手 10/16 20:49
137F:推 Lukas8b90G: 推 10/16 21:03
138F:推 homer00: 推分享 10/16 21:05
139F:推 joshualiu: 优文 10/16 21:10
140F:推 E33258: 推 好详细!! 10/16 21:17
141F:推 stud20806: 推 10/16 21:21
142F:推 mixcookie: 推推! 10/16 21:25
143F:推 CarlOrz: 好文推推 10/16 21:27
144F:推 appie1161695: 好优 10/16 21:44
145F:推 Satansblessi: U质文推 10/16 22:07
146F:推 bartester: 推 难得的优文 10/16 22:16
147F:推 jack7923love: 推, 重点在於肯不肯去了解原理。 10/16 22:26
148F:推 cocoyoyo: 推 10/16 22:50
149F:推 jnyaotn: 推 10/16 22:56
150F:推 ktu5223: 推 10/16 22:58
151F:推 Qoo20811: 希望各大designer不要偷Rule 不然每次帮忙DRC和JDV都很 10/16 23:09
152F:→ Qoo20811: 痛苦QQ 10/16 23:09
153F:推 lpoijk: 阅 不管在哪里 自学能力都很重要 10/17 00:15
154F:推 josh0114: 推 10/17 02:05
155F:推 asdg62558: 推 10/17 03:11
156F:推 yolo2380: 推~写的很清楚 10/17 08:48
157F:推 ohbravo: 推~ 10/17 09:45
158F:→ brightest: 看IC配的CPU CPU越强FW能做的事越多 10/17 10:00
159F:推 stonez: 推 详细 10/17 10:04
160F:推 tannie1005: 推 10/17 11:08
161F:推 wynton: 推 10/17 11:55
162F:推 dapu: 对於不懂ic设计产业的人 这是篇好文 10/17 12:06
163F:→ bnd0327: 推详细 10/17 12:40
164F:推 brian6607: 推 10/17 12:42
165F:推 leon1757tw: 推 10/17 13:02
166F:推 sixty60: 很用心仔细的介绍 受教了 10/17 13:18
167F:推 sadfasdf: 推推 10/17 14:14
168F:→ cates: 还少了验AIC 焊接 支援客户 跑闳康(照EMMI FIB nFIB) ,示 10/17 15:24
169F:→ cates: 波器 电表 电源供应器真的算基本工具.. 10/17 15:24
170F:推 gelegelego: 推 10/17 17:26
171F:推 applejuice64: 赞 10/17 21:33
172F:推 Jeniberg: 推 10/18 01:14
173F:推 newest: 推 10/18 03:03
174F:推 loveFigo: 推,超详实的好文 10/18 07:11
175F:嘘 JerrySue0086: 晶晶体真的只能嘘 10/18 08:29
176F:推 willy0206: 我在小系统厂 vendor不甩都得自干... 10/18 11:21
177F:推 jimmy983: 推详细好文 10/18 13:45
178F:推 becalm: 好文推 10/18 14:09
179F:推 lookat: 推 10/18 14:11
180F:推 Polestar: 推推 10/18 14:40
181F:→ Polestar: 我在系统厂觉得底层的东西 看完这篇才知道有够上层XD 10/18 14:40
182F:推 derekQQ: 已笔记 10/18 16:09
183F:推 Litfal: 写fw其实很少有完整的物件导向能用 10/18 18:07
184F:→ Litfal: 其实还少提一堆类比段的东西,那些也很可怕 10/18 18:08
185F:→ Litfal: 凡事靠自己(x) 出问题要有能力抓对人(o) 10/18 18:10
186F:推 Narce: 推! 10/18 19:32
187F:推 lonely1002: 好文分享给推 10/18 21:24
188F:推 gr2es60410: 推详细 10/18 22:15
189F:推 bobsonlin: 推 10/19 01:49
190F:推 anakindon: 推推 好详尽的介绍! 10/19 10:42
191F:推 gugeegee: 系统厂BSP跳IC设计有相同感受,不过研究所本来就做IC设 10/19 10:54
192F:→ gugeegee: 计所以多多少少有认识 10/19 10:55
193F:推 crazytia: 推 10/19 11:23
194F:推 skevin: 精准 这也是为啥系统厂bsp engineer 抄公板 改一改会动 10/22 12:45
195F:→ skevin: 以爲自己就屌上天了 没想到後面的事这摸多是靠你这种人准 10/22 12:45
196F:→ skevin: 备好的 10/22 12:45
197F:推 Incentive: 推好文 10/24 02:25
198F:推 bluesox: 你写的不错,很用心 给推 01/08 22:25
199F:推 blue41403: 谢谢分享 受益良多 02/28 18:34