e19*_*001 15 verilog system-verilog
我最近在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]
Run Code Online (Sandbox Code Playgroud)
我很少见到这一点,我想问一下这是什么,何时以及如何使用它?
dwi*_*kle 28
该特定语法称为索引部分选择.当您需要从多位寄存器中的可变偏移量中选择固定数量的位时,它非常有用.
这是一个语法示例:
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]
Run Code Online (Sandbox Code Playgroud)
此语法的最大优点是您可以使用变量作为索引.正常部分选择Verilog需要常量.因此dword[i+7:i]不允许尝试使用类似的东西.
因此,如果要使用变量select选择特定字节,可以使用索引部分选择.
使用变量的示例:
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];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5538 次 |
| 最近记录: |