UVM中transaction的通信。
要实现通信,就需要考虑,事务是如何发送、接收? 以及如何传输的?
以monitor 和 model 之间的通信为例,进行阐明。
1.几个概念:
- 参数化类: uvm_blocking_get_port 、uvm_analysis_port 其中的参数就是要传送的事务(transaction)
- fifo的本质: fifo的类型是uvm_tlm_analysis_fifo,它本身也是一个参数化的类
- 内建函数: get 、write
2.常规做法:
首先建立发送和接收的端口:
monitor :build_phase中new 一个ap(uvm_tlm_analysis_fifo)对象,并在main_phase中,收集完一个transaction 调用write方法将transaction发送出去。
model :build_phase中new 一个port(uvm_blocking_get_port)对象,并在main_phase中调用get方法 得到transaction,用于处理。
其次建立连接
- env: build_phase中new 一个agt_mdl_fifo,并在connect_phase中,将agt_mdl_fifo与agent和model中的端口进行连接,(agent中的ap定义与monitor完全相同,但是不需要对其进行实例化,只需在agent的connect_phase中将monitor的值赋给它,这相当于是一个指向monitor的ap指针)
3.疑问
为什么需要fifo?
- analysis_port是非阻塞性质的,ap.write函数调用完成后马上返回,不会等待数据被接收。假如当write函数调用时, blocking_get_port正在忙于其他事情,而没有准备好接收新的数据时,此时被write函数写入的my_transaction就需要一个暂存的位 置,这就是fifo。
analysis_port和analysis_export与put和get系列端口的区别是什么?
- 第一,默认情况下,一个analysis_port(analysis_export)可以连接多个IMP,也就是说,analysis_port(analysis_export)与IMP 之间的通信是一对多的通信,而put和get系列端口与相应IMP的通信是一对一的通信(除非在实例化时指定可以连接的数量,
- analysis_port(analysis_export)更像是一个广播。 第二,put与get系列端口都有阻塞和非阻塞的区分。但是对于analysis_port和analysis_export来说,没有阻塞和非阻塞的概念。 因为它本身就是广播,不必等待与其相连的其他端口的响应,所以不存在阻塞和非阻塞。
sequencer 和 driver直接的通信?
- ?