2014-10-23 3 views
1

오류 (10170) : "else"텍스트 근처에 jmd_alub_v.v (31)에 Verilog HDL 구문 오류가 있습니다.오류 (10170) : "else"텍스트 근처에 jmd_alub_v.v (31)에 Verilog HDL 구문 오류가 있습니다.

이 오류를 기대하는 것은 여러 번 사람은 당신이 begin로 브라켓 필요 elseif에서 여러 문을 넣어 가거나하는 경우 문제가

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 
+0

FYI :'Cout'은 모든 조건에서 정의되지 않았기 때문에 유추 된 래치입니다. '@ *'는 조합 논리를 위해 재개됩니다. '@ (A, B, FS)'는 유효하지만 자동 감도 목록은 확장 성이 뛰어납니다. else-if 체인이 길어서 대신 대/소문자를 사용하는 것이 좋습니다. – Greg

답변

1

을 어디 볼 ​​수 없어 나를 도울 수 및 end, 예를 들어 :

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

전체 코드에서 그랬지만 여전히 동일한 오류가 발생했습니다 –

+1

업데이트 된 코드로 질문을 편집하고 오류에서 참조 된 행의 주석을 명확하게 식별하십시오. –

1

/다른 사람이 begin 및,893로 브라켓해야하는 경우는 여러 개의 문을 사용하는 경우 210. Verilog를 배우는 동안 일반적인 오류를 피하고 리팩터링을 쉽게하기 때문에 자유롭게 사용하는 것이 좋습니다. 예를 들어

: (COUT)를도 필요

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

는 등록 번호로 선언합니다. output reg Cout;

실시 예는 EDA Playground으로 표시됩니다. 그래도 같은 오류가 발생하면 적어도 하나는 빠뜨려야합니다.

Greg가 의견에서 언급했듯이 자동 감도 목록은 RTL이 게이트 레벨 불일치의 가능성을 최소화하므로 선호됩니다. 자동 감도 목록의 경우 always @*

출력이 완전히 정의되지 않으면 래치가 유추됩니다. 값이 할당되지 않은 것처럼 조합 논리가 단독으로 수행 할 수없는 값을 보유해야합니다. 래치는 본질적으로 나쁘지는 않지만 타이밍에 큰주의를 기울여야하며 우발적 인 의미는 종종 타이밍을 고려하지 않았 음을 의미합니다.

또한 같은 case 문 뭔가를 사용하는 것이 더 연습이 될 것이라는 의견에 언급되었습니다

다음 두 줄은 1 개 라인으로 출시 될 수
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]; 

올 수 있습니다 {Cout, F} = Incr[4:0]; 수 있습니다.

관련 문제