演算子と式
二項演算子
これまで何度か説明しないで演算子をコードの中で扱っていました。(算術)論理演算の排他的論理和(”^")と論理積(”&")です。これらの論理演算は各ビット位置について並行して論理演算を行います。そしてビット位置を扱うことから幅(スライス)を併用することがよくあります。主な二項論理演算子は次の通りです。
演算 | 種類 | 演算子 | 例 | 例の結果 |
---|---|---|---|---|
論理和 | 論理演算 | | | 4'h5 | 4'h6 | 4'h7 |
論理積 | 論理演算 | & | 4'h5 & 4'h6 | 4'h4 |
排他的論理和 | 論理演算 | ^ | 4'h5 ^ 4'h6 | 4'h3 |
加算 | 数値演算 | + | 4'h5 + 4'h6 | 4'hb |
積算 | 数値演算 | * | 4'h5 * 4'h6 | 8'h1e |
割算 | 数値演算 | / | 4'h5 / 4'h6 | 4'h0 |
乗除 | 数値演算 | % | 4'h5 % 4'h6 | 4'h5 |
乗数 | 数値演算 | ** | 4'h5 ** 4'h2 | 8'h19 |
左論理シフト | 算術演算 | << | 4'h5 << 4'h1 | 4'ha |
右論理シフト | 算術演算 | >> | 4'h5 >> 4'h1 | 4'h2 |
左算術シフト | 算術演算 | <<< | 4'h5 <<< 4'h1 | 4'ha |
右算術シフト | 算術演算 | >>> | (-4'h5) >> 4'h1 | -4'h2 (= 4'hd) |
幅(ベクトル長)が一致していない場合、割り当てと代入それぞれでどうなるか考えて試してみてください。また、引数に割り当て先や代入先のある二項演算の場合、その同じ引数を省略して例えばinc += '1
とインクリメントを記述できます。
単項演算子
一つの引数のみ取る演算子の代表例は論理否定("~")です。他の論理演算同様各ビット位置に対して論理否定演算を行います。例えば~4'h5 = 4'ha
です。数値演算では符号付き表記があります。例えば-4'h5 = 4'hb
です。
他にリダクション演算子が論理演算に対してサポートされています。リダクションは指定されたビット位置(或いはすべて)に対して各ビットを引数として演算を行います。リダクション演算は主に次の3つを用います。
演算 | 種類 | 演算子 | 例 | 例の結果 |
---|---|---|---|---|
論理和 | 論理演算 | | | |4'h5 | 1'h1 |
論理積 | 論理演算 | & | &4'h5 | 1'h0 |
排他的論理和 | 論理演算 | ^ | ^4'h5 | 1'h0 |
比較演算子
他の言語同様に比較演算子もサポートされており、主に次のようなものがあります。
演算 | 種類 | 演算子 | 例 | 例の結果 |
---|---|---|---|---|
大なり | 算術演算 | > | 4'h5 > 4'h6 | 1'h0 |
小なり | 算術演算 | < | 4'h5 < 4'h6 | 1'h1 |
等しい | 算術演算 | == | 4'h5 == 4'h6 | 1'h0 |
等しくない | 算術演算 | != | 4'h5 != 4'h6 | 1'h1 |
等しい | 2値演算 | === | 4'h5 === 4'b011z | 1'h0 |
等しくない | 2値演算 | !== | 4'h5 !== 4'b011z | 1'h1 |
等しい | 2値演算 | ==? | 4'h5 ==? 4'b010z | 1'h1 |
等しくない | 2値演算 | !=? | 4'h5 !=? 4'b010z | 1'h0 |
他の言語同様に大なりと小なりに等しい条件を含めた>=
と<=
をサポートしています。
2値演算は4状態を持つ型、例えばlogic型で不定とハイインピーダンスも比較します。最後の二つは右の二項目の引数にワイルドカードとして不定とハイインピーダンスを含めることができます。
ブール代数演算子
先に説明した論理演算は各ビット(ベクトルの各要素)に対して論理演算を行うものでした。他にブール代数に従った論理演算もサポートしており、このシリーズではブール演算演算子として名称を区別しています。他の言語と同様に真と偽を表現するもので演算の結果としてそれぞれ1と0とした結果を持ちます。また引数は0値の時を偽、それ以外を真として扱います。
演算 | 種類 | 演算子 | 例 | 例の結果 |
---|---|---|---|---|
論理和 | 論理演算 | || | 4'h5 || 4'h6 | 1'h1 |
論理積 | 論理演算 | && | 4'h5 && 4'h6 | 1'h1 |
論理否定 | 論理演算 | ! | !4'h5 | 1'h0 |
式
日常使われている算術数値演算の四則演算では演算子の間に優先順位が暗黙にあります。皆さんが知っているように積算と除算は加算と減算より優先順位が高いです。例えば5+6*7
は6*7
を先に演算した後にその結果と加算を行います。この優先順位は暗黙に決まっており、カッコ"("と")"を用いて演算の順番、つまり優先順位をコード上指定していないことに起因しています。SystemVerilogでは演算子に関して暗黙の優先順位を定義しています。この優先順位はこの言語特有のものであり、例えば算術積算より単項の加算の方が優先順位が高く定義されています。