What are the +:
and -:
Verilog/SystemVerilog operators? When and how do you use them? For example:
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]
That particular syntax is called an indexed part select. It's very useful when you need to select a fixed number of bits from a variable offset within a multi-bit register.
Here's an example of the syntax:
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]
The biggest advantage with this syntax is that you can use a variable for the index. Normal part selects in Verilog require constants. So attempting the above with something like dword[i+7:i]
is not allowed.
So if you want to select a particular byte using a variable select, you can use the indexed part select.
Example using variable:
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];
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With