我们知道virtual来修饰子函数,可以让基类的指针指向扩展类,从而利用基类中的virtual函数可以复用扩展类中的同名函数。但是constrain呢?本小结就来详细说明一下constrain。
我们通过一个例子来简单声明一下:
class bird;
rand bit [1:0] src;
rand bit [1:0] drc;
constraint src_stim{src ==3;}
constraint drc_stim{drc ==1;};
endclass
class parrot extends bird;
constraint drc_stim{drc ==2;};
endclass
program ex6_14_tb;
bird A;
parrot B;
initial begin
A = new();
B = new();
assert(A.randomize());
$display("A:src=%0d,drc=%0d",A.src,A.drc);
assert(B.randomize());
$display("A:src=%0d,drc=%0d",A.src,A.drc);
end
endprogram
打印结果是:
A:src=3,drc=1
B:src=3,drc=2
class bird;
rand bit [1:0] src;
rand bit [1:0] drc;
constraint src_stim{src ==3;}
constraint drc_stim{drc ==1;};
endclass
class parrot extends bird;
constraint drc_stim{drc ==2;};
endclass
program ex6_14_tb;
bird A;
parrot B;
initial begin
A = new();
B = new();
A = B;
assert(A.randomize());
$display("A:src=%0d,drc=%0d",A.src,A.drc);
assert(B.randomize());
$display("A:src=%0d,drc=%0d",A.src,A.drc);
end
endprogram
打印结果:
A:src=3,drc=2
B:src=3,drc=2
class bird;
rand bit [1:0] src;
rand bit [1:0] drc;
constraint src_stim{src ==3;}
constraint drc_stim{drc > 1;
drc < 6;};
endclass
class parrot extends bird;
constraint drc_stim{drc ==2;};
endclass
program ex6_14_tb;
bird A;
parrot B;
initial begin
A = new();
B = new();
assert(A.randomize() with {drc ==3;});
$display("A:src=%0d,drc=%0d",A.src,A.drc);
assert(B.randomize());
$display("A:src=%0d,drc=%0d",A.src,A.drc);
end
endprogram
打印结果:
A:src=3,drc=3
B:src=3,drc=2
randomize() with {} 是求解drc>1;drc<6;以及drc == 3的交集;
如果with里面的东西与原来的约束没有交集的话,那么会显示约束求解错误。
那么比如说我就有这样的需求呢?有两种解决方案:
方案一:
class bird;
rand bit [5:0] src;
rand bit [5:0] drc;
constraint src_stim{src ==3;}
constraint drc_stim{
drc > 1;
soft drc < 6;}; //******************
endclass
class parrot extends bird;
constraint drc_stim{drc ==2;};
endclass
program ex6_14_tb;
bird A;
parrot B;
initial begin
A = new();
B = new();
assert(A.randomize() with {drc ==7;});
$display("A:src=%0d,drc=%0d",A.src,A.drc);
assert(B.randomize());
$display("A:src=%0d,drc=%0d",A.src,A.drc);
end
endprogram
打印结果:
A:src=3,drc=7
B:src=3,drc=2
方案二:
class bird;
rand bit [5:0] src;
rand bit [5:0] drc;
constraint src_stim{src ==3;}
constraint drc_stim{
drc > 1;
drc < 6;};
endclass
class parrot extends bird;
constraint drc_stim{drc ==2;};
endclass
program ex6_14_tb;
bird A;
parrot B;
initial begin
A = new();
B = new();
A.drc_stim.constraint_mode(0); //*****************//
assert(A.randomize() with {drc ==7;});
$display("A:src=%0d,drc=%0d",A.src,A.drc);
assert(B.randomize());
$display("A:src=%0d,drc=%0d",A.src,A.drc);
end
endprogram
打印结果:
A:src=3,drc=7
B:src=3,drc=2
原文:https://www.cnblogs.com/xuqing125/p/14772144.html