Сдвиг

Выделяют два вида операторов сдвига:

  • Операторы логического сдвига: << и >>.

  • Операторы арифметического сдвига: <<< и >>>.

Пример

// <переменная> <оператор> <выражение> 
module shift_operators_tb;
  reg [3:0] a; int i;

  initial begin
    a = 8'h1; $display("a = 'd%0d ('b%0b)", a, a);
    for (i = 0; i < 8; i +=1 ) begin
      $display("a << %0d = 'b%b", i, a << i); // логический сдвиг влево
    end

    a = 8'h80; $display("a = 'd%0d ('b%0b)", a, a);
    for (i = 0; i < 8; i +=1 ) begin 
      $display("a >> %0d = 'b%b", i, a >> i); // логический сдвиг вправо
    end

    a = 8'h1; $display("a >> 1 = 'b%b", a >> 1);
    
    a = 8'h1; $display("a = 'd%0d ('b%0b)", a, a);
    for (i = 0; i < 8; i +=1 ) begin
      $display("a <<< %0d = 'b%b", i, a <<< i); // арифметический сдвиг влево
    end

    a = 8'h80; $display("a = 'd%0d ('b%0b)", a, a);
    for (i = 0; i < 8; i +=1 ) begin 
      $display("a >>> %0d = 'b%b", i, a >>> i); // арифметический сдвиг вправо
    end
  end
endmodule

Результат исполнения

логический сдвиг
арифметический сдвиг
a = 'd1 ('b1)
a << 0 = 'b00000001
a << 1 = 'b00000010
a << 2 = 'b00000100
a << 3 = 'b00001000
a << 4 = 'b00010000
a << 5 = 'b00100000
a << 6 = 'b01000000
a << 7 = 'b10000000
a = 'd128 ('b10000000)
a >> 0 = 'b10000000
a >> 1 = 'b01000000
a >> 2 = 'b00100000
a >> 3 = 'b00010000
a >> 4 = 'b00001000
a >> 5 = 'b00000100
a >> 6 = 'b00000010
a >> 7 = 'b00000001
a >> 1 = 'b00000000
a = 'd1 ('b1)
a <<< 0 = 'b00000001
a <<< 1 = 'b00000010
a <<< 2 = 'b00000100
a <<< 3 = 'b00001000
a <<< 4 = 'b00010000
a <<< 5 = 'b00100000
a <<< 6 = 'b01000000
a <<< 7 = 'b10000000
a = 'd128 ('b10000000)
a >>> 0 = 'b10000000
a >>> 1 = 'b01000000
a >>> 2 = 'b00100000
a >>> 3 = 'b00010000
a >>> 4 = 'b00001000
a >>> 5 = 'b00000100
a >>> 6 = 'b00000010
a >>> 7 = 'b00000001

Last updated