1.前面使用宏产生transaction,隐藏了细节。 2.不适用宏产生transaction 主要靠两个任务:start_item 和finish_item。使用前,必须要实例化transaction: 3.构建sequence 如下: 4.可以在transaction 例化后,finish_item 前随机化: 1)assert也可在start_item 之后,finish_item 之前。 5.uvm_do系列宏封装了如下动作: 6...
mid_do是一个函数,在finish_item最开始被调用,在执行完此函数后才会进行finish_item中的其他操作。mid_do有一个参数,表示正在操作的sequence或transaction的指针,但其类型是uvm_sequence_item,需要通过cast转换成目标类型。 post_do也是一个函数,在finish_item中最后一行代码被调用。post_do也有一个参数,与mid_do类似。
在仿真中,序列等待直到同步器处于GO状态。进入GO状态后,同步的代码将使用new生成一个事务,然后调用start_item/finish_item执行该事务。在等待访问driver并执行之后,同步的序列返回到循环的顶部并检查同步器状态。它将再次运行,或停止/等待,如下图2所示。 图2 用序列实现中断服务程序 序列将用于提供“中断服务程序”。
sequence通过wait_for_item_done和sequencer的item_done握手,通过成员变量m_wait_for_item_sequence/transaction_id判断。每个sequence, sequence中的每个transaction其ID都是唯一的。 如果item_done()传入rsp,调用put_response函数,与sequence中的get_response配合使用。 start_item/finish_item封装函数以及sequence,sequencer...
2.2 start_item()和finish_item() 使用场景:将item挂载到sequencer上的应用 uvm_sequence::start_item中第三个参数需要用户注意是否将item和parent sequence挂载到不同的sequencer上面去。 使用item挂载到sequencer上的方法,需要创建item,还需要完成item的随机化,创建的方法;uvm_object::create()或者uvm_sequence::crea...
finish_item(txn); // Step 3 end endtask: body drv /// Driver class class my_driver extends uvm_driver #(my_txn); `uvm_component_utils(my_driver) // Run Task task run_phase (uvm_phase phase); my_txn txn; // Step 1 forever...
当driver中使用seq_item_port.get_next_item主动请求一个item(transaction)时,sequencer会要求sequence产生一个item(transaction);产生完成后,sequence就要等待driver把item(transaction)取走,这需要driver显示调用seq_item_port.item_done()。当此函数被调用后,finish_item才会返回,一个transaction的产生才真正的完成。
2.5 sequence里的宏及start/finish_item任务 1.uvm_do 相关宏 在sequence的body中使用uvm_do系列宏,可以自动完成transaction的创建,随机化和发送。 uvm_do系列宏对transaction和sequence都能支持。 如参数是transaction时它会调用start_item&finish_item任务。
sequencer.send_request(item)这个函数完成的是将item发送给sequencer,将item发送到req fifo中 finish_item会一直阻塞等待driver 侧的item done 在driver侧发生的事情 driver在调用get_next_item,尝试从req fifo中取出数据,但实际上get_next_item真正是在哪里执行的呢,实际上是在sequencer中执行的,这与TLM1.0通信有关...
调用finish_item()完成item发送。 有必要的情况下可以从driver那里获取response item。 在定义driver时,在它的主任务driver::run_phase()中也应通常做出如下的处理: 通过seq_item_port.get_next_item(REQ)从sequencer获取有效的request item。 从request item中获取数据,进而产生数据激励。