代码之家  ›  专栏  ›  技术社区  ›  evilpascal

Specman/e列表列表(多维数组)

  •  1
  • evilpascal  · 技术社区  · 7 年前

    如何创建 固定多维数组 在Specman/e中使用 变量 ?
    然后访问单个元素或整行?

    例如,在SystemVerilog中,我会:

    module top;
    
      function automatic my_func();
        bit [7:0] arr [4][8]; // matrix: 4 rows, 8 columns of bytes
        bit [7:0] row    [8]; // array : 8 elements        of bytes
    
        row = '{1, 2, 3, 4, 5, 6, 7, 8};
    
        $display("Array:");
        foreach (arr[i]) begin
          arr[i] = row;
          $display("row[%0d] = %p", i, row);
        end
    
        $display("\narr[2][3] = %0d", arr[2][3]);
      endfunction : my_func
    
      initial begin
        my_func();
      end
    
    endmodule : top
    

    这将产生以下输出:

    Array:
    row[0] = '{'h1, 'h2, 'h3, 'h4, 'h5, 'h6, 'h7, 'h8}
    row[1] = '{'h1, 'h2, 'h3, 'h4, 'h5, 'h6, 'h7, 'h8}
    row[2] = '{'h1, 'h2, 'h3, 'h4, 'h5, 'h6, 'h7, 'h8}
    row[3] = '{'h1, 'h2, 'h3, 'h4, 'h5, 'h6, 'h7, 'h8}
    
    arr[2][3] = 4
    

    有人能在Specman/e中重写我的函数吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Yuri Tsoglin    7 年前

    中没有固定阵列 E 。但您可以定义列表类型的变量,包括多维列表,例如:

    var my_md_list: list of list of my_type;
    

    它与其他语言中的多维数组不同,因为通常每个内部列表(作为外部列表的元素)的大小可能不同。但是你仍然可以用它来达到你的目的。例如,您的代码可能在中重写 E 或多或少是这样的:

    var arr: list of list of byte;
    var row: list of byte = {1;2;3;4;5;6;7;8};
    
    for i from 0 to 3 do {
        arr.add(row.copy());
        print arr[i];
    };
    
    print arr[2][3];
    

    注意的用法 row.copy() -它确保每个外部列表元素都是原始列表的副本。 如果我们不使用 copy() ,我们将得到一个指向 相同的 列表这也可能是合法的,具体取决于代码的用途。

        2
  •  2
  •   Yuri Tsoglin    7 年前

    对于字段(与局部变量相反),也可以使用给定的大小声明它。同样,此大小不是“固定的”,可以在运行时修改(通过添加或删除项),但它在创建时确定列表的原始大小,例如:

    struct foo {
        my_list[4][8]: list of list of int;
    };
    
    推荐文章