Aldec Riviera-PRO中断模拟SystemVerilog $error或$warning



是否可以配置Aldec Riviera-PRO模拟器来打破$error$warning SystemVerilog调用的模拟?如果是,那是怎么回事?

我不认为在Riviera-PRO中有一个特定的配置选项可以将$error$warning提升到断点,尽管值得检查他们的支持。您确实有几个选项:

  • $fatal代替$error
  • 用自定义的C代码编写VPI模块来重载系统任务

第二个选项看起来像这样:

#include "vpi_user.h"
// System function overload on $warning and $error to stop sim
static int system_function_overload(char *userdata)
{
    vpiHandle systfref, args_iter, argh;
    struct t_vpi_value argval;
    const char *msg = "*** NO MESSAGE PROVIDED ***";
    // Obtain a handle to the argument list
    systfref = vpi_handle(vpiSysTfCall, NULL);
    args_iter = vpi_iterate(vpiArgument, systfref);
    // Pull out the string passed in as the first argument
    if (args_iter) {
        argh = vpi_scan(args_iter);
        argval.format = vpiStringVal;
        vpi_get_value(argh, &argval);
        vpi_free_object(args_iter);
        msg = argval.value.str;
    }
    vpi_printf("BREAK sim from %s:%d with msg %sn",
                vpi_get_str(vpiFile, systfref),
                vpi_get(vpiLineNo, systfref),
                msg);
    vpi_control(vpiStop);
    return 0;
}
static void register_system_functions(void)
{
    s_vpi_systf_data tfData = { vpiSysTask, vpiSysTask };
    tfData.sizetf       = NULL;
    tfData.compiletf    = system_function_compiletf;
    tfData.calltf       = system_function_overload;
    tfData.user_data    = NULL;
    tfData.tfname       = "$warning";
    vpi_register_systf( &tfData );
    tfData.tfname       = "$error";
    vpi_register_systf( &tfData );
}
void (*vlog_startup_routines[])(void) = {
    register_system_functions,
    0
};

相关内容

最新更新