Specman/e 约束(对于每个 in)迭代
Specman/e constraint (for each in) iteration
我可以在约束条件下仅迭代 e 中列表的一部分吗?
例如,此代码将遍历整个 layer_l 列表:
<'
struct layer_s {
a : int;
keep soft a == 3;
};
struct layer_gen_s {
n_layers : int;
keep soft n_layers == 8;
layer_l : list of layer_s;
keep layer_l.size() == read_only(n_layers);
};
extend sys {
layer_gen : layer_gen_s;
run() is also {
messagef(LOW, "n_layers = %0d", layer_gen.n_layers);
for each in layer_gen.layer_l{
messagef(LOW, "layer[%2d]: a = %0d", index, it.a);
};
};
};
-- this will go through all layer_l
extend layer_gen_s {
keep for each (layer) using index (i) in layer_l {
layer.a == 7;
};
};
但是,例如,我只想迭代 2 个项目。我尝试了下面的代码,但它不起作用:
-- this produces an error
extend layer_gen_s {
keep for each (layer) using index (i) in [layer_l.all(index < 2)] {
layer.a == 7;
};
};
另外我不想使用蕴涵,所以这不是我想要的:
-- not what I want, I want to specify directly in iterated list
extend layer_gen_s {
keep for each (layer) using index (i) in layer_l {
(i < 2) => {
layer.a == 7;
};
};
};
使用列表切片运算符也不起作用,因为 for..each
约束中的 path
仅限于简单的 path
(例如列表变量)。以下内容也不起作用:
keep for each (layer) using index (i) in layer_l[0..2] {
//...
};
这是 Specman 的限制。
要强制循环子列表,您唯一的选择是将该子列表创建为单独的变量:
layer_subl: list of layer_s;
keep layer_subl.size() == 3;
keep for each (layer) using index (i) in layer_subl {
layer == layer_l[i];
};
现在您可以只循环 for..each
约束中的前 3 个元素:
keep for each (layer) in layer_subl {
layer.a == 7;
};
这避免了在约束中使用蕴涵。这是否值得由您决定。另请注意,列表将包含 same 对象(这很好)。没有创建额外的 struct
个对象。
像这样创建子列表是可以由工具本身处理的样板代码。这将使代码更加简洁和可读。您可以联系您的供应商并请求此功能。
我可以在约束条件下仅迭代 e 中列表的一部分吗? 例如,此代码将遍历整个 layer_l 列表:
<'
struct layer_s {
a : int;
keep soft a == 3;
};
struct layer_gen_s {
n_layers : int;
keep soft n_layers == 8;
layer_l : list of layer_s;
keep layer_l.size() == read_only(n_layers);
};
extend sys {
layer_gen : layer_gen_s;
run() is also {
messagef(LOW, "n_layers = %0d", layer_gen.n_layers);
for each in layer_gen.layer_l{
messagef(LOW, "layer[%2d]: a = %0d", index, it.a);
};
};
};
-- this will go through all layer_l
extend layer_gen_s {
keep for each (layer) using index (i) in layer_l {
layer.a == 7;
};
};
但是,例如,我只想迭代 2 个项目。我尝试了下面的代码,但它不起作用:
-- this produces an error
extend layer_gen_s {
keep for each (layer) using index (i) in [layer_l.all(index < 2)] {
layer.a == 7;
};
};
另外我不想使用蕴涵,所以这不是我想要的:
-- not what I want, I want to specify directly in iterated list
extend layer_gen_s {
keep for each (layer) using index (i) in layer_l {
(i < 2) => {
layer.a == 7;
};
};
};
使用列表切片运算符也不起作用,因为 for..each
约束中的 path
仅限于简单的 path
(例如列表变量)。以下内容也不起作用:
keep for each (layer) using index (i) in layer_l[0..2] {
//...
};
这是 Specman 的限制。
要强制循环子列表,您唯一的选择是将该子列表创建为单独的变量:
layer_subl: list of layer_s;
keep layer_subl.size() == 3;
keep for each (layer) using index (i) in layer_subl {
layer == layer_l[i];
};
现在您可以只循环 for..each
约束中的前 3 个元素:
keep for each (layer) in layer_subl {
layer.a == 7;
};
这避免了在约束中使用蕴涵。这是否值得由您决定。另请注意,列表将包含 same 对象(这很好)。没有创建额外的 struct
个对象。
像这样创建子列表是可以由工具本身处理的样板代码。这将使代码更加简洁和可读。您可以联系您的供应商并请求此功能。