一、语法介绍
在verilog中对向量net、向量reg、integer、time变量以及parameter中选取一个单独的位,被叫做位选择(bit-selects)。位向量可以被寻址参与表达式中。如果位选择在地址边界之外或者被选择的位是x值或者z值,则返回的参考值是x值。
在verilog中对向量net、向量reg、integer、time变量以及parameter中选取一个几个连续的位,被叫做部分选择(part-selects)。有两种部分选择类型,常数部分选择和索引部分选择。reg和net常数的索引语法为:
vect[msb_expr : lsb_expr]
msb_expr和lsb_expr都是整形常数表达式。
向量net、向量reg、integer、time变量以及parameter的索引部分选择语法为:
reg [15:0] big_event;
reg [0:15] little_event;
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]
代码1-1
msb_base_expr 和 lsb_base_expr 是整型表达式,表示部分索引的基地址;width_expr是正整型常数表达式,表示向量部分选择的范围。msb_base_expr 和 lsb_base_expr的值在运行过程中可以改变。“+:”表示在基值上增加width_expr,“+:”表示在基值上减去width_expr。
对于两种部分选择类型来说,如果寻址范围全在地址界限外,则读操作会返回X值,写操作不会对原来存储的值产生任何影响。对于部分在界限外部分选择来说,在界限外的部分读操作会返回X值,写操作只会形象在界限内那部分的存储值。
二、语法举例
reg [31:0] big_vect;
reg [0:31] little_vect;
reg [63:0] dword;
integer sel;
big_vect [0 +: 8] // == big_vect[7:0]
big_vect [15 -: 8] // == big_vect[15:8]
little_vect [0 +:8] // == little_vect[0:7]
little_vect [15 -: 8] // == little_vect[8:15]
dword [8*sel +: 8] //variable part-select with fixd width
代码2-1
代码1-1和代码2-1均为IEEE STD 1364-2005中的例子。通过代码2-2中的例子可以很清楚的显示2-1中msb/lsb_base_expr的含义就是索引部分选择的基值,以此为基准进行位宽的增加和减少,然后再按照大端模式或者小端模式的形式可以映射为注释符后面的形式。dword部分表明索引部分选择的基值表达式可以是变量表达式而不是常数表达式,从而可以进行位宽固定,机制可以变化的部分选择寻址。
三、参考资料
1. IEEE STD 1364-2005 5.2.1章节。