3.12 式,演算子


単位動作はおのおの独自の形式を持ちますが,その共通的な要素はです.式は演算子参照によって構成されます.

SFLの演算子を表3.4 に示します.同一優先順位の演算子では「式の右から左へ」評価されます.

たとえば,

^/|a<7:4> + (^20#\b)<3:0>

は「b をエンコ−ドする.この結果を符号拡張して 20ビットとする.この結果の否定をつくる.この結果のビット3 からビット0 までを切り出す.これを X とする.次に,a のビット7 からビット4 までを切り出す.この結果に対し桁方向の or をとる.この結果の否定をつくる.これをY とする.X に Yを加える」となります.

機能回路では,すべての演算子を使うことができます.モジュールでは,デコード,エンコード,加算,ビット右シフト,ビット左シフトは使うことができず,一致演算子の右項は定数でなければなりません.

オペランドの桁位置(ビット位置)は LSB から 0,1,2,... とします.

論理演算はビットごとに行われます.| (or),@ (eor),& (and) では 二つのオペランドのビット幅は等しくなければなりません.

連結では左項を MSB側,右項を LSB側として,左項と右項が連結されます.

ビット・シフトでは左項を「右項を 2進数としてみたときの値だけ」シフトします.結果のビット幅は左項と同じです.右シフトでは MSB側から,左シフトでは LSB側から 0 が入れられます.シフト数を指定する右項は式です.

一致判定では左項と右項のビット幅は等しくなければなりません.一致判定の結果は 1ビットで,左項と右項の値がビットごとにすべて等しいとき 1 ,そうでないとき 0 となります.

桁方向の論理演算はオペランドのビット相互で演算を行います.結果は 1ビットです.

加算ではオペランドのビット幅が一致している必要はありません.結果のビット幅は,オペランドのビット幅の大きいほうと等しくなります.桁上がりのぶんを考慮に入れたいときは,あらかじめ 1ビットぶん幅を増やしておく必要があります.


<表3.4> SFLの演算子

負の数を 2の補数で表現するときは,

A - B = A + ^B + 0b1

によって減算を定義することができます(AとBのビット幅が一致している場合のみ).

デコード演算はオペランドを 2進数としてみたときの値をビットの位置 ( LSBの位置が値 0 ) へ変換します.オペランドのビット幅が n のとき結果のビット幅は 2n となります.たとえば,

/0b000

/0b110

/0b111

は,おのおの0b00000001,0b01000000,0b10000000 となります.

エンコードはデコードの逆の演算です.オペランド内に含まれるもっとも MSB側の 1の位置がエンコードされます (プライオリティ・エンコード) .たとえば,

\0b00000001

\0b01000011

\0b10000000

\0b00000000

は,おのおの0b0000,0b0110,0b0111,0b1000 となります.オペランドのビット幅は 2 のべき乗でなければなりません.n ビットのオペランドをエンコードすると log2n + 1 ビットとなります.したがって,8ビットをエンコードすると上の例のように,結果は 4ビットになります.結果の MSB は,オペランドのすべてのビットが "0" であったときに "1" となります.

符号拡張は,オペランドの上位にオペランドの MSBを必要個数連結して,結果を指定サイズとします.もしオペランドのビット幅が指定のビット幅より大きいときは,オペランドは単に上位が切り捨てられます.

ビット切り出しはオペランドの任意位置の切り出しや反転を行います.たとえば,

a<7:4> , a<5> , a<4:7>

は,それぞれ a のビット7〜4 の 4ビットを切り出したもの,a のビット5 の 1ビットを切り出したもの,aのビット7〜4 までの 4ビットを切り出し,左右を反転したものを表します.また,オペランドのビット幅よりも大きいビット位置を指定したときは,オペランドの上位に 0 があるものとして扱われます.


ハードウェア動作の記述言語〜 SFL のページへ戻る

ホームページに戻る