riscv-sodor-rv32_1stage(1)
这是我对riscv-sodor处理器的学习过程。
1、 什么是riscv-sodor?
维基:https://github.com/ucb-bar/riscv-sodor/wiki
Github: https://github.com/ucb-bar/riscv-sodor
riscv-sodor处理器是教学处理器,相比于rocket-chip会更容易学习,可以用来学chisel & RISCV32指令 & cpu内部结构。
riscv-sodor有5个处理器的例子。分别是:
1)1阶段(基本上是ISA模拟器)
2) 2阶段(演示Chisel中的流水线操作)
3) 3阶段(使用顺序记忆;支持哈佛和普林斯顿版本)
4) 5阶段(可以在完全旁路或完全互锁之间切换)
5) 基于“总线”的微编码实现
(这部分说明先放这里,后面会写得多的话,会单独开一个目录。)
2、riscv-sodor-rv32_1stage
1) 先贴一张rv32_1stage的结构图:

2)然后看/riscv-sodor/src/rv32_1stage中的scala代码:
consts.scala cpath.scala package.scala top.scala core.scala dpath.scala tile.scala
有些scala代码是在/riscv-sodor/src/common中的,我们用到了再作说明。
3)我们一个个scala文件进行分析。
先进行说明的是cpath.scala:
package Sodor
{
import chisel3._
import chisel3.util._
import Common._
import Common.Instructions._
import Constants._
//这个是定义cpath到dpath的一些控制信号。
//pc_sel:用于告诉dpath模块pc下一步怎么变化
//op1_sel:操作数1,指定一些特定操作,可以看consts.scala,后面会对consts.scala进行说明
//op2_sel:c操作数2,指定一些特定操作,可以看consts.scala,后面会对consts.scala进行说明
//alu_fun:alu对应的操作类型
//wb_sel:是否进行回写操作
//rf_wen:写寄存器文件使能
//csr_cmd:该指令的操作是否为csr相关指令
//exception:该指令是否为异常/非法指令
class CtlToDatIo extends Bundle()
{
val stall = Output(Bool())
val pc_sel = Output(UInt(PC_4.getWidth.W))
val op1_sel = Output(UInt(OP1_X.getWidth.W))
val op2_sel = Output(UInt(OP2_X.getWidth.W))
val alu_fun = Output(UInt(ALU_X.getWidth.W))
val wb_sel = Output(UInt(WB_X.getWidth.W))
val rf_wen = Output(Bool())
val csr_cmd = Output(UInt(CSR.SZ))
val exception = Output(Bool())
}
//定义cpath模块的端口
//Flipped是反转的作用,将DebugCPath()中定义的端口反过来,并在cpath模块中命名为dcpath,即input在这边边ouput
//imem是cpath取指令的memory,MemPortIo()在/commo/memory.scala中定义,后面再说明吧,在这里知道它是声明了一片sram就可以了
//dmem是cpath出来数据的memory,MemPortIo()在/commo/memory.scala中定义,后面再说明吧,在这里知道它是声明了一片sram就可以了
//dat是在DatToCtlIo()中声明端口的反端口
//ctl是CtlToDatIo()的调用,CtlToDatIo()在上面已经作了说明,用法是:ctl.exception、ctl.csr_cmd,某些信号在rtl中能找到对应的名字
class CpathIo(implicit conf: SodorConfiguration) extends Bundle()
{
val dcpath = Flipped(new DebugCPath())
val imem = new MemPortIo(conf.xprlen)
val dmem = new MemPortIo(conf.xprlen)
val dat = Flipped(new DatToCtlIo())
val ctl = new CtlToDatIo()
override def clon

本文深入解析了RISC-V Sodor处理器,特别是rv32_1stage阶段的设计原理。从cpath模块的控制信号生成,到指令解码及控制逻辑,详细阐述了如何通过Chisel实现处理器的流水线控制。
最低0.47元/天 解锁文章
849

被折叠的 条评论
为什么被折叠?



