前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【UVM COOKBOOK】Sequences||覆盖

【UVM COOKBOOK】Sequences||覆盖

作者头像
空白的贝塔
发布2021-11-17 10:44:01
4690
发布2021-11-17 10:44:01
举报
文章被收录于专栏:摸鱼范式摸鱼范式

覆盖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架构的一部分。

代码语言:javascript
复制
// 
// 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 不太可能被覆盖。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 摸鱼范式 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 覆盖sequence和sequence item
    • sequence类型覆盖
      • sequence实例覆盖
        • sequence item的覆盖
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档