はじめに
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
まとめ
シフト演算子と算術シフト演算子についてまとめました。
コメント