| |
一:通用寄存器
Register | ABI | Use by convention | Preserved? |
---|---|---|---|
x0 | zero | hardwired to 0, ignores writes | n/a |
x1 | ra | return address for jumps | no |
x2 | sp | stack pointer | yes |
x3 | gp | global pointer | n/a |
x4 | tp | thread pointer | n/a |
x5 | t0 | temporary register 0 | no |
x6 | t1 | temporary register 1 | no |
x7 | t2 | temporary register 2 | no |
x8 | s0 or fp | saved register 0 or frame pointer | yes |
x9 | s1 | saved register 1 | yes |
x10 | a0 | return value or function argument 0 | no |
x11 | a1 | return value or function argument 1 | no |
x12 | a2 | function argument 2 | no |
x13 | a3 | function argument 3 | no |
x14 | a4 | function argument 4 | no |
x15 | a5 | function argument 5 | no |
x16 | a6 | function argument 6 | no |
x17 | a7 | function argument 7 | no |
x18 | s2 | saved register 2 | yes |
x19 | s3 | saved register 3 | yes |
x20 | s4 | saved register 4 | yes |
x21 | s5 | saved register 5 | yes |
x22 | s6 | saved register 6 | yes |
x23 | s7 | saved register 7 | yes |
x24 | s8 | saved register 8 | yes |
x25 | s9 | saved register 9 | yes |
x26 | s10 | saved register 10 | yes |
x27 | s11 | saved register 11 | yes |
x28 | t3 | temporary register 3 | no |
x29 | t4 | temporary register 4 | no |
x30 | t5 | temporary register 5 | no |
x31 | t6 | temporary register 6 | no |
pc | (none) | program counter | n/a |
Little Endian mode is used.
这个笔记写的不错,共享下来
https://www.cnblogs.com/George-Okelly1995/p/9801357.html
二:代码管理
学习一个cpu的最好的方法是试着写一个CPU, 就像软件的hello world。先实现一个简单的指令集,然后逐步扩充。
不太习惯用github之类的东西,一般用本地的svn,为了免得自己懈怠,找了一个代码管理网站,过一段更新进度。
https://gitee.com/lcf0451/riscv0.git
三:设计一个简单的CPU
买了雷思磊的<<自己动手写CPU>>,之所以买这本而不是胡振波的那本《手把手教你设计CPU》,存粹是因为我们公司发了100元的Amazon消费券。而我在Kindle中只能找到这本:-)
没钱买书的可以看这个微博,书没有多少钱,能买就买吧。
https://blog.csdn.net/leishangwen/article/list/2?t=1
设计一个一条指令的CPU.(2级流水线) --done 2020-05-01.
跑了仿真和综合 --done 2020-05-02
编译环境的搭建 --done 2020-05-05
windows 下riscv工具链的编译可参考这个网页:
https://www.emdalo.com/posts/risc-v-gnu-compiler-toolchain-howto-compile-on-windows/
写了一个简单的汇编程序,然后编译成二进制的文件。初始化到memory,跑仿真成功。
由于买的是Kindle的电子版本,不知道从哪可以下载bin2mem.exe文件,自己从下面这个程序简单改了一下,实现了
同样的功能,改动后的版本上传到了gitee上。
https://github.com/ikorb/gcvideo/blob/master/Firmware/bin2mem.pl
更多指令的实现 --done 2020-05-17
-> 实现了所有的ALU指令,实现了load 指令。 smoke test pass. --done 2020-05-10.
-> 大致浏览了以下文档,riscv-spec.pdf/RISC-V-Reader-Chinese-v2p1.pdf/riscv-privileged-v1.9.1.pdf。网上看到一个牛人说几个小时设计了一个RISC-V的CPU。不知道怎么做到的。我收集和研究资料就用了好长时间,这还是快速浏览的情况。 --done 2020-05-12
-> All RV32I commands are implemented. --done 2020-05-12.
-> 实现RV32M指令 --done 2020-05-16
IBEX的设计有些地方没有那么容易看懂。是因为做了一些逻辑资源共享和路径的balance. 我写这个只是为了研究,所以很多都忽略掉了,和IBEX不一样,而是直接实现,让工具去优化吧。并且看IBEX的设计,实际上有些地方功耗还可以改进,将来自己用的时候可以优化一下。目前阶段主要是学习。
IBEX的设计是用的system verilog, 而我是用verilog. 第一是因为自己的很多工具都是verilog的,第二是个人觉得system verilog是一个很尴尬的设计语言。抽象性还不如去用C,封装后可读性不如verilog, 懒得换了。
-> 实现各种异常检测和中断 -done 2020-05-17
-> 实现RV32C指令 -done 2020-05-17
验证,验证,验证。--tracked on another thread(2020-05-20).
之所以很多开源的设计,平时不用。是因为验证的不完整。因为试错的成本很高。所以在使用之前,需要完整的验证。
验证的工作在SOC的日志里记录。在研究RISCV CPU的时间,发现大部分的时间花在找资料和研究资料上。并且随着时间,自己必然会忘记。将来如果自己需要更复杂或者其它性能的CPU,可能还需要把这些资料再看一遍。这是很大的浪费。既然目前自己刚看完RISCV的资料,不如研究一下RISCV CPU的自动生成。这样将来自己需要不同性能的CPU是只需要简单生成一下,不需要花费很大的力气去研究资料,再去设计一个RISCV CPU。
使用更抽象的语言设计RISCV CPU
打算从Spinalhdl开始,请参考https://zhuanlan.zhihu.com/p/89249985。
抽象的模型语言,个人其实更喜欢用C,个人也写过用C转verilog的小工具。但是自己从头搞从C语言模型生成RISCV CPU的设计,太浪费时间。还是站在别人的肩膀上速度更快:-)。
-> 下载并研究SpinalHDL. --done 2020-06-06
安装软件,走了很多弯路。最后发现参考这个帖子比较好。成功安装并运行了第一个例子。尽管很多地方还不是很明白。
https://linuxadminonline.com/how-to-install-sbt-on-centos-7/
-> 下载各种SpinalHDL的文章,视频看看。--done.
scala for impatient. -- done 2020-09-07
Programming in scala -- on going
-> 重温各种CPU架构设计的资料 --done
公司的项目突然忙了起来,每天都在加班,回家后连开自己电脑的想法都没有。刚好趁这段时间,把零散的时间利用起来,重温各种CPU架构的书。
--> 利用现有的VexRiscV SOC, 生成代码,并编译C测试程序。FPGA demo. --done
--> 利用SpinalHDL 设计一些简单的verilog 设计。 --.done.
SpinalHDL Workshop.
--> 利用SpinalHDL自己设计RAM IP, 替换VexRiscV中的RAM. --On going.