2020龙芯杯之旅

Posted by Jackson on August 21, 2020

2020 龙芯杯之旅

1. 初识龙芯杯

1. 知道龙芯杯的存在

​ 我相信每个计算机专业的学生(虽然我是网安的:dog: )都会有一个梦想:在自己的CPU上运行自己的操作系统和编译器。我虽然一直有这个想法,但是并不知道在哪里寻找这样一个平台,终于偶然在知乎热榜上瞥见这样一个问题:

image-20200820214158912

​ 这一下点燃了我的雄心,就这样我就入了龙芯杯的坑,也梦想着有一天可以追赶上T大学子的脚步,当然,主要还是计算机人的浪漫驱动着我,一个自己的CPU,多舒服啊。

2. 学习预备知识

​ 为了2020年的龙芯杯,我在2019年下半年选了计算机学院的《计算机组成与设计》,犹记得我第一节课的时候老师说的话”大家都知道MIPS“吧,我当时黑人问号脸(没错,我的基础就是这么差),我还去上网查了一下,┗ `O′ ┛ 嗷,Million Instruction Per Second Microprocessor without interlocked piped stages architecture,是一种属于RISC的指令集架构,在上课的同时我也在跟着《自己动手做CPU》(雷思磊 著)写CPU,一般来说入门CPU是有两本书的:《自己动手做CPU》和《CPU自制入门》

img

我在这里面强制推荐左边的《自己动手做CPU》,其对MIPS指令集介绍的很详细,先从实现一条指令出发建立了数据通路的框架,然后一条指令一条指令的增加,思路很顺畅和舒服。

《自己动手写CPU》内容介绍得很详细,对MIPS32指令集的用法做出详细的介绍,对开发环境的安装和设置也介绍得很详细,在进阶篇介绍了OpenMIPS处理器的设计与实现,并且通过实验验证了设计的OpenMIPS处理器,最后还为OpenMIPS处理器移植了uCOS-II

​ 就这样到了2020新年,我已经完成了《自己动手做CPU》中OpenMIPS的实现,但是卡在了移植操作系统上,为了移植操作系统我还买了Intel的一个FPGA开发板(800rmb,肉痛极了),由于我对哪些uart串口什么的并不是很懂(我数字逻辑学的有点忘了),然后工作到后面的移植uCos-II操作系统就没办法推进了。

截止到2020新年我掌握了计算机组成设计的知识以及用Verilog开发一个单发射五级流水线CPU的大概流程是什么。

​ 2020上半学期沉浸在机器学习的痛苦中无法自拔,没怎么在看过CPU了,倒是计算机学院有个配套的计算机组成与设计实验,普通的班是自定义指令集然后实现(号称是不要沉溺于MIPS里面,要打破它!!),卓越工程师班是实现符合MIPS标准的CPU。

image-20200820220823604

弘毅学堂就不知道了,只会要求更高(逃),我是跟着普通班做的自定义指令集,感觉就是练了练verilog,那个实验没什么难度。

截止到2020年大二下半学期结束,我掌握的还是计算机组成设计的知识以及用Verilog开发一个单发射五级流水线CPU的大概流程是什么。:frowning_face:

2. 开始准备

​ 龙芯杯官网:http://www.nscscc.org/

1. 寻找导师

​ 寻找导师是个大问题,我对计算机学院的老师不熟悉,一个都不认识,而且龙芯杯也就举办过三届,到今年(2020年)是第四届,参考资料比较少,于是我就靠搜索式”武汉大学 龙芯杯“查到第一届龙芯杯我校就勇夺三等奖,武大计算机学院也有这样的新闻页

image-20200820221532037

​ 于是看到了龚老师和肖老师名字,搜索了一下两位,龚老师是CSAPP的翻译作者(我去太酷了,负责这么强的一本书的翻译),肖老师也是贵为副教授,还有”珞珈段子手“的外号。龚老师有个人主页,上面有她的联系方式,她的邮件是yiligong@whu.edu.cn,于是我就鼓起勇气给老师发了封邮件

image-20200820222502100

​ 后来就和老师联系上了,最后老师也很nice,问了我一些问题,同意做我的导师。

2. 寻找队友

​ 找队友一开始是在龙芯官方群里面找到了武汉大学的同学,一问发现人家已经组好队了,指导老师是肖老师,而且人已经满了,自己也加不进去,郑晖(那一队的队长)给我推荐了几个人,可是人家都不想参加这个比赛:cry:,最后龚老师听了我的情况,就去她们卓工班问了问,最后找来一个女生愿意参加,于是队就这么组好了。

3. 报名提交

​ 2020龙芯杯分为团队赛和个人赛,个人赛人数为一个人且不需要有指导老师,由于自己也找到了队友和老师,于是就参加了团队赛

image-20200821090009160

​ 中间还发生了一个插曲,后来有来一个人想参加龙芯杯,他自己又组织了一个队,这样武大就有了三个队伍(限制最多两个队),后来龙芯杯官方给我们三个队发了封邮件。

image-20200821090209466

​ 新组织的队伍一是他们都是大一的,还没学过机组,而是队长是弘毅网安的,暑期经历了残酷的网安实训,也没有时间来参加这个比赛,于是就退出了。最终2020龙芯杯武汉大学共有两个队,一个是我带队,一个是郑晖带队。

3. 初赛之旅

​ 其实我也参加了残酷的网安实训,这个实训一直到7.15号才结束,我差不多是7.1号开始做初赛(只有一个月的时间,害)

日期 工作
7.1-7.8 1. 王诗蕴有暑期项目,所以最近代码是我一个人在做,已经完成之前所设计部分的代码编写,现在正在调试
2. 今天又将任务重新分配出去,我先负责现在代码的调试,她继续向后做,我调试完后马上跟上她
3. 约定的ddl是15号完成初阶任务,已经在疯狂补了
截止到7.18 目前进度就是王诗蕴的乘除法器还没做完,初阶功能测试测试到div指令就没法进行下去了,所以还不可以上板测试。我先去做AXI总线了
截止到7.21 看她进度太慢就直接接收做了HILO和乘除法器,不过时间匆忙,乘除法器全都是用IP实现的,所以现在进度还有些拖沓。
截止到7.28 过去一周总结
1.感觉王同学学业压力比较大,所以没分工,我全权负责在做
2.中阶任务完成了99%,系统测试一直有个小bug已经卡了几天了,找不到问题在哪,其余的功能测试、性能测试、记忆游戏都做了,
3.性能分比较低,没来的及优化,三点几分左右
4.想先搁置系统测试的小bug,开始做cache,提高一下性能,到最后再看一下系统测试的bug能不能解决。
8.5号初赛提交前 image-20200821092127705

image-20200821105019717

​ 从上面可以看出我那个队友一点活没干。于是到了决赛我果断把她踢了,当然这是后话,当时我觉得自己根本不可能到决赛,性能分一点多分,去年都24分是最低分,今年怎么也得30分了吧,于是我非常愉快的发了个说说。

image-20200821092833174

​ 可很快龙芯就给了我一闷棒,让我这种渣渣挺进了决赛。

4. 苟进决赛

image-20200821093440924

​ 这方差就离谱,我一个一分的垃圾五级流水线进决赛干嘛呀?非得把我拉出来鞭尸嘛?:joy:但既然进了还是要做的,可是当我收到这个通知的时候都8.14了,距离提交8.17也没有时间了,我一个没cache没tlb的单发射五级流水线上去不就是被羞辱吗?后来郑晖找到了我,希望和我搭伙做他们的trifling-mips,后来得知他们对也几乎是他一个人做完的,他的mips性能分15分左右,但是记忆游戏和系统测试都没有通过,所以没能进决赛,我花了3天时间给他的cpu调bug,然后还是没有找出来,最后也只能草草交上去,只能说菜是原罪啊。

参赛图

5. 旅途结束

image-20200821101805265

​ 龙芯杯out,可以干些别的了,可以不熬夜了:smile:

6. 个人总结

  1. 这一次时间不够是大问题,一个月的时间我真的已经尽力了,感觉自己都快近视了
  2. 选队友一定要谨慎,一个人还不如去打个人赛,所以下次一定要问清楚队友时间安排啊什么的,摸摸底,这一次也是实在找不到队友了才死马当活马医
  3. 感觉自己个人能力还不行。
    1. 首先是编程能力,自己迟迟领悟不到“写verilog的同时脑子里就想好了电路”的境界,可能我的数字逻辑真的学废了?然后就是verilog还是就会个基础的(虽然会基础就可以了,但是看别人代码费劲),别人都用了system verilog和chisel啊什么的。
    2. 然后就是CPU能力,自己只会个单发射五级流水线,什么乱序多发啊(多发倒是会一些,但是不会做),都不会。

明年再来吧,今年好好学操作系统和CTF。