可以看到我们前面经常提到的m_sequencer就是声明在这里的,也就是说到uvm_sequence_item这一层就已经绑定了uvm_seuqencer的概念了,也就是说uvm_sequence_item类型的transaction最终都会给到sequencer再到driver中,关于transaction从产生到driver获取的详细流程参见之前的文章:数字验证大头兵:[UVM源代码研究] sequence、 seq...
意思就是说p_sequencer还没有被创建就引用了。 这里就涉及到一个问题,p_sequencer所指向的virtual_sequencer什么时候才被创建了? 我们实际项目中一般的做法都是在test_base或者env的build_phase创建virtual_sequencer,如下图3所示 图3 virtual_sequencer的创建 然后virtual_sequence在testcase的build_phase被设为virtual...
// Same agent as in the previous bidirectional example:classadpcm_agentextendsuvm_agent;adpcm_driver m_driver;uvm_sequencer #(adpcm_seq_item)m_sequencer;adpcm_agent_config m_cfg;// Connect method:functionvoidconnect_phase(uvm_phase phase);if(m_cfg.active==UVM_ACTIVE)begin m_driver.seq_item_...
可以在UVM源码中看到,get_next_item最终执行的部分是在sequencer中完成的,内容如下: m_req_fifo虽然是fifo,但实际上也是tlm端口,其类型是uvm_tlm_fifo #(REQ) m_req_fifo;是在uvm_sequencer_param_base中定义的 2.2 driver中get的发生的事情 可以看到,在driver中调用的seq_item_port.get依旧是最终调用的是seq...
uvm sequence/sequencer example 命令: vcs -full64 -sverilog -timescale=1ns/1ps -R -ntb_opts uvm-1.1 uvm_seq_exam.sv import uvm_pkg::*;`include"uvm_macro.svh" typedefseq0;typedefseq1; 定义xaction classxactionextendsuvm_sequence_item;randintrng;`uvm_object_utils_begin(xaction)`uvm_field...
m_sequencer是定义在uvm_sequencer_item中的,uvm_sequencer_base类型的句柄,也就是说 m_sequencer是uvm_sequencer_item的成员变量 m_sequencer是指向uvm_sequencer_base的句柄 任何派生于uvm_sequencer_item的类都会拥有一个m_sequencer m_sequencer源码如下: ...
p_sequencer.p_rm.counter.poke(status, {15'h00, 32'h2000f0}); // read out the value form register p_sequencer.p_rm.invert.peek(status, value); `uvm_info("case1_cfg_vseq", $sformatf("after poke, invert's value is %0h", value), UVM_LOW) ...
由于是牵扯到sequencer和driver的通信,因此这里就有一个主动和被动的过程。当driver中使用seq_item_port.get_next_item主动请求一个item(transaction)时,sequencer会要求sequence产生一个item(transaction);产生完成后,sequence就要等待driver把item(transaction)取走,这需要driver显示调用seq_item_port.item_done()。当此...
下面的序列“my_sequence”是一个简单的序列,它创建事务并将其发送给sequencer和driver。在下面的代码中,body任务得以实现。这是一个简单的for循环,它会循环LIMIT次。LIMIT是序列中的变量,可以从外部设置。 在for循环中,通过调用new函数或使用工厂来构建事务对象。然后,调用start_item以开始与sequencer的交互。此时,seq...
与driver类似,在jelly_bean_sequencer中的seq_item_export实际上是根据另一个参数化类uvm_seq_item_pull_imp为传输jelly_bean_transaction而专门扩展创建的一个对象。[class] uvm_seq_item_port类的详细内容可以参考UVM源码文档src/tlm1/uvm_sqr_connections.svh。简略的代码如下图5所示,该类的主要内容也是由两个...