实施FOR-LOOP和FOR-GENERATE之间的实际区别是什么?什么时候使用一个而不是另一个?

时间:2015-07-13 21:16:51

标签: for-loop vhdl fpga hardware-programming asic

假设我必须在std_logic_vector上测试不同的位。实现一个单独的进程,每个进程的for循环或使用for-generate实例化'n'进程,每个进程测试一个进程是不是更好?

for循环

my_process: process(clk, reset) begin
  if rising_edge (clk) then
    if reset = '1' then
      --init stuff
    else
      for_loop: for i in 0 to n loop
        test_array_bit(i);
      end loop;
    end if;      
  end if; 
end process;

FOR-GENERATE

for_generate: for i in 0 to n generate begin
my_process: process(clk, reset) begin
  if rising_edge (clk) then
    if reset = '1' then
      --init stuff
    else
      test_array_bit(i);
    end if;
  end if; 
end process;
end generate;

对于这种情况,会对FPGA和ASIC实施产生什么影响? CAD工具可以轻松应对什么?

编辑: 只是添加我给一个帮助人员的回复,让我的问题更清楚:

例如,当我在ISE上使用for循环运行一段代码时,综合摘要给了我一个公平的结果,花了很长时间来计算所有内容。当我重新编写我的设计时,这次使用for-generate和几个进程,我使用了更多的区域,但是该工具能够更快地计算所有内容,并且我的计时结果也更好。那么,它是否意味着一个规则,使用for-generate总是更好,并且需要额外的区域和更低的复杂性,或者是我必须验证每一个实现可能性的情况之一?

2 个答案:

答案 0 :(得分:3)

假设复位和测试功能中的逻辑相对简单(例如,相邻位之间没有相互作用),我希望两者都能生成相同的逻辑。

理解由于整个for循环在一个时钟周期内执行,因此综合将展开它并为每个输入位生成一个单独的test_array_bit实例。因此,综合工具很可能为两个版本生成相同的逻辑 - 至少在这个简单的例子中。

在此基础上,我会(稍微)更喜欢for ... loop版本,因为它本地化程序逻辑,而“生成”版本将其全局化,将其置于process样板之外。如果您发现loop版本稍微容易阅读,那么您会在某种程度上达成一致。

然而,关于风格的教条并不值得,并且你的实验说明了这一点:loop合成了劣质硬件。综合工具是复杂且不完善的软件,如高度优化的编译器,并分享许多相同的问题。有时他们会错过“明显的”优化,有时他们会进行复杂的优化(例如在软件中),因为增加的大小会破坏缓存。

所以最好尽可能用最干净的风格书写,但要有一定的灵活性来解决工具限制和偶尔真正的工具缺陷。

不同版本的工具会删除(偶尔会引入)此类缺陷。您可能会发现ISE的“使用新解析器”选项(对于pre-Spartan-6部分)或Vivado或Synplicity在ISE的旧解析器没有的情况下正确使用。 (例如,将信号传递出程序,较旧的ISE版本存在严重错误)。

修改示例并查看合成是否能够“正确”(生成相同的硬件)以获得最简单的情况,然后重新引入复杂性,直到找到哪个构造失败,这可能是有益的。

如果你以这种方式发现具体的东西,这里值得报告(通过回答你自己的问题)。 Xilinx曾鼓励通过其Webcase系统报告此类缺陷;最终他们甚至被修复了!然而,在过去的一两年里,他们似乎已经停止了这一点。

答案 1 :(得分:0)

第一个代码段相当于以下内容:

my_process: process(clk, reset) begin
  if rising_edge (clk) then
    if reset = '1' then
      --init stuff
    else
      test_array_bit(0);
      test_array_bit(1);
      ............
      test_array_bit(n);
    end if;      
  end if; 
end process;

虽然第二个将为每个n+1生成i 进程,以及重置逻辑和所有内容(这可能是一个问题,因为该逻辑将尝试驱动来自不同过程的相同信号)。
通常,for循环是顺序语句,包含顺序语句(即每个迭代被排序以在前一个迭代之后执行)。 for-generate循环是并发语句,包含并发语句,例如,您可以使用它来创建组件的多个实例。

相关问题