【问题标题】:Why do VHDL attribute calls require a process?为什么 VHDL 属性调用需要一个过程?
【发布时间】:2012-07-24 09:07:33
【问题描述】:

如果我有以下 VHDL-200X 架构:

architecture my_arc of my_entity is
    signal test_char   : std_logic_vector(7 downto 0);
    signal test_char_c : character;
    signal test_char_i : integer;
begin
    test_char   <= "01001010";
    test_char_i <= to_integer(unsigned(test_char));
    test_char_c <= character'val(test_char_i);
end architecture my_arc;

...并对其进行仿真(在 Xilinx iSim 14.1 中),test_char_c 不会从其初始值 NUL 改变,即使 test_char_i 采用值 74。但是,如果我将架构中的最后一行替换为:

    process(test_char_i)
    begin
        test_char_c <= character'val(test_char_i);
    end process;

...然后test_char_c 采用我所期望的值J

我认为如果右侧的 any 信号发生变化,那么裸信号分配将同时更新。换句话说,它相当于一个对分配中涉及的所有信号都敏感的过程。

为什么test_char_c 不首先更新?

编辑:test_char_i 更改为natural 不会改变结果。

【问题讨论】:

  • 您的想法是正确的,这是 iSim 的错误/不符合项。
  • @wap26:我不太确定,因为 Isim 被要求做一些它不能做的事情。它可能只需要一条错误消息...
  • @MartinThompson:似乎没关系,我已经用 Xilinx 打开了一个 webcase,看看他们的想法。

标签: vhdl


【解决方案1】:

在初始化时,test_char_i 的值是 integer'low,它不会映射到 character - Modelsim 10.0 报告:

# ** Fatal: (vsim-3390) Result ?(-2147483648) of attribute 'VAL is out of range NUL (0) to 'ÿ' (255).
#    Time: 0 ns  Iteration: 0  Process: /my_entity/line__15 File: attr.vhd
# Fatal error in Architecture my_arc at attr.vhd line 15
# 

如果我将test_char_i 设为natural,使其初始化为0,一切都会如您所愿(至少在Modelsim 中,没有尝试过iSim)

【讨论】:

  • 确实,按照标准,等效过程的灵敏度是test_char_i。所以 iSim 不遵循标准,而 ModelSim 遵循。
  • test_char_i 设为自然不会改变结果,但这对于错误报告会很方便。
  • 如果我尝试合成这样的东西会怎样?
  • @detly:我怀疑它是否有效,但也许这取决于您如何处理您的character(做一个printf ?;-))。您应该根据标准可综合VHDL及其综合工具的解释仔细区分合法VHDL及其行为。我认为您展示的代码类型应该仅限于非综合模块,例如测试平台。
  • @wap26:我不同意——那应该是完全有效的综合代码。仅仅因为存在一些中间信号,我知道的任何合成器都不会阻止您将 8 位向量转换为字符。
【解决方案2】:

我认为如果右侧的任何信号发生变化,裸信号分配将同时更新。换句话说,它相当于一个对分配中涉及的所有信号都敏感的过程。

没错。

为什么 test_char_c 不首先更新?

确实如此。

带有监控进程的Minimal, Complete, and Verifiable example 将报告test_char_c 上的所有值更新:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity my_entity is
end entity;

architecture my_arc of my_entity is
    signal test_char   : std_logic_vector(7 downto 0);
    signal test_char_c : character;
    signal test_char_i : natural; -- integer;
begin
    test_char   <= "01001010";
    test_char_i <= to_integer(unsigned(test_char));
    test_char_c <= character'val(test_char_i);

    process (test_char_c)
    begin
        report "test_char_c = " & character'image(test_char_c);
    end process;
end architecture my_arc;

请注意对 test_char_i 声明的更改,以克服 Martin Thompson 报告的导致边界检查失败的默认初始值 (INTEGER'LOW)。

这是使用符合 -1993 的 VHDL 工具进行分析、阐述和模拟的:

ghdl -r my_entity
../../src/ieee/numeric_std-body.v93:2098:7:@0ms:(断言警告):NUMERIC_STD.TO_INTEGER:检测到元值,返回 0
my_entity.vhdl:19:9:@0ms:(报告说明): test_char_c = nul
my_entity.vhdl:19:9:@0ms:(报告说明): test_char_c = 'J'

来自 numeric_std 包的断言警告是由 test_char 默认初始值“UUUUUUUU”引起的。

第一个报告的test_char_c 值是您报告的NUL,因为test_char_i 的初始值为0(映射到NUL)。

第二个是响应并发的简单信号分配给test_char,从而导致test_char_i 的更新,进而导致test_char_c 的更新(并恢复监控进程)。它反映了分配给test_char的位串,其值为x“4A”(对应于字符'J')。

如果您使用以下形式的断言语句而不是显示的监控进程:

    assert test_char_c /= NUL
        report "test_char_c = " & character'image(test_char_c);

您会发现只显示第一个报告语句,因为评估了一个断言语句条件,当发现错误断言时。

同样,如果条件中的“/=”更改为“=”,则只会显示第二个报告语句(显示“J”)。

如果不提供 MCVe,您的问题就不会被复制(或归咎于当时新生的 ISIM)。

【讨论】:

    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    相关资源
    最近更新 更多