由于这是标记为 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 工具使探索设计空间(如自定义字宽)变得多么容易?