搜索
bottom↓
回复: 70

直播写一个RISC-V IMC的CPU

  [复制链接]

出0入0汤圆

发表于 2017-2-11 18:28:36 | 显示全部楼层 |阅读模式
本帖最后由 xwkm 于 2017-2-12 08:57 编辑

大概是当作业做的一个小玩意,开源的~后续会有AHB-lite/Wishbone支持。想法是在FPGA里以尽量小的面积实现一个RV32IMC指令集的CPU。

大概比8051软核心之类的东西有更强大的性能。求各位的支持和Star~如果有愿意一起开发或者指导开发的大牛就更好了!

这会儿刚写完取指阶段和部分的译码阶段,这个礼拜内应该就能用。不过肯定不可能马上达到开发目标的咯~

https://github.com/rgwan/kamikaze

另外,本楼中所写所有部分均为原创。本人保留著作权,可能用此水一篇论文或者写一本小书!请各大坛友转载注明来源,作者!

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2017-2-11 18:45:33 | 显示全部楼层
orz... 前排膜拜!RISC-V 真火呀!

出0入0汤圆

 楼主| 发表于 2017-2-11 18:52:15 | 显示全部楼层
aozima 发表于 2017-2-11 18:45
orz... 前排膜拜!RISC-V 真火呀!

到时候求RTT支持,哈哈哈。

出0入0汤圆

发表于 2017-2-11 19:00:44 | 显示全部楼层
精简指令集就是这个方面优势
指令少
下功夫构建好关键指令就可以跑起来
当然也牺牲了性能
只能靠频率提高来弥补
这个也是高频低能的原因

出0入0汤圆

 楼主| 发表于 2017-2-11 19:16:09 | 显示全部楼层
本帖最后由 xwkm 于 2017-2-11 19:17 编辑
BFXY5433 发表于 2017-2-11 19:00
精简指令集就是这个方面优势
指令少
下功夫构建好关键指令就可以跑起来


此话不能这样讲。RISC/CISC之争早已过时,微架构才是重点。我这个东西实现的是个教科书般的处理器,不过不论如何,也比CISC的51处理能力强的太多了。精简指令集就是这个方面优势/。

我想,你大概不知道8051/8086和6502这类CISC处理器是怎么高频低能的了。哈哈哈。

出0入0汤圆

发表于 2017-2-11 19:21:00 | 显示全部楼层
xwkm 发表于 2017-2-11 18:52
到时候求RTT支持,哈哈哈。

微信risc-v群里面好像有人玩了,到时相关问题发论坛讨论就好了,调试OK后,欢迎提交到github。

出0入0汤圆

 楼主| 发表于 2017-2-11 22:29:59 | 显示全部楼层
本帖最后由 xwkm 于 2017-2-12 13:56 编辑

这个CPU的设计是教科书式的4级流水线结构。IF-ID-EX-MEM/WB 因此较为简单,效率也还可以。但是由于RISC-V IMC指令集是16-32位变长指令集。IF阶段需要正确地区分两种指令。不像OpenMIPS一样一个劲儿pc+=4就可以了。

另外求精~这个帖子会慢慢连载,不过学业较重,可能更新不及时。这个帖子适合看过自己动手写CPU——OpenMIPS的人。

由此,我们开始说IF阶段的设计。

先上仿真波形图:


先上传RISC-V的指令集描述资料~



首先,RISC-V指令的最后两位表示指令类型。为11是非压缩指令,非11则是压缩指令。这样对指令的区分要比连续变长的CISC处理器简单很多。也不会有ARM的Thumb-ARM切换带来的开销。

同步RAM的数据落后于地址一个周期,自然而然我们需要有一个超前1word(4)的pc指针。将它称为pc_4。

同样,由于新版RISC-V规范规定32位指令不必须对齐到32位,因此,很有可能出现一条指令被截为两半的情况,一半存于上次取来的指令的高16位,一半存在新取来的指令中的低16位。因此我们还需要一个32位寄存器来缓冲上一次取来的指令,将它称为last_instr。

在32位指令对齐的情况下,pc直接对应于内存输出的数据。因此,判断是否是压缩指令,只需要判断内存输出最后两位即可。

如果在纯16位指令的情况下,pc也将直接对应于内存输出数据分别的低16位和高16位的最后两位。在判断到取到了16位指令后,将pc的自增速度从4调为2即可。

