verilog语法中+:和-:用法

verilog语法中+:和-:主要用来进行位选择

      位选择从向量net、向量 reg、整数变量或时间变量中提取特定位。可以使用表达式寻址该位。如果位选择超出地址边界或位选择为 x 或 z,则引用返回的值应为 x。声明为实时或实时的变量的位选择或部分选择应被视为非法。 向量net、向量 reg、整数变量或时间变量中的几个连续位可以被寻址,称为部分选择。有两种类型的部分选择,常量部分选择和索引部分选择。

向量 reg 或 net 的常量部分选择由以下语法给出: vect[msb_expr:lsb_expr] 例如: vect[31:0] 两个表达式都应为常量表达式。第一个表达式必须处理比第二个表达式更重要的位。如果部分选择超出地址边界或部分选择是 x 或 z,则引用返回的值应为 x。 向量网络、向量 reg、整数变量或时间变量的索引部分选择使用以下语法给出:

reg [15:0] big_vect;
reg [0:15] little_vect;
big_vect[lsb_base_expr +: width_expr]
little_vect[msb_base_expr +: width_expr]
big_vect[msb_base_expr -:width_expr]
little_vect[lsb_base_expr -:width_expr]

 width_expr 应该是一个常量表达式。它也不受运行时参数分配的影响。 lsb_base_expr 和 msb_base_expr 可以在运行时变化。前两个示例选择从基数开始并递增位范围的位。选择的位数等于宽度表达式。后两个示例选择从基数开始并降序到位范围的位。部分选择寻址的位范围完全超出网络、reg、整数或时间的地址边界,或者当部分选择是 x 或 z 时,读取时应产生值 x,并且应具有写入时对存储的数据没有影响。 部分超出范围的部分选择应在读取时为超出范围的位返回 x,并且 写入时仅影响范围内的位。

例子:

reg [31:0] big_vect;
reg [0:31] little_vect;
reg [63:0] dword;
integer sel;

initial begin
if ( big_vect[0 +:8] == big_vect[7 : 0]) begin end
if (little_vect[0 +:8] == little_vect[0 : 7]) begin end
if ( big_vect[15 -:8] == big_vect[15 : 8]) begin end
if (little_vect[15 -:8] == little_vect[8 :15]) begin end
if (sel >0 && sel < 8) dword[8sel +:8] = big_vect[7:0];
// Replace the byte selected.*

 前四个 if 语句显示了两部分 select 构造之间的同一性。最后一个显示了可索引的性质。

区分一下大小端:

大端序是我们常用的描述位宽的方式,reg [31:0] big_vect;低位在右边,高位在左边。

小端序比如reg [0:31] little_vect;高位在右边,低位在左边。

位选则等效如下:

reg [31:0] big_vect;为大端,那么转化后的也一定是大端,**形式不变**
big_vect[0 +:8]转化后一定是       big_vect[较大的数值     **:**   较小的数值]
little_vect[0 +:8] 转化后一定是    little_vect[较小的数值    **:**     较大的数值]

big_vect    [0  +:   8]  从0 开始,升序,位宽为8     ======》》》》》big_vect   [7 :0]
little_vect  [0  +:   8]  从0 开始,升序,位宽为8     ======》》》》》little_vect  [0 :7]
big_vect   [15 -:   8]  从15开始,降序,位宽为8    ======》》》》》big_vect    [15 :8] 
little_vect [15 -:   8]  从15开始,降序,位宽为8    ======》》》》》little_vect   [8:15]

参考Verilog语法+:的说明_相顾无言_40994893的博客-CSDN博客_+: verilog

你可能感兴趣的:(verilog,System,verilog,fpga开发,硬件工程)