学习目标
UVM入门和进阶部分6
学习内容
1.TLM2.0是SystemC模型之间的核心传输方式:双向的阻塞或者非阻塞接口、时间标记、统一的数据包
2.TLM2.0支持blocking和nonblocking两种transport方式:
blocking的传输方式要求在一次传输过程中,完成request和response的传输
nonblocking的传输方式则将request和reponse的传输分为了两个独立的单向传输,而两次传输整体视为完成一次握手传输
3.两种传输方式对应的UVM方法如下:
task b_transport(T t,uvm_tlm_time delay);
function uvm_tlm_sync_e nb_transport_fw(T t,ref P p,input uvm_tlm_timedelay); //uvm_tlm_sync_e 非阻塞传输协议的预定义阶段状态值
function uvm_tlm_sync_e nb_transport_bw(T t,ref P p,input uvm_tlm_timedelay);
//T代表统一的传输数据类uvm_tlm_generic_payload,而P代表nonblocking传输方式中用来做状态同步的类型
4.UVM将TLM2.0端口类型称之为socket,它们由port、export和imp组合而成
socket类型都继承于uvm_port_base
5.TLM2.0对于传输数据类型提出了一致化的要求,统一的数据类型由uvm_tlm_generic_payload表示
6.TLM2.0传输其他数据内容有两种办法:
将其合并为数据成员data数组中的一部分;
创建新的uvm_tlm_extension类,将额外的数据成员装入到该数据延伸对象中,通过uvm_tlm_generic_payload::set_extension(uvm_tlm_extension_base ext)来添加这一部分的数据(uvm_tlm_extension类还提供拷贝、比较和打印等功能)
7.TLM2.0可以标定延迟时间,用户可以随时设置它的时间单位,不同的时间标记间隔是SystemC可以构建不同时间精度模型的重要手段
8.在UVM中,需要同步线程不在局限于同一对象中,还需要解决不同组件之间的线程同步问题,考虑到UVM组件的封闭性原则,定义了如下的类来满足组件之间的同步要求:两个组件之间的同步:uvm_event、uvm_event_pool、uvm_event_callback;多个组件之间的同步:uvm_barrier、uvm_barrier_pool
9.不同组件可以共享同一个uvm_event,该共享方式是通过uvm_event_pool这一全局资源池来实现的,这个资源池是uvm_object_string_pool#(T)的子类,它可以生成和获取通过字符串来索引的uvm_event对象
10.uvm_event的几个重要特性:
uvm_event通过trigger()来触发,会触发使用wait_trigger()等待该事件的对象;
如果要再次等待事件触发,uvm_event需要先通过reset()方法重置初始状态,再使用trigger()来触发;
uvm_event可以通过trigger(T data=null)的可选参数,将伴随触发的数据对象都写入到该触发事件中,而等待事件的对象可以通过方法wait_trigger_data(output T data)来获取事件触发时写入的数据对象;
uvm_event可以通过add_callback(uvm_event_callback cb,bit append=1)函数来添加回调函数,用户也可以扩展uvm_event_callback类,pre_trigger()需要有返回值,返回1,则uvm_event不会被trigger,返回0则继续;
uvm_event可以通过get_num_waiters()来获取等待它的进程数目;
11.uvm_barrier可以设置一定的等待阈值,当有不少于该阈值的进程在等待该对象时,才会触发该事件,同时激活所有正在等待的进程,使其可以继续进行