-1

GAUT ツールを使用して、次の C コードを合成しようとしています。

#define N 16


int main (const int tab[N], int* out)
{

//  static const int tab[N] =        {98,-39,-327,439,950,-2097,-1674,9883,9883,-1674,-2097,950,439,-327,-39,98};


  int k = 0, i=1;

  for( i = 1; i < N; i++)
{   

      // invariant : k est l'indice du plus petit
      // élément de x[0..i-1]
      if(tab[i] < tab[k])
          k = i;
}

  *out = tab[k];
  return 0;     
 }

配列内の最小値を見つける単純なプログラム。正常にコンパイルされ、正直に見える DFG が生成されます。しかし、合成しようとすると、次のエラーが表示されます。

誰が問題が何であるか知っていますか?私は他のそのような小さなテストプログラムでもそれに直面しています。どなたか専門家の方がお答えいただけると幸いです。

ありがとうございました。

4

1 に答える 1

2

これはVHDLのタグが付けられているため、ツールを完全にバイパスして、ストレートVHDLポートを確認する価値があります。これには数分しかかかりませんでした。これは3つの部分に分かれています。

1)VHDLには、配列をポートパラメータとして使用するには、名前付き型(int_array)である必要があるという癖があります。(Cには、配列を渡す別の癖があります。そうではなく、代わりにポインターを渡します)

package Types is
type int_array is array (natural range <>) of integer;
end Types;

package body Types is
end Types;

2)作業を行うビット:Cコードをコメントとして残して、それらがどれほど密接に対応しているかを示します。

use Work.Types.all;

-- int main (const int tab[N], int* out)
entity MinArray is
   Generic ( N : Natural);
   Port ( Tab : in int_array;
           Output : out integer );
end MinArray;

architecture Behavioral of MinArray is
--  int k = 0, i=1;
-- for( i = 1; i < N; i++)
--   {   
--      if(tab[i] < tab[k])
--          k = i;
--   }
--  *out = tab[k];
--  return 0;     
--}
begin
   Process(Tab) is
    variable k : natural;
    begin
       k := 1;
       for i in tab'range loop
           if tab(i) < tab(k) then
               k := i;
          end if;
        end loop;
       Output <= tab(k);
    end process;
end Behavioral;

3)テストハーネス:

  use Work.Types.all;

  ENTITY tester IS
     Port ( Minimum : out integer );
  END tester;

  ARCHITECTURE behavior OF tester IS 

--#define N 16
-- static const int tab[N] =        {98,-39,-327,439,950,-2097,-1674,9883,9883,-1674,-2097,950,439,-327,-39,98};

  constant N : natural := 16;
  constant tab : int_array (1 to N)  := (98,-39,-327,439,950,-2097,-1674,9883,9883,-1674,-2097,950,439,-327,-39,98 );

  BEGIN
          uut: entity work.MinArray 
                Generic Map (N => N)
                PORT MAP(
                Tab => Tab,
                 Output => Minimum );

  END;

これはすべてザイリンクスXSTで合成可能であることに注意してください。

Advanced HDL Synthesis Report

Macro Statistics
# RAMs                                                 : 1
 32x32-bit single-port distributed Read Only RAM       : 1
# Comparators                                          : 15
 32-bit comparator greater                             : 15
# Multiplexers                                         : 32
 1-bit 2-to-1 multiplexer                              : 24
 2-bit 2-to-1 multiplexer                              : 1
 3-bit 2-to-1 multiplexer                              : 4
 4-bit 2-to-1 multiplexer                              : 3

ただし(入力テーブルは定数配列であるため)、上記のハードウェアはすべて最適化段階で表示されなくなります。

現在、高位合成で重要なことの1つは、さまざまな単語幅などのさまざまなデータ型を調査することです。テストデータの保存に必要な15ビットワードなど。これを調べるために、「Types」パッケージを次のように変更してみましょう。

type small_int is range -16384 to 16383;
type int_array is array (natural range <>) of small_int;

また、出力ポートタイプをsmall_intに変更しました。また、統合レポートからわかるように、ハードウェアの使用量はそれに応じて削減されています。

Macro Statistics
# RAMs                                                 : 1
 32x15-bit single-port distributed Read Only RAM       : 1
# Comparators                                          : 15
 15-bit comparator greater                             : 15
# Multiplexers                                         : 32
 1-bit 2-to-1 multiplexer                              : 24
 2-bit 2-to-1 multiplexer                              : 1
 3-bit 2-to-1 multiplexer                              : 4
 4-bit 2-to-1 multiplexer                              : 3

したがって、おそらく問題は、Cツールを使用すると、カスタムの単語幅のようにデザインスペースを簡単に探索できるかどうかということです。

于 2013-03-04T17:35:58.690 に答える