3.1启动-seq启动之start task及start task源码(手动启动seq)

1.采用start task启动seq(实例化seq+randomize seq+seq.start(seqr))

(1) sequence如何向sequencer发送transaction? 定义sequence后,只需要在某个component(如my_sequencer, my_env)的main_phase中启动这个sequence即可,以在my_env中启动为例(通常放到my_test中比较合适);

复制代码
 1 //示例
 2 class wb_conmax_flat_seq_test extends wb_conmax_base_test;
 3     `uvm_component_utils(wb_conmax_flat_seq_test)
 4     sequence_0 seq0;
 5     
 6     function new(string name, uvm_component parent);
 7         super.new(name,parent);
 8     endfunction
 9 
10     virtual  task main_phase(uvm_phase phase);    
11         super.main_phase(phase);
12         phase.raise_objection(this,"Test main objection");
13         seq0=sequence_0::type_id::create("seq0",this);
14         seq0.start(env.master_agent[00].mast_sqr,null);
15  seq0.wait_for_sequence_state(UVM_FINISHED);
16         phase.drop_objection(this,"Dropping Test main objection");
17     endtask
18 
19 endclass
复制代码

(2) 通过start task中传递sequencer指针, 使得sequence知道将产生的transaction交给哪个sequencer.

注1:如果该sequence是顶层sequence,即没有更上层sequence嵌套它,则它可以省略对第二个参数parent_sequence的指定;

注2:如果该sequence不是顶层sequence,则可以指定parent_sequence;这样该sequence会继承parent_sequence的优先级;

(3) start函数会依次调用pre_start, pre_body, body, post_body, post_start函数(详见uvm_sequence_base.svh);

注1:在实际应用中,可以不写seq.starting_phase=***;但是如果需要在sequence中实现objection的控制,则需要指明starting_phase.

注2:在调用create函数进行sequence例化时,可以指定sequencer(???笔误,非笔误,查看type_id::create源码);

注3:当一个sequence启动后,会自动执行sequence的body任务;此外,还会自动调用sequence的pre_body与post_body;

2. start task源码

(1) m_sequence_state表示sequence的状态(CREATED表示sequence已经实例化; STOPPED表示一中不正常的中止,比如被别的进程杀死,没有执行完; FINISHED表示正常的结束;);

(2) 当sequence实例化后, m_sequence_state默认将会是CREATED;

 

 

(3) response_queue是一个队列,用于存放driver发送给sequence的response;

 

(4) 如果sequence正常结束,会调用sequencer的m_sequence_exiting函数; 该函数会调用remove_sequence_from_queues函数,将该sequence从sequence的仲裁队列arb_sequence_q中删除;

(5) arb_sequence_q队列存储的内容是uvm_sequence_request类型,主要用于记录sequence向sequencer发出的请求信息,比如sequence的id, sequence的指针以及请求的类型(SEQ_TYPE_REQ, SEQ_TYPE_LOCK, SEQ_TYPE_GRAB);

 

posted on   知北游。。  阅读(580)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示