Verilog 检查语法时出错 模块mult(a、b、p); 输入[16:0]a; 输入[16:0]b; 输出p; 金属丝[31:0]p; 注册i; 电线光伏; 铁丝网; 指定pv=32'b0; 赋值bp={16'b0,b}; 初始开始 对于(i=0;i

Verilog 检查语法时出错 模块mult(a、b、p); 输入[16:0]a; 输入[16:0]b; 输出p; 金属丝[31:0]p; 注册i; 电线光伏; 铁丝网; 指定pv=32'b0; 赋值bp={16'b0,b}; 初始开始 对于(i=0;i,verilog,xilinx,xilinx-ise,Verilog,Xilinx,Xilinx Ise,始终和初始块中赋值的左侧必须是寄存器。pv和bp是导线而不是寄存器 您不能将变量放在assign的左侧,而总是同时阻塞。因为总是需要寄存器,分配需要导线 我在代码中看到了明显的语义错误。你需要学习Verilog的基础知识。放置assign,这意味着您希望连续分配,但初始块在模拟开始时仅执行一次。 顺便说一下,默认情况下,输出是有线的。您可以将其声明为输出[31:0]p 如果我将寄存器分配给pv和bp。我得到以下错误:HDLCompilers:246-“mult.v”第30行对标量注册表'pv'的

始终和初始块中赋值的左侧必须是寄存器。pv和bp是导线而不是寄存器

您不能将变量放在assign的左侧,而总是同时阻塞。因为总是需要寄存器,分配需要导线

我在代码中看到了明显的语义错误。你需要学习Verilog的基础知识。放置assign,这意味着您希望连续分配,但初始块在模拟开始时仅执行一次。
顺便说一下,默认情况下,输出是有线的。您可以将其声明为输出[31:0]p

如果我将寄存器分配给pv和bp。我得到以下错误:HDLCompilers:246-“mult.v”第30行对标量注册表'pv'的引用不是合法的净左值错误:HDLCompilers:53-“mult.v”第30行连续赋值的左侧非法,因此我把它作为注册表,我该怎么办?错误:HDLCompilers:247-“mult.v”第31行对标量线“pv”的引用不是合法的注册表或变量左值错误:HDLCompilers:44-“mult.v”第31行阻塞分配错误的左侧非法:HDLCompilers:247-“mult.v”第36行对标量线“pv”的引用不是合法的注册表或变量左值错误:HDLCompilers:106-“mult.v”第36行非阻塞分配的非法左侧错误:HDLCompilers:247-“mult.v”第38行对标量线“bp”的引用不是合法的注册表或变量左值错误:HDLCompilers:106-“mult.v”第38行非阻塞分配的非法左侧assign@Laleh,你的答案有三个主要问题。(1) 代码将仅在时间0处执行(如何执行可合成的连续过程块?)。(2) 无限循环(你能找出原因吗?)。(3) 结果不正确(非阻塞如何工作?)我知道!正如我提到的,这段代码有很多语义错误。我只是把它改成编译!这段代码表明缺乏对基本Verilog概念的理解。在尝试修复代码之前,请了解
wire
vs
reg
vs
integer
以及
assign
vs
initial
vs
always
,以及阻塞分配(
=
)与非阻塞分配(

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