Hi guys!
When I compile vmm-1.1 under questasim 6.4c.
I fix all the warning but the following fatal error occur.
There isn’t any more message.
So who can tell me What’s the meaning of “Fatal: Unexpected signal: 11.”.
and how to fix this fatal error.
Thanks
vmm_opts.sv
154
From
function vmm_opts_info vmm_opts::get_opts_by_name(string name);
string vname = {“vmm_”, name};
string format;
vmm_opts_info oinfo;
int idx[$];
if (!opts_extracted)
void’(extract_opts_info());
if (opts_info.exists(name)) begin
oinfo = opts_info[name];
end
else begin
oinfo = new(name);
opts_info[name] = oinfo;
end
if (!oinfo.expected && $test$plusargs(vname)) begin
string sarg, format;
oinfo.opt_specified = 1;
format = `vmm_sformatf(“vmm_%s=%%s”, name);
if ($value$plusargs(format, sarg)) begin
oinfo.sarg = sarg;
oinfo.arg_specified = 1;
end
end
oinfo.expected = 1;
return oinfo;
endfunction
To
function vmm_opts_info vmm_opts::get_opts_by_name(string name=“”);
string vname = {“vmm_”, name};
string format;
vmm_opts_info oinfo;
vmm_opts_info oinfob;
int idx[$];
oinfob = new(name);
if (!opts_extracted)
void’(extract_opts_info());
if (opts_info.exists(name)) begin
oinfo = opts_info[name];
end
else begin
oinfo = oinfob;
opts_info[name] = oinfo;
end
if (!oinfo.expected && $test$plusargs(vname)) begin
string sarg, format;
oinfo.opt_specified = 1;
format = `vmm_sformatf(“vmm_%s=%%s”, name);
if ($value$plusargs(format, sarg)) begin
oinfo.sarg = sarg;
oinfo.arg_specified = 1;
end
end
oinfo.expected = 1;
return oinfo;
endfunction
I have already run vmm1.1 under questasim 6.4c.
I run the test case ethernet well.
but still a little problem.
This error does not affect simulation.
** Error: (vsim-8385) …/…/…/…/sv/std_lib/vmm_xactor.sv(23): fork…join_none statements in function ‘new’ only allowed if the calling process originates in an initial or always block.
vmm_ms_scenario_gen.sv
line 460
From:
function int vmm_ms_scenario_gen::get_ms_scenario_index(vmm_ms_scenario scenario);
get_ms_scenario_index = -1;
foreach(this.scenario_set[i]) begin
if(this.scenario_set[i] == scenario) begin
return (get_ms_scenario_index = i);
end
end
if(get_ms_scenario_index == -1) begin
vmm_warning(this.log,
vmm_sformatf(“Cannot find the index for the ms scenario”));
end
endfunction: get_ms_scenario_index
TO:
function int vmm_ms_scenario_gen::get_ms_scenario_index(vmm_ms_scenario scenario);
get_ms_scenario_index = -1;
foreach(this.scenario_set[i]) begin
if(this.scenario_set[i] == scenario) begin
get_ms_scenario_index = i;
return get_ms_scenario_index ;
end
end
if(get_ms_scenario_index == -1) begin
vmm_warning(this.log,
vmm_sformatf(“Cannot find the index for the ms scenario”));
end
endfunction: get_ms_scenario_index
vmm_version.sv
line 112
From
$write(“\n”);
$write(“%s VMM_SCENARIO %s\n”,
prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO));
$write(“%s VMM_SCENARIO_NEW_ARGS %s\n”,
prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO_NEW_ARGS));
$write(“%s VMM_SCENARIO_NEW_EXTERN_ARGS %s\n”,
prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO_NEW_EXTERN_ARGS));
$write(“%s VMM_SCENARIO_NEW_CALL %s\n”,
prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO_NEW_CALL));
$write(“%s VMM_SCENARIO_BASE %s\n”,
prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO_BASE));
$write(“%s VMM_SCENARIO_BASE_NEW_ARGS %s\n”,
prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO_BASE_NEW_ARGS));
$write(“%s VMM_SCENARIO_BASE_NEW_EXTERN_ARGS %s\n”,
prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO_BASE_NEW_EXTERN_ARGS));
$write(“%s VMM_SCENARIO_BASE_NEW_CALL %s\n”,
// prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO_BASE_NEW_CALL));
To
// $write(“\n”);
// $write(“%s VMM_SCENARIO %s\n”,
// prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO));
// $write(“%s VMM_SCENARIO_NEW_ARGS %s\n”,
// prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO_NEW_ARGS));
// $write(“%s VMM_SCENARIO_NEW_EXTERN_ARGS %s\n”,
// prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO_NEW_EXTERN_ARGS));
// $write(“%s VMM_SCENARIO_NEW_CALL %s\n”,
// prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO_NEW_CALL));
// $write(“%s VMM_SCENARIO_BASE %s\n”,
// prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO_BASE));
// $write(“%s VMM_SCENARIO_BASE_NEW_ARGS %s\n”,
// prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO_BASE_NEW_ARGS));
// $write(“%s VMM_SCENARIO_BASE_NEW_EXTERN_ARGS %s\n”,
// prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO_BASE_NEW_EXTERN_ARGS));
// $write(“%s VMM_SCENARIO_BASE_NEW_CALL %s\n”,
// prefix, VMM_MACRO_TO_STRING(
VMM_SCENARIO_BASE_NEW_CALL));
vmm_log.sv
line
From
`ifdef VCS
function void vmm_log_catcher::issue(vmm_log_msg msg);
this.issued = 1;
endfunction:issue
function void vmm_log_catcher::throw(vmm_log_msg msg);
this.thrown = 1;
endfunction:throw
`endif
To
function void vmm_log_catcher::issue(vmm_log_msg msg);
this.issued = 1;
endfunction:issue
function void vmm_log_catcher::throw(vmm_log_msg msg);
this.thrown = 1;
endfunction:throw
vmm_opts.sv
154
From
function vmm_opts_info vmm_opts::get_opts_by_name(string name);
string vname = {“vmm_”, name};
string format;
vmm_opts_info oinfo;
int idx[$];
if (!opts_extracted)
void’(extract_opts_info());
if (opts_info.exists(name)) begin
oinfo = opts_info[name];
end
else begin
oinfo = new(name);
opts_info[name] = oinfo;
end
if (!oinfo.expected && $test$plusargs(vname)) begin
string sarg, format;
oinfo.opt_specified = 1;
format = `vmm_sformatf(“vmm_%s=%%s”, name);
if ($value$plusargs(format, sarg)) begin
oinfo.sarg = sarg;
oinfo.arg_specified = 1;
end
end
oinfo.expected = 1;
return oinfo;
endfunction
To
function vmm_opts_info vmm_opts::get_opts_by_name(string name=“”);
string vname = {“vmm_”, name};
string format;
vmm_opts_info oinfo;
vmm_opts_info oinfob;
int idx[$];
oinfob = new(name);
if (!opts_extracted)
void’(extract_opts_info());
if (opts_info.exists(name)) begin
oinfo = opts_info[name];
end
else begin
oinfo = oinfob;
opts_info[name] = oinfo;
end
if (!oinfo.expected && $test$plusargs(vname)) begin
string sarg, format;
oinfo.opt_specified = 1;
format = `vmm_sformatf(“vmm_%s=%%s”, name);
if ($value$plusargs(format, sarg)) begin
oinfo.sarg = sarg;
oinfo.arg_specified = 1;
end
end
oinfo.expected = 1;
return oinfo;
endfunction
vmm_ral_mem.sv
176
From
extern /local/ function vmm_ral_access Xget_ral_accessX();
To
// extern /local/ function vmm_ral_access Xget_ral_accessX();
vmm_scenario_gen.sv
line 70
From
solve length before items.size() VMM_SOLVE_BEFORE_OPT; To /* solve length before items.size()
VMM_SOLVE_BEFORE_OPT;*/
vmm_data.sv
line 148
To
input int unsigned offset = 0,
vmm_scenario.sv
line 30
To
function string vmm_scenario::psdisplay(string prefix = “”);
vmm_ms_scenario_gen.sv
23
To
function vmm_ms_scenario::new(VMM_SCENARIO parent = null
VMM_SCENARIO_NEW_ARGS);
vmm_ms_scenario_gen.sv
54
To
function vmm_ms_scenario vmm_ms_scenario::get_ms_scenario(string scenario, string gen = “”);
vmm_ms_scenario_gen.sv
98
To
function vmm_ms_scenario_gen::new(string inst,
int stream_id = -1
`VMM_XACTOR_NEW_ARGS);
vmm_ms_scenario_gen.sv
152
To
function void vmm_ms_scenario_gen::reset_xactor(vmm_xactor::reset_e rst_typ = SOFT_RST);
vmm_log.sv(551)
vmm_log.sv(552)
vmm_log.sv(553)
vmm_log.sv(563)
vmm_log.sv(564)
vmm_log.sv(565)
void'(this.text("Over 200 vmm_log instances have been created."));
void'(this.text("Check that all vmm_data extensions use a static instance")
void'(this.text("or use +vmm_log_nowarn_at_200 to disable this warning."));
void'(this.text("Over 1000 vmm_log instances have been created."));
void'(this.text("Check that all vmm_data extensions use a static instance"));
void'(this.text("or use +vmm_log_nofatal_at_1000 to disable this failure."));
vmm_log.sv(1774)
void’(this.text(“Callback has already been registered”));
vmm_log.sv(1757)
void’(this.text(“Callback has already been registered”));
vmm_log.sv(1797)
vmm_env.sv(377)
return prefix;
vmm_subenv.sv(85)
return prefix;
vmm_xactor.sv(544)
return prefix;
Try +define+NO_STATIC_METHODS on your vlog command line. It appears the new vmm_opts class introduces a race condition during static initialization. Setting this define removes the unnecessary static qualifiers on the methods in vmm_opts. This will get you past your present problem.
You will probably also want to remove the static qualifier for the vmm_xactor_iter::_vmm_xactor variable. The vmm_xactor class’ new method calls fork-join_none. This is only legal if new is called from an initial block. In this case, it is not. It is called from a static initializer.