您如何两次实例化同一模块?

时间:2019-03-27 13:20:09

标签: chisel

我正在用凿子开发代码,并试图两次实例化模块加密。

如果我仅在下面的代码中使用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的所有输入和输出均正确连接,因为当我注释所有40-48行时,Enc0可以工作。

所以我不知道为什么它不起作用

1 个答案:

答案 0 :(得分:1)

我已经将其扩展到可以编译的模块。也许您可以将其与上面的示例进行比较。这可能是您的一根中间线的IO方向错误。它不理想(正在努力改善此类错误消息),但是您可以通过取消注释用DontCare替换40-48的右侧,并一一替换,直到缩小范围来找出问题所在。触犯规矩。

我的示例似乎可以构建。

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))
  }
}