演算子

算術演算子

算術演算子には+,-,*,/,**があります。

2'd1 + 2'd2 // 2'b3
2'd2 - 2'd1 // 2'd1
4'd3 * 4'd2 // 4'd6
parameter WIDTH = 2 ** 4; // 16
parameter HALF_WIDTH = WIDTH / 2; // 8

比較演算子

比較演算子には<、<=、>、>=があります。指定した関係が真なら1を、偽なら0を返します。

assign r0 = 2'd1 < 2'd3; // 1
assign r1 =
2'd1 <= 2'd3; // 1
assign r2 = 2'd1 <= 2'd1; // 1
assign r3 = 2'd1 > 2'd3; // 0
assign r4 = 2'd1 >= 2'd3; // 0
assign r5 = 2'd1 >= 2'd1; // 1

等号演算子

等号演算子には==、!=、===、!==がある。指定した関係が真なら1を、偽なら0を返す。

===、!==はX(不定)やZ(ハイインピーダンス)とを比較することができる。

assign r0 = 2'd1 == 2'd1; // 1
assign r1 =
2'd1 != 2'd1; // 0

論理演算子

&&は論理積、||は論理和、!は論理否定である。
assign r0 = 1'b1 && 1'b1; // 1
assign r1 = 1'b1 || 1'b0; // 1
assign r2 = !1'b1; // 0

ビット演算子

~, &, |, ^, ~^
はビットごとの演算を行う。
A = 4'b0110;
B = 4'b1100;

Y = ~A;    //否定演算 結果は1001
Y = A & B;  //AND演算 結果は0100
Y = A | B;  //OR演算 結果は1110
Y = A ^ B;  //XOR演算 結果は1010
Y = A ~^ B;  //XNOR演算 結果は0101

リダクション演算子

&,|,^,~^
があり、1つの信号に対して各ビット単位で演算を行い、1ビットの結果を返す。
wire [3: 0] A = 4'b0010;

X = &A; //AND演算、結果は0
X = ~&A; //NAND演算、結果は1
X = |A;  //OR演算、結果は1
X = ~|A;  //NOR演算、結果は0
X = ^A;  //XOR演算、結果は1
X= ~^A;  //XNOR演算、結果は0

シフト演算子

指定したビット数に応じて左または右方向にビットをシフトさせます。空いたビットには0が補完されます。

信号 >> シフト幅 // 符号なし右シフト
信号 << シフト幅 // 符号なし左シフト
信号 >>> シフト幅 // 符号有り右シフト
信号 <<< シフト幅 // 符号有り左シフト

以下に例を示します。

wire [3:0]A = 4'b1011;
wire [3:0]B;
assign B = (A << 2);  //左に2つシフトする、結果は1100

条件演算子

条件に従い、処理を実行します。

条件式 ? 真の場合の処理 : 偽の場合の処理

以下に例を示します。

assign X = sel ? A: B;   //selが1ならX=A、0ならX=Bとなる
assign X = (sel == 2'b00) ? A : (
    (sel == 2'b01) ? B : (
        (sel == 2'b10) ? C : D
    )
);

連接演算子

連結演算子は、信号同士を連結します。

{信号, 信号,...,信号}

以下に例を示します。

wire [3:0] A = 3'b110;
wire [3:0] B = 3'b001;

wire [7:0] S = {2'b00, A, B}; //8'b00110001

応用実験受講者へ

/、**演算子を信号に対し使わないでください。