【问题标题】:How to create an VHDL-2008 alias to a signal in an hierarchy created by for-generate?如何为由 for-generate 创建的层次结构中的信号创建 VHDL-2008 别名?
【发布时间】:2021-09-30 03:47:34
【问题描述】:

我有一个由 for-generate 创建的层次结构,如下所示:

INST: for ... generate
. . .
end generate;

正如预期的那样,它创建了许多实例,命名为INST__0INST__1 等,其名称上带有双下划线。

当我尝试在此层次结构中创建信号 A 的别名时,我收到类似“无效文字”的错误,因为信号路径有双下划线,这在 VHDL 中确实无效:

alias A is <<signal DUT.INST__0.COUNTER.A: std_logic>>;

有什么办法可以解决这个问题吗?使用双下划线防止 for-generate,也许?

谢谢

【问题讨论】:

  • 在您的 Counter 实例中,执行 A'path_name。它也有双下划线吗?你看过扩展名吗?这可能会给你一种允许双下划线的方法。
  • 报告A'path_name 返回了一些不同的东西——:tb:dut:inst(0):counter:a,这更有意义。在alias 语句中使用这个路径解决了这个问题。路径dut.inst__0.counter.a 只是波形查看器的误导性伪影。很好的收获,tks!

标签: vhdl alias literals generate


【解决方案1】:

我会尝试扩展标识符。我会尝试以下两种方法,但我怀疑第一种方法会让你到达那里(而第二种方法不会):

alias A is <<signal DUT.\INST__0\.COUNTER.A : std_logic>>;

alias A is <<signal \DUT.INST__0.COUNTER.A\ : std_logic>>;

我担心第二个会被视为单个标识符。

【讨论】:

  • 扩展标识符的有趣功能,很像 Verilog。我尝试了这两个示例,它们解决了文字错误,但找不到信号 - 不足为奇,因为我意识到生成块中的真正 VHDL 路径是 inst(0) instealdof inst__0。见上面的评论。 Tks
【解决方案2】:

您没有提供可重现或完整的示例,也没有演示别名声明的语法位置。特别注意缺少循环参数,您的尝试暗示包含值 0 和 1。

参见 IEEE Std 1076-2008 8.7 外部名称

路径名元素 ::=
实体_simple_name
| component_instantiation_label
| 阻止_label
| generate_statement_label [ ( static_expression ) ]
| _simple_name

以及附带的静态表达式的语义描述:

b)其次,对于包路径名中的每个包简单名称,或绝对或相对路径名中的每个路径名元素,按顺序,先前标识的声明区域被以下之一替换为标识的声明区域:

...
5)对于generate语句标签,对应于generate语句的等效块的声明区域。如果 generate 语句是 for generate 语句,则 pathname 元素应包含静态表达式,表达式的类型应与 generate 参数的类型相同,表达式的值应属于 for 指定的离散范围生成参数。表达式的类型应通过将 12.5 的规则应用于被视为完整上下文的表达式来确定,使用类型应为离散的规则。如果表达式的类型是 universal_integer 并且 generate 参数的类型是整数类型,则假定表达式隐式转换为 generate 参数的类型。

我们看到generate语句标签后面括号中的静态表达式是循环参数的值。

可以分析、阐述和模拟的 -2008 示例:

entity for_gen_label is
end entity;

architecture fum of for_gen_label is

begin
INST:
    for i in 0 to 3 generate
COUNTER:
        block
            signal a: boolean;
        begin
PROC_LABEL:
            process
            begin
                report a'INSTANCE_NAME;
                wait;
            end process;
        end block;
    end generate;
end architecture;

我们还看到-2008预定义属性'INSTANCE_NAME也可以演示路径名元素(GHDL):

for_gen_label.vhdl:16:17:@0ms:(report note): :for_gen_label(fum):inst(0):counter:a
for_gen_label.vhdl:16:17:@0ms:(report note): :for_gen_label(fum):inst(1):counter:a
for_gen_label.vhdl:16:17:@0ms:(report note): :for_gen_label(fum):inst(2):counter:a
for_gen_label.vhdl:16:17:@0ms:(report note): :for_gen_label(fum):inst(3):counter:a

'INSTANCE_NAME 预定义属性值的格式在 16.2.5 命名实体的预定义属性中给出。

两个下划线是名称的 C(++) 伪装,表示您可能从能够支持多种硬件描述语言的模拟器的用户界面获取信息。 GHDL,一个仅支持 VHDL 的批处理模拟器,产生的输出符合 VHDL 路径名称元素:

ghdl -r for_gen_label --disp-signals-map
.for_gen_label(fum).inst(0).counter.a: 00007FBDBD504700 net: 0
.for_gen_label(fum).inst(1).counter.a: 00007FBDBD5047A0 net: 0
.for_gen_label(fum).inst(2).counter.a: 00007FBDBD504840 net: 0
.for_gen_label(fum).inst(3).counter.a: 00007FBDBD5048E0 net: 0
...

同时顺便演示了整个路径。与其他一些 HDL 不同,VHDL 不区分标识符大小写。

【讨论】:

  • 如您的示例所示,for 生成的实例中的 VHDL 路径是 name(index),而不是 name__index。我被 波形查看器 使用的层次结构路径误导了——它对于非生成的实例是一致的,所以我认为它对于生成的实例是正确的。我的错。 Tks
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
相关资源
最近更新 更多