如果在32位指令和16位指令混合的情况下,我们需要引入一个等待逻辑,由于指令一半存于上次取来的数据的高16位,一半存在新取来的数据中的低16位。于是不能让原先取得的数据由于时钟的作用被新取来的数据覆盖掉。

于是,等待逻辑的执行条件是原先的pc自增量为2,并且当前的指令于32位对齐的情况。

故有代码:


详细在GitHub上看吧,我不知道为什么Debian下面,Firefox根本打不开高级模式的对话框,插入不了代码。。。

https://github.com/rgwan/kamikaze/blob/master/src/fetch.v

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2017-2-11 22:55:14 | 显示全部楼层
关于分支预测:

于是有人问了,如果一条无条件跳转指令,经过IF-ID-EX后最终改动了IF阶段的PC。执行下来应该是4个周期。那么,ARM/AVR这类处理器是如何在2级/3级流水线的情况下执行无条件跳转指令只要一个周期的呢?

这种情况,在IF阶段,要做一次译码。比如判断到待发送给ID阶段的指令是无条件跳转指令,那就在IF阶段把PC给改掉,指向新的地址,然后ID和EX阶段什么都不做就可以。相当于把跳转提前了。所以无条件跳转指令就可以一个周期实现。

那么,如果是带着指针寄存器偏移的无条件跳转指令。这样的方式就是不能使用的,因为此时ID,EX,WB三个阶段中还有3条指令在同时执行。如果这三条指令中任何一条改动了寄存器的值,就会导致跳转到错误的地址上。这样倒也有应对的解决方案,就是把ID、EX、WB阶段在操作的寄存器地址全部引出来。如果寄存器地址和跳转用的指针寄存器毫无关系。则可以放心跳转。有关系,就得先阻塞住,等到和这个寄存器相关的指令跑完以后,才可以进行跳转。但是这样会在IF阶段引入太多的组合逻辑,降低速度。对我而言,我暂时不会使用这个技术。

如果是有条件的跳转指令,那么也得先确保条件在另外3个正在执行的阶段中不会被改动。如果确认没有被改动的话,就可以放心大胆的取值跳转。但是很不幸运的是,条件跳转指令和判断指令几乎都是伴生的。

因此,我们需要引入一种称为分支预测的技术,来尽量降低流水线阻塞的条件。在单片机用的内核里,不会给你太多的空间放跳转预测表(gshare之类的算法需要)。

不过,没有跳转表和概率计算,也是可以做分支预测的。只是说,穷有穷办法。比如说,一般而言,编译器喜欢将代码的向后跳转优化的容易执行,向前跳转优化的较少执行。比如:

for(i=0;i<100;i++){.....}

所以,不妨假设大多数程序都是这样的。遇到向后跳转的条件跳转指令,即使我不知道条件的结果(估计还卡在EX哪里没算出来呢)。我就先当它应该是跳了。于是把PC改为跳转后的值。老的PC保留备用。

等到条件值过了EX被计算出来了之后,我就来比较和我当时假设的跳转情况做比较。如果预测失败了,那么将IF/ID的寄存器全部清空,把上次的PC放出来,+1。然后继续执行。如果预测成功了,那就接着跑。

向前跳转的条件跳转指令也一样处理,只是反过来而已。

显而易见,这样的分支预测算法在遇到随机代码的时候,预测的正确率对半开。但是!一般的编译器喜欢把向后的跳转指令默认更容易执行。向前的更不容易被执行。所以这样的预测效率还是比较可观的,配合良好的编译器可以上90%。

预测正确的话,条件跳转指令应当是一个周期。预测失败的话,假设改动条件的指令在EX阶段,条件跳转指令在IF阶段。于是执行一个周期,写回寄存器需要一个周期,同时可以再次修改PC,等RAM数据妖一个周期。因此这样的条件跳转指令要执行3个周期。

如果改动条件的指令在ID阶段。那么要等ID走完一个周期,EX走完再一个周期,写回寄存器和修改PC又要一个周期,等RAM也要一个周期。因此这样执行的条件跳转指令就要4个周期。

预测失败后,EX阶段以前的流水线指令必须被抛弃,然后从头重新取。要不然就会得到错误的结果。

