我认为如果右侧的任何信号发生变化,将同时更新裸信号分配。换句话说,它相当于一个对分配中涉及的所有信号都敏感的过程。
这是正确的。
为什么 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)。