2013-07-22 25 views
11

Kısa bir süre önce bu operatörü bir verilog/systemverilog kodunda gördüm.`+:` ve `-:` nedir?

logic [15:0] down_vect; 
logic [0:15] up_vect; 

down_vect[lsb_base_expr +: width_expr] 
up_vect [msb_base_expr +: width_expr] 
down_vect[msb_base_expr -: width_expr] 
up_vect [lsb_base_expr -: width_expr] 

Nadiren bu nedenle bu gördüğüm, ne şudur, ne zaman ve bunu nasıl kullanırım sormak istiyorum?

cevap

22

Bu özel sözdizimi dizinli kısım olarak adlandırılır.. Çok bitli bir kayıttaki değişken bir ofsetden sabit sayıda bit seçmeniz gerektiğinde çok kullanışlıdır.

reg [31:0] dword; 
reg [7:0] byte0; 
reg [7:0] byte1; 
reg [7:0] byte2; 
reg [7:0] byte3; 

assign byte0 = dword[0 +: 8]; // Same as dword[7:0] 
assign byte1 = dword[8 +: 8]; // Same as dword[15:8] 
assign byte2 = dword[16 +: 8]; // Same as dword[23:16] 
assign byte3 = dword[24 +: 8]; // Same as dword[31:24] 

bu sözdizimi ile büyük avantajı index için bir değişken kullanabilirsiniz olmasıdır:

İşte sözdizimi bir örnek. Verilog'da normal kısım seçimleri sabitler gerektirir. Yani, yukarıda dword[i+7:i] gibi bir şeyle giriş yapmaya izin verilmiyor.

Belirli bir bayt seçmek için bir değişken kullanarak seçmek istiyorsanız, endeksli parça seçimini kullanabilirsiniz.

Örnek kullanarak değişken: Bir otobüsün bir dilim erişmeniz gerektiğinde

reg [31:0] dword; 
reg [7:0] byte; 
reg [1:0] i; 

// This is illegal due to the variable i, even though the width is always 8 bits 
assign byte = dword[(i*8)+7 : i*8]; // ** Not allowed! 

// Use the indexed part select 
assign byte = dword[i*8 +: 8]; 
+1

İkinci örneğinizde '' 'ile 'i' i değiştirmek istediğinizi düşünüyorum. – nguthrie

0

bu operatörün amacı, MSB pozisyonu ve hem LSB pozisyonları değişkenler, ancak dilim genişliği bir sabittir Aşağıdaki örnekte olduğu gibi, değer:

bit[7:0] bus_in = 8'hAA; 
int lsb = 3; 
int msb = lsb+3; // Setting msb=6, for out bus of 4 bits 

bit[3:0] bus_out_bad = bus_in[msb:lsb]; // ILLEGAL - both boundaries are variables 
bit[3:0] bus_out_ok = bus_in[lsb+:3]; // Good - only one variable