错误(10170):jmd_alub_v.v(31)附近文本"其他"的Verilog HDL语法错误;

时间:2014-10-23 01:06:57

标签: verilog hdl

错误(10170):jmd_alub_v.v(31)附近文本“else”的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

2 个答案:

答案 0 :(得分:1)

如果您要在ifelse中添加多个语句,则需要将其括在beginend中,例如:

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

答案 1 :(得分:1)

如果您在if / else中使用多个语句,则需要将其括在beginend中。在学习Verilog时,我会建议大量使用它们,因为它可以避免常见错误并使重构更容易。

例如:

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

Cout也需要声明为reg。 output reg Cout;

显示了一个工作示例EDA Playground。如果你仍然得到同样的错误,你必须至少错过其中一个错误。

正如Greg在评论中提到的那样,自动灵敏度列表是首选,因为这可以最大限度地降低RTL门级不匹配的可能性。对于自动敏感度列表always @*

当输出未完全定义时,这会导致推断出一个锁存器,好像没有分配一个值,它必须保持其值,而单独的组合逻辑是不能的。锁存器本身并不是很糟糕,但必须非常注意时间,意外的暗示通常意味着时间没有被考虑。

评论中还注意到,使用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

以下两行也可以分为1行:

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

可以来{Cout, F} = Incr[4:0];