deep_copy 和 gen keeping 在 Specman 中有什么区别?

What is the difference between deep_copy and gen keeping in Specman?

有人能告诉我将一项交易(项目)处理成另一项交易(如以下示例)有什么区别(add_method_port_1add_method_port_2):

add_method_port_1 (added_item: item_s) is {
    var new_item: new_item_s;
    gen new_item keeping { 
        it.my_trans_s == added_item.as_a(t_trans_s); 
    };  
};

add_method_port_2 (added_item: item_s) is {
    var new_item : new_item_s = deep_copy(added_item.as_a(t_trans_s));
};

其中 new_item_s 看起来像:

struct new_item_s like item_s {
    %my_trans_s: t_trans_s;
};

谢谢, 安德里亚

在这个具体的例子中,假设new_item_s只有一个字段my_trans_s,结果没有区别。

在实践中,“留代”的意义和目标与deep_copy大不相同:

  • gen保持,即使有'=='约束,实际上是赋值,意味着随机约束生成一个执行iGen逻辑引擎的项目;如果这是一个结构,则调用 pre_generate 和 post_generate 方法,并且 'keeping {}' 块中未提及的所有字段也根据现有约束及其类型属性随机生成。它通常用于创建一个只有一些属性已知的新项目。
  • deep_copy 创建给定结构的精确副本(最多有一些细微差别),如果它具有也是结构的字段 - 所有连接的图拓扑的副本。没有随机生成,没有特殊方法,没有执行逻辑引擎。通常它用于在某个时间点捕获数据以供以后分析。

换句话说,如果假设“new_item_s 只有一个字段 my_trans_s” 是错误的,那么结果将大不相同。

实际上,即使Rodion的回答中提到的假设成立,两种方法的结果也是不同的。

使用第一种方法,new_item指向与原始added_item相同的my_trans_s对象,因为约束it.my_trans_s == added_item.as_a(t_trans_s)表示指针相等。

使用第二种方法,new_item 指向原始 my_trans_scopy,因为 deep_copy 递归复制所有内容。