2013-07-22 15 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

2番目の例で 'i'を' select'に置き換えたいと思います。 – 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 
関連する問題