所以说,在某些处理器核心手册上看到的某些指令执行周期是1/2/3就是这样来的。带分支预测的流水线的行为是完全可以预测的,而不是像本坛某些人说的那样根本不可控。做计算机底层开发的,还是需要更多了解计算机结构比较好。

关于超标量和乱序执行,我自己也不是非常明白。所以我就不来班门弄斧了。如果有大牛愿意通俗易懂的描述这两个技术,我非常支持!

出0入0汤圆

发表于 2017-2-11 23:00:08 | 显示全部楼层
只能火钳留名了      

出0入0汤圆

 楼主| 发表于 2017-2-11 23:08:15 | 显示全部楼层
至于Cortex-M3/M4号称用的分支预测技术,我不知道是那种。因为我并没有看过它们的实现代码~不过按规模,我推测大概也是这样的静态分支预测算法。

出0入0汤圆

发表于 2017-2-11 23:12:20 | 显示全部楼层
大神,跪.....
跟着瞅瞅

出0入0汤圆

 楼主| 发表于 2017-2-11 23:29:31 | 显示全部楼层
然后我不负责任的推测一下,是不是老姚苦心经营多年的STC32将要改换RISC-V的指令集(毕竟实现简洁不要钱,基本看着本描述书就能写个核……),顺便和某某32管脚兼容一下,为国产RV32处理器打头阵

出0入4汤圆

发表于 2017-2-11 23:39:16 来自手机 | 显示全部楼层
软件开发用什么编译器?

出0入0汤圆

 楼主| 发表于 2017-2-11 23:45:37 | 显示全部楼层
laujc 发表于 2017-2-11 23:39
软件开发用什么编译器?

GCC

我交叉的工具链在这里

https://pan.baidu.com/s/1kUAfWsZ

出0入0汤圆

发表于 2017-2-12 00:26:13 | 显示全部楼层
看着好流B的样子,支持支持!

出0入0汤圆

 楼主| 发表于 2017-2-12 08:43:47 | 显示全部楼层
至于非对齐到的启动和跳转地址。使用等待法等待。比如说一条指令的前和后半部分被截在两个内存单元中。一半存于上次取来的指令的高16位,一半存在新取来的指令中的低16位。这样,就必须把这两个内存单元的值全部取来,才可以进行处理。这个时候,就需要IF模块等待一个周期,等到指令的低16位到位之后,才可以继续执行。因此,强制把PC对齐到4字节。并且判断要载入的PC是否是2字节对齐,是则插入一个等待周期。不是则略过。修改后的代码如下所示:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2017-2-12 08:47:14 | 显示全部楼层
手快发出去了……高级模式插不了附件……

仿真波形如下所示:



在后续的解码、执行、写回的模块中,要对前级输出的有效性进行判定。这样的情况被称为插入空泡。分支预测算法和无条件跳转前置暂未实现。等到ID EX和WB/MEM三个阶段完成之后。再会实现。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2017-2-12 09:51:20 | 显示全部楼层
只能火钳留名了  +1   

出90入4汤圆

发表于 2017-2-12 10:01:18 | 显示全部楼层
xwkm 发表于 2017-2-11 23:45
GCC

我交叉的工具链在这里

要是用KEIL,IAR  WIN下一体的开发环境,更加给力

出0入0汤圆

发表于 2017-2-12 10:31:16 来自手机 | 显示全部楼层
火前留名

出0入0汤圆

发表于 2017-2-12 11:48:10 | 显示全部楼层
好贴,留名。

出0入0汤圆

 楼主| 发表于 2017-2-12 11:58:14 | 显示全部楼层
john78 发表于 2017-2-12 10:01
要是用KEIL,IAR  WIN下一体的开发环境,更加给力

用Eclipse就可以了。GCC可以在WIN下用。

出0入4汤圆

发表于 2017-2-12 12:51:26 | 显示全部楼层
这个高级,持续关注

出0入0汤圆

 楼主| 发表于 2017-2-12 13:02:36 | 显示全部楼层
我就看到RISC-V的中文翻译版spec被下载了那么多次。没一个给我的repository点star或者fork的。这是什么情况。

出0入0汤圆

发表于 2017-2-12 13:55:04 | 显示全部楼层
完全看不懂,膜拜,,,

出0入0汤圆

发表于 2017-2-12 14:08:09 来自手机 | 显示全部楼层
支持!。。。。

