def instBytes = if (HasCExtension) 2 else 4
def instOffsetBits = log2Ceil(instBytes)
def carryPos = log2Ceil(PredictWidth)+instOffsetBits
def getLower(pc: UInt) = pc(carryPos-1, instOffsetBits) 怎么理解上面的代码?
instBytes是每条指令占用的字节数,如果是压缩,就占用2个字节。反之是4个字节。
instOffsetBits = log2Ceil(instBytes) 计算需要多少位来表示这些字节内的偏移。每加一条指令,需要的PC地址偏移。PC占用2个字节,那么最低1位就需要在地址运算加1时去掉。
carryPos是PC当中用来表示每个分支预测块占用的地址段的最高位。
getLower(pc: UInt):给出一个pc,取出其中用来表示每个分支预测块的地址变化范围的部分。
例如:假设给定pc值为 "1010110000"。
HasCExtension
为真,所以instBytes = 2
。PredictWidth
为16,所以log2Ceil(16) = 4
。
则carryPos= log2Ceil(16)+1=5。
getLower(pc: UInt)=pc(5-1:1)= 1000。
也就是说,对于pc值为 "1010110000",其中1000部分是和分支预测地址相关的。