UVM具有phase机制,由一组构建阶段,运行阶段和检查阶段组成。在run()阶段进行实际的测试仿真,并且在此phase中,每个组件都可以在开始时提出raise_objection和drop_objection。一旦所有组件都drop_objection,则run_phase完成,然后所有组件的check_phase执行,然后测试结束。
这是正常仿真结束的方式,但是如果某些组件由于设计或测试平台中的错误而挂起,则仿真超时也可以终止run_phase。当run_phase启动时,并行超时计时器也会启动。如果在run_phase完成之前超时计时器达到指定的超时限制,则将发出一条错误消息,然后将执行run_phase之后的所有phase,最后测试结束。
UVM RAL(UVM Register Abstraction Layer)是UVM所支持的功能,有助于使用抽象寄存器模型来验证设计中的寄存器以及DUT的配置。UVM寄存器模型提供了一种跟踪DUT寄存器内容的方法,以及一个用于访问DUT中寄存器和存储器的层次结构。寄存器模型反映了寄存器spec的结构,能够作为硬件和软件工程师的共同参考。RAL还具备其他功能,包括寄存器的前门和后门初始化以及内置的功能覆盖率支持。
uvm_callback类是用于实现回调的基类,这些回调通常用于在不更改组件类的情况下修改或增强组件的行为。通常,组件开发人员会定义一个专用于应用程序的回调类,该类扩展并定义一个或多个虚方法,称为回调接口。这些方法用于实现组件类行为的重写。
一种常见用法是在driver将错误发送到DUT之前将错误注入到生成的数据包中。以下伪代码展示了如何实现。
class Packet_c;
byte[4] src_addr, dst_addr;
byte[] data;
byte[4] crc;
endclass
//User defined callback class extended from base class
class PktDriver_Cb extends uvm_callback;
function new (string name = "PktDriver_Cb");
super.new(name);
endfunction
virtual task corrupt_packet (Packet_c pkt);
//Implement how to corrupt packet
//example - flip one bit of byte 0 in CRC
pkt.crc[0][0] = ~pkt.crc[0][0]
endtask
endclass : PktDriver_Cb
//Main Driver Class
class PktDriver extends uvm_component;
`uvm_component_utils(PktDriver)
//Register callback class with driver
`uvm_register_cb(PktDriver,PktDriver_Cb)
function new (string name, uvm_component parent=null);
super.new(name,parent);
endfunction
virtual task run();
forever begin
seq_item_port.get_next_item(pkt);
`uvm_do_callbacks(PktDriver,PktDriver_Cb, corrupt_packet(pkt))
//other code to derive to DUT etc
end
endtask
endclass
uvm_root类充当所有UVM组件的隐式顶级和phase控制器。用户不直接实例化uvm_root。UVM会自动创建一个uvm_root实例,用户可以通过全局(uvm_pkg-scope)变量uvm_top访问该实例。
uvm_test类是用户可以实现的顶级类,并且没有显式父类。但是,UVM有一个称为uvm_top的特殊组件,它被指定为测试类的父级。
形式验证是使用数学建模来验证设计实现是否符合spec的方法。形式验证使用数学推理和算法来证明设计符合spec。在形式验证中,该工具隐式地涵盖了所有情况(输入和状态),而无需开发任何激励生成器或预期输出。该工具需要以property或更高级别的模型形式对spec进行形式描述,以详尽地涵盖所有输入组合,证明功能的正确性。SystemVerilog的property也可用于形式化描述spec。
正确答案将在下一期公布,或者到下面的文章获取答案