我试图为下面的程序生成verilog,但它正在抛出AssertionError。相应的verilog是否会将“io.opcode:= io.a + io.b”语句展开5次? 如果有人能说出循环是如何起作用的话会非常有用。
val io = new Bundle {
val a = UInt(INPUT, 2)
val b = UInt(INPUT, 2)
val opcode = UInt(INPUT, 2)
val output = UInt(OUTPUT, 2)
}
for(j <- 0 to 4){
io.opcode := io.a + io.b
}
io.output := io.opcode
答案 0 :(得分:2)
io.opcode字段是一个输入,因此当您指定它时会收到错误。
答案 1 :(得分:2)
首先,您将“io.opcode”作为输入,但是您要为其分配io.a + io.b
。
其次,你的for循环无所作为。这是scala代码,你没有在任何地方使用“j”迭代器变量,所以这就是它扩展到:
io.opcode := io.a + io.b
io.opcode := io.a + io.b
io.opcode := io.a + io.b
io.opcode := io.a + io.b
这里的语义是最后一个作者获胜,所以“io.opcode = io.a + io.b”的最后一个语句将是最终值。实际上,前三个语句没有任何意义,因此它们将从图中删除。当然,io.opcode实际上是一个输入,所以它不会生成你想要的代码(它应该抛出错误)。