接下里是TLM通信,以下几个地方的都需要用到TLM:
然而在driver、monitor和DUT的通信是用的interface(这个另说)
TLM1.0 interface object(在其他的验证方法学里面继承发展,如systemC和OVM)
export(中间部分)、port、imp、fifo/put() 、get() write()
TLM通信里面FIFO和analysis的write()用的较多;
在上面的问题中,为什么不建议TLM实现config_db?
答:麻烦
interface只能在driver和monitor与DUT通信用得到,其他的无。
这里有很多的TLM的传输方法;
方法一:Push/put mode传输通信用法.
先写输出端:
1:extends uvm_component;
2:uvm_bloking_put_port #(transaction) #后面是要传递的信号或参数,a_port;这出现了blocking,non_blocking阻塞会出现数据丢失
3:put_port=new(“put_port”,this);用new()
4:virtual task里面写put_port.put(tr);把信号put出去。
再写接收端:
1:extends uvm_component;
2:uvm_bloking_put_imp #(transaction,consumer) put_export;使用到重写task的部分写imp
3:put_export=new(“put_export”,this);也要new()
4:virtual task put(transaction tr); 接收端在put task编写接下来要做的,与上面输出端.put对应,且在process(tr)里面对tr进行数据处理。
最后连接起来:
1:environment extends uvm_env;
producer p;
consumer c;
2:virtual function void connect_phase(uvm_phase phase);
p.put_port.connect(c.put_export);从左向右写connect_phase连接
put相反;
FIFO写一个连接和connect。
FIFO上面这里的connect前面有put和get,先put到fifo里面,再从fifo里get出信号。
FIFO的深度在new()里面设置:
接下来要用到scoreboard class,功能是检验来自monitor的信号的计分板。
其实put、get用的很少,FIFO用的较多。
uvm_analysic_port使用较多,多个connect实现1对N的连接
调用write function 里的自定义功能,在env里面将producer和subscriber connect起来
下面是结合了analysis的agent的写法:
FIFO的深度的意思是producer put的数据深度,已知consumer get数据,在深度一定情况下,若put的数据比get快,那么会数据溢出,相反则每一次数据put进去,都能及时get到。
scoreboard:
利用before和after链接后进行比较。
下面对mailbox进行解释,mailbox是SV语法里面相当重要的数据传输方式
激励器先put出去
接下里driver接收到激励的put:
然后将driver和generator连起来
mailbox可以设置深度:
上面将深度设置成1,只能存一次、取一次。
这样正好可以使得同步,同时,还有一种方法可以实现同步,那就是event触发机制:
每当接收一个数据,就—>触发一个event,然后再每当触发一个event,发送一个数据。
下面是coverage的一些关键字:
covergroup是SV里面的采样集合,coverpoint是采样点,.sample()是内建系统函数,作用是去采样。