Здесь происходит то, что 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
, где вы пытались использовать его методы без предварительного нахождения внутри модуля.