【UVM COOKBOOK】Sequences||覆盖
覆盖sequence和sequence item
有时,在激励生成过程中,更改sequence或sequence item的行为很有用。UVM 工厂提供了一种覆盖机制,能够在不更改任何测试平台代码且无需重新编译的情况下将一个对象替换为另一个对象。
UVM 工厂允许工厂注册的对象被派生类型的对象覆盖。这意味着当使用 <class_name>::type_id::create() 方法构造对象时,对象类型会根据被覆盖后的类型构造。例如,如果存在类型为 seq_a 的sequence,并且将其扩展为创建类型为 seq_b 的sequence,则 seq_b 可用于覆盖 seq_a。
UVM中有两种覆盖方式,一种是根据类型覆盖,一种是根据实例覆盖。
sequence类型覆盖
类型覆盖意味着任何时候使用工厂构造特定对象类型时,都会返回覆盖类型的句柄。类型覆盖可以与sequence一起使用,它应该是测试中测试用例配置的一部分。一旦设置了类型工厂覆盖,它将应用于后续sequence代码中构造覆盖sequence对象的所有位置。
sequence实例覆盖
可以通过 UVM 测试台组件层次结构中的“路径”覆盖特定sequence。对于 uvm_components,路径通过 create 方法的名称和父参数定义为构建过程的一部分。但是,sequence是 uvm_objects 并且仅在其构造函数中使用名称参数,并且未链接到 uvm_component 层次结构中。为sequence创建路径的解决方案是使用 create 方法的另外两个参数。传递给sequence的第三个参数可以由 get_full_name() 调用的结果填充,也可以是任意字符串。实例覆盖然后使用此字符串与sequence的实例名称字段连接来重新创建sequence的“实例路径”。在这种情况下,必须预先考虑sequence实例覆盖作为sequence架构的一部分。
//
// The build method of a test class:
//
// Inheritance:
//
// a_seq <- b_seq <- c_seq
//
function void build_phase( uvm_phase phase );
m_env = sot_env::type_id::create("m_env", this);
// Set type override
b_seq::type_id::set_type_override(c_seq::get_type());
// Set instance override - Note the "path" argument see the line for s_a creation
// in the run method
a_seq::type_id::set_inst_override(c_seq::get_type(), "bob.s_a");
endfunction: build
//
// Run method
//
task run_phase( uvm_phase phase );
a_seq s_a; // Base type
b_seq s_b; // b_seq extends a_seq
c_seq s_c; // c_seq extends b_seq
phase.raise_objection( this , "start a,b and c sequences" );
// Instance name is "s_a" - first argument,
// path name is "bob" but is more usually get_full_name() - third argument
s_a = a_seq::type_id::create("s_a",,"bob");
// More usual create call
s_b = b_seq::type_id::create("s_b");
s_c = c_seq::type_id::create("s_c");
s_a.start(m_env.m_a_agent.m_sequencer); // Results in c_seq being executed
s_b.start(m_env.m_a_agent.m_sequencer); // Results in c_seq being executed
s_c.start(m_env.m_a_agent.m_sequencer);
phase.drop_objection( this , "a,b and c sequences done" );
endtask: run
sequence item的覆盖
原则上,相同的工厂覆盖机制可用于 sequence_items。但是,它需要使用派生类型的先验知识来编写driver,以便它可以将接收到的 sequence_item 转换为正确的类型。因此,从实用的角度来看,sequence_items 不太可能被覆盖。
相关文章
- 中国拟将光伏硅片制备、激光雷达等7项技术列入禁止/限制出口技术目录!
- 日本半导体设备销售额实现连续24个月增长,但增幅正持续缩小
- 拓荆科技:2022年净利润预计同比增长381.85%至484.06%
- 传鸿海正与通用汽车洽谈代工订单
- 传日本考虑放宽对韩国半导体及显示面板原材料出口管制
- ASML确认:美日荷已达成协议!
- SIA:对华禁令恐损害美国半导体产业!
- 中国电信成功研发出100%国产化5G pRRU小基站
- 打破日本垄断!OLED关键材料FMM实现国产化!
- 持续扩大碳化硅产能,英飞凌与Resonac签订长期供应协议
- 中微公司预计2022年营收47.4亿元,同比增长52.2%
- 苹果已开始印度生产AirPods零件,并出口至中国大陆和越南
- 中国致电荷兰外长,希望维持供应链和贸易的开放性!
- 48.58亿!联电收购厦门联芯100%股权将遭大陆官方拒绝?
- PayPal宣布裁员2000人!
- 2023年全球服务器采购量同比增长率下修至1.87%
- 索尼相机产线迁至泰国,中国工厂仅供应中国市场
- 半导体测试设备大厂爱德万宣布收购PCB厂兴普科技
- AMD业绩超预期:净利润同比增长34%!但今年一季度营收预计将下跌10%!
- 英特尔宣布大规模降薪:CEO最高降25%,普通员工降5%,奖金停发!