功能类似verilog里的$display函数,在vmm里做了强化,可以在仿真过程中看到整个平台的运行信息,用来调试仿真平台。
函数原型在vmm.sv里(class vmm_log;),其构造函数为extern function new(string name,string inst,vmm_log under=null),name表示包含vmm_log的类的名称,inst是包含vmm_log的类的例化名字,vmm的验证组件(test/generator/driver,etc)都包含vmm_log的隐式例化,在编写验证组件时不需要再次例化,对于transaction则不同,因为在验证期间,transcation往往会被例化很多次,这时的vmm_log往往需要在编写验证组件时单独例化,例化为静态函数,可以让transactions一直使用,比如:
class wb_spi_trans extends vmm_data; static vmm_log log = new("wb_spi_trans","WB_SPI_TRANS"); ...
function new();
super.new(this.log);
‘vmm_note(this,log,"Create an object");
endfunction: new endclass : wb_spi_trans
这样在例化wb_spi_trans时就会输出信息“Normal[NOTE] on wb_spi_trans(WB_SPI_TRANS) at 0
Create an object”,参数name的作用在于告诉你是哪个组件输出的信息,参数inst的作用在于告诉你这个组件在整个验证环境中的层次(例化名称)。VMM通过参数化的宏定义输出信息,比如上面的‘vmm_note,展开后:
do if(log.start_msg(vmm_log::NOTE_TYP)) begin ‘void(log.text("Create an object")); log.end_msg(); end while(0)
log.start_msg函数输出”Normal[NOTE] on wb_spi_trans(WB_SPI_TRANS) at 0",log.test输出"Create an object",log.end_msg结束输出。vmm_log关键的属性有信息种类types_e(枚举类型:FAILURE_TYP/NOTE_TYP/DEBUG_TYP/REPORT_TYP/NOTIFY_TYP...),信息等级(枚举类型:FATAL_SEV/ERROR_SEV/WARNING_SEV/NORMAL_SEV/TRACE_SEV/DEBUG_SEV...),函数根据这两个变量来决定是否将信息输出,start_msg根据这两个变量决定是否输出信息,根据name和inst决定是哪个组件在输出信息。
原文地址:http://www.cnblogs.com/kxk_kxk/p/3855725.html