假设我必须在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总是更好,并且需要额外的区域和更低的复杂性,或者是我必须验证每一个实现可能性的情况之一?
答案 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
循环是并发语句,包含并发语句,例如,您可以使用它来创建组件的多个实例。