class data_s;
int c=5;
endclass
class config_c;
data_s format[];
rand int num_supp = 5;
function new();
format = new[num_supp];
foreach(format[i])
format[i] = new();
endfunction
endclass
class packet;
rand int nsid;
rand int a;
rand int b;
endclass
program p;
packet p = new;
config_c conf = new;
initial begin
p.randomize() with {nsid < (conf.num.supp + 1);
nsid > 0;
if(a < conf.format[nsid - 1].c)
b=0;
else
b=1;
}
end
endprogram
在这段代码中,我遇到了致命的错误,因为nsid不在num_supp的范围内,因此在if条件下它试图访问一个未创建的对象(如格式[32'hb235_44d5])。
“在b之前解决nsid”也无效。
我可以使用if条件,在randomize函数之外它可能有效,但是这个问题在随机函数中可以解决什么?
答案 0 :(得分:4)
问题SystemVerilog不允许您使用带有随机变量的表达式作为数组的索引。您需要根据 foreach 循环来设置约束。此外 - 解决前指令不会更改解决方案空间,只会选择作为解决方案选择的值的分布。
class data_s;
bit [31:0] c=5;
endclass
class Config;
data_s format[];
rand int num_supp = 5;
function new();
format = new[num_supp];
foreach(format[i])
format[i] = new();
endfunction
endclass
class packet;
rand bit [31:0] nsid;
rand bit [31:0] a,b;
endclass
module top;
packet p = new;
// Some other stuff
Config conf=new();
initial begin
p.randomize() with {nsid < (conf.num_supp + 1);
foreach (conf.format[i])
i == (nsid -1) ->
if(a < conf.format[i].c)
b==0;
else
b==1;
};
$display("%p",p);
end
endmodule