pp.214-215
非公式訳
演算子の優先順位
演算子はカテゴリーによって優先順位が異なります。カテゴリーの同じ演算子は、優先順位が同じであり、記述された式の左から右へ向かって順番に評価されます。演算の順番を明示したいときは積極的に括弧を使うよう習慣づけてください。たとえば下のステートメントについて考えてみましょう。
s <= a + b + c + d
これは4つの被ベクタ演算子を加算するステートメントです。VHDLコンパイラーは、s <= ((a + b) + c) + d
と記述されたものとして回路を合成します。3つの加算器がカスケード接続されるため、3つの加算器を通過する伝播遅延の生じたあとに和が得られます。括弧を使って下のように記述した場合はどうでしょうか。
s <= (a + b) + (c + d)
この場合もやはり、合成された回路には加算器が3つ含まれます。しかしa + b
およびc + d
の2つの加算が並列して実行されるため、加算器を2つだけ通過する伝播遅延の生じたあとに最終的な和が得られます。
――――――――――――――――――――――――――
で、実際に確かめてみる。
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity sute_vhdl is generic ( NUM_BITS: natural := 4 ); port ( a, b, c, d: in std_logic_vector(NUM_BITS-1 downto 0); s0, s1: out std_logic_vector(NUM_BITS-1 downto 0) ); end entity; architecture rtl of sute_vhdl is begin s0 <= a + b + c + d; -- s1 <= ((a + b) + c) + dと同じ; s1 <= (a + b) + (c + d); end architecture;
かなり見づらいがs0はAdd0、Add1、Add2の3つの加算器を通過している。s1はAdd0とAdd3とがパラレルになっている。