我可以定义一个从0到-1的for..generate,它不会产生任何东西吗? BLOCK_WIDTH是一个通用的,对于某些边缘情况可能为0(这很好,我们不需要生成任何东西)。
Gen_Block: if BLOCK_WIDTH /= 0 generate -- Do I need this?
Gen_Bits: for i in 0 to BLOCK_WIDTH - 1 generate
-- Other stuff here.
end generate;
end generate;
答案 0 :(得分:3)
包含if generate语句是否必要?否。
至少有一个完整且可验证的例子:
entity foo is
end entity;
architecture fum of foo is
constant BLOCK_WIDTH: natural := 0;
begin
Gen_Bits:
for i in 0 to BLOCK_WIDTH - 1 generate
-- Other stuff here.
end generate;
end architecture;
这分析,阐述和运行告诉我们它在语法和语义上是合法的VHDL。
对于BLOCK_WIDTH = 0的情况,我们看到for generate语句条件的参数规范的范围是0到BLOCKWIDTH - 1(或0 = 1 = -1)。
IEEE Std 5.2标量类型,5.2.1。将军,第3段:
范围指定标量类型的值的子集。如果指定的子集为空,则称范围为空范围。
那么我们如何确定子集是否为空?
11.8生成第5段的陈述:
for generate语句的generate参数规范中的离散范围应为静态离散范围;类似地,if generate语句中的每个条件都应该是一个静态表达式。
那么在离散范围内会发生什么?
5.3.2数组类型,5.3.2.1第2段(摘录):
discrete_range ::= *discrete_*subtype_indication | range
5.2标量类型,5.2.1第2段(摘录):
range ::= range_attribute_name | simple_expression direction simple_expression direction ::= to | downto
第4段:
范围L 到 R称为上升范围;如果L> R,则范围是空范围。范围L downto R被称为下降范围;如果L < R,则范围是空范围。 L被称为范围的左边界,...
第7段:
如果在子类型指示中使用范围约束,则表达式的类型(同样,范围属性的边界)应与子类型指示的类型标记的基本类型相同。如果范围的每个边界属于子类型或范围约束定义空范围,则范围约束与子类型兼容。否则,范围约束与子类型不兼容。
(i
范围的每个边界都与范围表达式的基本类型兼容,即整数。)
那猜猜怎么着?没有包含for generate语句的if generate语句的VHDL代码是合法的VHDL,整数值子集中没有值i
可以导致任何封闭的并发语句或声明的详细说明。
所以不,你不需要封闭if generate语句。