Ошибка при проверке синтаксиса
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;