set_new_handler例子

本文介绍了一个自定义new处理器的实现,通过安装一个new处理器来处理内存分配失败的情况,并释放预分配的安全缓冲区来尝试再次分配内存。
#include <iostream>
/// buffer to be allocated after custom new handler has been installed
char* g_pSafetyBuffer = NULL;


/// exceptional one time release of a global reserve
void my_new_handler()
{
    if (g_pSafetyBuffer) {
        delete [] g_pSafetyBuffer;
        g_pSafetyBuffer = NULL;
        std::cout << "[Free some pre-allocated memory]";
        return;
    }
    std::cout << "[No memory to free, throw bad_alloc]";
    throw std::bad_alloc();
}


/// illustrates how a custom new handler may work
int main()
{
    enum { MEM_CHUNK_SIZE = 1000*1000 }; // adjust according to your system
    std::set_new_handler(my_new_handler);
    g_pSafetyBuffer = new char[801*MEM_CHUNK_SIZE];
    try {
        while (true) {
            std::cout << "Trying another new... ";
            new char[200*MEM_CHUNK_SIZE];
            std::cout << " ...succeeded.\n";
        }
    } catch (const std::bad_alloc& e) {
        std::cout << " ...failed.\n";
    }
    return 0;
}
### UVM 中 `set_verbosity` 方法的使用方式 在 UVM 中,`set_verbosity` 方法用于控制消息的详细程度级别(verbosity level),以决定哪些信息会被记录或打印。通过设置不同的详细程度级别,可以灵活地过滤调试信息,从而在不同场景下(如调试、测试或生产)控制输出的冗余度。 #### 设置全局 verbosity 级别 可以通过 `uvm_report_handler` 来设置全局的 verbosity 级别。例如,屏蔽所有信息输出: ```systemverilog uvm_report_handler.set_report_verbosity_level(UVM_NONE); ``` 此设置会影响整个仿真环境中所有组件的默认信息输出行为。 #### 设置特定组件的 verbosity 级别 UVM 支持为特定组件设置不同的 verbosity 级别。例如,在组件内部设置当前组件的 verbosity: ```systemverilog class my_component extends uvm_component; `uvm_component_utils(my_component) function new(string name, uvm_component parent); super.new(name, parent); endfunction virtual function void build_phase(uvm_phase phase); // 设置当前组件的报告详细程度为 UVM_HIGH this.get_report_handler().set_report_verbosity_level(UVM_HIGH); // 打印不同详细程度的消息 `uvm_info("MY_INFO_LOW", "This is a low verbosity message.", UVM_LOW) `uvm_info("MY_INFO_MEDIUM", "This is a medium verbosity message.", UVM_MEDIUM) `uvm_info("MY_INFO_HIGH", "This is a high verbosity message.", UVM_HIGH) endfunction endclass ``` 在这个例子中,只有 `UVM_HIGH` 级别的信息会被打印出来,因为当前组件的 verbosity 被设置为 `UVM_HIGH`。 #### 通过命令行参数动态设置 verbosity UVM 提供了命令行参数 `+uvm_set_verbosity` 来动态调整特定组件和 ID 的 verbosity 级别。其语法如下: ``` +uvm_set_verbosity=<comp>,<id>,<verbosity>,<phase>,<optional_time> ``` 例如: ``` +uvm_set_verbosity=tb_top.pcie_inst*,_ALL_,UVM_NONE,time,0 ``` 该命令将 `tb_top.pcie_inst` 下所有 ID 的 verbosity 设置为 `UVM_NONE`,即屏蔽所有信息输出。 #### verbosity 与 severity 的协同作用 在 UVM 中,消息的输出不仅受 verbosity 级别控制,还与 severity 类型相关。例如,`UVM_INFO` 类型的消息会根据当前 verbosity 级别决定是否显示,而 `UVM_ERROR` 和 `UVM_FATAL` 类型的消息通常不受 verbosity 控制,除非明确配置其行为。 UVM 默认设置了如下行为: ```systemverilog set_severity_action(UVM_INFO, UVM_DISPLAY); set_severity_action(UVM_WARNING, UVM_DISPLAY); set_severity_action(UVM_ERROR, UVM_DISPLAY | UVM_COUNT); set_severity_action(UVM_FATAL, UVM_DISPLAY | UVM_EXIT); ``` 这些设置可以通过 `set_severity_action()` 方法进行修改,从而实现更精细的控制逻辑。 #### 示例:设置特定 ID 的 verbosity 以下是一个通过命令行动态设置特定 ID 的 verbosity 级别的示例: ``` +uvm_set_verbosity=tb_top.pcie_inst0,MY_INFO_HIGH,UVM_DEBUG ``` 此命令将 `tb_top.pcie_inst0` 组件中 ID 为 `MY_INFO_HIGH` 的消息 verbosity 设置为 `UVM_DEBUG`,从而确保该特定信息以最高详细程度输出。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值