blob: 76edbd54ca9fcd9bb672c4b59f65c449b259e8e3 [file] [log] [blame]
/*
* Copyright 2023 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package kelvin
import chisel3._
import chisel3.util._
// Convert register port into a onehot w/wo stripmining.
object RegActive {
def apply(m: Bool, step: UInt, regnum: UInt): UInt = {
assert(step.getWidth == 3)
assert(regnum.getWidth == 6)
assert(step <= 4.U)
val oh = OneHot(regnum(5,2), 16)
val oh0 = Cat(0.U(3.W), oh(15),
0.U(3.W), oh(14),
0.U(3.W), oh(13),
0.U(3.W), oh(12),
0.U(3.W), oh(11),
0.U(3.W), oh(10),
0.U(3.W), oh(9),
0.U(3.W), oh(8),
0.U(3.W), oh(7),
0.U(3.W), oh(6),
0.U(3.W), oh(5),
0.U(3.W), oh(4),
0.U(3.W), oh(3),
0.U(3.W), oh(2),
0.U(3.W), oh(1),
0.U(3.W), oh(0))
val oh1 = Cat(0.U(2.W), oh(15), 0.U(1.W),
0.U(2.W), oh(14), 0.U(1.W),
0.U(2.W), oh(13), 0.U(1.W),
0.U(2.W), oh(12), 0.U(1.W),
0.U(2.W), oh(11), 0.U(1.W),
0.U(2.W), oh(10), 0.U(1.W),
0.U(2.W), oh(9), 0.U(1.W),
0.U(2.W), oh(8), 0.U(1.W),
0.U(2.W), oh(7), 0.U(1.W),
0.U(2.W), oh(6), 0.U(1.W),
0.U(2.W), oh(5), 0.U(1.W),
0.U(2.W), oh(4), 0.U(1.W),
0.U(2.W), oh(3), 0.U(1.W),
0.U(2.W), oh(2), 0.U(1.W),
0.U(2.W), oh(1), 0.U(1.W),
0.U(2.W), oh(0), 0.U(1.W))
val oh2 = Cat(0.U(1.W), oh(15), 0.U(2.W),
0.U(1.W), oh(14), 0.U(2.W),
0.U(1.W), oh(13), 0.U(2.W),
0.U(1.W), oh(12), 0.U(2.W),
0.U(1.W), oh(11), 0.U(2.W),
0.U(1.W), oh(10), 0.U(2.W),
0.U(1.W), oh(9), 0.U(2.W),
0.U(1.W), oh(8), 0.U(2.W),
0.U(1.W), oh(7), 0.U(2.W),
0.U(1.W), oh(6), 0.U(2.W),
0.U(1.W), oh(5), 0.U(2.W),
0.U(1.W), oh(4), 0.U(2.W),
0.U(1.W), oh(3), 0.U(2.W),
0.U(1.W), oh(2), 0.U(2.W),
0.U(1.W), oh(1), 0.U(2.W),
0.U(1.W), oh(0), 0.U(2.W))
val oh3 = Cat(oh(15), 0.U(3.W),
oh(14), 0.U(3.W),
oh(13), 0.U(3.W),
oh(12), 0.U(3.W),
oh(11), 0.U(3.W),
oh(10), 0.U(3.W),
oh(9), 0.U(3.W),
oh(8), 0.U(3.W),
oh(7), 0.U(3.W),
oh(6), 0.U(3.W),
oh(5), 0.U(3.W),
oh(4), 0.U(3.W),
oh(3), 0.U(3.W),
oh(2), 0.U(3.W),
oh(1), 0.U(3.W),
oh(0), 0.U(3.W))
assert(oh.getWidth == 16)
assert(oh0.getWidth == 64)
assert(oh1.getWidth == 64)
assert(oh2.getWidth == 64)
assert(oh3.getWidth == 64)
val idx = regnum(1,0)
val active = MuxOR(!m && idx === 0.U || m && step <= 0.U, oh0) |
MuxOR(!m && idx === 1.U || m && step <= 1.U, oh1) |
MuxOR(!m && idx === 2.U || m && step <= 2.U, oh2) |
MuxOR(!m && idx === 3.U || m && step <= 3.U, oh3)
assert(active.getWidth == 64)
active
}
}
// Convert tagged address into register file format.
object OutTag {
def apply(v: VAddrTag): UInt = {
OutTag(v.addr, v.tag)
}
def apply(addr: UInt, tag: UInt): UInt = {
assert(addr.getWidth == 6)
assert(tag.getWidth == 4)
tag(addr(1,0))
}
}
object ScoreboardReady {
def apply(a: VAddrTag, sb: UInt): Bool = {
assert(a.addr.getWidth == 6)
assert(a.tag.getWidth == 4)
assert(sb.getWidth == 128)
val tag = a.tag(a.addr(1,0))
val idx = Cat(tag, a.addr)
assert(idx.getWidth == 7)
(!a.valid || !sb(idx))
}
}