取 UInt 的 log2Ceil

Taking log2Ceil of UInt

我正在计算以下计算的 log2:

tl_out.a.bits.size := log2Ceil(s1_row * s2_column * 4.U)

其中,s1_row 和 s2_column 是 UInt。 我收到以下错误:

[info] Compiling 1 Scala source to ...rocket-chip/target/scala-2.12/classes ...
[error] ...scala:199:25: overloaded method value apply with alternatives:
[error]   (in: Int)Int <and>
[error]   (in: BigInt)Int
[error]  cannot be applied to (chisel3.core.UInt)
[error]         tl_out.a.bits.size := log2Ceil(s1_row * s2_column * 4.U)
[error]                               ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed

似乎无法在UInt/SInt上执行log2Ceil。有什么方法可以通过 UInt 执行类型转换 UINT/SInt 或 log2Ceil 的替代方法? 请协助...

感谢和问候,

log2Ceil() 是查找单词大小的好函数。但请注意,对于 UInt() Wire 或 Reg,它不是 "synthesizable"。 log2Ceil() 计算在综合时完成一次,它不是硬件功能。那么你的输出信号tl_out.a.bits.size将是一个常数。

如果你想找到最重要的设置位,你应该使用名为 PriorityEncoder(Reverse(s1_row * s2_column * 4.U)) 的硬件函数。

PriorityEncoder() return信号中最低有效“1”的位置。 Reverse() 反转信号中的位顺序。