一个从刚入大学就励志做CPU设计到毕业后如愿以偿的故事!

来源:EETOP BBS  作者:Romer

注:这是《我的处理器之路》更新后的完整版。本文记录了作者从入学准备学习CPU设计,以及在学校的几年时间里一步步走来,不断提高,最终找到自己满意的工作,走上了CPU设计之路的故事!


虽然不是什么大神,但觉得自己的经历或许对新人有帮助吧!      收到大学的录取通知后,我便准备着迎接大学生活,虽说那时还没进大学的门,但心中早已埋下种子--找到自己的兴趣 。
大一时,我们学习了C语言编程,便想着第一个寒假学学编程(当时只觉得不应该荒废掉那宝贵的假期),结果由于种种原因放弃了编程,觉得要深入学习的话,没那个耐心。大一期间受到舍友的影响也开始学习单片机(另一个原因就是好奇:处理器是如何识别代码然后执行程序的,这就是学习处理器设计的根本原因),断断续续买了两款开发板,一直闲到现在,因为往上走就是嵌入式了,还是搞编程之类的,心里有点抵触就没再继续。还有另一个原因:班上有一个同学从大一入学一直自学一些东西,最终在大一结束的那个暑假拿了省一等奖,他在单片机,设计电路方面比较了解了,就去请教了他,因为他那次做的是硬件,就推荐我学硬件了,说是学硬件一旦技术强了,很吃香的,结果我就信了。然后推荐我准备下一次电子设计大赛,我采纳了他的建议。然而若没采纳他的意见,我不知道会不会走到现在。
(14年的九月)重点来了,大家都知道参加电子设计大赛,数电模电是基础,而我先开始准备学习的就是数电,自己找图书馆的书学习(大二第一学期还没开数电课)。然而我找到的那本书就是《数字设计和计算机体系结构》:从晶体管讲到数字电路设计,再到硬件描述语言,然后是体系结构,再到微体系结构。它涵盖了很多领域的知识,他第一次为我揭开了处理器神秘的面纱。找到它之后就如同捡到珍宝一样,那段时间,每天都抽出课余时间自己学习,过的很像我期盼的生活:源自于内心的诉求去学习一门知识。然而学完那本书之后,突然感到空虚了——下一步该做什么呢?(此时电子设计大赛早已抛到九霄云外了)答案是:分析or1200源代码,从代码的角度去理解一块已经成熟的处理器整体框架结构。经过一段时间的分析,已经熟悉了内部关键部件及整体系统运转的原理,此时万恶的英语四级到来了,不得不放下手头的代码去备战英语了,况且期末考也来临了!(由于我粗鄙的认识,有一段时间常常觉得就算把or1200分析的很透彻,又有什么卵用呢?能干个什么呢?自我怀疑了好长一段时间)。
然而在那无聊透顶的复习期末季除了加深了学过的专业知识,又收获了一个惊喜,这当然得益于我对图书馆的钟爱——没事就去感兴趣的栏目前寻找一些有用的书籍。一天,复习得身心俱备,就去处理器设计栏目浏览书籍去了,惊喜来了,那就是《现代处理器设计-超标量处理器设计基础》。它讲的内容比较贴近实际的处理器核心了(intel p6),当时没多想什么(自己设计超标量处理器,然而这就是现在就在做的),纯粹的兴趣使然,当时的第一感觉是:原来还有更高端的玩意啊!于是果断列入寒假计划之中,事实是寒假(50天)就只干了两件事:

1,考驾照;

2,学习那本书。

另一个惊喜接踵而来。15年2月2号下午,在网上之前注册了coursera一个账户一直没用,就登上去浏览了处理器之类的课程,结果我竟然找到了普林斯顿大学现代处理器设计的课程,主讲竟然是一个MIT的大神,点进去看了一下,他竟然还是一家处理器设计公司的联合创始人,自己设计了几款高性能处理器。第一节课,就拿着自己的处理器开发板在那鼓励学生敢于尝试,勇攀高峰,我的第一感觉是有处理器设计经验的人讲授这门课,那肯定是一流的啊,很认真的态度就在那时建立的,前面的20多节课,该听的都一字不落的全部要弄清楚,有时一段20分钟的视频可能要用我1个小时的时间,然而我愿意。大神讲课,你往往都觉得自己是有能力去做的好的。令我激动的是,老师推荐的了两本教材我都有,一本便是上面所说的《现代处理器设计-超标量处理器设计基础》,另一本是自己买的计算机体系结构:量化研究方法,5th。愉快的假期总是那么快,开学了,我继续走我的处理器设计之道(显然当时选的这条路很广,处理器设计包含很多流程,相应的知识层次也大都不同),经过满满的思考与学习的深入,发现自己喜欢将设计算法转化为数字逻辑和电路的这个过程。
于是凭着寒假的知识储备,我打算从画模块图开始将理论转化为实践,渐渐地将重要部件的电路画出来。然而当缺乏一个整体的规划时,这么复杂的一个系统,很难按计划实施下去。大二下学期(开设数电课程了)我便下意识地去请教数电老师了,当老师听了我的想法后便坚定地说道你一个电子工程的直接用现成的处理器就行了,干嘛要自己设计呢,intel公司每年花那么大人力财力去设计处理器,你觉得你有必要那么做吗?你根本不行的然后推荐我去学习单片机之类的比较实际的一些东西!我当时懵了,一个老师竟然可以这样嘲笑我的梦想,况且我并没说是要设计出多么先进的东西来,只是为了增加设计经验,了解更多的知识。然而老师还有事,就剩下我一人在怀疑人生。然而我仔细想了想,除了这个我暂时找不到能带给我如此多乐趣与感触的学科了,上大学不就是为了找到自己的兴趣,发现自己人生轨迹吗,既然当初报考的时候填报专业有点失策,难道要一次再错吗?不,我觉得我必须把这个做下去(傻瓜在此时才会放弃这么好的事)
事实证明,我的坚持换来了回报,分为四件事。

