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