riscv-sodor-rv32_3stage(3)

现在分析的是consts.scala。这两个文件的主要作用是定义一些常量。

consts.scala:

package Sodor
package constants
{

import chisel3._
import chisel3.util._


trait SodorProcConstants
{
   //************************************
   // Machine Parameters

   //声明两个memory的端口。
   val NUM_MEMORY_PORTS = 2;

   // if the front-end ONLY predicts PC+4, this simplifies quite a bit of logic.
   // First, the PC select mux never needs to compute ExePC + 4 on a branch
   // redirect (since PC+4 is always predicted).
   // Second, JAL can write-back to rd the ExePC, since it will already be PC+4
   // relative to the JAL.
   //做最简单的预测,每次都是当前PC+4,不需要计算执行PC+4的分支(即一条指令可能是跳转指令或
   //者是分支指令,由现在的A跳转到C,C是作为一个PC数值存在于该指令中的,这里的意思是只需
   //要计算A+4的值就可以,不需要额外计算C+4这个分支的值。)
   //跳转指令执行时,将PC+4的值(即错误预测的ExePC值)回写至rd中,即使回写的这个PC可能以后
   //都不会用。这是因为默认预测的PC永远是+4的,遇到跳转指令,这个预测就是错误的,回写只是一
   //个默认的操作。3stage还只是PC+4的预测,还没有BTB的分支预测功能。
   val PREDICT_PCP4 = true; require(PREDICT_PCP4==true) // no BTB, etc, added yet

   //************************************
   // Debugging
   val PRINT_COMMIT_LOG = false
}

trait ScalarOpConstants
{
   //************************************
   // Control Signals

   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 5-bit immediate; used by 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

   //回写选择信号
   //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   = false.B
   val MEN_1   = true.B
   val MEN_X   = false.B

   //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)


}

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值