出0入0汤圆

发表于 2017-2-12 15:01:37 | 显示全部楼层
xwkm 发表于 2017-2-12 13:02
我就看到RISC-V的中文翻译版spec被下载了那么多次。没一个给我的repository点star或者fork的。这是什么情况 ...

First star and fork

出0入0汤圆

发表于 2017-2-12 15:56:45 | 显示全部楼层
我个人觉得,你还是先教我们怎么把网上开源的RISC-V I32指令集的代码,怎么用起来,怎么搭建开发环境,让我们先在FPGA上能够搭载硬件开发和调试,不是每个人都对设计CPU 本身感兴趣,有现成的,不如把精力放在外设上,及早在项目中把RISC-V core用起来。

出0入0汤圆

 楼主| 发表于 2017-2-12 17:01:12 | 显示全部楼层
sme 发表于 2017-2-12 15:56
我个人觉得,你还是先教我们怎么把网上开源的RISC-V I32指令集的代码,怎么用起来,怎么搭建开发环境,让我 ...

用PULPino的RI5CY。

出0入0汤圆

发表于 2017-2-12 20:20:22 | 显示全部楼层
xwkm 发表于 2017-2-12 17:01
用PULPino的RI5CY。

能说得详细些吗?搜不到?

出0入4汤圆

发表于 2017-2-13 08:18:15 | 显示全部楼层
xwkm 发表于 2017-2-11 23:45
GCC

我交叉的工具链在这里

这个交叉编译工具,也是你从GCC改的吗?

出0入0汤圆

发表于 2017-2-13 08:33:05 | 显示全部楼层
sme 发表于 2017-2-12 15:56
我个人觉得,你还是先教我们怎么把网上开源的RISC-V I32指令集的代码,怎么用起来,怎么搭建开发环境,让我 ...

目前是RV的早期阶段,编译器好像还没Main Stream,开源的核的软核成熟且被广泛应用的也不多,尤其是针对FPGA场景的软核。

如果有能力折腾HDL,打补丁编译编译器,熟悉盲调,有了Bug能自己定位/Fix,etc,那自己就应当知道该怎么做;否则,如果需要比较详细的Guide,那最好再等等看。

出0入8汤圆

发表于 2017-2-13 08:48:59 | 显示全部楼层
不明觉厉,膜拜一下。

出0入0汤圆

发表于 2017-2-13 09:19:35 来自手机 | 显示全部楼层
先mark后看

出0入4汤圆

发表于 2017-2-13 09:36:54 | 显示全部楼层
这个厉害,不过对于我这样连MIPS都没有弄明白的新手,看这个还有点吃力

出0入0汤圆

发表于 2017-2-13 11:56:52 | 显示全部楼层
dr2001 发表于 2017-2-13 08:33
目前是RV的早期阶段,编译器好像还没Main Stream,开源的核的软核成熟且被广泛应用的也不多,尤其是针对F ...

原来是这样啊,反正觉得risc-v挺乱的,github上一堆东西,也不知道用哪个,然后一些用到risc-v的厂家,也不知道去哪里下载代码,再有有FPGA厂家也在github上有risc-v的实现,太乱了,无从下手。

出0入0汤圆

发表于 2017-2-13 12:41:21 | 显示全部楼层
R0常数0,MIPS 的套路

出0入0汤圆

 楼主| 发表于 2017-2-13 16:00:52 来自手机 | 显示全部楼层
dr2001 发表于 2017-2-13 08:33
目前是RV的早期阶段,编译器好像还没Main Stream,开源的核的软核成熟且被广泛应用的也不多,尤其是针对F ...

LLVM和GCC已经并入主线了。Linux和glibc还要等等看。

出0入0汤圆

发表于 2017-2-13 19:46:02 | 显示全部楼层
xwkm 发表于 2017-2-13 16:00
LLVM和GCC已经并入主线了。Linux和glibc还要等等看。

GCC的发布周期太慢了,好像今年2月2宣布的合并,能赶上GCC 7么……赶不上就明年去了。。。LLVM发布周期或许能快点。
记得好像newlib也mainstream了?

工具链不能着急,且着呢。

出0入0汤圆

发表于 2017-2-17 08:39:23 | 显示全部楼层
不知能用了没有

出0入0汤圆

