一般interface protocol把component分为master, slave
Master: 发起transaction
slave: 对transaction产生response
从是否驱动DUT的角度,可以分为:
active:驱动DUT信号 (Driver){agent会有driver, monitor, sequencer}
passive: 只监听DUT信号 (Monitor){agent只有monitor}
把master/slave和active/passive的概念混合起来,就会有
proactive master: seq产生transaction,送达sequencer
sequencer把transaction送到driver,驱动DUT
monitor负责监视interace,收集transaction, 送到coverage collector和scoreboard
reactive slave:active slave, 一般我们成为reactive slave, 又称为responder
DUT产生transaction,送到sequencer,再送到sequence
sequence根据收到的transaction,产生response,再送到sequencer
sequencer把收到的response送到driver,回应DUT的transaction
passive slave???: 就是普通的slave啦,只是监视DUT信号
passive master???: 不可能,master一定是active的,否则怎么驱动DUT?
所以,sequence只和proactive master以及reactive slave打交道
用UVM实现proactive master是很直接的,例子太多。难度在如何产生sequence。
reactive slave比较麻烦,各个component必须增加TLM port。
1. monitor监视DUT,产生req,用TLM 1.0 put mode 实现,送去sequencer。
sequencer就实现一个接收的write或创建一个uvm_tlm_ananlysis_fifo
sequence在main_phase中实现一个无限循环,首先调用p_sequencer.uvm_tlm_analysis_fifo.get() 或p_sequencer.write_req(), 然后根据req产生rsp,再把rsp用sequencer送给driver