双打上的chisel3算术运算

时间:2017-08-24 14:01:57

标签: scala verilog chisel

我在使用凿子中的双打来操作算术运算时遇到问题。我一直在看到仅使用以下类型的示例:Int,UInt,SInt。 我看到here算术操作只描述了SInt和UInt。 Double怎么样? 我试图将输出声明为Double,但不知道如何。因为我的代码输出是Double。 有没有办法在Bundle中声明输入和Double类型的输出?

这是我的代码:

class hashfunc(val k:Int, val n: Int ) extends Module {

  val a = k + k
  val io = IO(new Bundle {
    val b=Input(UInt(k.W))
    val w=Input(UInt(k.W))
    var out  = Output(UInt(a.W))
  })

   val tabHash1 = new Array[Array[Double]](n)
    val x   = new ArrayBuffer[(Double, Data)]
    val tabHash = new Array[Double](tabHash1.size)
  for (ind <- tabHash1.indices){
     var sum=0.0
    for (ind2 <- 0 until x.size){
      sum += ( x(ind2) * tabHash1(ind)(ind2) )
   }     
      tabHash(ind) = ((sum + io.b) / io.w)
    }
  io.out := tabHash.reduce(_ + _)
 }

编译代码时,出现以下错误: code error

感谢您的关注,期待您的回复。

2 个答案:

答案 0 :(得分:2)

任何HDL都不直接支持对浮点数的操作(在这种情况下为Double)。这样做的原因是虽然固定点数的加法/减法/乘法很明确,但浮点硬件有很多设计空间权衡,因为它是一个复杂得多的硬件。

也就是说,高性能浮点单元本身就是一块重要的硬件,并且可以在任何实际设计中分享时间。

答案 1 :(得分:2)

Chisel确实有一个可能有用的原生FixedPoint类型。它在实验包中

import chisel3.experimental.FixedPoint

还有一个项目DspTools可以为双打提供模拟支持。有一些很好的功能,例如它允许模块在数字类型(Complex,Double,FixedPoint,SInt)上进行参数化,以便您可以在double上运行模拟以验证所需的数学行为,然后切换到符合您的精度标准的可合成数字格式。

DspTools是一个正在进行的研究项目,团队会非常感谢外部用户的反馈。