现在分析的是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

consts.scala文件定义了Sodor处理器的一些关键常量和控制信号,包括内存端口数量、预测PC+4策略、调试标志以及各种控制信号如PC选择、分支类型、操作数选择、寄存器写使能、回写选择、内存操作类型等,这些常量和信号在处理器的指令执行和数据流控制中起着重要作用。
最低0.47元/天 解锁文章
2565





