如何解决在功能中放置工厂注册时出现空项错误
我正在尝试编写一个函数,该函数创建一个向工厂注册项目,然后对该项目进行一些基本操作的函数。我遇到的问题是,当我尝试执行此代码时,出现空项目错误。
我想要的代码示例摘录为:
modified_sequence_item example_msg_item
function new (string name = ex_sequence);
super.new(name);
create_message(example_msg_item,"example_msg_item",32'hDEADBEEF);
endfunction
function create_message(modified_sequence_item msg_item,string msg_name,bit[31:0] data);
msg_item = modified_sequence_item::type_id::create(msg_name);
msg_item.data_field = data;
endfunction
不幸的是,这不起作用。我收到以下错误:
UVM_FATAL @ 5710: reporter [NullITM] attempting to start a null item from sequence 'main'
但是,以下代码确实有效:
modified_sequence_item example_msg_item
function new (string name = ex_sequence);
super.new(name);
example_msg_item = modified_sequence_item::type_id_create("example_msg_item");
example_msg_item.data_field = 32'hDEADBEEF;
endfunction
看看这两位代码,对我来说,除了嵌套在第一位代码中的函数中的动作外,它们几乎是相同的。这使我相信这个问题很可能是传递数据作为函数的问题。
有人对我如何修改第一个代码示例以使其没有空项错误有任何建议吗?
解决方法
函数声明的两个问题:
- 在函数内部创建的句柄在退出函数时需要复制出来,因此
msg_item
需要声明为output
参数。 - 您忘记将返回类型声明为
void
。否则,默认值为1位4状态结果(IEEE Std 1800-2017,第13.4节函数:implicit_data_type
)
function void create_message(
output modified_sequence_item msg_item,input string msg_name,bit[31:0] data);
msg_item = modified_sequence_item::type_id::create(msg_name);
msg_item.data_field = data;
endfunction
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。