2016-11-09 5 views
0

저는 10 진수의 자릿수를 계산하기위한 Verilog 코드를 작성하고 있습니다. 아래의 코드에서 나는 c의 값을 a와 같도록 초기화했다. 시뮬레이션 결과를 올바르게 얻을 수 있었지만 syntesise 할 수 없었고 오류는 'c = a'때문입니다. 오류를 제거하려면 어떻게해야합니까? 자릿수를 계산하는 다른 논리가 있습니까?For 루프를 항상 사용하는 블록

Error: [Synth 8-3380] loop condition does not converge after 2000 iterations 

코드 -

module numdigits(a,b); 
parameter n=100; 
input [0:n-1] a; 
output reg [0:n-1]b; //THIS MODULE COUNTS THE NUMBER OF DIGITS IN DECIMAL FORM 
reg [0:n-1] d,c; 
always @(*) 
begin 
    d=0; 
    for(c=a;c>0;c=c/10) 
    begin 
    d=d+1; 
    end 
    b=d; 
end 
endmodule 
+0

귀하의 모듈에 문제가 없습니다. 아마도 테스트 벤치 또는 도구 문제일까요? 참조 : https://www.edaplayground.com/x/24e3 – Hida

+0

@Hida 나는 vivado 소프트웨어를 사용하고 있으며 왜 코드를 합성하기 위해 테스트 벤치가 필요합니까? 주로 시뮬레이션 용입니다. 맞습니까? –

+0

질문에 적절하게 답변하지 않았다는 데 동의합니다. 그러나 FPGA/합성 피드백 디버깅에 소요되는 시간을 줄이기 위해 항상 RTL을 시뮬레이트해야한다고 지적하고 싶습니다. – Hida

답변

0

synthesisable 될 수있는 for 루프 순서에서는, 정적이어야 즉, 루프 라운드 반복의 최대 수를 고정해야한다. a에는 고정 된 비트 수가 있기 때문에 루프 반복의 최대 횟수가있는 것처럼 보일 수 있지만 신디사이저는 코드를 시뮬레이트하지 않으므로이를 알 수 없습니다.

코드를 리팩토링해야합니다. 루프 반복의 최대 수가 고정되도록이 방법으로 작성해야합니다. 즉, 루프의 반복 횟수는 고정되어야하지만 원할 경우 조기에 점프 할 수 있습니다 (disable 문 사용).

+0

숫자의 자릿수를 찾는 다른 논리가 있습니까? –

+0

글쎄, 당신의 알고리즘은 괜찮아요, 그건 단지 당신이 그것을 작성하는 방식으로 synthesable 아니에요. 우선, 'n/3'은 어떨까요? 너무 많아서 'n/4'가 너무 적습니다. 그런 다음 10을 나누어 카운터를 증가시키고 0에 도달하면 멈출 수 있습니다. 그 시점에서 원하는 경우 'disable'을 사용하여 루프에서 빠져 나올 수 있지만 필수는 아닙니다. (필수적으로 필요한 것은 'c'가 0이 될 때 카운터를 증가시키는 것을 멈추는 것입니다.) –

관련 문제