流操作符,有分为操作对象是一整个数组和单独的数据两种,例如bit [7:0] a[4]和bit [31:0] b,前者操作对象是数组,后者是单独一个较大位宽的数。
流操作符有<<和>>,代表从右向左打包和从左向右打包。
打包的整体格式为
{>>block_size {变量或表达式}} ;
或
{<<block_size {变量或表达式}} ;
数组打包成一个大位宽数据的场景,指定分割尺寸是8bit,按照<<,将数据从索引0开始,从右往左摆放
module test;
function void pack_array_int(const ref bit[7:0] array[4], output int a);
a = {<<byte{array}};
endfunction
bit[7:0] array[4] = '{ 8'h8C, 8'h00, 8'hA4, 8'hFF };
int pack_result;
initial begin
pack_array_int(array, pack_result);
$display("The result is 0x%h", pack_result);
end
endmodule
打印出的结果如下
再有一个用于大小端转换的场景,将大位宽数据,按byte分块,按照<<符号,从右向左摆放,则将大位宽数据分割为’h11、'h22、'h33、…'h11、'h22,从右往左摆放数据,形成一个新的数据,'h2211ffeeddccbbaa_8877665544332211
module test;
function void unpack(bit[127:0] big_endian_data, output bit[63:0] little_endian_array[2]);
bit[127:0] temp;
temp = {<<byte{big_endian_data}};
for(int i=0; i<2; i++) begin
little_endian_array[i] = temp[63:0];
temp = temp >> 64;
end
endfunction
bit[127:0] big_endian_data = 128'h1122334455667788_aabbccddeeff1122;
bit[63:0] little_endian_array[2];
initial begin
unpack(big_endian_data, little_endian_array);
foreach(little_endian_array[i]) begin
$display("The result is 0x%h",little_endian_array[i]);
end
end
endmodule
验证结果如下