Specman / e列表(多维数组)

时间:2018-05-06 15:28:53

标签: aop verification hdl specman e

如何使用 varibles 在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中重写my_func()吗?

2 个答案:

答案 0 :(得分:2)

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(),我们将获得指向相同列表的许多指针的列表。这也可能是合法的,具体取决于您的代码的目的。

答案 1 :(得分:2)

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

struct foo {
    my_list[4][8]: list of list of int;
};