Specman/e列表列表(多维数组)
Specman/e list of lists (multidimensional array)
如何使用变量在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() 吗?
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()
,我们将得到一个指向相同列表的许多指针的列表。这也可能是合法的,具体取决于您的代码的用途。
如果是字段(与局部变量相反),也可以用给定的大小声明它。同样,此大小不是 "fixed",可以在 运行 时修改(通过添加或删除项目),但它决定了列表在创建时的原始大小,例如:
struct foo {
my_list[4][8]: list of list of int;
};
如何使用变量在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() 吗?
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()
,我们将得到一个指向相同列表的许多指针的列表。这也可能是合法的,具体取决于您的代码的用途。
如果是字段(与局部变量相反),也可以用给定的大小声明它。同样,此大小不是 "fixed",可以在 运行 时修改(通过添加或删除项目),但它决定了列表在创建时的原始大小,例如:
struct foo {
my_list[4][8]: list of list of int;
};