riscv-sodor-rv32_1stage(4)

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
{
}

你可能感兴趣的:(RISC-V,&,rocket-chip)