UVM:6.3.4 start_item与 finish_item 1.前面使用宏产生transaction,隐藏了细节。 2.不适用宏产生transaction 主要靠两个任务:start_item 和finish_item。使用前,必须要实例化transaction: 3.构建sequence 如下: 4.可以在transaction 例化后,finish_item 前随机化: 1)assert也可在start_item 之后,finish_item 之前...
我们在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 用序列实现中断服务程序 序列将用于提供“中断服务程序”。
当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通信有关...
1.uvm_do 封装了一系列接口,封装越多,灵活性越差。所以增加了三个接口:pre_do,mid_do 与post_do 任务。 2.pre_do 是start_item 返回前执行的组后一行代码,之后才对transaction 随机化。 3.mid_do 位于finish_item最开始;post_do位于finish_item 最后一行。大致顺序: ...
1)不适用宏产生transaction的方式要依赖于两个任务:start_item和finish_item; 2)在使用这两个任务前,必须要先实例化transaction后才能调用这两个任务; 3)可以在transactin实例化后,finish_item调用前对其进行随机化; 4)uvm_do系列宏其实是将上面四个步骤封装在这个宏中。
在示例代码中,任务c_thread调用辅助函数sv_start_sequenceC。这将创建一个序列并运行它。按照这种顺序,将创建事务并将其随机化,然后start_item和finish_item会将它们发送给driver,然后发送给接口引脚和DUT。 但是C代码不需要担心这些细节。C代码是一段调用内置辅助函数的代码。C代码和辅助函数必须以线程安全的方式编写...