Как вы дважды создаете один и тот же модуль? - PullRequest
1 голос
/ 27 марта 2019

Я разрабатываю код в долоте и дважды пытался создать экземпляр модуля Encryption.

Если я просто использую Enc0 в приведенном ниже коде, он работает нормально. Но если я использую Enc0 и Enc1, то в строке 40 появляется следующая ошибка:

[error] chisel3.internal.ChiselException: Connection between sink (chisel3.core.UInt@1fc1) and source (chisel3.core.UInt@1f8d) failed @: Sink or source unavailable to current module.
 30       val Enc0 = Module(new Encryption())
 31       Enc0.io.lab1 := a0
 32       Enc0.io.lab2 := b0
 33       Enc0.io.lab3 := a0 & b0
 34       Enc0.io.key := io.secret_key
 35       Enc0.io.wire_id := io.wire_index
 36       Enc0.io.go := io.go
 37       val tab0 = Enc0.io.enc
 38       io.garbled_table.out0 := tab0
 39 
 40       val Enc1 = Module(new Encryption())
 41       Enc1.io.lab1 := a0
 42       Enc1.io.lab2 := b1
 43       Enc1.io.lab3 := a0 & b1
 44       Enc1.io.key := io.secret_key
 45       Enc1.io.wire_id := io.wire_index
 46       Enc1.io.go := io.go
 47       val tab1 = Enc1.io.enc
 48       io.garbled_table.out1 := tab1

Все входы и выходы Enc0 и Enc1 правильно подключены, поскольку Enc0 может работать, когда я комментирую все строки 40-48.

Так что я не знаю, почему он не работает

1 Ответ

1 голос
/ 27 марта 2019

Я расширил это до модуля, который компилирует. Возможно, вы можете сравнить это с вашим примером выше. Вероятно, это ошибка в направлении ввода-вывода одного из ваших промежуточных проводов. Это не идеально (есть работа по улучшению подобных сообщений об ошибках), но вы можете выяснить, какая строка является проблемой, раскомментировав замену правых частей 40-48 на DontCare и заменяя их по одному, пока вы не сузите вниз по оскорбительной линии.

Мой пример, который, кажется, строит.

import chisel3._
import chisel3.experimental.MultiIOModule

class Encryption extends Module {
  val io = IO(new Bundle {
    val lab1 = Input(Bool())
    val lab2 = Input(Bool())
    val lab3 = Input(Bool())

    val key = Input(UInt(8.W))
    val wire_id = Input(UInt(8.W))
    val go = Input(UInt(8.W))

    val enc = Output(UInt(8.W))
  })
}

class Parent extends MultiIOModule {

  val a0 = IO(Input(Bool()))
  val b0 = IO(Input(Bool()))
  val a1 = IO(Input(Bool()))
  val b1 = IO(Input(Bool()))
  val secret_key = IO(Input(UInt(8.W)))
  val io = IO(new Bundle {
    val secret_key = Input(UInt(8.W))
    val wire_index = Input(UInt(8.W))
    val garbled_table = new Bundle {
      val out0 = Output(UInt(8.W))
      val out1 = Output(UInt(8.W))
    }
    val go = Input(UInt(8.W))
  })

  val Enc0 = Module(new Encryption())
  Enc0.io.lab1 := a0
  Enc0.io.lab2 := b0
  Enc0.io.lab3 := a0 & b0
  Enc0.io.key := io.secret_key
  Enc0.io.wire_id := io.wire_index
  Enc0.io.go := io.go
  val tab0 = Enc0.io.enc
  io.garbled_table.out0 := tab0

  val Enc1 = Module(new Encryption())
  Enc1.io.lab1 := a0
  Enc1.io.lab2 := b1
  Enc1.io.lab3 := a0 & b1
  Enc1.io.key := io.secret_key
  Enc1.io.wire_id := io.wire_index
  Enc1.io.go := io.go
  val tab1 = Enc1.io.enc
  io.garbled_table.out1 := tab1
}

object Encryption {
  def main(args: Array[String]): Unit = {
    println(Driver.emit(() => new Parent))
  }
}
...