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'不是合法的注册或变量左值 第37行非阻塞分配的非法左侧 第39行对标量线'bp'的引用不是合法的注册或变量左值 第39行非阻塞分配的非法左侧
请帮助。
答案 0 :(得分:0)
始终和初始块中赋值的左侧必须是寄存器。 pv和bp是导线而不是寄存器。
你不能把一个变量放在assign的左边,并且总是同时阻塞。因为总是需要寄存器并分配需求线。
我在代码中看到了明显的语义错误。你需要学习Verilog的基础知识。你把assign表示你期望连续赋值,但初始块只在模拟开始时执行一次。 顺便说一下输出是默认的。你可以将它声明为输出[31:0] p;