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

Fel*_* GM 7 for-loop fpga vhdl asic hardware-programming

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

FOR-LOOP

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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 6

假设重置和测试功能中的逻辑相对简单(例如,相邻位之间没有交互),我预计两者都会生成相同的逻辑。

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

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

然而,对风格教条是没有好处的,你的实验说明了这一点:loop对劣质硬件的综合。综合工具是复杂且不完美的软件,就像高度优化的编译器一样,并且存在许多相同的问题。有时他们会错过“明显”的优化,有时他们会进行复杂的优化(例如在软件中),因为其增加的大小破坏了缓存,因此运行速度较慢。

因此,最好尽可能以最简洁的方式进行编写,但要具有一定的灵活性,可以解决工具限制和偶尔出现的真正的工具缺陷。

不同版本的工具消除(有时引入)此类缺陷。您可能会发现 ISE 的“使用新解析器”选项(对于 Spartan-6 之前的部件)或 Vivado 或 Synplicity 可以实现这一点,而 ISE 的旧解析器则无法做到这一点。(例如,从程序中传递信号,较旧的 ISE 版本存在严重错误)。

修改示例并查看综合是否可以在最简单的情况下“得到正确的结果”(产生相同的硬件),并重新引入复杂性,直到找到哪个构造失败,可能会很有启发。

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