Я хочу создать несколько новых типов чисел, таких как DspReal для dsptools, таких как DspPosit и DspQuire.DspPosit основан на posit, у меня есть некоторый Java-код, а DspQuire основан на quire, который является своего рода аккумулятором для posit.Потому что я просто хочу симуляции сейчас, поэтому я написал много ScalaBlackBox для их работы, например, DspReal.Однако я обнаружил, что ScalaBlackBox не может создавать последовательную логику.Например, токовый выход аккумулятора Quire зависит от его входа и последнего выхода.Но ScalaBlackBox не может получить значение вывода.Кроме того, шаг (n) также влияет на вывод.Потому что аккумулятор будет читать свой вход за такт.
Я обнаружил некоторые системные проблемы с педалью.Во-первых, функция ScalaBlackBox, twoOp и oneOp и так далее будет вызываться много раз.Я не знаю почему.Во-вторых, step (n) является функцией PeekPokeTester, к которой ScalaBlackBox не может получить доступ.В-третьих, я пытаюсь прочитать текущий вывод, но система выдает ошибки.
trait DspBlackBlackBoxImpl extends BlackBoxImplementation with ScalaBlackBox
abstract class DspQuireAccumulator extends DspBlackBlackBoxImpl {
lazy val accValue = Quire32() // initial value
/**
* sub-classes must implement this two argument function
*
* @param posit accumulate element
* @return quire operation result
*/
def accOp(posit: Posit32): Unit
def outputDependencies(outputName: String): Seq[(String)] = {
outputName match {
case "out" => Seq("in") // Seq("out", "in") gives errors
case _ => Seq.empty
}
}
def cycle(): Unit = {}
def execute(inputValues: Seq[Concrete], tpe: Type, outputName: String): Concrete = {
val arg1 :: _ = inputValues
val positArg = Posit32(arg1.value)
accOp(positArg)
val result = quire32ToBigInt(accValue)
ConcreteSInt(result, DspQuire.underlyingWidth, arg1.poisoned).asUInt
}
def getOutput(inputValues: Seq[BigInt], tpe: Type, outputName: String): BigInt = {
val arg1 :: _ = inputValues
val positArg = Posit32(arg1)
accOp(positArg)
quire32ToBigInt(accValue)
}
}
class DspQuireAddAcc(val name: String) extends DspQuireAccumulator {
def accOp(posit: Posit32): Unit = accValue += posit
}
class QuireBlackboxAccOperand extends BlackBox {
val io = IO(new Bundle() {
val in = Input(UInt(DspPosit.underlyingWidth.W))
val out = Output(UInt(DspQuire.underlyingWidth.W))
})
}
class BBQAddAcc extends QuireBlackboxAccOperand
class TreadleDspQuireFactory extends ScalaBlackBoxFactory {
def createInstance(instanceName: String, blackBoxName: String): Option[ScalaBlackBox] = {
blackBoxName match {
case "BBQAddAcc" => Some(add(new DspQuireAddAcc(instanceName)))
...
accOp будет вызываться много раз.Итак, если я хочу накапливать List (1, 2, 3), результат может быть 0 + 1 + 1 + 2 + 2 + ... И функция peek снова вызовет accOp, это также меня смущает.