中[ ]的用法
不管是reg变量还是wire变量,data1[X:0]
,data1[X]
是最高位,data1[0]
是最低位。data2[0:X]
,data2[0]
是最高位,data2[X]
是最低位。
例如: 两个4位的寄存器变量data1和data2,并对这两个寄存器变量赋值4‘b1100
。
wire [3:0] data1;
wire [0:3] data2;
wire [3:0] data;
assign data = 4‘b1100;
assign data1 = data;
assign data2 = data;
这时
data1[3]=1, data1[2]=1, data1[1]=0, data1[0]=0;
data2[0]=1, data2[1]=1, data2[2]=0, data2[3]=0;
对于data1而言,data1[3]是最高位
对于data2而言,data2[0]是最高位
中数据的截取
Verillog支持指定 bit 位后固定位宽的向量域选择访问。
[bit + : width] : 从起始 bit 位开始递增,位宽为 width。
[bit - : width] : 从起始 bit 位开始递减,位宽为 width。
//下面 2 种赋值是等效的
A = data1[31-: 8] ;
A = data1[31:24] ;
//下面 2 种赋值是等效的
B = data1[0+ : 8] ;
B = data1[0:7] ;
中{ }的用法
3.1 拼接{ }
{a, b[3:0], c, 3'b100}
等同于
{a, b[3],b[2], b[1],b[0],c, 1'b1,1'b0,1'b0}
其中最左边是最高位,最右边是最低位
。
3.2 复制 {{ }}
{8 {a[1]}}
等同于
{a[1],a[1],a[1],a[1],a[1],a[1],a[1],a[1]}
其中8表示要把a[1]重复8次,并不是要拼接的内容,所以就不用指定位长了。比如a[1]=1,上面的描述就对应了一个长度为8,每一位都是1的二进制串。
多展示几个例子:
{ 3 { a } }=={a,a,a}
{a, {3{b, c}}} =={a, b, c, b, c, b, c}
{{4{1'b0}},wr_addr[8:0]} = {4'b0000,wr_addr[8:0]};