【问题标题】:explanation of arrays in systemVerilogsystemVerilog中数组的解释
【发布时间】:2016-08-04 08:37:36
【问题描述】:

我是 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

请解释一下结果。

【问题讨论】:

    标签: arrays system-verilog


    【解决方案1】:

    SystemVerilog 多维数组有两种维度:packedunpacked。可以有任意数量的打包维度(写在变量名之前)和任意数量的未打包维度(写在变量名之后)。尺寸按从 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
    

    【讨论】:

    • 感谢马修。告诉我,你能推荐我一本 systemVerilog 书(从一开始就教)吗?
    • @sara8d 恐怕我不能推荐 SystemVerilog 书。
    • @Matthew Taylor-lol。不要这样:) 我不会只指望你:) 你熟悉“SystemVerilog for Verification: A Guide to Learning the Testbench Language Feature”吗?
    • @Matthew Taylor-所有这个函数都返回绑定的索引,而不是值?
    • @sara8dYes - 这些函数返回有关数组大小的信息,而不是内容。 $increment 很有趣:如果数组边界递减,则返回 1,如果数组边界递增,则返回 -1。你的例子中的所有这些都减少了,因为左边的界限高于右边。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多