for-loop - 实现 FOR-LOOP 和 FOR-GENERATE 之间的实际区别是什么?什么时候使用其中一种比另一种更好?

标签 for-loop vhdl fpga hardware 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 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 总是更好,但需要额外的面积和较低的复杂性,还是我必须验证每一个实现可能性的情况之一?

最佳答案

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

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

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

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

因此,最好尽可能以最简洁的风格进行编写,但要具有一定的灵 active ,可以解决工具限制和偶尔出现的实际工具缺陷。

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

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

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

关于for-loop - 实现 FOR-LOOP 和 FOR-GENERATE 之间的实际区别是什么?什么时候使用其中一种比另一种更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31393653/

相关文章:

javascript - 将类分配给动态创建的 div

java - 具有求和功能的 For 循环

c - C语言如何查找句子中的字符

vhdl - RAM模拟代码在VHDL中不能很好地模拟

vhdl - GHDL 模拟器不支持没有错误的 vhdl 属性?

java - 在循环中附加到字符串并保留对附加字符串的访问权限

algorithm - 内存寻址方法为对应于 'nCk' 值组合的值分配内存(静态硬件)从 0 到 n-1

将 C 宏转换为 VHDL

fpga - Simulink 中两个复数向量的矩阵乘法

verilog - verilog 中的位宽不同