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 可以工作。
所以我不知道为什么它不起作用
解决方案
我已将其扩展为一个可以编译的模块。也许您可以将其与上面的示例进行比较。这可能是您的中间线之一的 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))
}
}
推荐阅读
- ios - 更新证书并重新启动后解析服务器拒绝会话身份验证
- javascript - 为什么我的 m4a 音频可以用 html5 播放,但不能在 Android 上用 fetch 和 blob uri 播放?
- shell - 使用 awk 和逻辑运算符过滤 shell 脚本中的多个列
- python - 回购函数的递归计数
- python - 如何在 pandas 和 datetime 中使用 or
- java - onCreate 在设置单顶启动模式的情况下运行 2 次
- python - 无法使用 CMD 打开 Jupyter Notebook
- android - 在进行 REST-Api 调用时预期结果后获取 Null 列表
- javascript - 在 Mapbox 的视口之外过滤功能
- php - Laravel View 无法识别我的服务提供商