首页 > 解决方案 > 你如何两次实例化同一个模块?

问题描述

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

如果我只在下面的代码中使用 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 可以工作。

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

标签: chisel

解决方案


我已将其扩展为一个可以编译的模块。也许您可以将其与上面的示例进行比较。这可能是您的中间线之一的 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))
  }
}

推荐阅读