Systemverilog内置了数组求和运算方法(sum()),将数组的所有元素累加起来,返回一个最终值。在使用时要注意数组类型的位宽,通常情况下,如果你将一组单bit的值加起来,Systemverilog会使用足够的精度来确保不丢失任何bit的值。但是数组内置方法sum()使用的是数组类型的位宽,因此,如果你直接使用sum()去算单bit类型的数组,那么最终结果还是单bit,这可能不是你所期望的。解决的办法就是在sum()后面跟上with表达式,在with表达式里进行强制类型转换就可以的。下面举个例子:
module top;
int result1, result2, result3;
bit arr_bit[5] = '{1'b1, 1'b0, 1'b1, 1'b1, 1'b0};
initial begin
result1 = arr_bit[0]+arr_bit[1]+arr_bit[2]+arr_bit[3]+arr_bit[4];
$display("re sult1=%0d", result1);
result2 = arr_bit.sum();
$display("result2=%0d", result2);
result3 = arr_bit.sum() with ( int'(item) );
$display("result3=%0d", result3);
end
endmodule
使用Questasim的仿真结果是:
# run -all
# result1=3
# result2=1
# result3=3
# exit
结果分析:result1的结果是3,因为arr_bit[0],arr_bit[2]和arr_bit[3]的值为1’b1,且result1的类型为int类型,所有Systemverilog会自动扩展右边的bit位宽为32-bit,所以arr_bit[0]~ arr_bit[4]的累加不会溢出,得到的结果是3。result2的结果是1,是因为数组内置方法sum()直接使用的是数组类型的位宽去做累加,也就是1’b1+1’b0+1’b1+1’b1+1’b0=1’b1,总和溢出,得到的结果是1。result3的结果是3,是因为在sum()在相加数组元素之前,使用with表达式把数组元素强制类型转换为int,然后再把数组元素累加起来,这样结果就没有溢出,得到的结果是3,这和result1的相加类似。