2013-07-22 131 views
11

我最近在verilog/systemverilog代碼中看到了這個操作符。什麼是`+:`和` - :`?

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] 

我很少看到這個,所以我想問一下這是什麼,什麼時候以及如何使用它?

回答

22

該特定語法稱爲索引部分選擇。當您需要從多位寄存器中的變量偏移量中選擇固定數量的位時,它非常有用。

下面是語法的例子:

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] 

與此語法的最大好處是,你可以使用一個變量的索引。正常器件在Verilog中選擇需要常量。所以嘗試使用dword[i+7:i]之類的東西是不允許的。

所以,如果你想選擇一個特定的字節使用變量選擇,你可以使用索引部分選擇。

實施例使用可變:

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

我想你想在第二個例子中用'select'替換'i'。 – nguthrie

0

這個操作符的目的是,當你需要訪問總線的切片,都MSB位置和LSB的位置是變量,但是切片的寬度是恆定的值,如下例所示:

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