8

假设我必须在 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-generates 总是更好,代价是额外的面积和较低的复杂性,还是我必须验证每一个实现可能性的情况之一?

4

2 回答 2

4

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

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

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

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

因此,最好尽可能以最简洁的风格编写,但在解决工具限制和偶尔真正的工具缺陷方面具有一定的灵活性。

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

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

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

于 2015-07-14T11:06:20.453 回答
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,您可以使用它来创建组件的多个实例。

于 2015-07-13T21:37:18.047 回答