Вывод for неизвестен вместо 1 в Verilog

Я использую Icarus iVerilog для синтеза и тестирования своего кода, но я получаю неизвестные значения, когда логически должны появляться единицы. Вот пример того, что я пытаюсь сделать.

reg [8:0] a = 000110100;
wire [8:0] b = 0;

generate
    genvar i;
    for (i = 8; i > -1; i = i - 1)
    begin:loop
        assign b[i] = |a[8:i];
    end
endgenerate

Это должно произвести некоторые ворота в виде

b[8] = a[8];
b[7] = a[8] | a[7];
b[6] = a[8] | a[7] | a[6];
b[5] = a[8] | a[7] | a[6] | a[5];
...

Мой ожидаемый результат

000111111

я на самом деле получаю

000xxxxxx

Я не могу найти причину появления крестиков и начинаю подозревать, что это проблема с iVerilog.


person adragon202    schedule 31.07.2016    source источник
comment
Поддерживает ли ваш инструмент синтеза инициализацию объявления переменных?   -  person dave_59    schedule 01.08.2016
comment
Я мог бы попробовать это в другом инструменте завтра, но сейчас вы можете попробовать две вещи: 1) использовать i>=0 вместо i>-1 и 2) считать вперед с 0, а не назад с 8.   -  person teadotjay    schedule 01.08.2016


Ответы (1)


Пожалуйста, удалите присвоение в объявлении ниже. Присвоение провода 0 в объявлении конфликтует с назначением 1 в блоке genvar.

 wire [8:0] b = 0;

изменить на

wire [8:0] b;

Это потому что

wire [8:0] b = 0;

это не инициализация, это непрерывное присваивание. Это эквивалентно

wire [8:0] b;
assign b = 0;

Отсюда и конфликт.

person babyworm    schedule 01.08.2016