"=10=" ()
Array.sum() Gotcha
正在尝试实现数组的求和方法。将方法的 return 值存储到函数内的 Integer 中。为什么我得到的输出是 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,30,244 的总和是 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));
正在尝试实现数组的求和方法。将方法的 return 值存储到函数内的 Integer 中。为什么我得到的输出是 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,30,244 的总和是 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));