Perbedaan antara >> dan >>> di Verilog?

8

Apa perbedaan antara >>dan >>>di Verilog / sistem Verilog? Saya tahu ==tes hanya untuk 1 dan 0, sedangkan ===tes untuk 1, 0, X, Z. Jadi bagaimana itu mirip dengan operator shift?

daut
sumber

Jawaban:

13

Ini tidak mirip dengan ==/ ===, jika operan tangan kiri ditandatangani kemudian >>>melakukan ekstensi tanda.

reg signed [9:0] b = 10'sb11_0101_0101;
reg signed [9:0] a_signed;
reg        [9:0] a_unsigned; 

always_comb begin
  a_signed   = b >>> 2;
  a_unsigned = b >>  2;
end

Hasil:

#a_signed   1111010101
#a_unsigned 0011010101

Contoh tentang EDA Playground .

pre_randomize
sumber
2
Wow, itu persis kebalikan dari makna Java >>dan >>>operator ... jahat.
Colin D Bennett
2
Verilog adalah 10 tahun sebelum Jawa. : P
dave_59
1
@ dave_59, tetapi nilai yang ditandatangani (selain dari tipe 32-bit integer) dan operator pergeseran aritmatika hanya diperkenalkan ke Verilog di Verilog-2001.
The Photon
1
Verilog sudah harus >>berarti perubahan logis pada tahun 1985 (diambil dari Pascal, yaitu dari tahun 1970). Jadi itu harus digunakan >>>untuk perubahan aritmatika.
dave_59
8

Menurut IEEE1800-2012 >>adalah pergeseran logis biner, sedangkan >>>pergeseran aritmatika biner.

Pada dasarnya, pergeseran aritmatika menggunakan konteks untuk menentukan bit pengisian, jadi:

  • arithmetic right shift ( >>>) - menggeser jumlah bit yang ditentukan, isi dengan nilai bit tanda jika ekspresi ditandatangani , jika tidak, isi dengan nol,
  • arithmetic left shift ( <<<) - menggeser jumlah bit yang ditentukan ke kiri, isi dengan nol.

Di sisi lain, shift logis ( <<, >>) selalu mengisi posisi bit yang kosong dengan nol.

Sebagai contoh:

a = 5'b10100;
b = a <<< 2; //b == 5'b10000
c = a >>> 2; //c == 5'b11101, 'cause sign bit was `1`
d = a <<  2; //d == 5'b10000
e = a >>  2; //e == 5'b00101
Qiu
sumber
Hasil dari contoh ini bergantung pada pernyataan c: jika Anda menggunakan reg [4:0] c, Anda akan mendapatkannya 5'b00101, tidak 5'b11101. Memperbarui contoh untuk memperjelas jenisnya akan bermanfaat, saya pikir.
Clément