/bit_nscscc_suggestion

为了更好地帮助后来的同学参加龙芯杯,草拟了这份建议,望对后来人有所帮助

针对参加龙芯杯的若干建议

为了更好地帮助后来的同学参加龙芯杯,草拟了这份建议,望对后来人有所帮助。

常用链接

信息获取及工具

可参考代码

大赛概况

1. 大赛核心任务说明

龙芯杯的全称是全国大学生系统能力培养大赛,这个比赛是要求参赛学生具有一定的计算机系统设计能力,所谓的计算机系统就是整个计算机硬件和软件系统。

大赛分为两个阶段:

  • 初赛阶段:初赛阶段要求参赛选手完成一个 MIPS CPU 的设计,需要实现 MIPS 指令集架构的一个子集,共 57 条指令,同时要实现部分异常处理和协处理器 CP0 中的部分寄存器。CPU 的实现是通过 HDL(verilog、VHDL、system verilog 等)编程实现,并在 FPGA 上下板运行。大赛会提供相关的软件对参赛队伍的 CPU 的功能和性能进行测试。首先要功能测试通过才会再去进行性能测试。因此,参赛队伍需要在功能测试通过的前提下尽可能的提高性能测试。初赛的评比结果决定进入决赛的队伍,目前基本就是根据各参赛队伍 CPU 性能来判定,性能越高进入决赛的几率就越大。

  • 决赛阶段:在初赛阶段基本都是硬件相关工作,到决赛阶段主要涉及到软件工作,决赛阶段要求参赛队完成一个拥有软件和硬件的计算机系统的作品,基本上就是需要有一个软件能够跑在初赛阶段所开发的 CPU 上。这个软件可以自己写也可以使用大赛提供的软件,软件可以是一些嵌入式软件,也可以是操作系统如 ucore、 linux,一般参赛队都会选择跑大赛提供的 pmon、ucore、linux。决赛最终成绩由三部分组成: 1. 再次测试的 CPU 性能水平(40%)。 2. 自定义指令答题,决赛会让参赛队在现场实现一条指定指令(20%)。 3. 系统展示和答辩,系统展示就是展示 CPU 及其运行的软件,当然跑的软件越复杂(如 Linux)分数越高,还会有一个答辩(40%)。

补充:

  1. 龙芯杯新增内容:自第四届开始,龙芯杯比赛中开始加入个人赛,个人赛只允许单人报名,名额不受限,不得同时参加个人赛和团体赛。在个人赛中,要求参赛人员独自完成一个 CPU 的设计,内容相对团体赛来说会简单一些。具体请参考官方网站通知。
  2. 相关比赛:除了龙芯杯,在 2020 年开始出现其他与计算机系统相关的竞赛。其中之一便是华为毕昇杯编译系统设计赛,2020 年开始第一届,有兴趣可以联系本校相关老师咨询。此外,之后可以还会有操作系统设计相关的比赛,敬请关注。

2. 大赛获奖形势说明

必须要说明的是:大赛形势非常严峻!

北理工在第二届开始参赛,第二届只有一支参赛队伍最终进入了决赛并拿到了三等奖,第三届参赛队伍有两支,但都没有进入决赛。

第二届进入决赛的参赛队伍都完成了 CPU 的功能测试,并且最后一名参赛队伍的性能测试分数为 0.885,本届我校一支参赛队伍的分数为 5.909。第三届进入决赛的参赛队伍也都完成了 CPU 的功能测试,最后一名参赛队伍的性能测试分数为 24.539,我校两支参赛队伍的分数分别为 14.0、7.0。因此,可以说想要进入决赛是越来越难(如果改赛制可能就不一定了)。同时,进入决赛想要拿一个奖项也很难。龙芯杯的特等奖和一等奖的归属基本上就是清华、国科大、西工大这三所学校(但今年又冒出北邮这个"黑马"拿了一等奖)。然后二等奖就是华科、南航、北航、哈工大等学校。三等奖基本就是其他学校和上面这些学校的二队瓜分。

我理该何去何从?

参加这个比赛之前必须做好不能获奖的心理准备。

补充:

从目前的状况来看,这个比赛的投入和回报(这里的回报是指获奖,以此为自己简历加分)貌似并不成正比,就是说可能需要付出很大的努力,但是也不一定能够拿奖,即使拿奖可能也只是三等奖(emmm开始劝退)。所以,想通过这个比赛来获奖为自己的简历加分,难度还是挺大的,并且龙芯杯是近几年才出的比赛,一些学校保研什么的可能还不认可这个比赛。但是,如果有面试老师了解过龙芯杯,看到你参加龙芯杯的经历,即使不获奖我觉得也会对你刮目相看。所以做这个比赛,到最后能坚持下来的基本上都是对这个方面有兴趣的人,如果只执着于获奖,能坚持下去的可能性很小。这两年最开始报名的都有二三十人,坚持到最后的只有五六个人,所以还是比较劝退的。

