Тип класса для комплексных чисел - PullRequest
0 голосов
/ 10 января 2019

Мне нужно реализовать пользовательский класс типов для операций Complex DSP и Complex Ring. Я знаю о проекте DspTools, но намеренно хочу исключить его из рассмотрения.

У меня есть аппаратный модуль, который я хочу создать с помощью классов diff: UInt, SInt, FixedPoint, Real и Complex (FixedPoint, FixedPoint).

Вот мой минимальный класс:

class Complex[A <: Data, B <: Data] (val re:A, val im:B) extends Bundle {
  override def cloneType: this.type = new Complex(re, im).asInstanceOf[this.type]
}

object Complex {    
  def apply[A <: Data, B <: Data](re:A, im:B) = new Complex(re, im)  
  implicit def UInt2Complex(re:UInt, im:UInt) = Complex(re,im)
}

Когда я создаю это с разными типами данных из Chisel3.Core, код компилируется и работает. Однако, когда я пытаюсь сделать:

import chisel3.core.{FixedPoint => FP}
...

  val inType  = Complex ( FP(20.W,10.BP), FP(20.W,10.BP))
  val outType = Complex ( FP(20.W,10.BP), FP(20.W,10.BP))
...

Я скомпилировал код, но FIRRTL выдает ошибку:

[info], используя --backend-name verilator [info] chisel3.core.Binding $ RebindingException: Попытка переназначения привязки к chisel3.core.FixedPoint@d [info] at chisel3.core.Data.binding_ $ eq (Data.scala: 250)

Что с этим не так? Как решить проблему?

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Вот реальная минималистичная реализация, которая работала для меня. @jkoenig указал мне правильное направление. Большое спасибо!

class Complex[A <: Data, B <: Data] (val re:A, val im:B) extends Bundle {
  override def cloneType: this.type = new Complex(re.cloneType, im.cloneType).asInstanceOf[this.type]
}

object Complex {

  def apply[A <: Data, B <: Data](re:A, im:B):Complex[A,B] = {
    val real  = re.cloneType
    val imag  = im.cloneType
    new Complex(real,imag)
  }  
}
0 голосов
/ 11 января 2019

Проблема в том, что Chisel нужны свежие клоны любого Data, когда он рекурсивно вызывает cloneType, и вы просто передаете re и im конструктору Complex, что приводит к точно таким же объектам. Поместите немного более конкретно:

val a = Complex(UInt(8.W), UInt(8.W))
val b = a.cloneType
a.re eq b.re // This will be true and it *must* not be

Это своего рода давняя проблема, которую мы не можем решить, в вашем случае вам следует позвонить .cloneType на re и im на Complex.cloneType

Я знаю, что вы не используете DSPTools, но он все еще может предоставить ссылку, и они делают это: https://github.com/ucb-bar/dsptools/blob/fe8f9d08987f3a403f6281ba4face1c26b627b71/src/main/scala/dsptools/numbers/chisel_concrete/DspComplex.scala#L75

...