我是SystemVerilog的新手。我开始从this网站学习。我阅读了以下示例,但不理解结果。
//EXAMPLE: arrays
module arr;
bit [2:0][3:0] arr [4:0][5:0];
initial
begin
$display(" $left %0d $right %0d $low %0d $high %0d $increment %0d $size %0d $dimensions %0d",$left(arr),$right(arr),$low(arr),$high(arr),$increment(arr),$size(arr),$dimensions(arr) );
end
endmodule
结果:
$ left 4 $ right 0 $ low 0 $ high 4 $ increment 1 $ size 5 $ dimensions 4
请解释结果。
答案 0 :(得分:0)
SystemVerilog多维数组有两种类型的维度:压缩和解压缩。可以有任意数量的打包维度(在变量名称之前写入)和任意数量的解压缩维度(在变量名称之后写入)。尺寸编号从1 ,从左到右,首先解压缩尺寸。因此,在索引数组元素时,第一个解压缩的维度成为最重要的索引(首先写入),最后一个打包维度成为最不重要的索引(最后写入),导致奇怪的排序。这并不像它可能首先出现那样愚蠢,因为可以将打包维度的索引留在列表的末尾。
因此,在您的示例中,维度的编号如下:
bit [2:0][3:0] arr [4:0][5:0];
3 4 1 2
System Verilog中有以下数组查询函数:
$left/$right(arrayname, dimension) – returns the left or right bound
$low/$high(arrayname, dimension) – returns the lowest or highest bound
$increment(arrayname, dimension) – returns 1 if $left >= $right and -1 otherwise
$size(arrayname, dimension) – returns the number of elements of the given dimension
$dimensions(arrayname) – returns the number of dimensions
$unpacked_dimensions(arrayname) – returns the number of unpacked dimensions
当您调用系统函数(例如$left
)而未指定您所指的维度时,它默认为维度1.因此您看到的输出;系统函数正在输出维度1的值,因为未指定维度。您还可以在这些系统函数中指定维度。所以,这段代码:
module arr;
bit [2:0][3:0] arr [4:0][5:0];
initial begin
$display(" DIMENSION 1 (the default) : $left %0d $right %0d $low %0d $high %0d $increment %0d $size %0d $dimensions %0d",
$left(arr),$right(arr),$low(arr),$high(arr),$increment(arr),$size(arr),$dimensions(arr) );
$display(" DIMENSION 1 (specified) : $left %0d $right %0d $low %0d $high %0d $increment %0d $size %0d $dimensions %0d",
$left(arr,1),$right(arr,1),$low(arr,1),$high(arr,1),$increment(arr,1),$size(arr,1),$dimensions(arr) );
$display(" DIMENSION 2 (specified) : $left %0d $right %0d $low %0d $high %0d $increment %0d $size %0d $dimensions %0d",
$left(arr,2),$right(arr,2),$low(arr,2),$high(arr,2),$increment(arr,2),$size(arr,2),$dimensions(arr) );
$display(" DIMENSION 3 (specified) : $left %0d $right %0d $low %0d $high %0d $increment %0d $size %0d $dimensions %0d",
$left(arr,3),$right(arr,3),$low(arr,3),$high(arr,3),$increment(arr,3),$size(arr,3),$dimensions(arr) );
$display(" DIMENSION 4 (specified) : $left %0d $right %0d $low %0d $high %0d $increment %0d $size %0d $dimensions %0d",
$left(arr,4),$right(arr,4),$low(arr,4),$high(arr,4),$increment(arr,4),$size(arr,4),$dimensions(arr) );
end
endmodule
http://www.edaplayground.com/x/4NzY
输出:
DIMENSION 1 (the default) : $left 4 $right 0 $low 0 $high 4 $increment 1 $size 5 $dimensions 4
DIMENSION 1 (specified) : $left 4 $right 0 $low 0 $high 4 $increment 1 $size 5 $dimensions 4
DIMENSION 2 (specified) : $left 5 $right 0 $low 0 $high 5 $increment 1 $size 6 $dimensions 4
DIMENSION 3 (specified) : $left 2 $right 0 $low 0 $high 2 $increment 1 $size 3 $dimensions 4
DIMENSION 4 (specified) : $left 3 $right 0 $low 0 $high 3 $increment 1 $size 4 $dimensions 4