补充 2020.10.24:

根据 2020 年龙芯杯的结果来看,由于进入决赛名额增加了不少,因此拿个三等奖貌似也不是很难?但是,每年参赛队伍数量不同,参赛队伍能力也各有不同,因此最终结果也不太好说。不管怎么样,尽力而为,学有所得,不留遗憾,那么参加这个比赛就是有意义的。

参加这个比赛你能有什么收获?

  • 了解到计算机系统最底层的工作原理,从门电路到软硬件接口到操作系统都能有一定的了解。 这个比赛的核心任务是设计一个 CPU,这属于硬件相关工作,做好这一块的工作起码能对 CPU 的工作原理有一个较为清晰的认识。在这种情况下,再去学习诸如单片机这种基本上就算是小菜一碟。硬件做的比较完备的情况下,可以考虑增加操作系统,编译器等相关软件部分,进一步对软硬件协同工作能有一定了解。

  • Debug 能力的提升。这个比赛可以说大部分的时间都是在 Debug,Debug 的过程是极其缓慢并且枯燥的,但是真正的走过了这个比赛,你会发现自己 Debug 的能力着实提高不少。

  • 通过这个比赛,至少可以将组成原理、体系结构和汇编与接口这三门课结合起来,在实践的层次上能进一步地对所学的知识进行融汇贯通,可以对整个计算机底层结构能够有一个较为深入的认识与了解。进入到决赛,还可以再将操作系统的部分加进来,进一步了解到软件如何工作在硬件的基础之上,以及操作系统的部分工作原理。(实际上,在决赛之前老师就会让参赛队员学习清华大学的操作系统课程,主要跟 ucore 相关,会涉及到操作系统源码)

  • 还有很多。。

其实,很多东西都是在做的过程中逐渐学习到的,这是一个潜移默化的过程,有付出必定有回报

备赛时间节点安排建议

首先分析我理的情况:以第三届为参考,在 10 月份左右,陆老师会开始召集大三学生参加这个比赛,在第二年的 8 月初即开始提交初赛作品,因此总共会有近 10 个月的准备时间。因为我校的计算机组成原理和操作系统开在大三上,体系结构和汇编开在大三下,所以 10 月份参赛的时候基本上没有一点基础,顶多也就在数字逻辑课上学了一点简单的 verilog 语法。同时在大三一学年还有相关课程,因此在平时可能时间并不多。

针对我理的情况,对参赛队伍提供一下的时间节点安排的参考:

  • 大三上
    • 学期中期前:完成单周期 CPU 的设计,能够下板运行,对 verilog 有进一步的认识与了解,对 MIPS 架构有一定程度的了解。
    • 学期末之前:完成多周期 CPU 的设计(对于多周期可以不花费较多时间)。重点学习流水线设计,理解流水线中的相关概念,争取对流水线的整个架构能够有一个清晰认识。
  • 寒假
    • 个人完成流水线的一个简单设计,在下学期开始组队合作写流水线。让每个人都实现一个简单流水线的目的在于能够让每个人都能把握流水线中的设计要点,这样在小组合作的时候不至于成员相互之间不知所云。
  • 大三下
    • 学期开始进行组队,在学期中之前:小组能够完成一个流水线 CPU,可以下板运行通过功能测试与性能测试,但此时性能肯定很低。
    • 学期末之前:小组对完成 CPU 的 cache 设计,要写进决赛必须完成 cache 实现,cache 对 CPU 性能提升有至关重要的作用,并且不能使用 system_cache ip 核(使用这个 ip 核性能提高不会太多)。另外,cache的实现中请不要使用reg直接定义,这样会浪费大量的LUT和FF资源,导致布线失败。请参考loongson官方提供的cache手册,实现bram结构的cache。特别地,cache的实现需要精细的设计,如果想进入决赛,需要cache hit时最多每两个周期读取一条指令,且主频要比较高。建议花时间实现一个无互锁的流水线结构,即cache命中时IPC=1,这样可以确保进入决赛,这也是mips(microprocessor without interlocked piped stages architecture)设计的愿意所在。
  • 暑假
    • 假定到暑假时完成以上的设计,并且可以确定当前分数能够进入决赛,此时需要对 CPU 进一步扩充以支持操作系统运行,即增加 TLB 模块以及增加若干条运行操作系统所需的指令,同时还需完成一个 soc 的设计。此时还需开始软件部分的工作,需要修改软件相关代码,以支持软件在小组所实现的 CPU 上运行,对软件调试,可以先跑 pmon,再跑 ucore,最后上 linux。
    • 若到暑假时觉得 CPU 性能还有欠缺,那就尽可能地先提高 CPU 的性能。之后再进行上述工作。

