如何在Chisel中为UInt划分结果

时间:2018-03-22 01:52:32

标签: scala chisel

正如标题所述,怎么做?

val a = 3.U

val result = a / 2.U 

结果为1.U

但是我想在分区上应用ceil。

val result = ceil(a / 2.U )

因此,我可以得到2.U的结果值。

3 个答案:

答案 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}
}