【>>>/<<<】算術シフト演算子とシフト演算子 Verilog

はじめに

Verilogにはシフト演算子「>>/<<」(Shift Operator)と算術シフト演算子「>>>/<<<」(Arithmetic Shift Operator)があります。

使い方

シフト演算子

シフト演算子は左シフト「<<」、右シフト「>>」ともに、変数がSigned/Unsigned どちらでも0 埋めとなります。

サンプルコード1
module top;
    bit signed [2:0] din1 = 3'b101;
    bit signed [2:0] din2 = 3'b011;
    bit [2:0] din3 = 3'b101;
    bit [2:0] din4 = 3'b011;

    initial begin
        $display("%b", din1 >>  1); // 010
        $display("%b", din2 >>  1); // 001
        $display("%b", din3 >>  1); // 010
        $display("%b", din4 >>  1); // 001
        $display("%b", din1 <<  1); // 010
        $display("%b", din2 <<  1); // 110
        $display("%b", din3 <<  1); // 010
        $display("%b", din4 <<  1); // 110
    end
endmodule

算術シフト演算子

算術シフト演算子は左シフト「<<<」は0埋めです。右シフト「>>>」は符号ビット(MSB)埋めとなります。

サンプルコード2
module top;
    bit signed [2:0] din1 = 3'b101;
    bit signed [2:0] din2 = 3'b011;
    bit [2:0] din3 = 3'b101;
    bit [2:0] din4 = 3'b011;

    initial begin
        $display("%b", din1 >>> 1); // 110
        $display("%b", din2 >>> 1); // 001
        $display("%b", din3 >>> 1); // 010
        $display("%b", din4 >>> 1); // 001
        $display("%b", din1 <<< 1); // 010
        $display("%b", din2 <<< 1); // 110
        $display("%b", din3 <<< 1); // 010
        $display("%b", din4 <<< 1); // 110
    end
endmodule

まとめ

シフト演算子と算術シフト演算子についてまとめました。

コメント

タイトルとURLをコピーしました