发表于 2017-2-17 10:58:45 | 显示全部楼层
看起来很NB的样子,搬板凳听课。

出0入0汤圆

发表于 2017-2-19 17:11:12 | 显示全部楼层
RISC-V的指令是开放的,目前好像只有RISC-V,SPARC和OR1K的是开放的

出0入0汤圆

发表于 2018-5-3 09:46:25 来自手机 | 显示全部楼层
看看有没有跟新

出0入0汤圆

发表于 2018-5-3 10:42:02 | 显示全部楼层
这个高级,持续关注 +1

出0入0汤圆

发表于 2018-5-3 10:58:03 | 显示全部楼层
大佬,有没有epm240t能用的串口模块呢? 用最少的LE

出0入0汤圆

发表于 2018-5-3 11:19:03 | 显示全部楼层
Cortex-M3的无条件跳转指令我记得至少要两个时钟周期吧

出0入4汤圆

发表于 2018-5-3 11:39:41 | 显示全部楼层
今天看新闻提到这个架构了,看看能否超越arm。

出0入0汤圆

发表于 2018-5-3 11:46:46 | 显示全部楼层
RISC-V IMC的CPU

出0入0汤圆

发表于 2018-5-3 13:44:46 | 显示全部楼层
大神,好NB

出0入4汤圆

发表于 2018-5-3 18:51:51 | 显示全部楼层
期待!     

出0入0汤圆

发表于 2018-5-3 22:50:03 | 显示全部楼层
这个CPU的编译器有吗,是做好的,还是自己做?

出0入0汤圆

发表于 2018-5-3 23:13:29 | 显示全部楼层
大神,跪.....

出0入0汤圆

发表于 2018-5-5 09:58:57 | 显示全部楼层

出0入0汤圆

发表于 2018-5-5 19:48:47 | 显示全部楼层
可以预计的是RISC-V在未来将出现n多个分支,碎片化会比较严重,因为任何人都可以随意添加新指令。

出0入0汤圆

发表于 2018-5-5 20:40:03 | 显示全部楼层
大神。。。。

出0入0汤圆

发表于 2018-5-6 17:33:12 | 显示全部楼层
最近在看自己动手写CPU,希望跟进老师的脚步。

出0入0汤圆

发表于 2018-5-6 18:10:56 | 显示全部楼层
Mark 一下

出0入0汤圆

发表于 2018-5-6 21:04:01 | 显示全部楼层
支持一个

出0入0汤圆

发表于 2018-5-6 22:25:22 | 显示全部楼层
Q牛B大大的好

出0入0汤圆

发表于 2018-8-1 18:19:04 | 显示全部楼层
膜拜大神!

出0入0汤圆

发表于 2018-9-20 23:43:51 | 显示全部楼层
膜拜楼主

出0入0汤圆

发表于 2018-9-22 16:57:47 | 显示全部楼层
膜拜楼主,我最近才注意到这个

出0入0汤圆

发表于 2018-10-15 15:58:05 | 显示全部楼层
这个CPU是完整的吗?有人试过吗?

出10入12汤圆

发表于 2018-11-12 17:38:53 | 显示全部楼层
加油     祖国需要你这样的人    大家一起完   等待生态好起来那天

出10入12汤圆

发表于 2018-11-16 13:42:41 | 显示全部楼层
众人拾柴火焰高!!!  完多了就有价值

出0入0汤圆

发表于 2018-11-16 21:47:01 | 显示全部楼层
好久都没有更新了

出0入4汤圆

发表于 2018-11-17 09:16:10 | 显示全部楼层
ericw2012 发表于 2018-10-15 15:58
这个CPU是完整的吗?有人试过吗?

想做成完整的,还应该加上很多外围模块吧,如uart,spi,timer等

出0入0汤圆

发表于 2019-5-24 18:33:43 | 显示全部楼层
看到这个帖子。。。我只能支持。。。我就随便搜了下。。居然真有人用fpga写risc - v。。牛逼

出0入0汤圆

发表于 2019-5-25 14:22:24 | 显示全部楼层
持续关注 +1

出0入0汤圆

发表于 2019-5-25 16:31:14 | 显示全部楼层
太适合stc了,stc冲鸭

出0入0汤圆

发表于 2019-5-25 20:21:16 | 显示全部楼层
怎么没有后文了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 22:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表