Verilog HDL中有一个特殊的连接符号——“{}”,(上次看华为面试题也有这个简单的选择题),称为迭代连接运算符,顾名思义,它兼具迭代和连接的双重功效,如下:
(1)连接功能
该运算符号的第一个基本功能就是连接功能,能够将若干个寄存器或者线网类型的变量首尾连接起来组成一个位宽更大的变量。例如:
wire a = 1'b1;
wire [2:0] b = 3'b001;
wire [3:0] c = {a, b}; // c = 4'b1001;
(2)迭代功能
迭代功能是该运算符号的第二个基本功能,它能够把一个变量复制多次,然后首尾连接起来组成一个位宽更大的变量。例如:
wire [1:0] a =2'b10;
wire [7:0] b = {4{a}}; //b = 8'b10101010;
注意,最外层的那个大括号{}是不能省略的!里外两层大括号是语法的必须要求!因为上述赋值其实相当于:
wire [7:0] b ={a,a,a,a};
//如果省略了,相当于如下:
wire [7:0] b = a,a,a,a;//不伦不类
所以,里层的大括号完成的是多次复制,而外层的大括号完成的是连接功能,两层大括号配合起来才完成了迭代功能。
(3)混合功能
所谓混合功能就是既有迭代又有连接的功能,如下:
wire a = 1'b1;
wire [2:0] b = 3'b011;
wire [7:0] c = { {5{a}}, b }; //c = 8'b11111_011
注意,要保证迭代的完整性,不能写成:
c = { 5{a}, b };
即使你看起来也行呀,其实也不行,会导致编译出错。
上述例子是先迭代再连接,也可以先连接再迭代,如下:
wire [7:0] d = {2{a,b}}; // d = 8'b1011_1011;
最后,迭代连接运算符除了可以操作变量外,还可以操作常量,例如:如果我们要给一个64bit的线网向量赋值一个64bit的常量,我们可以这么做:
wire [63:0] a = 64'bF9F9F9_A8A8A8A8A8;
//可以利用迭代写成:
wire [63:0] a = 64'b{ {3{8'hF9}}, {5{8'hA8}} };