`uvm_do(SEQ_OR_ITEM)//1. 根据sequence_item实例,随机化产生数据`uvm_do_with(SEQ_OR_ITEM, CONSTRAINTS)//2. 在随机化数据的基础上,添加约束`uvm_do_pri(SEQ_OR_ITEM, PRIORITY) `uvm_do_pri_with(SEQ_OR_ITEM, PRIORITY, CONSTRAINTS) `uvm_do_on(SEQ_OR_ITEM, SEQR)//3. 随机化同时,显式的...
比如在上面的例子中,flat_seq 类不再操闲心考虑数据内容,只考虑这个数据包的长度、地址等信息, 因为扩充随机数据的责任一般由 item 负责就足够了,使用 flat_seq 的用户不需要考虑多余的数据约束。 Hierarchical Sequence hierarchical sequence 区别于 flat sequence 的地方在于,它可以使用其他 sequence, 当然还有item,...
uvm_seq_item_pull_port #(REQ, RSP) seq_item_port; uvm_seq_item_pull_port #(REQ, RSP) seq_item_prod_if; // alias // Port: rsp_port // // This port provides an alternate way of sending responses back to the // originating sequencer. Which port to use depends on which export t...
3.random seq_item ,然后send_request把seq_item 发给sqr.这个过程不消耗仿真时间,然后seq进入wait_for_item_done()的阻塞性等待状态,直到获取drv的response。 sqr的REQ FIFO会把seq_item转给drv。 drv使用get_next_item 非阻塞的获取seq_item.转成virtual interface时序 4. drv返回response(item_done)给sqr; sq...
从hier_seq::body()来看,它其中包含有bus_trans t1,t2和flat_seq s1,s2。而它的层次关系就体现在了对于各个sequence/item的协调上面。例码中使用了`uvm_do_with宏,这个宏完成了三个步骤: sequence或者item的创建 sequence或者item的随机化 sequence或者item的传送 ...
driver中的seq_item_port.item_done(),实际调用的是uvm_sequencer中的item_done函数。sequence通过wait_for_item_done和sequencer的item_done握手,通过成员变量m_wait_for_item_sequence/transaction_id判断。每个sequence, sequence中的每个transaction其ID都是唯一的。
上图是红宝书代码执行结果我有疑问的地方,开始在想为啥已经lock了,seq3还传了,原因就是权限最终是给到item的,lock之后10ns才satrt第一个item,所以这个时候lock_sequence是还没有拿到权限的,所以seq3不需要等10ns,他的item就先拿了权限发了。 5.1.3 Sequence层次化 ...
item指的是uvm_sequence_item, Sequence Item具备UVM核心基类所必要的数据操作方法,对于激励的生成和场景控制,是由sequence来编织的,item应该有什么用途的数据成员被定义在item中呢?文章进行了划分。 无论是自驾item,穿过sequencer交通站,通往终点driver,还是坐上sequence的大巴,一路沿途观光,最终跟随导游停靠到风景点driv...
通过继承关系,我们可以看待uvm_sequence_item是扩展自uvm_transaction的。 对于usr来说,想创建自己的transaction一般是从uvm_sequence_item扩展来的,为什么呢?因为 1、The uvm_sequence_item provides a hook to the uvm_sequencer and the functions to build a sequence hierarchy. ...
do_item(); join endtask task do_item(); forever begin mbus_item req; lock.get(); seq_item_port.get(req); // Completes the sequencer-driver handshake accept_tr(req); // request bus, wait for grant, etc. begin_tr(req);