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...
我们在sequence中往driver发包时,最常用的方法就是使用uvm_do()系列宏,偶尔会使用方法start_item()和finish_item()的组合,极个别场景下会 使用`uvm_create()和`uvm_send()宏,极极个别场景下还会看到create_item()方法的使用,这些宏和方法有什么区别,各自使用场景有什么局限和注意事项,他们分别定义在了UVM源代码...
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 用序列实现中断服务程序 序列将用于提供“中断服务程序”。
从描述可以看到,start_item到finish_item的过程调用了两个东西,一个是sequencer,一个是parent_seq,parent_seq是眼下这个sequence的父类sequence,那说到底还是个sequence,也就是说儿子把父亲做的事情先做一遍,那不重要,我们不用管它。就看sequencer的调用好了,一看发现这就是一个wait-send-再wait的通信过程。
2.5 sequence里的宏及start/finish_item任务 1.uvm_do 相关宏 在sequence的body中使用uvm_do系列宏,可以自动完成transaction的创建,随机化和发送。 uvm_do系列宏对transaction和sequence都能支持。 如参数是transaction时它会调用start_item&finish_item任务。
下图为Sequence与Driver之间的通信时序,做一下解释:首先从create_item创建item,进而通过start_item准备要发送item,先去sequencer排队,如果这个这时driver想要item,就会get_next_item,收到这两个信号,sequencer就做出仲裁给出权限。finish_item将随机化后的item通过Sequencer传给Driver,Driver在got_item之后就会对数据进行处...
1)不适用宏产生transaction的方式要依赖于两个任务:start_item和finish_item; 2)在使用这两个任务前,必须要先实例化transaction后才能调用这两个任务; 3)可以在transactin实例化后,finish_item调用前对其进行随机化; 4)uvm_do系列宏其实是将上面四个步骤封装在这个宏中。
上节提到使用uvm_do宏启动sequence,如果宏传入的第一个参数不是uvm_sequence_base类型,就是我们的transaction, 则调用start_item, finish_item函数。 start_item()三个参数,第一个是传入的transaction, 第二个是优先级,第三个是指定该transaction发送给哪一个sequencer, transaction挂载在哪一个sequencer上。
/finish_item:控制sequencer何时发送sequenceitem。我们扩展uvm_sequence来得到需要的sequences,通过参数化传入我们需要的sequenceitem类型..._agent的前提下,我们仍需要在env中例化各个组件。此时其中的tester需要负责两项功能,导致难以维护和重用。我们希望tester只是实现传递sequenceitems至driver,至于sequence ...