正如标题所述,怎么做?
val a = 3.U
val result = a / 2.U
结果为1.U
但是我想在分区上应用ceil。
val result = ceil(a / 2.U )
因此,我可以得到2.U
的结果值。
答案 0 :(得分:1)
将a
除以b
时,如果您知道a
不是太大(即a <= UInt.MaxValue - (b - 1)
),那么您可以
def ceilUIntDiv(a: UInt, b: UInt): UInt =
(a + b - 1.U) / b
如果a
可能太大,那么以上内容可能会溢出,您需要在事后调整结果:
def ceilUIntDiv(a: UInt, b: UInt): UInt = {
val c = a / b
if (b * c == a) c else c + 1.U
}
答案 1 :(得分:0)
问题是表达式a / 2.U
确实是1.U
:如果您将ceil
应用于1.U
,您将获得1.U
。
回想一下,Int
也会发生这种情况,因为它们使用整数除法:
scala> val result = Math.ceil(3 / 2)
result: Double = 1.0
你应该做的是同样强制一个除法操作数为Double
:
scala> val result = Math.ceil(3 / (2: Double))
result: Double = 2.0
然后将其转换回UInt
。
答案 2 :(得分:0)
def ceilUIntDiv(a: UInt, b: UInt): UInt = {
(a / b) + {if (a % b == 0.U) 0.U else 1.U}
}