PicoRV32是一个RISC-V的IMC实现,可以配置为RV32E,RV32I, RV32IM,RV32IMC,并包含一个内置的中断控制器。
PicoRV32是一个开源的RISC-V的软核,他遵循ISC的许可证,ISC许可证类似于MIT许可证
RV32E:包含16个寄存器
RV32I:RISC-V基础指令集
RV32IM:基础指令集+乘法指令集
RV32IMC:基础指令集+乘法指令集+压缩指令集
1.PicoRV32在xilinx的7系列FPGA上能达到很小的面积,大约(700-2000)lut,因为xilinx的7系列FPGA都是6输入LUT,一个LUT可以实现更大的的组合逻辑,PicoRV32中有大量的组合逻辑,使用6输入lut更节省资源,同样spartan6也是6输入。
2.在xilinx的7系列上,可以实现250M-450M的fmax的极限频率。
3.可选择原生mem接口或者axi4-lite的接口
4.可通过选项配置,禁用x16-x31寄存器
5.可以通过配置选项选择:单口或者双口RAM来实现CPU的寄存器。双口RAM实现寄存器有更好的性能。
6.PicoRV32源码中有picorv32接口,picorv32_axi接口, picorv32_wb接口
picorv32接口 | 是一个原生的存储接口,接口简单易用 |
picorv32_axi | 提供一个axi4-lite的主接口,很容易集成到使用AXI总线的系统中 |
picorv32_wb | 提供了一个Wishbone总线的主接口 |
picorv32_axi_apapter | 提供一个桥,原生存储接口到AXI4总线的转接桥 |
7.可选的IRQ控制器可以捕获外部事件。
8.可选的PCPI接口,是一个协处理器接口,他可以实现一些非跳转的指令。picorv32代码中通过pcpi接口实现了M扩展,实现标准的MUL[H[SU|U]]和DIV[U]/REM[U]指令
指令周期
在使用双口RAM实现CPU寄存器,并且一个时钟访问存储器的情况下,平均指令周期CPI为4,下表列出对应指令周期
指令名称 | 平均指令周期(双口RAM) | 平均指令周期(单口RAM) |
直接跳转指令,jal | 3 | 3 |
寄存器和立即数运算指令 | 3 | 3 |
寄存器和寄存器运算指令 | 3 | 4 |
分支指令 | 3 | 4 |
存储加载 | 5 | 5 |
存储写入 | 5 | 6 |
跳转指令jalr | 6 | 6 |
移位操作 | 4-14 | 4-15 |
由上表可以看出,当原操作数2为寄存器时候,单口ram实现的寄存器需要两个时钟周期,双口RAM只需要一个时钟周期即可取出操作数。
后续分析PicoRV32源码。
PicoRV32作者为 Claire Wolf ,非常厉害,编写综合器Yosys,后续看PicoRV32代码就会感叹,编写综合器的牛人写的verilog太博大精深...