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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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吗?