如何在dependencies {
...
}
apply plugin: 'com.google.gms.google-services'
中更改/添加约束或constraint_mode?
我知道我可以覆盖pre_randomize()
中的结果,我可以在post_randomize
中打开和关闭rand_mode,但我正在寻找一些特别与约束相关的其他功能。
答案 0 :(得分:3)
pre_randomize
通常用于在对象随机化之前设置一些前置条件。在这里,可以打印先前随机化的结果,设置一些约束依赖的变量等。
正如您所提到的,pre_randomize
可用于为任何变量设置rand_mode(0)
。它也可以用来操纵约束。
post_randomize
用于操纵某些变量,如ECC检查,打印随机化结果,根据现有随机化操作一些非随机字段< / strong>等等。
post_randomize
的另一种用法是在随机化过程中生成'x'或'z'。默认情况下,随机化仅生成0
和1
个已知值。但是,也可以使用现有的随机变量生成x
/ z
值。
以下是我们在pre_randomize
和post_randomize
函数中可以执行的操作的虚拟示例。在这里,根据non_rand_var
,我们可以启用/禁用约束模式并设置任何变量的rand模式。在 post_randomize函数中,可以覆盖' my_x'变量byt'x'或'z'。
class A;
int non_rand_var;
rand int rand_var;
rand int rand_var2;
rand logic my_x;
constraint c1{non_rand_var==1 -> rand_var=='h5;}
function new(int non_rand_var);
this.non_rand_var = non_rand_var; // set non random variable
endfunction
function void pre_randomize();
if(non_rand_var==5) begin // set randomization mode of rand_var2
rand_var2.rand_mode(0);
c1.constraint_mode(0); // disable constraint
end
$display("In pre randomize, non_rand_var=0x%0x rand_var=0x%0x",non_rand_var, rand_var);
endfunction
function void post_randomize();
// my_x = $urandom_range(0,1) ? 0 : 'x;
my_x = (non_rand_var==1) ? 0 : 'x; // Manipulate my_x to generate 'x' values
$display("In post randomize, rand_var=0x%0x",rand_var);
endfunction
endclass
module top();
A a=new(1);
initial begin
a.randomize();
$display("Initial block:\na.my_x = 0x%0x\na.rand_var=0x%0x\na.non_rand_var=0x%0x\na.rand_var2=0x%0x",a.my_x,a.rand_var,a.non_rand_var,a.rand_var2);
end
endmodule
答案 1 :(得分:0)
pre_randomize
&amp; post_randomize
函数可以根据应用程序有多种用途。
以下是这些功能的少数用法列表。
pre_randomization
函数的典型用法是生成一组唯一值。
class helper;
randc bit [7:0] a;
endclass
class original;
bit [7:0] unique[64];
function void pre_randomize();
helper h = new();
foreach (unique[i])
begin
void'(h.randomize());
unique[i] = h.a;
end
endfunction
endclass