При просмотре HasTileParameters я вижу два разных типа ширины виртуального адреса: vaddrBits
и vaddrBitsExtended
:
def vaddrBits: Int =
if (usingVM) {
val v = maxSVAddrBits
require(v == xLen || xLen > v && v > paddrBits)
v
} else {
// since virtual addresses sign-extend but physical addresses
// zero-extend, make room for a zero sign bit for physical addresses
(paddrBits + 1) min xLen
}
def vpnBits: Int = vaddrBits - pgIdxBits
def vpnBitsExtended: Int = vpnBits + (vaddrBits < xLen).toInt
def vaddrBitsExtended: Int = vpnBitsExtended + pgIdxBits
Последний является на один бит больше, чем предыдущий, когда ширина виртуальной машины меньше чем xLen. Почему эта разница? И когда следует использовать один или другой?