Этот вопрос действительно поражает сердце того, что делает долото мощным. Как DSL, встроенный в Scala, у вас есть доступ к полной мощности объектно-ориентированного и функционального языка программирования.
Хотя я не уверен точно, что вы делаете, это кажется хорошим местом для использования наследования. Вы можете создать новый класс модуля, который расширяет модуль datapath и добавляет дополнительные функции.
Игрушечный пример:
import Chisel._
class ParentIO extends Bundle {
val foo = UInt(width = 32).asInput
val bar = UInt(width = 32).asOutput
}
class Parent extends Module {
// Note the use of lazy val
// Due to Scala initialization order (http://docs.scala-lang.org/tutorials/FAQ/initialization-order.html)
// this cannot be a val
// Due to quirks of Chisel, this cannot be a def
lazy val io = new ParentIO
io.bar := io.foo
}
class ChildIO extends ParentIO {
val isOdd = Bool().asOutput
}
class Child extends Parent {
override lazy val io = new ChildIO
io.isOdd := io.foo(0)
}
// Note use of call-by-name for passing gen
// Chisel Modules must be constructed within a call to the Module(...) function
class Top(gen: => Parent) extends Module {
val dut = Module(gen)
val io = dut.io.cloneType
io <> dut.io
}
Модуль Top параметризируются по типу модуля он создает экземпляр: родитель или ребенок. Таким образом, вы можете условно создать родительский или дочерний объект, а не всю логику, которая их отличает. Если вы хотите, чтобы Ребенок переопределял определенные функции родителя, последняя семантика связывания Chisel позволяет любым соединениям в Ребенке отменять соединения в родительском элементе.
Спасибо за ответ! Я задаюсь вопросом, возможно ли иметь переменную, которая может управлять параметром модуля Top, поэтому он будет создавать экземпляр Child, если переменная установлена в 1, а родитель в противном случае? Я пробовал разные идеи, не получая того, что хочу. – Mrchacha
Я ответил на http://stackoverflow.com/questions/41720320/initialize-class-depending-on-config-value – jkoenig