Просто чтобы понять, почему вы не можете использовать while
l oop с аппаратными значениями, такими как chisel3.Bool
, вы можете представить проект chisel3
как программу Scala, которая конструирует аппаратный дизайн как это выполняется. Когда запускается chisel3
, он просто запускает программу, вывод которой является вашей схемой (в конечном итоге выводится как Verilog
). while
- это конструкция Scala
, поэтому она доступна только во время выполнения программы, она не существует на реальном оборудовании. Существует аналогичный вопрос и ответ о for
петлях в списке рассылки пользователей зубила .
Теперь, чтобы ответить на ваш вопрос, как упоминал Чик, вы можете использовать конструкции chisel3
when
, .elsewhen
и .otherwise
для управления потоком управления в реальном оборудовании:
class Module2 extends Module {
val io = IO(new Bundle {
val in = Input(Reg(UInt))
}
val test = 0.U
when (test < io.in) {
// Logic for that applies when (or while) the condition is true
} .otherwise {
// Logic that applies when it isn't
}
}
Также, как упоминал Чик, вам, вероятно, понадобится некоторое состояние (с использованием Reg
с), так как вы можете нужно делать вещи в течение нескольких тактов. Трудно дать совет, кроме этого простого примера, без дополнительной информации, но, пожалуйста, уточните свой вопрос или задайте больше вопросов, если вам нужна дополнительная помощь.
Если это так, не будет ли это быстро усложниться, если вы есть несколько функций, каждая в разных модулях?
Я не уверен, как ответить на этот бит без большего контекста, но вся цель Chisel состоит в том, чтобы упростить создание абстракций, которые позволяют вам справиться со сложностью. Долото позволяет разрабатывать программное обеспечение при проектировании оборудования.