右側の信号が変更されると、裸の信号の割り当てが同時に更新されると思いました。つまり、割り当てに関係するすべてのシグナルに敏感なプロセスと同等です。
そのとおりです。
最初のインスタンスで 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_i
が 0 (NUL へのマッピング) であるため発生します。
2 つ目は、 への同時単純シグナル割り当てに応答して、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);
アサーション ステートメントの条件が評価され、false が検出されたときにアサートされるため、最初のレポート ステートメントのみが表示されることがわかります。
同様に、条件の「/=」が「=」に変更された場合、2 番目のレポート ステートメントのみが表示されます (「J」が表示されます)。
MCVe を提供しないと、問題を再現することはできません (または、当時発生していた ISIM のせいにすることはできません)。