2014-11-12 2 views
-3

Verilog 프로젝트를 합성하려고하면 다음과 같은 오류가 발생합니다 : 오류 : Xst : 2634 - "shiftman.v"15 행 : 루프 정지 조건은 루프 변수에 의존하거나 정적이어야합니다. 오류 : Xst : 2634 - "shiftman.v"22 행 : 루프 중지 조건은 루프 변수에 의존하거나 정적이어야합니다.Verilog 합성 중 오류가 발생했습니다

오류의 원인을 이해할 수 있다고 생각하지만 문제를 해결할 방법을 찾을 수 없습니다. 당신이 합성 코드에 가변 반복 루프를 사용 할 수 없기 때문에

module shiftman(in,sh,out); 

input[47:0] in; 
input[8:0] sh; 
output[47:0] out; 
reg[47:0] out; 
reg[7:0] r; 
reg i; 
[email protected](in or sh) 
begin 
r=sh[7:0]; 
out=in; 
if(sh[8]==0) 
     for(i=0; i<r; i=i+1) 
     begin 
     out[23:0]={1'b0,out[23:1]}; 
     end 
else 
     for(i=0; i<r; i=i+1) 
     begin 
     out[47:24]={1'b0,out[47:25]}; 
     end 

end 

endmodule 
+1

'i'는 단일 비트입니다','정수를 시도 난;'. 참고 : 합성하기 전에 항상 시뮬레이션해야합니다. – Greg

답변

1

당신의 합성이 실패하는 이유입니다. 합성 할 때 도구는 루프를 언 롤하려고 시도하지만 루프의 종료 조건이 합성시 고정되거나 결정 가능하지 않으면이 작업을 수행 할 수 없습니다. 조건 i <= r은 모듈에 대한 입력이며 따라서 정적이 아닌 r을 모른 채 루프를 풀 수없는 조건입니다.

이 문제를 해결하려면 합성 도구에서 처리 할 수있는 방식으로 코드를 다시 작성해야합니다. 이 모양을 이용하면 의 상단 또는 하단을,에 따라 sh[7:0]에 따라 논리적으로 이동하는 것입니다. 이렇게하기 위해 루핑이 필요 없지만 >> (논리 오른쪽 시프트 연산자)를 사용할 수 있습니다. 그래서, 당신의 always 블록은 더 같을 것이다 : 내가 등록 번호 '로 정의 할 때

always @(*) begin 
    out = in; 

    if (sh[8]) 
    out[47:24] = in[47:24] >> sh[7:0]; 
    else 
    out[23:0] = in[23:0] >> sh[7:0]; 
end