我正在用凿子开发代码,并试图两次实例化模块加密。
如果我仅在下面的代码中使用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可以工作。
所以我不知道为什么它不起作用
答案 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))
}
}