源码来自risc-v中文社区的这个帖子,本mini risc mcu学习源代码有二个对应的文件,一个是chisel源码文件,另一个是对应的verilog源文件,其中chisel源文件进行了行注释,相信不懂chisel的也能明白很多东西:还有一个帖子模拟如何烧写bin文件到 flash,上电boot,读指令并执行并判断结果
chisel源码:
import chisel3._
import chisel3.util._
class Risc extends Module{
val io = IO(new Bundle {
val isWr = Input(Bool())
val wrAddr = Input(UInt(8.W))
val wrData = Input(UInt(32.W))
val boot = Input(Bool())
val valid = Output(Bool())
val out = Output(UInt(32.W))
})
val file = Mem(256,UInt(32.W)) //Mem的构造参数,第一个是数量,第二个是chisel类型 file表示二进制码文件.bin内容
val code = Mem(256,UInt(32.W)) //指令代码区
val pc = RegInit(0.U(8.W)) //当前指令地址指针
val add_op :: imm_op :: Nil = Enum(2) //操作符
val inst = code(pc) //根据pc值在代码区取指令值
val op = inst(31,24) //32位指令码中高8位
val rci = inst(23,16) //32位指令码中次高8位
val rai = inst(15,8) //32位指令码中中8位 //相对偏移地址
val rbi = inst(7,0) //32位指令码中低8位 //相对偏移地址
val ra = Mux(rai === 0.U,0.U,file(rai)) //根据指令码中中8位地址从.bin文件中取对应偏移地址所对应的值
val rb = Mux(rbi === 0.U,0.U,file(rbi)) //根据指令码中低8位地址从.bin文件中取对应偏移地址所对应的值
val rc = Wire(UInt(32.W)) //指令操作的结果
io.valid := false.B //默认值 因为io.valid在逻辑判断过程中是有条件改变值,所以根据语法需要,output类型需要赋初值,否则会报错
io.out := 0.U
rc := 0.U
|