ghdlのfooのrtlのテストベンチの場合:
ghdl -r foo_tb --wave = foo_tb.ghw
./foo_tb:error:foo_tb.vhdl:15での境界チェックの失敗
./foo_tb:error:シミュレーションに失敗しました
Billのfooエンティティとアーキテクチャにコンテキスト句を追加しました。
library ieee;
use ieee.std_logic_1164.all;
entity foo is port (
15行目はxへの信号割り当てです。
x <= x + 1;
これはシミュレーションエラーです(実行時に発生します)。
IEEE 1076-1993から:
7.2.4演算子の追加
加算演算子+および-は、任意の数値タイプに対して事前定義されており、従来の数学的意味を持っています。
これは、「+」演算子の結果がxのサブタイプ制約の外にある可能性があることを意味します。「+」にオーバーロードを提供するように宣言された関数は、結果のサブタイプを指定できないことに注意してください。(戻り値は、値の範囲または配列の長さを定義できるサブタイプ指示で宣言されたオブジェクトである可能性があります)。
および12.6.2信号値の伝播
特定のシミュレーションサイクル中に信号を更新するために、カーネルプロセスは最初にその信号の駆動値と実効値を決定します。次に、カーネルプロセスは、信号の現在の値を含む変数を、新しく決定された実効値で次のように更新します。
a)Sが配列型ではないタイプの信号である場合、Sの実効値を使用してSの現在の値を更新します。Sの実効値がSのサブタイプに属していることを確認します。このサブタイプチェックが失敗するとエラーが発生します。最後に、Sの実効値が、信号の現在の値を表す変数に割り当てられます。
加算の結果がターゲットxのサブタイプ制約と一致しない場合、エラーが生成されます。そのサブタイプ制約は、整数(範囲)のサブタイプ指示を提供するオブジェクトx宣言によって提供されます。
実行時エラーにより、LRM準拠の実装のシミュレーションが終了します。
エラーレポートの標準化されたフォーマットがないと、ghdlは現在のシミュレーション時間を提供しません。これは、生成された波形を調べることで見つけることができます。

波形は20ns後にかなり更新されています。次に予定されているイベント:
library ieee;
use ieee.std_logic_1164.all;
entity foo_tb is
end entity;
architecture foo of foo_tb is
signal clk: std_logic := '0';
begin
DUT:
entity work.foo
port map (
clk => clk
);
CLOCK:
process
begin
wait for 5 ns;
clk <= not clk;
if now > 30 ns then
wait;
end if;
end process;
end architecture;
25nsでのclkの立ち上がりエッジでした。
したがって、これは、制約された整数がどのようにオーバーフローエラーを生成するかを示しています。
サブタイプ制約のない整数はどうですか?
architecture fum of foo is
signal x : integer := INTEGER'HIGH - 2;
begin
process (clk)
begin
if rising_edge(clk) then
x <= x + 1;
end if;
end process;
end architecture;
xを制約のない整数セットとして定義し、xがオーバーフローすると予想されるデフォルト値を設定します。
パッケージ標準は明示的にINTEGER"+"を宣言します:
-- function "+" (anonymous, anonymous: INTEGER) return INTEGER;
「+」が通常の数学的意味を持っている場合、期待される結果はINTEGERの範囲外です。
ただし、パッケージ標準の実装依存宣言から:
type integer is range -2147483648 to 2147483647;
とシミュレーション:

xラップアラウンドの値がわかります。
「+」演算子の結果の割り当ては、制約に違反していません。
3種類:
特定のタイプのオブジェクトの可能な値のセットは、制約と呼ばれる条件に従うことができます(制約が制限を課さない場合も含まれます)。対応する条件を満たす場合、値は制約を満たすと言われます。サブタイプは、制約を伴うタイプです。値がそのタイプに属し、制約を満たしている場合、その値は特定のタイプのサブタイプに属していると言われます。指定されたタイプは、サブタイプの基本タイプと呼ばれます。タイプはそれ自体のサブタイプです。このようなサブタイプは制約なしと呼ばれます(制限を課さない条件に対応します)。タイプの基本タイプはタイプ自体です。
2番目のアーキテクチャでは、制約はありませんが、INTEGER型の宣言された範囲外の可能な値はありません。代わりに、値がロールオーバーします。
VHDLのセマンティクスは、ここでの検出を必要としないように構築されており、これは、バイナリビット(ハードウェア)を表す要素の1次元配列に対する数学演算と一致します。