IC验证学霸笔记4——UVM--消息管理
消息管理
一个好的验证系统应该应该具有消息管理特性,它们是:
通过一种标准化的方式打印信息;
过滤(重要级别的)信息;
打印通道。
这些特性在UVM中均有支持,UVM提供了一系列丰富的类和方法来生成和过滤消息:
• 消息方法
• 消息处理
• 消息机制
function void uvm_report_info(string id, string message, int verbosity = UVM_MEDIUM, string filename = "", int line = 0);
function void uvm_report_warning(string id, string message, int verbosity = UVM_MEDIUM, string filename = "", int line = 0);
function void uvm_report_error(string id, string message, int verbosity = UVM_LOW, string filename = "", int line = 0);
function void uvm_report_fatal(string id, string message, int verbosity = UVM_NONE, string filename = "", int line = 0);
function void uvm_report_warning(string id, string message, int verbosity = UVM_MEDIUM, string filename = "", int line = 0);
function void uvm_report_error(string id, string message, int verbosity = UVM_LOW, string filename = "", int line = 0);
function void uvm_report_fatal(string id, string message, int verbosity = UVM_NONE, string filename = "", int line = 0);
四个消息函数有若干共同的信息,它们是严重级别(severity)、冗余度(verbosity)、消息ID、消息、文件名和行号:
• 严重级别: 从函数名本身也可以得出, 这四个严重级别分别是UVM_INFO、
UVM_WARNING、UVM_ERROR、 UVM_FATAT,不同的严重级别在打印的消息中也会有不同的指示来区别, 同时仿真器对不同严重级别消息的处理方式也不一样。 例如对于UVM_FATAL的消息, 默认情况下仿真会停止。
• 消息ID: 如ID可以是任意的字符串, 用来标记该消息。 这个标记会同消息本身打印出来, 同时不同的标记也可以用来进行消息处理。
• 消息: 即消息文本的主体。
• 冗余度: 冗余度与消息处理中的过滤直接相关。 冗余度的设置如果低于过滤的开关, 那么该消息会打印出来, 否则不会被打印出来。 但是无论信息是否会被打印出夹, 这都与对消息采取的其它措施没有关系, 例如仿真停止。(UVM_NONE/LOW/MEDIUM/HIGH/FULL/DEBUG重要性逐渐降低)
• 文件名和行号: 这些信息用来提供消息发生时所存的文件和行号。 用户可以使用默认值, 而UVM后台会自动填补它们原本的文件名和行号, 同时也在打印时将文件名和行号输出。
与每一 条消息对应的是如何处理这些消息。通常情况下,消息处理的方式是同消息的严重级别对应的。如果用户有额外的需求,也可以修改对各个严重级别的消息处理方式。
• 严重级别: 从函数名本身也可以得出, 这四个严重级别分别是UVM_INFO、
UVM_WARNING、UVM_ERROR、 UVM_FATAT,不同的严重级别在打印的消息中也会有不同的指示来区别, 同时仿真器对不同严重级别消息的处理方式也不一样。 例如对于UVM_FATAL的消息, 默认情况下仿真会停止。
• 消息ID: 如ID可以是任意的字符串, 用来标记该消息。 这个标记会同消息本身打印出来, 同时不同的标记也可以用来进行消息处理。
• 消息: 即消息文本的主体。
• 冗余度: 冗余度与消息处理中的过滤直接相关。 冗余度的设置如果低于过滤的开关, 那么该消息会打印出来, 否则不会被打印出来。 但是无论信息是否会被打印出夹, 这都与对消息采取的其它措施没有关系, 例如仿真停止。(UVM_NONE/LOW/MEDIUM/HIGH/FULL/DEBUG重要性逐渐降低)
• 文件名和行号: 这些信息用来提供消息发生时所存的文件和行号。 用户可以使用默认值, 而UVM后台会自动填补它们原本的文件名和行号, 同时也在打印时将文件名和行号输出。
与每一 条消息对应的是如何处理这些消息。通常情况下,消息处理的方式是同消息的严重级别对应的。如果用户有额外的需求,也可以修改对各个严重级别的消息处理方式。
而不同的严重级别消息,用户可以使用默认的消息处理方式:
如果要做自定义的消息处理方式,用户可以通过uvm_report_object类提供的方法进行配置。
uvm_report_object类是间于uvm_object类与uvm_component类之间的中间类,它的主要功能是完成消息打印和管理。
uvm_report_object类是间于uvm_object类与uvm_component类之间的中间类,它的主要功能是完成消息打印和管理。
UVM也提供了一些宏来对应上面的消息方法,用户也可以使用这些宏来处理消息。
消息处理是由uvm_report_handler类来完成的,而每一个uvm_report_object类中都有一个uvm_report_handler实例。
• 上面的uvm_report_object消息处理方法或者uvm_component消息处理方法,都是针对于这些uvm_report_handler做出的配置。
• 除了上面的常见使用方法,用户还可以做出更高级的消息控制。例如, 当UVM_ERROR出现之后,仿真默认会停止,这是由于设置了UVM_ERROR的处理方式是UVM_COUNT数量达到上限(默认为1)'即停止仿真。可以通过set_max_quit_count来修改UVM_COUNT值。
#深度学习##做项目##芯片IC验证工程师##你为什么选择硬件行业##你的秋招进展怎么样了#• 上面的uvm_report_object消息处理方法或者uvm_component消息处理方法,都是针对于这些uvm_report_handler做出的配置。
• 除了上面的常见使用方法,用户还可以做出更高级的消息控制。例如, 当UVM_ERROR出现之后,仿真默认会停止,这是由于设置了UVM_ERROR的处理方式是UVM_COUNT数量达到上限(默认为1)'即停止仿真。可以通过set_max_quit_count来修改UVM_COUNT值。
回调函数
• 消息用户在处理信息时还希望做出额外的处理,这时回调函数就显得很有必要了, uvm_report_object类提供了下面的回调函数满足用户更多的需求:
• function bit report_hook(string id, string message, int verbosity, string filename, int line);
• function bit report_info_hook(string id, string message, int verbosity, string filename, int line);
• function bit report_warning_hook(string id, string message, int verbosity, string filename, int line);
• function bit report_error_hook(string id, string message, int verbosity, string filename, int line);
• function bit report_fatal_hook(string id, string message, int verbosity, string filename, int line);
• report_hook()函数通过结合消息管理时的UVM_CALL_HOOK参数,结合用户自定义的回调函数. 就可以实现更丰富的配置。
• 这样用户在调用回调函数时, 首先会调用report_hook()函数, 接下来才按照severity级别来选择更细致的回调函数report_SEVERITY_hook()。
• 默认情况下,report_hook()函数返回值为1, 进而再转入severity hook函数。
• 如果report_hook()函数由用户自定义且返回0的话, 那么后续report_SEVERITY _hook()函数不会执行。
• function bit report_hook(string id, string message, int verbosity, string filename, int line);
• function bit report_info_hook(string id, string message, int verbosity, string filename, int line);
• function bit report_warning_hook(string id, string message, int verbosity, string filename, int line);
• function bit report_error_hook(string id, string message, int verbosity, string filename, int line);
• function bit report_fatal_hook(string id, string message, int verbosity, string filename, int line);
• report_hook()函数通过结合消息管理时的UVM_CALL_HOOK参数,结合用户自定义的回调函数. 就可以实现更丰富的配置。
• 这样用户在调用回调函数时, 首先会调用report_hook()函数, 接下来才按照severity级别来选择更细致的回调函数report_SEVERITY_hook()。
• 默认情况下,report_hook()函数返回值为1, 进而再转入severity hook函数。
• 如果report_hook()函数由用户自定义且返回0的话, 那么后续report_SEVERITY _hook()函数不会执行。
除了每个uvm_report_object中都内置个uvm_report_handler实例之外,所有uvm_report_handler实例也都依赖于uvm_pkg中uvm_report_server的唯一实例, 但是该实例并没有作为全局变量, 直接暴露给用户,需要用户自行调用uvm_report_server::get_server()方法来获取。
uvm_report_server是一个全局的消息处理设备, 用来处理从所有uvm_report_hanlder中产生的消息。 这个唯一的report server之所以没有暴露在uvm_pkg中供用户使用, 一个原因在于对消息的处理方式。
uvm_report_server是一个全局的消息处理设备, 用来处理从所有uvm_report_hanlder中产生的消息。 这个唯一的report server之所以没有暴露在uvm_pkg中供用户使用, 一个原因在于对消息的处理方式。
以下案例涵盖本节的所有重点
注:优秀验证学员随堂笔记,已经征求到学生的同意,会持续给牛友们分享!
大家看完记得 一键三连!多多支持
查看12道真题和解析