1,遇到了志同道合的EDA实验室老师,老师愿意提供所取得FPGA开发板,两人可以讨论数字电路方面的问题。

2, 接着,我找到了一本重要的书《超标量处理器设计》,基于之前的基础,在不到半个月就掌握了书中的大部分知识及重要技术。

3,一个超标量处理器架构的模型来自北卡罗来纳州大学,虽然模型简单,没有RTL代码,只有系统顶层的及各模块的图和子模块的input,output;但这一个成熟的架构对我来说足够了,它至少给我指明了努力的方向——利用I/O信号名称和超标量处理器的相关知识将该架构的子模块的内部工作原理及电路图画出来。

4,待上面的架构中的各模块和各模块之间的连接交互弄懂后,我向老师请教了一些遗留问题后,便决定开始用verilog语言将它进行建模;然后又幸运的无意中在eetop上找到了uiuc大学的超标量处理器RTL代码。
而此时正在分析这些珍贵的代码,之后打算将一些部件进行优化,或者将ALPHA 体系结构转化为熟悉的MIPS体系结构。期望着自己在学校立一个项目,让更多的处理器爱好者参与设计,并从中受益。
虽然还远远没有结束处理器设计,但我想总结一下。

1,我首先找到了一个学习的方向,这个方向是自己真心喜欢的,即使在自己烦躁的时候, 都能随时静下心学习的东西。

2,即使在最艰难,希望最渺茫的时候也不放弃(只要内心相信自己做得到,而且还愿意做,那就做吧)。

3,和同学,朋友及家人分享自己的想法,以获得支持。

4,敢于说出自己的想法,或许你的倾听者跟你有共同的看法,或许你们正在做着同样的事。

5,学习一个专业方向的初期,没有带着强烈的急功近利的心态,学习这个方向的初衷是好奇心,所以即使好多知识不懂那也没关系,自己慢慢学吧;但是到了现在,说没有功利心那是骗人的。


最新更新内容:

继以上所写感想已经一年多了,现在已经大四了,而且凭借着自己的知识积累和项目经验,在今年国庆前找到了处理器设计方面的工作。现在就在分享一下我从上次的分享到现在的经历吧。

之前的《我的处理器之路》论坛地址: http://bbs.eetop.cn/thread-557991-1-1.html  提到自己在阅读分析IVM(Illinois  verilog model), 除了分支预测部分代码比较晦涩难懂之外,其他部分感觉还行。当时说想把Alpha ISA转化成MIPS ISA, 然后就去请教了学校里研究 高性能处理器微结构 的老师,经过交流发现自己的想法太simple了,这个想法没有什么价值。毕竟ILP开发都走到尽头了,只是把指令集变一下也没什么卵用啊,,,。老师说:“如果只是玩一玩,倒也没什么,但真想要有所收获,在这个基础上去研究多核去吧,毕竟现在是多核的时代”。(当然前提是理解了单核设计的基本原理)。

时间到了15年9月23日(大三上学期刚开学),得知一家处理器设计公司来我校招聘了,于是就去听宣讲会去了,期间跟招聘人员交流了一下,然后他推荐我:“去研究gem5(一款研究计算机体系结构的开源模拟器based C++ and python)的架构,搞清它的源代码,如果你都弄懂了,就凭那技术积累,毕业之后随便挑公司”。然后我就信了,刚返回宿舍就开始了阅读代码之旅,尽管刚开始不懂C++ 和python,但很快就去学习语言了,之后就开始阅读代码了。尽管到现在都没有读完所有代码,(因为知识和项目积累根本不够)但是我懂得了如何用C++来写模拟器,用 python来处理大量的仿真数据,而且这些技能肯定会用在以后的工作中的。与此同时开始通过 计算机体系结构:量化研究方法 学习多核处理器相关的知识了。

