Ошибка при проверке синтаксиса

module mult(a, b, p);     
input [16:0] a;     
input [16:0] b;     
output p;    
wire [31:0] p;   
reg i;       
wire pv;     
wire bp; 
assign pv = 32'b0; 
assign bp = {16'b0,b} ; 
initial begin 
for (i = 0; i < 32 ; i = i + 1)     
    begin       
    if (a[i] == 1'b1)           
    begin               
       pv <= pv + bp;           
    end                 
    bp <= bp << 1 ;     
    end 
end 
assign p = pv;   
endmodule

Я получаю следующую ошибку при компиляции кода, строка 37 Ссылка на скалярный провод 'pv' не является допустимым регистром или строкой переменной lvalue 37 Недопустимая левая сторона неблокирующей строки назначения 39 Ссылка на скалярный провод 'bp' не является юридическим регистром или переменная lvalue строка 39 Недопустимая левая часть неблокирующего назначения

Пожалуйста, помогите.

1 ответ

Левая часть присваивания всегда и начальные блоки должны быть регистрами. PV и BP - это провода вместо регистров.

Вы не можете поместить переменную в левую часть присвоения и всегда блокировать одновременно. Потому что всегда нужны регистры и назначают нужды провода.

Я вижу очевидные семантические ошибки в вашем коде. Вам необходимо изучить основы Verilog. Вы назначаете назначение, что означает, что вы ожидаете непрерывного назначения, но начальный блок выполняется только один раз в начале моделирования. Кстати выход по умолчанию проводной. Вы можете объявить это как output [31:0] p;

Другие вопросы по тегам