UVM 中的四种消息属性
时间:2021-11-05 13:45:45
手机看文章
扫描二维码
随时随地手机看文章
[导读]UVM中的消息有三种属性,分别是:严重度(severity)、冗余度(verbosity)、以及消息的关联行为,此外还有消息的标签ID。UVM的消息机制基于该三种属性和标签ID,实现对消息的处理。a.严重度(severity):在调试和仿真的过程中,我们需要输出消息,那么如何区...
UVM 中的消息有三种属性,分别是:严重度(severity)、冗余度(verbosity)、以及消息的关联行为,此外还有消息的标签 ID。UVM 的消息机制基于该三种属性和标签 ID, 实现对消息的处理。
a. 严重度(severity):
在调试和仿真的过程中,我们需要输出消息,那么如何区分消息的严重度?UVM 中用对应的枚举值来标识,更具体来说是用消息宏来标识。不同严重度的枚举值及其缺省的关联操作:
b. 冗余度(verbosity)
UVM 定义了一些枚举值表示预定义的消息冗余(消息的冗余就是该条消息是否被打印出来的敏感阈值,敏感阈值越小,则越容易被打印出来)。这些值被用在两个地方。一个是消息自身有一个冗余度,另一个是发出消息的uvm_compoment 也有一个冗余度。这些枚举值为:
UVM_NONE 阈值最低,为 0;UVM_DEBUG的阈值最高,为 500。对于UVM 来说,阈值越高,则越不容易被打印出来,这里是和我们平常的思维是相反的。
在 UVM 中,一个有着低冗余等级的消息会更容易打印出来。一个有着UVM_NONE 冗余等级的消息总会打印出来。
对于一条消息来说,这条消息本身有一个冗余等级,此外,发出该消息的组件也会有一个冗余等级,当这两个冗余等级发生冲突时,将如何处理?对于 UVM来说,发出该消息组件的冗余等级的优先级高于消息本身的冗余等级的。即当一个冗余等级为 UVM_DEBUG 的 compoment 发出所有等级的消息时,该消息总是会被打印出来的;而一个冗余等级为 UVM_NONE 的 compoment 发出一条所有等级的消息时,只有等级为 UVM_NONE 的消息才会被打印出来。
这里说明:给一个组件设置更高的冗余等级将会暴露该组件更多的细节。组件和消息缺省的冗余等级是 UVM_MEDIUM。
在缺省情况下运行这段代码只有 Checkpoint 1 和 Checkpoint 2 消息打印出来。
c. 关联行为(action)
关联行为是指仿真平台执行到该消息时执行的动作。关联行为对应的枚举值
如下:
在仿真过程中 UVM 对消息严重度为 warning、 error、 fatal 的条目自动进行计数,不需要另外配置。(这个特性可以用于用例的仿真pass/error控制)
d. 关联 ID
每一个打印出来的消息都包括一个和该消息相关的 ID。该 ID 字段可以用来完成用户指定的、甚至在仿真之外的任何鉴别或者过滤工作。在仿真中,该 ID能够指示严重度、等级等消息的属性或者做其他修改或者废止该报告的决定。因为冗余等级能够处理一个 ID 的粒度级别,一般建议将 get_type_name()和第 二 个 字 符 串 连 接 在 一 起 的 模 式 。 这 个 get_type_name() 函 数 ( 由`uvm_component/object_utils() 宏生成)能够通知用户该字符串来自哪个类。第二个字符串被用于表示消息来自那个函数/任务或用于进一步需要的粒度。
我的理解:关联 ID 类似于一个标签,消息之所以有关联 ID 是为了标识同一类型的消息,这样通过 ID 和其他属性就可以对该类型的消息进行处理。比如可以设置具有该 ID 的消息不输出、冗余度为 UVM_HIGH、对其进行计数等等。
a. 严重度(severity):
在调试和仿真的过程中,我们需要输出消息,那么如何区分消息的严重度?UVM 中用对应的枚举值来标识,更具体来说是用消息宏来标识。不同严重度的枚举值及其缺省的关联操作:
枚举值 | 属性 | 缺省操作 |
UVM_INFO | 有用的消息 | UVM_DISPLAY |
UVM_WARNING | 显示一个潜在的问题 | UVM_DISPLAY |
UVM_ERROR | 显示一个问题,仿真将继续,并且计数ERROR CNT | UVM_DISPLAY| UVM_COUNT |
UVM_FATAL | 显示一个导致仿真无法恢复的问题,仿真将退出 | UVM_DISPLAY| UVM_EXIT |
b. 冗余度(verbosity)
UVM 定义了一些枚举值表示预定义的消息冗余(消息的冗余就是该条消息是否被打印出来的敏感阈值,敏感阈值越小,则越容易被打印出来)。这些值被用在两个地方。一个是消息自身有一个冗余度,另一个是发出消息的uvm_compoment 也有一个冗余度。这些枚举值为:
枚举值 | 属性 |
UVM_NONE | 值为 0,不可屏蔽的关键消息 |
UVM_LOW | 值为 100,可屏蔽消息,在仿真过程中极少输出 |
UVM_MEDIUM | 值为 200,对每个数据项或者序列(sequence)仅仅发生一次的消息 |
UVM_HIGH | 值为 300,更详细的数据项信息,包括打印封包的值 |
UVM_FULL | 值为 400,剩余的部分,包括特定方法的消息打印 |
UVM_DEBUG* | 值为 500,调试模式下的调试信息 |
UVM_NONE 阈值最低,为 0;UVM_DEBUG的阈值最高,为 500。对于UVM 来说,阈值越高,则越不容易被打印出来,这里是和我们平常的思维是相反的。
在 UVM 中,一个有着低冗余等级的消息会更容易打印出来。一个有着UVM_NONE 冗余等级的消息总会打印出来。
对于一条消息来说,这条消息本身有一个冗余等级,此外,发出该消息的组件也会有一个冗余等级,当这两个冗余等级发生冲突时,将如何处理?对于 UVM来说,发出该消息组件的冗余等级的优先级高于消息本身的冗余等级的。即当一个冗余等级为 UVM_DEBUG 的 compoment 发出所有等级的消息时,该消息总是会被打印出来的;而一个冗余等级为 UVM_NONE 的 compoment 发出一条所有等级的消息时,只有等级为 UVM_NONE 的消息才会被打印出来。
这里说明:给一个组件设置更高的冗余等级将会暴露该组件更多的细节。组件和消息缺省的冗余等级是 UVM_MEDIUM。
task run_phase(uvm_phase phase);
`uvm_info({get_type_name(),”::run_phase”},”starting run_phase”,UVM_HIGH)
...
`uvm_info({get_type_name(),”::run_phase”},”checkpoint 1 of run_phase”,UVM_MEDIUM)
...
`uvm_info({get_type_name(),”::run_phase”},”checkpoint 2 of run_phase”,UVM_LOW)
...
`uvm_info({get_type_name(),”::run_phase”},”Ending run_phase”,UVM_HIGH)
endtask :run_phase
在缺省情况下运行这段代码只有 Checkpoint 1 和 Checkpoint 2 消息打印出来。
c. 关联行为(action)
关联行为是指仿真平台执行到该消息时执行的动作。关联行为对应的枚举值
如下:
枚举值 | 属性 |
UVM_NO_ACTION | 不采取任何行动 |
UVM_DISPLAY | 发送该报告到标准输出 |
UVM_LOG | 发送该报告到该冗余等级和 id(severity, id)对应的文件 |
UVM_COUNT | 对该属性的报告进行计数,当计数值到达最大 quit 数量时,仿真终止 |
UVM_STOP | 执行$stop 指令,使仿真进入交互模式 |
UVM_EXIT | 立即终止仿真 |
UVM_CALL_BACK | 回调报告 hook 方法 |
d. 关联 ID
每一个打印出来的消息都包括一个和该消息相关的 ID。该 ID 字段可以用来完成用户指定的、甚至在仿真之外的任何鉴别或者过滤工作。在仿真中,该 ID能够指示严重度、等级等消息的属性或者做其他修改或者废止该报告的决定。因为冗余等级能够处理一个 ID 的粒度级别,一般建议将 get_type_name()和第 二 个 字 符 串 连 接 在 一 起 的 模 式 。 这 个 get_type_name() 函 数 ( 由`uvm_component/object_utils() 宏生成)能够通知用户该字符串来自哪个类。第二个字符串被用于表示消息来自那个函数/任务或用于进一步需要的粒度。
我的理解:关联 ID 类似于一个标签,消息之所以有关联 ID 是为了标识同一类型的消息,这样通过 ID 和其他属性就可以对该类型的消息进行处理。比如可以设置具有该 ID 的消息不输出、冗余度为 UVM_HIGH、对其进行计数等等。