不知不觉时间到了2016年元旦之后,在eetop上下载了一本parallel computer architecture: a hardware software approach。这本书更加详细地讲解了多核设计的相关知识。随即将其列入寒假学习目录中。寒假期间通过与一位好友的聊天得知现在研发岗位要求比较严,不仅得有扎实的基础知识,还得有更好的项目经验,要不然本科生基本没有机会。而我的打算就是本科直接毕业,心想自己得做出点东西来,要不然在求职过程中没有竞争力。然后结合当时的情况,决定自己设计一个四核的处理器(灵感来自于MIT 复杂数字集成电路设计的一个学生的项目报告和当时正在学习parallel computer architecture: a hardware software approach以及CMU的并行计算架构课程https://users.ece.cmu.edu/~omutlu/ )。在积累了相关知识之后就开干了。当然一个人设计这个比较复杂的系统还是有点难度的,于是决定按设计流程走:

1)根据学校实验室FPGA的开发板资源来决定cache大小;互联网络的FIFO大小;分支预测器的各个参数:BTB tag bits , BTB entry number,RAS 大小,PHT 的大小;然后利用gem5配置各模块参数(设计空间的探索),然后利用几个测试程序来跑仿真,最后根据性能结果来决定每个模块的具体参数;

2)采用监听一致性协议还是目录一致性协议,感觉后者的实现更有意思便选择了后者;

3)将MIT 2005年的6.823: Computer System Architecture课程中的协议进行改进便用到了我的项目中;

4)将系统的架构进行划分,然后详细的弄清每个模块的具体实现(框图形式);

5)开始编码。

2016年3月8,大三下学期开始了。第一个月学业负担还不算大,但不容忽视十门左右的专业课,还在接着寒假时的进度编码,调试。但过了一个月后发现课程已经跟不上了。只好暂时放下项目(最坏情况下可不能挂科吧,影响就业,还得补考)。之前提到我结识了一位老师他是我们EDA实验室的负责人,他得知我还在学习这方面的东西,还有这个项目,于是表示很支持。不久他就给我说他可以帮我申请一个项目,于是项目被批准了!

尽管暂且放下了项目,但我仍然在坚持听CMU的计算机体系结构课程,然后从一个关于预取器的讲座中产生了自己的一个想法(被课程中一些实例启发到了,omutlu老师教的好!),随即借着gem5的基础,便开始着手基于gem5来验证自己的想法,因为它是模块化编程(C++的好处吧),只需实现自己的想法,熟悉一些接口就可以了。

等到了暑假,我便留校打算把多核处理器的项目做完。实际上编码,已经结束,剩下测试了,于是测了一个月,到快开学时各个核心可以独立工作,存储器模块可以独立工作,互联网络也可以独立 工作,但是当整个系统组织在一起时就出现问题了!!!然而没时间了,因为2017校招开始了!

其实投的简历也不少,但真正技术(处理器设计相关)对口的很少。然而很庆幸自己的知识积累和面试表现还可以,便获得了一份处理器设计相关的工作。当然面试过程中遇到了些问题:编译器及操作系统知识不是很熟。

现在以自己目前的水平来谈一下优秀的处理器架构设计师的知识要求:(备注为我的参考书)

自上而下:

  • 操作系统----(操作系统:精髓与设计原理)

  • 计算机体系结构----(计算机体系结构:量化研究方法,optional:并行计算机体系结构:软硬件方法)

  • 计算机组成原理----(计算机组成与设计:硬件/软件 接口)

  • 数字集成电路----(CMOS超大规模集成电路设计)

随着多线程/多核设计的发展,了解,甚至是熟悉操作系统是很有必要的。因为操作系统中进程与线程的创建,分配到核心/核心的一个线程(以SMT(同时多线程)为例)。如何平衡同一物理核心的单线程性能和多线程性能,什么时候由ST(single thread )转到SMT, 什么时候由SMT转到ST。以及在对多线程编程的程序进行仿真时的参数配置,配置方式,怎样看待仿真中的一些问题,没有操作系统知识,很容考虑不全面。

随着现在芯片设计对低功耗的考虑,而且随着工艺的发展,静态功耗的比例不断在增大,以及对线延时的考虑,这些要求我们在看待一个方案时要参考所采用工艺的功耗和延时的发展规律。而且我们应该意识到在架构级别的低功耗方案往往更容易得到更大的收益,例如从复杂高发射带宽的OOO处理器到现在的多个稍微简单的ooo处理器组成的多核处理器,后者的能效更高。

(0)

相关推荐