xwkm 发表于 2017-2-11 18:28:36

直播写一个RISC-V IMC的CPU

本帖最后由 xwkm 于 2017-2-12 08:57 编辑

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

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

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

https://github.com/rgwan/kamikaze

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

aozima 发表于 2017-2-11 18:45:33

orz... 前排膜拜!RISC-V 真火呀!

xwkm 发表于 2017-2-11 18:52:15

aozima 发表于 2017-2-11 18:45
orz... 前排膜拜!RISC-V 真火呀!

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

BFXY5433 发表于 2017-2-11 19:00:44

精简指令集就是这个方面优势
指令少
下功夫构建好关键指令就可以跑起来
当然也牺牲了性能
只能靠频率提高来弥补
这个也是高频低能的原因

xwkm 发表于 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处理器是怎么高频低能的了。哈哈哈。

aozima 发表于 2017-2-11 19:21:00

xwkm 发表于 2017-2-11 18:52
到时候求RTT支持,哈哈哈。

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

xwkm 发表于 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

xwkm 发表于 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就是这样来的。带分支预测的流水线的行为是完全可以预测的,而不是像本坛某些人说的那样根本不可控。做计算机底层开发的,还是需要更多了解计算机结构比较好。

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

dengterry 发表于 2017-2-11 23:00:08

只能火钳留名了      

xwkm 发表于 2017-2-11 23:08:15

至于Cortex-M3/M4号称用的分支预测技术,我不知道是那种。因为我并没有看过它们的实现代码~不过按规模,我推测大概也是这样的静态分支预测算法。

BFXY5433 发表于 2017-2-11 23:12:20

大神,跪.....
跟着瞅瞅

xwkm 发表于 2017-2-11 23:29:31

然后我不负责任的推测一下,是不是老姚苦心经营多年的STC32将要改换RISC-V的指令集(毕竟实现简洁不要钱,基本看着本描述书就能写个核……),顺便和某某32管脚兼容一下,为国产RV32处理器打头阵{:lol:}

laujc 发表于 2017-2-11 23:39:16

软件开发用什么编译器?

xwkm 发表于 2017-2-11 23:45:37

laujc 发表于 2017-2-11 23:39
软件开发用什么编译器?

GCC

我交叉的工具链在这里

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

flash3g 发表于 2017-2-12 00:26:13

看着好流B的样子,支持支持!

xwkm 发表于 2017-2-12 08:43:47

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

xwkm 发表于 2017-2-12 08:47:14

手快发出去了……高级模式插不了附件……

仿真波形如下所示:



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

ifus 发表于 2017-2-12 09:51:20

只能火钳留名了+1   

john78 发表于 2017-2-12 10:01:18

xwkm 发表于 2017-2-11 23:45
GCC

我交叉的工具链在这里


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

huangqi412 发表于 2017-2-12 10:31:16

火前留名

bone 发表于 2017-2-12 11:48:10

好贴,留名。

xwkm 发表于 2017-2-12 11:58:14

john78 发表于 2017-2-12 10:01
要是用KEIL,IARWIN下一体的开发环境,更加给力

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

MAD_FISH 发表于 2017-2-12 12:51:26

这个高级,持续关注

xwkm 发表于 2017-2-12 13:02:36

我就看到RISC-V的中文翻译版spec被下载了那么多次。没一个给我的repository点star或者fork的。这是什么情况。

wkman 发表于 2017-2-12 13:55:04

{:sweat:} 完全看不懂,膜拜,,,

Excellence 发表于 2017-2-12 14:08:09

支持!。。。。

jordonwu 发表于 2017-2-12 15:01:37

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

First star and fork

sme 发表于 2017-2-12 15:56:45

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

xwkm 发表于 2017-2-12 17:01:12

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

用PULPino的RI5CY。

sme 发表于 2017-2-12 20:20:22

xwkm 发表于 2017-2-12 17:01
用PULPino的RI5CY。

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

laujc 发表于 2017-2-13 08:18:15

xwkm 发表于 2017-2-11 23:45
GCC

我交叉的工具链在这里


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

dr2001 发表于 2017-2-13 08:33:05

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

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

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