注:以上时间节点安排仅供参考,可以灵活调整

补充:

强烈建议在组队之前,每个人都必须完成一个简易的流水线(大概20条指令左右)的设计,以此保证在组队时每个人都能对流水线有一个充分的学习过程,不然在组队合作时会出现小组之间无法合作的问题。如果到组队时,还没有做完,可以考虑参加个人赛,能够独自完成个人赛也是非常有挑战性的。

可参考书籍

1.《数字设计与计算机体系结构》

2.《自己动手写CPU》雷思磊 著

3.《MIPS体系结构透视》 (英) Dominic Sweetman 著 机械工业出版社 2008

4.《MIPS体系结构与编程》刘佩林, 谭志明, 刘嘉龑 编著 科学出版社 2008

5.《MIPS处理器设计透视》(英) Dominic Sweetman 著 北京航空航天大学出版社 2005

后面四本书是学校图书馆可以借阅到的,其中《MIPS体系结构与编程》这本书仅在中关村校区图书馆有。

其他建议

  • 写流水线时,一开始不要直接使用龙芯的 SOC,而是自己先简单搭设一个 SOC,这样可以写完一条指令之后,自己写一些简单的小程序进行测试,便于找出一些 bug。等指令加的差不多之后再把整个代码加入的龙芯的 SOC 上。
  • 认真记录日志!
  • 使用 git 对代码进行版本控制,同时使用 github 平台进行代码托管,代码一定要备份!
  • 多交流,与老师交流,学长交流,与组员交流。听君一席话,胜读十年书。

其他

1. 第二届决赛入围名单:

序号 队伍名称 功能分 性能分
1 西北工业大学 2 队 100.000 71.173
2 西北工业大学 1 队 100.000 70.773
3 **科学院大学 1 队 100.000 69.289
4 北京航空航天大学 1 队 100.000 49.124
5 南京大学 2 队 100.000 41.142
6 华中科技大学 1 队 100.000 40.671
7 河北大学 1 队 100.000 40.150
8 清华大学 1 队 100.000 36.760
9 济南大学 1 队 100.000 36.312
10 河北大学 2 队 100.000 35.258
11 北京航空航天大学 2 队 100.000 34.705
12 华中科技大学 2 队 100.000 29.215
13 重庆大学 2 队 100.000 19.162
14 重庆大学 1 队 100.000 16.425
15 天津大学队 100.000 12.196
16 **科学院大学 2 队 100.000 10.288
17 北京理工大学 1 队 100.000 5.909
18 东北大学 1 队 100.000 4.755
19 东北大学 2 队 100.000 4.692
20 南京理工大学 2 队 100.000 1.389
21 北京科技大学 1 队 100.000 1.121
22 武汉大学队 100.000 0.972
23 南开大学 1 队 100.000 0.966
24 哈尔滨工业大学(威海)1 队 100.000 0.899
25 南京航空航天大学 100.000 0.885

2. 第三届决赛入围名单

序号 队伍名称 学校 功能分 性能分 频率 MHz
1 真香队 **科学院大学 100.000 71.441 110
2 毕业就去送快递 北京邮电大学 100.000 61.376 100
3 Hypothetic CPU 哈尔滨工业大学(威海) 100.000 60.256 120
4 HITSZers 哈尔滨工业大学(深圳) 100.000 52.652 109
5 编程是一件很危险的事情 清华大学 100.000 52.157 80
6 天骄四连 南京理工大学 100.000 48.565 89
7 ECNUCoder 华东师范大学 100.000 47.099 80
8 河北大学 2 队 河北大学 100.000 46.18 110
9 北京航空航天大学 2 队 北京航空航天大学 100.000 43.864 82
10 河北大学 1 队 河北大学 100.000 43.468 83
11 西工大 1 队 西北工业大学 100.000 39.92 65
12 北京航空航天大学 1 队 北京航空航天大学 100.000 39.862 87
13 Cat 南京理工大学 100.000 39.029 70
14 HITSZ-MIPSbuilder 哈尔滨工业大学(深圳) 100.000 38.982 95
15 沙坪坝技校一队 重庆大学 100.000 35.969 70
16 别急稳住我们能赢 华中科技大学 100.000 32.588 60
17 南航 1 队 南京航空航天大学 100.000 32.113 94
18 NKU 日新队 南开大学 100.000 30.589 85
19 西工大 2 队 西北工业大学 100.000 28.91 50
20 天津大学 2 队 天津大学 100.000 26.35 60
21 NKU 月异队 南开大学 100.000 24.539 110

建议人列表

姓名 介绍
王赞 北理工第三届龙芯杯参赛队员
范志鹏 北理工第三届龙芯杯参赛队员