UVM组件
UVM组件家族是从uvm_component类继承的来的类
UVM_DRIVER
1.uvm_driver类会从uvm_sequencer中获取事务,经过转化然后再接口中对DUT进行时序激励
2.uvm_driver类是参数化类,在定义时需要声明参数的类型
class uvm_driver #(type REQ=uvm_sequence_item,type RSP=REQ) extends uvm_component;
用户在定义新的driver类时,应当声明该类所获取的事务参数REQ类型,默认情况下RSP参数类型同REQ类型保持一致
3.uvm_driver在uvm_component基础上没有扩展新的函数,只扩展了一些用来通信的端口和变量
UVM_MONITOR
uvm_monitor和其父类uvm_component相比,没有增加任何新成员和方法,自定义monitor类应继承于uvm_monitor类
执行的功能包括:
1.观测DUT的interface,并收集总线信息
2.永远保持PASSIVE模式,即永远不会驱动DUT
3.在总线协议或者内部信号协议观察时,可以做一些功能和时序的检查
4.对于更复杂的检查要求,它们可以将数据发送至其他验证组件,如:scoreboard,reference model或者coverage collector
UVM_SEQUENCER
1.uvm_sequencer是一个参数类,需要在定义sequencer时声明REQ类型
2.sequencer管理着sequence,将sequence产生的transaction传送给driver,也将driver返回的rsp信号返回给sequence
UVM_AGENT
uvm_agent通常包含一个driver,一个monitor和一个sequencer。
uvm_agent中有时候只需要包含一个monitor,不需要driver和sequencer,需要通过uvm_active_passive_enum is_active = UVM_ACTIVE;
来进行有条件的例化
is_active是agent的一个成员,默认值是UVM_ACTIVE,表示处在active模式的agent需要例化driver,monitor和sequencer;如果is_active是UVM_PASSIVE,表示agent是passive模式,只可以例化monitor。active模式的agent既有激励功能也有监测功能,passive模式的agent只有监测功能。
active模式对应着DUT的接口暴露给agent且需要激励的场景,passive模式对应着DUT的接口已经与其他设计连接但只需要监测的场景
通过is_active变量,agent需要在build_phase()和connect_phase()等函数中通过选择语句来对driver和sequencer进行有条件的例化和连接
is_active可以通过顶层uvm_config_db#(enum)::get()
来进行配置
UVM_SCOREBOARD
uvm_scoreboard和其父类uvm_component相比,没有增加任何新成员和方法,建议在自定义scoreboard类时继承于uvm_scoreboard类
uvm_scoreboard和sv的checker功能一样,用来进行数据比对和报告
在scoreboard中通常声明TLM端口供monitor传输数据
简易比较的方法,可以采用UVM预定义的comparator
对于复杂的设计,可以在scoreboard中分别创建reference model和comparator
UVM_ENV
uvm_env是一个结构化的容器,可以容纳其他组件并且也可以作为子环境在更高层的集成中被嵌入。从验证环境层次结构来看,uvm_env可能包含多个uvm_agent和其他component
建议的uvm_env与uvm_agent之间的嵌套关系
- uvm_agent作为一个标准单元,在更上层的集成中应该被例化到uvm_env
- uvm_env在更高层的复用中,可以被其他uvm_env所嵌套
UVM_TEST
uvm_test类决定着环境的结构和连接关系,也决定着使用哪一个测试序列
uvm_test是整个验证环境建立的唯一入口,只有通过它才能正常运转uvm的phase机制,如果没有uvm_test,那么整个验证环境无法建立