endmodule 的 Verilog 语法错误
Verilog Syntax Error with endmodule
卡在这里一天了。我将 edaplayground 用于 运行 这段代码,但我不知道我的代码有什么问题。在我写endmodule
的最后一行说语法错误,请帮忙。
module lifo #(parameter n=4,w=4) ( input insert ,clk,output isEmpety,isfull,error,inout [w-1:0]data);
logic h=$clog2(n);
reg [n-1:0]mem[w-1:0];
reg [h:0]sp;
reg [w-1:0]datar;
wire [w-1:0] #(0) data=datar;
always@* begin
if(reset==1)
begin
assign datar={n{z}};
assign sp={h{1'b0}};
assign isfull=0;
assign isEmpety=0;
assign error=0;
end
if(insert==1)
begin
if(isEmpety==1)
begin
assign mem[sp]=data;
assign isEmpety=0;
if(error==1)
assign error=0;
end
else
if(isfull==1)
begin
assign mem[sp]=data;
assign error=1;
end
else
begin
assign sp=sp+1;
assign stack[sp]=data;
if(sp=={h{1}})
assign isfull=1;
end
end
if(insert==0)
begin
if(sp=={h{0}}&&(isEmpety!=1))
begin
assign datar=mem[sp];
assign isEmpety=1;
end
else
if(isEmpety==1)
begin
assign datar=mem[sp];
assign error=1;
end
else
begin
assign datar=mem[sp];
if(sp!={h{0}})
assign sp=sp-1;
if(error==1)
assign error=0;
if(isfull==1)
assign isfull=0;
end
end
endmodule
感谢您的帮助。
在 endmodule
之前包含一个 end
您缺少 end
for always
块。并删除 always 块中的 assign
关键字。不推荐这种编码风格。我已经为您编辑了代码,请查看
module lifo #(parameter n=4,w=4) ( input insert ,clk,output isEmpety,isfull,error,inout [w-1:0]data);
logic h=$clog2(n);
reg [n-1:0]mem[w-1:0];
reg [h:0]sp;
reg [w-1:0]datar;
wire [w-1:0] #(0) data=datar;
always@* begin
if(reset==1)
begin
datar={n{z}};
sp={h{1'b0}};
isfull=0;
isEmpety=0;
error=0;
end
if(insert==1)
begin
if(isEmpety==1)
begin
mem[sp]=data;
isEmpety=0;
if(error==1)
error=0;
end
else if(isfull==1)
begin
mem[sp]=data;
error=1;
end
else begin
sp=sp+1;
stack[sp]=data;
if(sp=={h{1}})
isfull=1;
end
end
if(insert==0)
begin
if(sp=={h{0}}&&(isEmpety!=1))
begin
datar=mem[sp];
isEmpety=1;
end
else if(isEmpety==1)
begin
datar=mem[sp];
error=1;
end
else
begin
datar=mem[sp];
if(sp!={h{0}})
sp=sp-1;
if(error==1)
error=0;
if(isfull==1)
isfull=0;
end
end
end
endmodule
我的建议是按正确的顺序编写代码,这样您就可以轻松修正错误。
卡在这里一天了。我将 edaplayground 用于 运行 这段代码,但我不知道我的代码有什么问题。在我写endmodule
的最后一行说语法错误,请帮忙。
module lifo #(parameter n=4,w=4) ( input insert ,clk,output isEmpety,isfull,error,inout [w-1:0]data);
logic h=$clog2(n);
reg [n-1:0]mem[w-1:0];
reg [h:0]sp;
reg [w-1:0]datar;
wire [w-1:0] #(0) data=datar;
always@* begin
if(reset==1)
begin
assign datar={n{z}};
assign sp={h{1'b0}};
assign isfull=0;
assign isEmpety=0;
assign error=0;
end
if(insert==1)
begin
if(isEmpety==1)
begin
assign mem[sp]=data;
assign isEmpety=0;
if(error==1)
assign error=0;
end
else
if(isfull==1)
begin
assign mem[sp]=data;
assign error=1;
end
else
begin
assign sp=sp+1;
assign stack[sp]=data;
if(sp=={h{1}})
assign isfull=1;
end
end
if(insert==0)
begin
if(sp=={h{0}}&&(isEmpety!=1))
begin
assign datar=mem[sp];
assign isEmpety=1;
end
else
if(isEmpety==1)
begin
assign datar=mem[sp];
assign error=1;
end
else
begin
assign datar=mem[sp];
if(sp!={h{0}})
assign sp=sp-1;
if(error==1)
assign error=0;
if(isfull==1)
assign isfull=0;
end
end
endmodule
感谢您的帮助。
在 endmodule
之前包含一个 end
您缺少 end
for always
块。并删除 always 块中的 assign
关键字。不推荐这种编码风格。我已经为您编辑了代码,请查看
module lifo #(parameter n=4,w=4) ( input insert ,clk,output isEmpety,isfull,error,inout [w-1:0]data);
logic h=$clog2(n);
reg [n-1:0]mem[w-1:0];
reg [h:0]sp;
reg [w-1:0]datar;
wire [w-1:0] #(0) data=datar;
always@* begin
if(reset==1)
begin
datar={n{z}};
sp={h{1'b0}};
isfull=0;
isEmpety=0;
error=0;
end
if(insert==1)
begin
if(isEmpety==1)
begin
mem[sp]=data;
isEmpety=0;
if(error==1)
error=0;
end
else if(isfull==1)
begin
mem[sp]=data;
error=1;
end
else begin
sp=sp+1;
stack[sp]=data;
if(sp=={h{1}})
isfull=1;
end
end
if(insert==0)
begin
if(sp=={h{0}}&&(isEmpety!=1))
begin
datar=mem[sp];
isEmpety=1;
end
else if(isEmpety==1)
begin
datar=mem[sp];
error=1;
end
else
begin
datar=mem[sp];
if(sp!={h{0}})
sp=sp-1;
if(error==1)
error=0;
if(isfull==1)
isfull=0;
end
end
end
endmodule
我的建议是按正确的顺序编写代码,这样您就可以轻松修正错误。