2016-11-09 33 views
0

私は10進数の桁数を計算するためのVerilogコードを書いています。以下のコードでは、cの値をaと等しく初期化しています。 私はシミュレーション結果を正しく得ることができましたが、syntesiseできず、エラーは 'c = a'によるものです。エラーを取り除くにはどうすればよいですか?数字の数を計算する他のロジックはありますか?Forループin alwaysブロックの使用

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

合成可能であるためforループのためには、静的なければならない。つまり、ループ反復ラウンドの最大数は固定されなければなりません。 aには固定ビット数があるので、ループの反復回数が最大になるように見えるかもしれませんが、シンセサイザはコードをシミュレートしていないので、そのことは分かりません。

コードをリファクタリングする必要があります。このようにしてループの反復の最大数が固定されるように記述する必要があります。つまり、ループの反復回数は固定する必要がありますが、(disableステートメントを使用して)望むなら早めに飛び越すことができます。

+0

数値の桁数を見つけるための他のロジックはありますか? –

+0

あなたのアルゴリズムは問題ありません。あなたが書いた方法では合成できません。初心者にとっては、ループ回数を一定回数にする必要があります。「n/3」についてはどうですか?それはあまりにも多いですが、「n/4」が少なすぎます。その後、10で割ってカウンターをインクリメントしてゼロになると停止します。その時点で、望むなら 'disable'を使ってループから飛び出すことができますが、それは必須ではありません。 (必須であるのは、 'c 'が0になったときにカウンターのインクリメントを止めることです。) –