Использование существующего класса Scala в новом классе [Зубило Scala]

#scala #class #module #chisel

Вопрос:

Это, вероятно, очень простой вопрос, но я ни за что на свете не смог бы найти ответа.

У меня есть это существующее логическое И классовое:

     class DelayedAND(val n:Int = 2) extends Module{
    val io = IO(new Bundle{
        val a = Input(UInt(1.W))
        val b = Input(UInt(1.W))
        val out = Output(UInt(1.W))
    })
     val delay = 2 
     val dand =io.aamp;io.b
     io.out := ShiftRegister(dand, delay)
    }
 

Который мне нужно включить в это Class вместо обычного «и»

     class HalfAdder extends Module {
     val io = IO(new Bundle{
     val a    = Input(UInt(1.W))
     val b    = Input(UInt(1.W))
     val sum  = Output(UInt(1.W))
     val cout = Output(UInt(1.W))
     })
  
     val a_xor_b = io.a ^ io.b
     io.sum := a_xor_b

     val a_and_b = io.a amp; io.b  //previous Class needs to be used here
     io.cout := a_and_b
     }
 

Я совершенно новичок в Scala и Chisel и уже несколько часов пытался решить эту проблему! Пожалуйста, помогите мне, спасибо!

Ответ №1:

 val a_and_b = Module(new DelayedAND(2))
a_and_b.io.a  := io.a
a_and_b.io.b  := io.b
io.cout       := a_and_b.io.out
 

Вот хорошее объяснение

https://www.chisel-lang.org/chisel3/docs/explanations/modules.html

Редактировать:

Чтобы дать более подробную информацию, a Module действует очень похоже на типичный Verilog, module за исключением того, что clock и reset подразумевается неявно (есть исключения, которые перечислены в ссылке, и некоторые другие, но это более глубоко и выходит за рамки этого вопроса). В Chisel, однако, Module представляет то, что должно стать Verilog module после компиляции/разработки Chisel для FIRRTL.

В журнале module проверки мы бы перечислили порты и подключили порты через список портов в экземпляре модуля. «Порты» в этом случае подключаются через. := оператор. Это назначение некоторой логики в/из наших Module «портов». Если исходить из фона Verilog, это может показаться довольно странным. Во-первых, вы можете подключиться к портам в любом месте кода! Эффективно распространяя свой «экземпляр модуля» повсюду. Если вы привыкли отслеживать соединения сигналов в verilog для отладки, это может показаться немного сложным, однако у этого есть некоторые преимущества. Вы можете изменить то, что подключено к определенному порту, на основе некоторого параметра/переменной. Отлично, соси это generate .

FIRRTL будет жаловаться, если вы не подключите один или несколько Input «s». Output Они нормально плавают/не подключены, хотя вы можете видеть, что часть вашей логики оптимизирована в зависимости от того, что создано.

Поэтому, когда вы впервые запускаете Chisel, применяйте этот подход к кодированию Module так же, как вы бы использовали Verilog module . Более интересные функции Chisel начнут проявляться по мере того, как вы попытаетесь понять, как выполнить определенную генерацию оборудования.

Преимущества Chisel в большей степени зависят от его гибкости в сложных системах, чем от небольших примеров, однако понимание этих небольших примеров является ключом к прогрессу в овладении языком.