它应该展开循环,而是抛出AssertionError

时间:2014-09-30 06:14:47

标签: hardware chisel

我试图为下面的程序生成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

2 个答案:

答案 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实际上是一个输入,所以它不会生成你想要的代码(它应该抛出错误)。