-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 端口,完全绕过该工具。这只花了几分钟,它分为三个部分:

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;

请注意,这在 Xilinx 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

但是(因为输入表是一个常量数组)上述所有硬件在优化阶段都消失了。

现在在高层次综合中重要的事情之一是探索不同的数据类型,例如不同的字宽;例如存储测试数据所需的 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 回答