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
始终和初始块中赋值的左侧必须是寄存器。pv和bp是导线而不是寄存器 您不能将变量放在assign的左侧,而总是同时阻塞。因为总是需要寄存器,分配需要导线 我在代码中看到了明显的语义错误。你需要学习Verilog的基础知识。放置assign,这意味着您希望连续分配,但初始块在模拟开始时仅执行一次。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'的
顺便说一下,默认情况下,输出是有线的。您可以将其声明为输出[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
vsreg
vsinteger
以及assign
vsinitial
vsalways
,以及阻塞分配(=
)与非阻塞分配(
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