我想编写一个约束来确保只有在r_addr
之前使用同一地址时才允许w_addr
,但是下面的约束不起作用,你有什么建议吗?它?
class try;
rand int w_addr;
rand int r_addr;
int ua[$];
int aa[int];
constraint unique_addr_c{
aa.size() == 0 || aa.exists(r_addr);
}
endclass
module test;
try a;
initial begin
a=new;
repeat(20) begin
if(a.randomize);
$display("add=%0d", a.w_addr);
$display("add=%0d", a.r_addr);
a.ua.push_back(a.w_addr);
a.aa[a.w_addr] = 1;
end
end
endmodule
答案 0 :(得分:1)
您想使用inside
运算符。
class try;
rand bit [31:0] w_addr;
rand int [31:0] r_addr;
bit [31:0] ua[$];
constraint unique_addr_c{
ua.size() >0 -> r_addr inside {ua};
}
function void post_randomize();
ua.push_back(w_addr);
endfunction
endclass
module test;
try a;
initial begin
a=new;
repeat(50) begin
if (!a.randomize) $error("randomization failed");
$display("wadd=%0d", a.w_addr);
$display("radd=%0d", a.r_addr);
end
end
endmodule
注意:您应该使用无符号类型的地址。您的随机检查应该会产生错误。
答案 1 :(得分:0)
戴夫的回答很棒。
这是另一个使用队列而不是关联数组的人。
class try;
rand int w_addr;
rand int r_addr;
int q[$];
function void post_randomize();
int sz;
int idx;
q.push_back(w_addr);
sz = q.size();
idx = $urandom_range(0, sz-1);
r_addr = q[idx];
endfunction
endclass
module test;
try a;
initial begin
a=new;
repeat(20) begin
a.randomize();
$display("sz=%0d w_addr=%x r_add=%x", a.q.size(), a.w_addr, a.r_addr);
end
end
endmodule