Он должен развернуть цикл, но вместо этого выдает AssertionError

Я пытался сгенерировать verilog для приведенной ниже программы, но она выдает AssertionError. Является ли соответствующий оператор verilog развернутым «io.opcode: = io.a + io.b» 5 раз? было бы очень полезно, если бы кто-нибудь мог рассказать, как работает цикл for.

 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

person Vikas Chauhan    schedule 30.09.2014    source источник


Ответы (2)


Поле io.opcode является входным, поэтому при его назначении вы получаете сообщение об ошибке.

person colins    schedule 30.09.2014

Во-первых, вы вводите «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 на самом деле является вводом, поэтому он не будет генерировать нужный код (он должен выдавать ошибку).

person Chris    schedule 30.09.2014
comment
Спасибо за ваш ответ, я получил свой ответ. - person Vikas Chauhan; 01.10.2014