关于seq中的starting_phase

news/2024/11/29 7:48:59/

1. starting_phase是什么?作用是什么? 

starting_phase是sequence中的一个变量,uvm_phase类型。sequencer自动将phase传给req变量的startiing_phase。(req指向sequencer发送的sequence),starting_phase用来在sequence中控制验证平台的关闭,只有将此要运行的sequence作为sequencer的某动态运行phase的default_sequence时,其starting_phase才不为null。

在demo_seq文件中部分代码如下:task pre_body()if(starting_phase != null)starting_phase.raise_objection(this);
endtasktask post_body()if(starting_phase != null)starting_phase.drop_objection(this);
endtask

seq的body函数在sqr的哪个phase启动,那么seq的staring_phase就等于该phase的值,一般来讲,seq是在sqr.main_phase()中启动的,此时seq的starting_phase会被赋值为main;

如下:

在某个testcase中:

function void testcase0::build_phase(uvm_phase phase);super.build_phase(phase);mo_seq = demo_seq::type_id::create("mo_seq");uvm_config_db#(demo_seq)::set(this,"*.master_sequencer.main_phase","default_sequence",mo_seq);
endfunction : build_phase

那么,在demo_seq中:

task demo_seq::pre_body();super.pre_body();if(starting_phase!=null) begin`uvm_info(get_full_name(),$sformatf("starting_phase=%s",staring_phase.get_name),UVM_MEDIUM);endelse begin`uvm_info(get_full_name(),$sformatf("starting_phase is null!!!!")end  
endtask

如此,运行后会在demo_seq的pre_body()打印出”staring_phase=main”的信息。

如果不使用default_sequence的方式启动,则uvm不会为starting_phase自动赋值,需要手动添加赋值语句,如下:


class testcase0 extends base_test;function new(string name = "test_case0", uvm_component parent = null);super.new(name,parent);endfunction `uvm_component_utils(test_case0)virtual task main_phase(uvm_phase phase);demo_seq seq0;seq0 = new("seq0");seq0.starting_phase = phase; //手动为seq0中的starting_phase赋值seq0.start(env.i_agt.sqr);endtask
endclass

以上是在uvm_1.1版本适用,在uvm1.1中采用default_sequence中会自动给starting_phase进行赋值;
但是uvm1.2starting_phase不在推荐使用,即使使用default_sequence,也不会给starting_phase自动赋值,sequence中starting_phase仍然为null。建议使用手动启动seq的方式,手动赋值。

在uvm_1.2中starting_phase不建议使用,但是这个类依旧存在于uvm,如果想要继续使用,可以调用uvm_1.2如下的方法:uvm_sequence_base::set_automatic_phase_objection;在demo_seq中的new()可以添加如下:

function demo_seq::new(string name="demo_seq");super.new(name);set_automatic_phase_objection(1);
endfunction : new

当然,也不一定要在new函数中set,只要是在seq启动之前set均可。

但是上述set_automatic_phase_objection的方式个人不推荐使用,因为如果你的平台环境需要在uvm_1.1和uvm_1.2之间来回切换,而在uvm_1.1中并没有这种方法。

所以个人推荐如下方式:

task testcase0::main_phase(uvm_phase phase)my_seq_type seq = new("seq");phase.raise_objection(this);//在testcase0.main_phase中提起,控制seq的启动seq.start(my_sequencer);phase.drop_objection(this);//在testcase0.main_phase中关闭,控制seq的关闭
endtask

如此,在uvm_1.1和uvm_1.2中都能兼容且安全的启动并且控制objection。

本文主要参考如下文章:

1.安全地启动sequence - 知乎

2.UVM中 sequence中的starting_phase_小汪的IC自习室的博客-CSDN博客_starting_phase


http://www.ppmy.cn/news/380596.html

相关文章

CSAPP Lab2 实验记录 ---- Bomb Lab(Phase 1 - Phase 6详细解答 + Secret Phase彩蛋解析)

文章目录 Lab 总结博客链接实验前提引子实验需要指令及准备Phase 1Phase 2Phase 3Phase 4Phase 5Phase 6Phase Secret(彩蛋Phase) Lab 总结博客链接 CSAPP Lab入门系统安装摸索Lab 博客链接 实验前提引子 这部分是我在大一寒假的时候写的 那个时候只写了…

数据库|TiDB灾备切换实践-部署

刘昊 | 数据库工程师 最近手头有个系统,有需要搭建灾备库的需求(RTO要求4小时内,根据实际情况计算)。考虑到生产系统是5版本,TiCDC存在一些兼容性问题,且TiDB Binlog已经有实践案例及经验可供参考&#xf…

UVM中phase的执行顺序

1 UVM中引入phase的原因 代码的书写顺序会影响代码的实现(代码之间存在依赖关系,如代码B依赖于代码A),所以区分出build_phase、connect_phase等,让被依赖的phase(代码A)先执行,依赖…

(七)phase机制

一、phase机制 1、简述 UVM中phase分两类,一类是function phase,不耗费仿真时间;另一类是task phase,消耗仿真时间。见下图,灰色是task phase,其他为function phase。 说明: run-time phase指run_phase包…

05、UVM的phase机制

目录 一、概述 二、9个phase执行机制 三、12个分支phase 四、UVM编译和运行顺序 UVM仿真开始 UVM仿真结束 一、概述 SV的验证环境构建中,传统的硬件设计模型在仿真开始前,已经完成例化和连接了,而SV的软件部分对象例化则需要在仿真开始…

Clock and Jitter Phase Noise

1、Jitter定义 定义1(SONET规范):抖动可以定义为数字信号在重要时点上偏离理想时间位置的短期变化。 2、Total Jitter表征方式 2.1、周期抖动(Period Jitter),与理想时钟无关,不累积 Period j…

Phase机制之-phase_jump的使用场景

Phase机制之-phase_jump的使用场景 应用场景:在验证复位时,需要对正在运行的测试平台进行复位,再次拉高复位信号后,DTU输出的信号是否正确? 采用phase_jump可以使整个测试平台复位,并且再次复位后&#xff…

phaser

phaser 常见的资源资源加载回调事件显示对象**Image****Sprite****Text****Graphics**常用显示对象属性Phaser中的显示对象容器组的创建Phaser如何渲染显示对象camera state (类似vue中的router)state使用方式state实现多页面原理state生命周期与工作原理…