2

如果我有以下 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为 ,它的初始值也不会改变。但是,如果我将架构中的最后一行替换为:NULtest_char_i74

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

...然后按照我test_char_c的预期获得价值。J

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

为什么第一时间不test_char_c更新?

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

4

2 回答 2

2

在初始化时,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)

于 2012-07-24T13:00:12.803 回答
0

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

这是正确的。

为什么 test_char_c 在第一个实例中没有得到更新?

确实如此。

一个最小的、完整的和可验证的示例,其中包含将报告所有值更新的监控流程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克服默认初始值 (INTEGER'LOW) 导致 Martin Thompson 报告的边界检查失败。

使用符合 -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_i0(映射到 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)。

于 2016-05-26T14:42:05.617 回答