我可以定义一个不会为边缘情况生成任何内容的for..generate吗?

时间:2015-11-12 22:44:07

标签: vhdl

我可以定义一个从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;

1 个答案:

答案 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语句。