riscv-sodor-rv32_1stage(4)
下面进行说明的是consts.scala & package.scala。这两个文件的主要作用是定义一些常量。
consts.scala:
trait SodorProcConstants
{
// for debugging, print out the commit information.
// can be compared against the riscv-isa-run Spike ISA simulator's commit logger.
val PRINT_COMMIT_LOG = false
}
trait ScalarOpConstants
{
//************************************
// Control Signals
//定义Y为true的布尔量,N为false的布尔量
val Y = true.B
val N = false.B
//PC的选择信号
//PC_4 --- PC+4 --- 位宽为3bits的信号,0值
//PC_BR --- 分支目标 --- 位宽为3bits的信号,1值
//PC_J --- 跳转目标 --- 位宽为3bits的信号,2值
//PC_JR --- 跳转寄存器目标 --- 位宽为3bits的信号,3值
//PC_EXC --- 异常 --- 位宽为3bits的信号,4值
// PC Select Signal
val PC_4 = 0.asUInt(3.W) // PC + 4
val PC_BR = 1.asUInt(3.W) // branch_target
val PC_J = 2.asUInt(3.W) // jump_target
val PC_JR = 3.asUInt(3.W) // jump_reg_target
val PC_EXC = 4.asUInt(3.W) // exception
//分支类型
//BR_N --- 下一个PC --- 位宽为4bits的信号,0值
//BR_NE --- 不等于 --- 位宽为4bits的信号,1值
//BR_EQ --- 等于 --- 位宽为4bits的信号,2值
//BR_GE --- 大于等于 --- 位宽为4bits的信号,3值
//BR_GEU --- 大于等于(无符号数) --- 位宽为4bits的信号,4值
//BR_LT --- 小于 --- 位宽为4bits的信号,5值
//BR_LTU --- 小于(无符号数) --- 位宽为4bits的信号,6值
//BR_J --- 跳转 --- 位宽为4bits的信号,7值
//BR_JR --- 寄存器跳转 --- 位宽为4bits的信号,8值
// Branch Type
val BR_N = 0.asUInt(4.W) // Next
val BR_NE = 1.asUInt(4.W) // Branch on NotEqual
val BR_EQ = 2.asUInt(4.W) // Branch on Equal
val BR_GE = 3.asUInt(4.W) // Branch on Greater/Equal
val BR_GEU = 4.asUInt(4.W) // Branch on Greater/Equal Unsigned
val BR_LT = 5.asUInt(4.W) // Branch on Less Than
val BR_LTU = 6.asUInt(4.W) // Branch on Less Than Unsigned
val BR_J = 7.asUInt(4.W) // Jump
val BR_JR = 8.asUInt(4.W) // Jump Register
//rs1寄存器操作选择信号
//OP1_RS1 --- rs1寄存器 --- 位宽为2bits的信号,0值
//OP1_IMU --- 立即数,U-type --- 位宽为2bits的信号,1值
//OP1_IMZ --- rs1的零扩展字段,用于CSRI指令 --- 位宽为2bits的信号,2值
//OP1_X --- rs1寄存器 --- 位宽为2bits的信号,0值
// RS1 Operand Select Signal
val OP1_RS1 = 0.asUInt(2.W) // Register Source #1
val OP1_IMU = 1.asUInt(2.W) // immediate, U-type
val OP1_IMZ = 2.asUInt(2.W) // Zero-extended rs1 field of inst, for CSRI instructions
val OP1_X = 0.asUInt(2.W)
//rs2寄存器操作选择信号
//OP2_RS2 --- rs2寄存器 --- 位宽为2bits的信号,0值
//OP2_IMI --- 立即数,I-type --- 位宽为2bits的信号,1值
//OP2_IMS --- 立即数,S-type --- 位宽为2bits的信号,2值
//OP2_PC --- PC --- 位宽为2bits的信号,3值
//OP2_X --- rs2寄存器 --- 位宽为2bits的信号,0值
// RS2 Operand Select Signal
val OP2_RS2 = 0.asUInt(2.W) // Register Source #2
val OP2_IMI = 1.asUInt(2.W) // immediate, I-type
val OP2_IMS = 2.asUInt(2.W) // immediate, S-type
val OP2_PC = 3.asUInt(2.W) // PC
val OP2_X = 0.asUInt(2.W)
//寄存器文件写使能信号
//REN_0 --- flase,不使能 --- 位宽为1bit的信号,false值
//REN_1 --- true,使能 --- 位宽为1bit的信号,true值
//REN_X --- flase,不使能 --- 位宽为1bit的信号,false值
// Register File Write Enable Signal
val REN_0 = false.B
val REN_1 = true.B
val REN_X = false.B
//ALU操作信号
//ALU_ADD --- 加法 --- 位宽为4bits的信号,1值
//ALU_SUB --- 减法 --- 位宽为4bits的信号,2值
//ALU_SLL --- 逻辑左移 --- 位宽为4bits的信号,3值
//ALU_SRL --- 逻辑右移 --- 位宽为4bits的信号,4值
//ALU_SRA --- 算术右移 --- 位宽为4bits的信号,5值
//ALU_AND --- 与 --- 位宽为4bits的信号,6值
//ALU_OR --- 或 --- 位宽为4bits的信号,7值
//ALU_XOR --- 异或 --- 位宽为4bits的信号,8值
//ALU_SLT --- 如果小于,则置值 --- 位宽为4bits的信号,9值
//ALU_SLTU --- 如果小于,则置值(无符号),U-type --- 位宽为4bits的信号,10值
//ALU_SLTU --- 复制 --- 位宽为4bits的信号,11值
//ALU_X --- 不操作 --- 位宽为4bits的信号,0值
// ALU Operation Signal
val ALU_ADD = 1.asUInt(4.W)
val ALU_SUB = 2.asUInt(4.W)
val ALU_SLL = 3.asUInt(4.W)
val ALU_SRL = 4.asUInt(4.W)
val ALU_SRA = 5.asUInt(4.W)
val ALU_AND = 6.asUInt(4.W)
val ALU_OR = 7.asUInt(4.W)
val ALU_XOR = 8.asUInt(4.W)
val ALU_SLT = 9.asUInt(4.W)
val ALU_SLTU= 10.asUInt(4.W)
val ALU_COPY1= 11.asUInt(4.W)
val ALU_X = 0.asUInt(4.W)
//回写选择信号
//WB_ALU --- 回写ALU --- 位宽为2bits的信号,0值
//WB_MEM --- 回写memory --- 位宽为2bits的信号,1值
//WB_PC4 --- 回写PC --- 位宽为2bits的信号,2值
//WB_CSR --- 回写CSR寄存器 --- 位宽为2bits的信号,3值
//WB_X --- 不操作 --- 位宽为2bits的信号,0值
// Writeback Select Signal
val WB_ALU = 0.asUInt(2.W)
val WB_MEM = 1.asUInt(2.W)
val WB_PC4 = 2.asUInt(2.W)
val WB_CSR = 3.asUInt(2.W)
val WB_X = 0.asUInt(2.W)
//内存函数的类型
//MWR_R --- 读 --- 位宽为2bits的信号,0值
//MWR_W --- 写 --- 位宽为2bits的信号,1值
//MWR_F --- FENCE --- 位宽为2bits的信号,2值
//MWR_X --- 不操作 --- 位宽为2bits的信号,0值
// Memory Function Type (Read,Write,Fence) Signal
val MWR_R = 0.asUInt(2.W)
val MWR_W = 1.asUInt(2.W)
val MWR_F = 2.asUInt(2.W)
val MWR_X = 0.asUInt(2.W)
//memory写使能信号
//MEN_0 --- flase,不使能 --- 位宽为1bit的信号,false值
//MEN_1 --- true,使能 --- 位宽为1bit的信号,true值
//MEN_X --- flase,不使能 --- 位宽为1bit的信号,false值
// Memory Enable Signal
val MEN_0 = Bool(false)
val MEN_1 = Bool(true)
val MEN_X = Bool(false)
//memory掩蔽类型信号
//MSK_B --- 1字节 --- 位宽为3bits的信号,0值
//MSK_BU --- 1字节(无符号) --- 位宽为3bits的信号,1值
//MSK_H --- half-word(半字) --- 位宽为3bits的信号,2值
//MSK_HU --- half-word(半字) --- 位宽为3bits的信号,3值
//MSK_W --- word(4字节) --- 位宽为3bits的信号,4值
//MSK_X --- word(4字节) --- 位宽为3bits的信号,4值
// Memory Mask Type Signal
val MSK_B = 0.asUInt(3.W)
val MSK_BU = 1.asUInt(3.W)
val MSK_H = 2.asUInt(3.W)
val MSK_HU = 3.asUInt(3.W)
val MSK_W = 4.asUInt(3.W)
val MSK_X = 4.asUInt(3.W)
//cache flush操作,同步
//M_N --- 不操作 --- 位宽为3bits的信号,0值
//M_SI --- 指令流同步 --- 位宽为3bits的信号,1值
//M_SD --- 数据流同步 --- 位宽为3bits的信号,2值
//M_FA --- 刷新全部cache --- 位宽为3bits的信号,3值
//M_FD --- 刷新dcache --- 位宽为3bits的信号,4值
// Cache Flushes & Sync Primitives
val M_N = 0.asUInt(3.W)
val M_SI = 1.asUInt(3.W) // synch instruction stream
val M_SD = 2.asUInt(3.W) // synch data stream
val M_FA = 3.asUInt(3.W) // flush all caches
val M_FD = 4.asUInt(3.W) // flush data cache
//内存函数的类型
//MT_READ --- 读 --- 位宽为2bits的信号,0值
//MT_WRITE --- 写 --- 位宽为2bits的信号,1值
//MT_FENCE --- FENCE --- 位宽为2bits的信号,2值
// Memory Functions (read, write, fence)
val MT_READ = 0.asUInt(2.W)
val MT_WRITE = 1.asUInt(2.W)
val MT_FENCE = 2.asUInt(2.W)
}
}
一样的package.scala也是定义一些常量。
package.scala:
package Sodor
import Sodor.constants._
import chisel3._
import chisel3.util._
import scala.math._
//TODO: When compiler bug SI-5604 is fixed in 2.10, change object Constants to
// package object rocket and remove import Constants._'s from other files
object Constants extends
// SodorProcConstants & ScalarOpConstants在上面的consts.scala中已经有定义
SodorProcConstants with
ScalarOpConstants with
// RISCVConstants在/common/consts.scala中再作介绍
Common.constants.RISCVConstants with
// MemoryOpConstants在/common/memory.scala中再作介绍
Common.MemoryOpConstants
{
}