class ns_data_struct;
rand bit [63:0] ns_size = 64'h0000_0000_0000_0800;
endclass : ns_data_struct
class conf;
ns_data_struct ns_data[];
function new();
ns_data = new[5];
foreach (ns_data[i])
ns_data[i] = new();
endfunction
endclass : conf
class x;
randc bit [63:0] slba;
randc bit [63:0] nlb;
bit [63:0] slba_previous [bit [31:0]][bit [63:0]];
conf cfg;
bit [31:0] nsid = 'h1;
bit [63:0] num [bit [31:0]];
constraint slba_nlb_inside_ns_c
{
slba inside {[1:cfg.ns_data[nsid-1].ns_size]};
nlb inside {[0:(cfg.ns_data[nsid-1].ns_size - slba)]};
}
constraint slba_nlb_non_overlapping_c
{
foreach(slba_previous[nsid, i])
{
if(!(i%2))
{
slba < slba_previous[nsid][i] -> (slba + nlb) < slba_previous[nsid] [i];
slba > slba_previous[nsid][i] -> slba > slba_previous[nsid][i+1]; // <-- Warning Here
slba > slba_previous[nsid][i+1] -> (slba + nlb) > slba_previous[nsid][i+1]; // <-- Warning Here
slba < slba_previous[nsid][i+1] -> slba < slba_previous[nsid][i]; // <-- Warning Here
}
}
}
function void post_randomize();
num[nsid] = (num.exists(nsid))?(num[nsid]):0;
slba_previous[nsid][num[nsid]++] = slba;
slba_previous[nsid][num[nsid]++] = (slba + nlb);
$display("\nslba_previous - %p\n", slba_previous);
endfunction
function new (input conf _cfg);
this.cfg = _cfg;
endfunction: new
endclass : x
program p1;
conf c;
x t;
initial
begin
c = new;
t = new(c);
t.nsid = 3;
for(int i=0; i<15; i++)
begin
if(!t.randomize())
$display("ERROR : Starting LBA & NLB Provider Randomization Failed");
$display("@%0t : KARAN, Starting LBA - %0h %0d", $time, t.slba, t.slba);
$display("@%0t : KARAN, Number of LBA - %0h %0d", $time, t.nlb, t.nlb);
end
end
endprogram
在这段代码中,我在 QuestaSIM 中面临 2 个问题。
在约束中,我使用了 (i%2),但它仍然显示此警告:
警告:(vsim-3829)不存在的关联数组条目。返回默认值。
如何在约束中循环遍历二维关联数组中的低维?
foreach(slba_previous[, i])
不管用。