持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天!
- 构造器必须按顺序定义name和parent两个参数,name在前,parent在后
- name参数必须是字符串,parent参数必须是uvm_component类型
- 构造器的第一个可执行必须调用super.new(name,parent),然后UVM才能工作
UVM Component
定义和例化UVM组件
- 第一步:从uvm_component类及其子类继承定义你的组件
- 第二步:用uvm_component_utils()宏注册到这个类到Factory
- 第三步:提供uvm_conponent构造器
- 第四步:在必要时重写UVM的phase方法
第一步:从uvm_conponent类继承创建模块
class scoreboard extends uvm_component;
uvm_component_utils(scoreboard);
virtual tinyalu_bfm bfm;
第二步:用uvm_conponent_utils()宏注册类到Factory
uvm_component_utils()宏把这个类注册到Factory,现在我们可以用Factory来例化比较器。【代码见上】
第三步:提供uvm_conponent构造器、
所有的uvm_component类的new()方法都需要name和parent两个参数,这里是比较器类的构造器
function new(string name,uvm_component parent)
super.new(name,parent);
endfunction:new
第四步:有必要的话重写UVM的phase方法
所有的UVM component都继承了这些phase方法,UVM在所有的component里以设定的顺序调用这些phase方法。在你的component里重写这些phase方法,然后UVM会按顺序调用。 phase方法不用强制重写,不过要在重写的时候,必须在第一步调用super.<phase_name>函数。 UVM按照以下顺序调用phase方法:
- function void build_phase--UVM用这个方法自顶向下建立你的验证平台。你要在这个方法里例化你的uvm_component,如果在别的方法里例化,就会报错
- function void connect_phase -- connnect phase 把各个模块连接在一起
- function void end_of_elabortion_phase--UVM在所有component都就位并连接好以后调用这个方法,需要在UVM层次设定完之后再对验证平台进行调整的话可以用这个phase
- task run_phase--UVM会在各自的线程调用这个task,这是个耗时的phase.验证平台中的run_phase()是”同时”运行的,run_phase中还有12个phase.
- function void report_phase-- 这个phase会在最后一个objection撤销后运行,然后测试用例就结束了。这可以用来报告结果。