错误(10170):文本附近jmd_alub_v.v(31)处的Verilog HDL语法错误;“否则”;;

错误(10170):文本附近jmd_alub_v.v(31)处的Verilog HDL语法错误;“否则”;;,verilog,hdl,Verilog,Hdl,错误(10170):文本“else”附近jmd_alub_v.v(31)处的Verilog HDL语法错误 很多次都在期待这个错误,有人能帮我解决吗?我不知道问题出在哪里 module jmd_alub_v(A, B, FS, F, Cout); input [3:0] FS; input [3:0] A, B; output reg [3:0] F; output wire Cout; wire [4:0] Sum, Incr, Diff, Decr,

错误(10170):文本“else”附近jmd_alub_v.v(31)处的Verilog HDL语法错误

很多次都在期待这个错误,有人能帮我解决吗?我不知道问题出在哪里

module jmd_alub_v(A, B, FS, F, Cout);

    input [3:0] FS;
    input [3:0] A, B;
    output reg [3:0] F;
    output wire Cout;
    wire [4:0] Sum, Incr, Diff, Decr, Shr ;


    assign Sum = {1'b0, A} + {1'b0 ,B} + FS[0];
    assign Diff ={1'b0, A} + {1'b0,~B} + FS[0];
    assign Incr = {1'b0,A} + FS[0];
    assign Decr = {1'b0,A} + 5'b01111;
    assign Shr[4] = A[0];
    assign Shr[3] = A[3];
    assign Shr[2] = A[3];
    assign Shr[1] = A[2];
    assign Shr[0] = A[1];

    always @(A,B,FS)    

    begin

        if (FS == 4'b0000)
        F = A;
        else if (FS == 4'b0001)
        F = Incr[3:0];
        Cout = Incr[4];

        else if (FS == 4'b0010)
        F = Sum[3:0];
        Cout = Sum[4];

        else if (FS == 4'b0011)
        F = Sum[3:0];
        Cout = Sum[4];

        else if (FS == 4'b0100)
        F = Diff[3:0];
        Cout = Diff[4];

        else if (FS == 4'b0101)
        F = Diff[3:0];
        Cout = Diff[4];

        else if (FS == 4'b0110)
        F = Decr[3:0];
        Cout = Decr[4];

        else if (FS == 4'b0111)
        F = A;

        else if (FS == 4'b1000)
        F = ~A;

        else if (FS == 4'b1001)
        F = ~A;

        else if (FS == 4'b1010)
        F = A & B;

        else if (FS == 4'b1011)
        F = A & B;

        else if (FS == 4'b1100)
        F = A | B;

        else if (FS == 4'b1101)
        F = A | B;

        else if (FS == 4'b1110)
        F = Shr[3:0];
        Cout = Shr[4];

        else if (FS == 4'b1111)
        F = Shr[3:0];
        Cout = Shr[4];

        else 

        F = 4'b0000; //default
        Cout = 1'b0; // default
    end
endmodule

如果要在
If
else
中放入多个语句,则需要将它们括在
开始
结束
中,例如:

if (FS == 4'b0000)
  F = A;
else if (FS == 4'b0001)
  begin
     F = Incr[3:0];
     Cout = Incr[4];
  end
if (FS == 4'b0000) begin
  F = A;
end
else if (FS == 4'b0001) begin
   F = Incr[3:0];
   Cout = Incr[4];
end

如果在If/else中使用多个语句,则需要将它们括在
begin
end
中。在学习Verilog时,我建议自由地使用它们,因为它可以避免常见错误并使重构更容易

例如:

if (FS == 4'b0000)
  F = A;
else if (FS == 4'b0001)
  begin
     F = Incr[3:0];
     Cout = Incr[4];
  end
if (FS == 4'b0000) begin
  F = A;
end
else if (FS == 4'b0001) begin
   F = Incr[3:0];
   Cout = Incr[4];
end
Cout还需要声明为reg<代码>输出寄存器Cout

给出了一个工作示例。如果您仍然遇到相同的错误,那么您肯定至少错过了其中一个错误

正如Greg在评论中提到的,自动灵敏度列表是首选的,因为这将RTL与门级不匹配的可能性降至最低。对于自动灵敏度列表
始终@*

当一个输出没有完全定义时,这会导致一个锁存器被推断出来,就像没有分配一个值一样,它必须保持它的值,这是组合逻辑本身无法做到的。闩锁本身并不坏,但在计时时必须非常小心,意外影响通常意味着没有考虑计时

评论中还指出,最好使用
case
语句,例如:

always @* begin
  case(FS)
    4'd0 : F = A;
    4'd1 : begin
      F    = Incr[3:0];
      Cout = Incr[4];
    end
    4'd2 : begin
      F    = Sum[3:0];
      Cout = Sum[4];
    end

   endcase
 end
以下两条生产线也可以合并为一条生产线:

F    = Incr[3:0];
Cout = Incr[4];

可以是{code>{Cout,F}=Incr[4:0]

我对整个代码都这样做了,但仍然得到相同的错误用更新的代码编辑问题,并用注释清楚地标识错误中引用的行。仅供参考:
Cout
是一个推断锁存,因为它不是在每种情况下都定义的<对于组合逻辑,重新启动代码>@*<代码>@(A、B、FS)是合法的,但自动敏感度列表更具可扩展性。你有一个长的其他如果链,考虑使用一个case语句代替。