来源:liangkangnan的博客
更新于 2021-01-31
tinyriscv 一个从零开始写的极简易懂的RISC-V处理器核
从零开始写RISC-V处理器之一 前言
从零开始写RISC-V处理器之二 绪论
从零开始写RISC-V处理器之三 硬件篇
从零开始写RISC-V处理器之四 软件篇
从零开始写RISC-V处理器之五 实践篇
从零开始写RISC-V处理器之六 写在最后
调试经验
作为一名还没入门的数字设计新手的我,其实没什么设计、调试经验可谈,这里只是分享一下我在设计tinyriscv处理器过程中用到的调试方法。
设计tinyriscv用到的工具有两个,分别是iverilog和gtkwave,这两个都是跨平台、轻量级的工具。iverilog用来编译verilog代码,gtkwave用来查看波形。
验证一个处理器,首先是能跑通各个指令,RISC-V官方提供了指令兼容性测试程序,这些程序是用汇编语言编写的,当编译这些程序之后,会生成对应的elf、bin文件,还有反汇编(dump)文件。通过vvp工具生成波形(vcd)文件后,再用gtkwave打开波形文件,然后对照着反汇编文件查看要关心的信号。比如在测试add指令时,就需要看ex阶段时reg_we_o信号是否为1,reg_wdata_o和reg_waddr_o信号的值是否正确。就这样,将反汇编文件里的每一条指令都对着信号波形走一遍(流水线的每一个阶段),如果所有反汇编指令的执行过程都符合预期,则表示这条指令测试基本上通过了。注意,这里只是说基本上,并不是说一定没问题,因为即使你把RISC-V的全部指令兼容性测试都通过了,也不能说明你设计的RISC-V处理器就没问题了,后续还要经过更多的测试和验证,比如随机指令测试等等。
设计感言
我是从零开始设计tinyriscv处理器的,虽然已经工作好几年了,但是我工作的内容可以说与数字设计没有任何关系。之所以跨度这么大,第一是在各种“掐脖子”的环境下,我个人非常看好RISC-V的前景,我不想错过这个黄金时代。第二是想结合实际工作拓展一下自己的知识面,将底层软件理解得更深入,技多不压身。第三,当时网上关于RISC-V入门的资料还很少,决定自己写一个RISC-V处理器,并将设计过程分享出来,提高自己的同时希望可以帮助到更多想入门RISC-V的同学。第四是机会总是留给有准备的人的,哪天有机会出来创业或者转型的话,RISC-V必定是我的首选。
前面说到我的工作与数字设计是没有关系的,而且上班时间比较长(差不多996),因此我只能利用业余时间、下班后的时间、周末休息的时间来学习,以至于会感觉到休息比上班还要累,放弃了很多陪伴家人和小孩的时间。为了学习verilog和数字设计,我买了不少于10本相关的书籍,一边学一边看,遇到不懂的知识点再查看相关的章节。
对于tinyriscv,我是以一个实际项目来做的,我给自己制定了一个目标,就是每个月至少做一次大的更新。一边做设计一边还要写文档,以至于有段时间好几个月没更新到文档,不少网友都催更了好几次了,在这里跟大家说声不好意思,让你们久等了。有时候眼看快一个月没有更新项目了,此时心里会非常着急,以至于好几次睡梦中都在想着怎么完成本次功能的设计的事情。说实话,我完全可以没有任何压力地、慢慢地去完成这个项目,完全没必要给自己这么大的压力。但我没有这么做,我要对自己负责,更要对这些学习tinyriscv的同学负责。看到大家一个个的star,就是我更新的最大动力。
tinyriscv是我真正做开源、走向开源的第一个项目,通过这个项目我认识了不少朋友,有国内一流大学硕士毕业刚参加工作的HYF同学,有硕士在读的ZK同学,有出版社的编辑,有创业公司的老总等等。目前tinyriscv的功能还不是很完善,更新速度也变慢了,这是因为我在设计上遇到了瓶颈,还有很多相关的知识需要学习才能继续走下去,才能走得更远,还请大家多多见谅。
最后,文笔有限,这个设计文档写得不是详细,写得也不是很好,如有不对的地方还请多多包涵。
|