我是systemverilog的初学者,我试图制作一个复杂的代码来比较两个邮箱 这给了我这些模拟错误 enter image description here
//包装代码
包装类型;
typedef结构{
int pid;
}数据包;
最终包装
//主要代码
module mbox;
import types::*;
//Declare two mailboxes here
mailbox exp_mb = new(256);
mailbox act_mb = new(256);
// This task supplies stimulus to the two mailboxes
task stimulus();
packet stim_pkt;
for (int i = 0; i < 256; i++) begin
stim_pkt.pid = i;
//*** Write stim_pkt to both mailboxes here
exp_mb.put(stim_pkt);
act_mb.put(stim_pkt);
$display("Sending pkt: ",i);
end
endtask
// Add task checker here
task check(input mailbox exp_mb ,act_mb);
bit com;
packet x;
packet y;
for (int i = 0; i < 256; i++) begin
x.pid = exp_mb.get(i) ;
y.pid = act_mb.get(i);
com = compare(x,y);
if (com == 1)
$display ("No Error");
else
$display ("Error in %d", i);
end
endtask
// Add function compare here
function bit unsigned compare (packet a ,b);
if (a.pid == b.pid)
return 1;
else
return 0;
endfunction// Add an initial block to run stimulus & checker tasks simultaneously
initial
begin
fork
stimulus();
check(exp_mb ,act_mb);
join_none
end
endmodule
答案 0 :(得分:0)
错误消息告诉您确切的问题是什么。邮箱get()
方法不返回值,而是在其参数中放置一个值。
我相信你想要
exp_mb.get(x) ;
act_mb.get(y);
此外,一个好主意是将类型添加到您的邮箱中。随着代码的增长和不同数据包类型的数量的增长,它将对获取编译错误而不是运行时错误非常有帮助。
mailbox #(packet) exp_mb = new(256);
mailbox #(packet) act_mb = new(256);
...
task check(mailbox #(packet) exp_mb ,act_mb);