Можно ли проверить консоль Reg () в консоли? - PullRequest
1 голос
/ 08 ноября 2019

Чтобы проверить код Chisel, я запускаю консоль sbt, а затем scala в каталоге моего проекта, где находится файл build.sbt. Я могу импортировать библиотеку chisel3:

$ cd myproject
$ sbt
sbt:myproject> console
scala> import chisel3._
import chisel3._

Затем я могу протестировать некоторый код долота для типа данных, например:

scala> val plop = "b01010101".U(20.W)
plop: chisel3.UInt = UInt<20>(85)

Но я могу проверить Reg () или другие элементы Module ():

scala> val plopReg = RegInit(23.U(24.W))
java.lang.IllegalArgumentException: requirement failed: must be inside Builder context
  at scala.Predef$.require(Predef.scala:281)
  at chisel3.internal.Builder$.dynamicContext(Builder.scala:232)
  at chisel3.internal.Builder$.currentClock(Builder.scala:308)
  at chisel3.internal.Builder$.forcedClock(Builder.scala:318)
  at chisel3.RegInit$.apply(Reg.scala:155)
  at chisel3.RegInit$.apply(Reg.scala:173)
  ... 36 elided

Есть ли подсказки для проверки этих долот в консоли? Или это обязательно написать файл с кодом исходного кода?

1 Ответ

1 голос
/ 15 ноября 2019

Здесь происходит то, что UInt - это тип долота, а Reg - это тип оборудования.

Вы можете играть с типами оборудования только внутри модуля. Я часто делаю что-то вроде следующего, чтобы поиграть с ними на консоли:

import chisel3._
import chisel3.stage.{ChiselStage, ChiselGeneratorAnnotation}
import chisel3.util.Cat

import firrtl.EmittedCircuitAnnotation

class Foo extends MultiIOModule {
  val in = IO(Input(Bool()))
  val out = IO(Output(Bool()))

  val tmp = RegNext(~in)

  out := tmp
}

val args = Array(
  "-X", "verilog",
  "-E", "high",
  "-E", "middle",
  "-E", "low",
  "-E", "verilog")

(new ChiselStage).execute(args, Seq(ChiselGeneratorAnnotation(() => new Foo)))

Затем вы можете просмотреть различные выводы в вашем каталоге chisel3 верхнего уровня.

Дополнительная информация

В частности, UInt (и тому подобное) являются фабричными методами, генерирующими классы (технически UInt на самом деле является объектом, расширяющим UIntFactory). ,Когда вы делаете UInt(4.W), это создает новый UInt. Вы должны иметь возможность создавать новые классы где угодно, именно поэтому это работает на консоли.

Однако, когда вы делаете Reg(UInt(4.W)), это взаимодействует с глобальным изменяемым состоянием, используемым в процессе разработки для связи регистра сконкретный модуль. Это глобальное изменяемое состояние хранится внутри Builder. Ошибка, которую вы получаете, исходит от Builder, где вы пытались использовать его методы без предварительного нахождения внутри модуля.

...