ysyx一年记
将ysyx介绍给各位已经整整一年了。一年期间,各位或多或少接受了不同程度的折磨,进度快,花时间多的接受的折磨多一点。从结果上来看,带ysyx进组的效果离初衷有一定偏差,但也有一些效果。从过来人的角度,可以和各位聊一下ysyx能带来的一些东西。 ysyx的最终目的是独立实现支持riscv64指令集,可以运行复杂程序的CPU。但实际需要完成的内容却远不止于此。事实上,训练的开始是让各位意识到,程序员需要,但学校教育往往欠缺的专业技能都有哪些。这些东西看不见摸不着,做项目的时候甚至会觉得不需要。但具备这些技能,在工作中的体现是能独立地一次把事情做对,最大程度地减少事后填坑和毅力调试的可能性,是用来拔高技能水平的。训练与得到收益是存在时间错位的,随着工作难度的上升,这些东西的重要性才会凸显出来;但当工作难度开始需求专业技术的时候,训练的最佳时机往往已经丧失了。在没有任何项目核心需求压力的时候,进行这样的训练是最合适的。当然,是否参与训练,参与到什么程度还是在各位自己手上的,只要有所选择就好。
正式的预学习答辩需要完成800字的《提问的艺术》读后感,为什么要阅读这篇语言不乏傲慢的文字,还要完成篇幅不短的读后感呢?包括个人经历在内,未经训练的提问绝大多数都类似“我这里波形出问题了,该怎么办”的无效句式,把自己的问题描述清楚是需要付出努力的。一个面上的问题往往是需要数百个字,结合截图和日志才能解决的。这个意识是反直觉的——人人都想做得最少得到最多,新手更是希望能直接得到解决问题的答案。但这在解决问题的过程中是不合适的,需要付出努力,解决问题的主体,最终还是是提问者本人。认真提问是付出努力的第一步。把问题描述清楚,不仅在为回答者提供有效信息,还是把问题头绪理清的过程,也是激起努力意愿的第一步。各位后续成为学长学姐,开始回答问题的时候,或许也会有所感受。
聊完意识之后,ysyx(实际上是PA)又花了大量篇幅,甚至故意设置障碍,让各位完成编程环境于工具的配置和使用。硕士阶段的rtl代码任务基本上不会超过几百行,似乎用记事本都可以完成所有任务。但考虑最简单的情形,一个有数十个接口的模块在连线的时候,利用正则表达式将input/output xxx替换为.xxx(),就已经能显著提高工作效率了。正是因为这些事情不用任何工具都能做,所以才需要强调有工具可以快速地做这些事情。总有一天,任务的工作量会必须依赖于自动化指令完成,而训练的意义在于告诉各位,一定有工具可以做这些繁琐耗时的事情。结合提问的艺术,在遇到繁琐工作的时候,chatgpt就可以解决绝大多数生产效率问题。也许vscode还是比vim好用,但用过vim的批处理指令以后,在vscode下的开发也会自然地想到,有没有帮助我完成批量工作的方法。当具备这些意识的时候,使用什么工具就都不重要了。 艰难地来到正式cpu系统搭建的部分,第一个任务竟然是完全基于C语言的计算机系统组成实验,且这个任务离rtl代码设计仍然相差数个月的工作量。到此为止,是我认为效果与初衷有偏差的原因之一:训练的最终目的是希望各位熟悉rtl代码的基本写法,检验标准是实现一个单周期CPU。但为了完成这个开发周期不会超过数个星期的任务,却要经历工作量更大,难度更高的模拟器实现任务。在无压力自学的情况下,知难而退的概率会非常高,训练的意义也因此完全丧失了。到现在为止,我也没有太好的办法解决这个问题,如果有好想法和建议的可以私聊我。 回到实验本身,如果说前面两个任务是意识和通用技能层面的训练,PA就是专业知识层面的训练。CPU是支撑整个计算机系统运行的硬件核心,只有了解它服务的系统,才有可能设计出合理的硬件电路。如果没有前置知识,直接思考PC(程序计数器)模块如何加入设计当中,都会是困难的事情(没做到rtl设计的可以看看能不能看懂这句话)。CPU需要支持指令集行为的正确解读,其行为直接影响内部状态和外部设备的表现。这些表现在硬件层面是波形与数值,但在软件层面是我们熟悉的“hit good/bad trap”,或者是程序执行的结果。从更加熟悉的结果,而非难以阅读的波形入手系统实现,反而是通过拉长了任务周期,降低了任务难度,因为直接通过寄存器波形数值调试硬件bug是不可能的。
另外,完成PA的同时,也意味着完成了设计目标的参考模型。和批作业需要答案一样,如果硬件设计也有运行结果的参考答案,bug就可以较精确地定位在设计实现与参考答案出现偏差的位置,进一步地层次化寻找问题。NEMU作为emulator与difftest model的例子,是硬件设计里非常重要的思想体现,所谓的C模型和UVM验证也在做类似的事,只是写代码或许意识不到其作用和目的,但PA通过写在纸面上的字眼展示了这个重要的思想。
结束了对计算机系统的理解之后,我们终于可以开始入手系统的硬件实现了。在完成PA之后,CPU的执行过程将变得非常容易理解,画出架构图,根据架构图实现硬件代码也会非常简单。更关键的是,这里的调试工具是指令粒度精确的比对模型,bug不需要通过看所有波形来定位。调试过程还会帮助大家理解,rtl代码是如何用高级语言描述电路行为,进而完成仿真的(正确实现这里的仿真时序模拟,也就理解很多时序相关的面试题都在说什么了)。单周期CPU成功运行cpu-test程序是个比较重要的节点,因为这是架构知识-行为模拟-硬件实现的最小闭环。完成这个闭环以后,复杂功能的添加和调试只是难度上的变化,但已无环节上的缺失。如果能独立完成到这一步,尤其是对于没有先验知识的人来说,就已经是非常成功的工程训练了。未来实验室项目需要的意识和能力,也不会高于训练的要求了。
另一点和初衷有偏差的点也在于此。训练最重要的目的实际上是唤起一些专业意识,完成的训练任务量反而是其次。长篇累牍地说了很多原理和希望,弯弯绕绕地设置了很多跟rtl设计本身完全无关的任务,实际上想要提高的是各位在完成实际任务时,思考“我这么设计对不对?我如何验证这个设计对不对?”的能力。某种程度上说,学校里的任务结构是较为畸形的。博士作为任务的顶层设计者,很多时候并没有子任务的工程经验,外加需要考虑的任务过多,并没有办法提供具体的任务指导,甚至子任务的合理性,也需要硕士通过实际结果协助博士验证(说来惭愧,任务不是工程实现,并不是没有工程实现经验和能力的借口。在我自己完成ysyx的过程中,也意识到自己能力欠缺得比较多,但这些欠账只能慢慢补足了)。从这个角度出发,进一步压缩任务量,但强化每个任务环节的训练;或者保持任务量不变,但推动一定完成足够的训练量会更好一些。
但是,令人欣慰的点也在这里。即使ysyx作为非强制的工程训练,也有相当一部分人完成了能力范围内的闭环,并且也参与了讨论和思考的实践。在这里感谢各位在实践中付出的时间与精力。ysyx或许不是一个非常合适的入门训练,它需要付出的时间精力过多,不参与流片得到的显性回报又几乎为零。但对零基础且缺乏入门任务,或者对自己要求较高,希望得到系统能力训练的同学来说,是一个值得坚持去做的选项。不管完成了多少训练,只要尝试克服过不敢克服的困难,多了之前教育过程中没有的意识,甚至只是意识到自己是否适合这个行业,这样的实践都是有价值的。
百年未有的大变局之下,我们的集成电路行业正在经历前所未有的打压和封杀。即使谈论时代精神是件虚无缥缈的事情,但身处这个行业已然是事实,背负着振兴产业的期望也已然是事实。无论成功与否,也无论未来个人选择为何,在此时此刻的当下,我们已然完成了提高个人专业能力的尝试。ysyx展示了处理器设计的全流程,也展示了入门一个行业需要付出的努力。希望各位能从这段经历中有所体验,有所收获。对这个项目感兴趣的同学,可以继续自学,或者参加正式学习的报名与流片。有问题的还是欢迎随时与我沟通。前一段时间我自己经历了一段比较混乱的时间,有很多想分享的主题,但因为精力原因作罢。后续应该会继续更新一些主题,内容还是会结合PA和ysyx的一些核心思想。有其它感兴趣主题的也可以私聊我,我能讲就试着讲一下。