Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
System verilog Array.sum()明白了_System Verilog - Fatal编程技术网

System verilog Array.sum()明白了

System verilog Array.sum()明白了,system-verilog,System Verilog,正在尝试实现数组的求和方法。将方法的返回值存储在函数内的整数上。为什么我得到的输出是48而不是560 program test; class check2; logic [7:0] a [3:0] = '{10,20,30,500}; function void dis(); int unsigned ch; ch = a.sum()+16'd0; $display(ch); endfunction endclass check2 c; initial begin c = n

正在尝试实现数组的求和方法。将方法的返回值存储在函数内的整数上。为什么我得到的输出是48而不是560

program test;

class check2;
logic [7:0] a [3:0] = '{10,20,30,500};

function void dis();
  int unsigned ch;
  ch = a.sum()+16'd0;
  $display(ch);
endfunction
endclass

check2 c;

initial begin
c = new;
c.dis;
end
endprogram

数组位宽度不够大,无法容纳值500。500(十进制)等于0x1F4(十六进制),需要9位。但是,您只指定8位([7:0])。这意味着500被转换为0xF4或244(十进制)

此外,阵列比特宽度不足以容纳阵列值之和(560)。560需要10位

得到48是因为10,20,30244的和是304,这是0x130十六进制,对于8位和来说太大了。因此,0x130变为0x30,即48(十进制)

使用
logic[9:0]a[3:0]
将为您提供560的输出

program test;

class check2;
    logic [9:0] a [3:0] = '{10,20,30,500};

    function void dis();
        int unsigned ch;
        ch = a.sum()+16'd0;
        $display(ch);
    endfunction
endclass

check2 c;

initial begin
    c = new;
    c.dis();
end
endprogram
a.sum()方法的结果是数组中每个元素的类型宽度相同。您可以使用
with
子句将每个元素强制转换为更大的大小

ch = a.sum(item) with (int'(item));

为什么$display(a.sum()+16'd0)在这种情况下不起作用?因为sum()是一个函数调用,返回值的计算是在一个独立的上下文中进行的,从这个上下文中可以使用结果表达式。你在想,如果求和方程与上面提到的方法中的
+16'd0
Hey@dave一致,我得到的求和是304,而不是560。链接:-因为500被截断为244。