2

私はたくさんのテストベンチを開発し、テスト目的でfor()ループとwhile()ループを使用する習慣を身につけました。それはいいです。問題は、私がこの習慣を、合成可能であるはずの回路のコーディングに引き継いだことです。XSTなどは、次のようなコードの合成を(合成パラメーターに追加の変更を加えることなく)拒否します。

while (num < test_number) 
     begin 
     . 
     . 
     . 
     num = num+1; 
     end

シンセサイザーにとってtest_numは値2^32のintであるため、これは悪いコーディングスタイルです。または、無制限のパラメータと見なします。いずれにせよ、それは悪いコーディング習慣です。しかし、私はCとテストベンチでこれを行うことにとても慣れています。上記のコードセグメントのコードの同等の合成可能性は何でしょうか?

ありがとう!

4

3 に答える 3

4

合成ツールはさまざまですが、通常、合成ツールが反復回数を認識している限り、ループを合成できます。そう、

for ( i = 0; i < 10; i = i + 1 )

ツールは 10 回のループ反復があることを認識しているため、問題ありません。しかし

reg [10:0] r;
for ( i = 0; i < r; i = i + 1 )

r は変数なので、合成時に r の値は不明です。

RTL コードのループは、既知の一定数のロジックのコピーを作成するものと考えてください。

于 2010-03-10T22:26:29.497 に答える
2

開始するには、それを制御するためのクロックが必要です。

always @(posedge clk or negedge rst_n)
  if (!rst_n)
     num <= 32'b0; // or whatever your width is.
  else
     if (num < test_number)
       num <= num + 1'b1;
于 2010-03-02T14:11:13.077 に答える
1

合成ツールがループをサポートしていない場合はwhileforループを使用しないでください。コードを展開するだけです。

wire [1:0] addr;
reg  [3:0] wren;

always @(posedge clk) begin
    wren[0] <= (addr == 2'd0);
    wren[1] <= (addr == 2'd1);
    wren[2] <= (addr == 2'd2);
    wren[3] <= (addr == 2'd3);
end

私は XST に詳しくありませんが、一部の合成ツールはループをサポートしています (Synopsys など)。

于 2010-03-02T14:12:26.000 に答える