System verilog systemverilog中pre_randomize()和post_randomize()的常见用法和良好用法是什么?
如何在System verilog systemverilog中pre_randomize()和post_randomize()的常见用法和良好用法是什么?,system-verilog,System Verilog,如何在pre\u randomize()中更改/添加约束或约束模式? 我知道我可以在post_randomize中覆盖结果,也可以在pre_randomize中打开和关闭rand_模式,但我正在寻找一些额外的功能,特别是与约束相关的功能。pre_randomize通常用于在对象随机化之前设置一些先决条件。这里可以打印先前随机化的结果,设置约束依赖的一些变量等 正如您所提到的,pre\u randomize可用于为任何变量设置rand\u模式(0)。它也可用于操纵约束 post_randomize
pre\u randomize()
中更改/添加约束或约束模式?
我知道我可以在
post_randomize
中覆盖结果,也可以在pre_randomize
中打开和关闭rand_模式,但我正在寻找一些额外的功能,特别是与约束相关的功能。pre_randomize
通常用于在对象随机化之前设置一些先决条件。这里可以打印先前随机化的结果,设置约束依赖的一些变量等
正如您所提到的,pre\u randomize
可用于为任何变量设置rand\u模式(0)
。它也可用于操纵约束
post_randomize
用于操作一些变量,如ECC检查、打印随机化结果、基于现有随机化操作一些非随机化字段等
post_randomize
的另一个用法是在随机化过程中生成“x”或“z”。默认情况下,随机化仅生成0
和1
已知值。但也可以使用现有的随机变量生成x
/z
值
下面是一个虚拟示例,说明我们可以在pre_randomize
和post_randomize
函数中执行哪些操作。在这里,根据非随机变量
,我们可以启用/禁用约束模式并设置任何变量的随机模式。在后随机函数中,可以通过“x”或“z”覆盖我的x”变量
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
pre_randomize
通常用于在对象随机化之前设置一些前置条件。这里可以打印先前随机化的结果,设置约束依赖的一些变量等
正如您所提到的,pre\u randomize
可用于为任何变量设置rand\u模式(0)
。它也可用于操纵约束
post_randomize
用于操作一些变量,如ECC检查、打印随机化结果、基于现有随机化操作一些非随机化字段等
post_randomize
的另一个用法是在随机化过程中生成“x”或“z”。默认情况下,随机化仅生成0
和1
已知值。但也可以使用现有的随机变量生成x
/z
值
下面是一个虚拟示例,说明我们可以在pre_randomize
和post_randomize
函数中执行哪些操作。在这里,根据非随机变量
,我们可以启用/禁用约束模式并设置任何变量的随机模式。在后随机函数中,可以通过“x”或“z”覆盖我的x”变量
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
pre_randomize
和post_randomize
函数根据应用程序可以有多种用途
下面列出了这些函数的几种用法
- 这两个函数都可以重写,因此可以使用扩展类修改随机化行为
- 打开/关闭几个随机变量
- 启用/禁用几个约束
- 分配给随机化依赖的其他非随机变量
- 根据一定条件改变随机变量的权重
pre_随机化
函数的典型用法是生成一个唯一值数组
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
pre_randomize
和post_randomize
函数根据应用程序可以有多种用途
下面列出了这些函数的几种用法
- 这两个函数都可以重写,因此可以使用扩展类修改随机化行为
- 打开/关闭几个随机变量
- 启用/禁用几个约束
- 分配给随机化依赖的其他非随机变量
- 根据特定条件改变随机变量的权重
pre_随机化
函数的典型用法是生成一个唯一值数组
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