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

我的建议是按正确的顺序编写代码,这样您就可以轻松修正错误。