security 发表于 2017-2-13 08:48:59

不明觉厉,膜拜一下。

alamuhan 发表于 2017-2-13 09:19:35

先mark后看

flyfox8 发表于 2017-2-13 09:36:54

这个厉害,不过对于我这样连MIPS都没有弄明白的新手,看这个还有点吃力{:sad:}。

sme 发表于 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的实现,太乱了,无从下手。

3DA502 发表于 2017-2-13 12:41:21

R0常数0,MIPS 的套路

xwkm 发表于 2017-2-13 16:00:52

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

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

dr2001 发表于 2017-2-13 19:46:02

xwkm 发表于 2017-2-13 16:00
LLVM和GCC已经并入主线了。Linux和glibc还要等等看。

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

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

mcu5i51 发表于 2017-2-17 08:39:23

不知能用了没有

imliyucai 发表于 2017-2-17 10:58:45

看起来很NB的样子,搬板凳听课。

aydyjf 发表于 2017-2-19 17:11:12

RISC-V的指令是开放的,目前好像只有RISC-V,SPARC和OR1K的是开放的

qiqirachel 发表于 2018-5-3 09:46:25

看看有没有跟新

fraser 发表于 2018-5-3 10:42:02

这个高级,持续关注 +1

wx85105157 发表于 2018-5-3 10:58:03

大佬,有没有epm240t能用的串口模块呢? 用最少的LE

modbus 发表于 2018-5-3 11:19:03

Cortex-M3的无条件跳转指令我记得至少要两个时钟周期吧

gmyu 发表于 2018-5-3 11:39:41

今天看新闻提到这个架构了,看看能否超越arm。

tear604922959 发表于 2018-5-3 11:46:46

RISC-V IMC的CPU

yuguoliang 发表于 2018-5-3 13:44:46

大神,好NB

sunliezhi 发表于 2018-5-3 18:51:51

期待!   

liugu 发表于 2018-5-3 22:50:03

这个CPU的编译器有吗,是做好的,还是自己做?

xxc007 发表于 2018-5-3 23:13:29

大神,跪.....

sea_star 发表于 2018-5-5 09:58:57

{:smile:}{:victory:}

dxgdsx 发表于 2018-5-5 19:48:47

可以预计的是RISC-V在未来将出现n多个分支,碎片化会比较严重,因为任何人都可以随意添加新指令。

chengsong 发表于 2018-5-5 20:40:03

大神。。。。

freching 发表于 2018-5-6 17:33:12

最近在看自己动手写CPU,希望跟进老师的脚步。

zishan 发表于 2018-5-6 18:10:56

Mark 一下

Gohome_soon 发表于 2018-5-6 21:04:01

支持一个

zya2008 发表于 2018-5-6 22:25:22

Q牛B大大的好

fsl 发表于 2018-8-1 18:19:04

膜拜大神!{:lol:}

308594151 发表于 2018-9-20 23:43:51

膜拜楼主

qumei 发表于 2018-9-22 16:57:47

膜拜楼主,我最近才注意到这个

ericw2012 发表于 2018-10-15 15:58:05

这个CPU是完整的吗?有人试过吗?

wowangru 发表于 2018-11-12 17:38:53

加油   祖国需要你这样的人    大家一起完   等待生态好起来那天

wowangru 发表于 2018-11-16 13:42:41

众人拾柴火焰高!!!  完多了就有价值

minier 发表于 2018-11-16 21:47:01

好久都没有更新了

laujc 发表于 2018-11-17 09:16:10

ericw2012 发表于 2018-10-15 15:58
这个CPU是完整的吗?有人试过吗?

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

93434387@qq.com 发表于 2019-5-24 18:33:43

看到这个帖子。。。我只能支持。。。我就随便搜了下。。居然真有人用fpga写risc - v。。牛逼

qmsolo2004 发表于 2019-5-25 14:22:24

持续关注 +1

ericdai 发表于 2019-5-25 16:31:14

太适合stc了,stc冲鸭

minier 发表于 2019-5-25 20:21:16

怎么没有后文了
页: [1]
查看完整版本: 直播写一个RISC-V IMC的CPU