在生成期间从随机化中排除某些字段 运行

Exclude some fields from randomization during a generation run

我不想根据在同一随机化过程中本身确定的特定条件将某些字段排除在随机化之外 运行。这意味着我不能使用 rand_mode(0) 因为这需要在调用 randomize().

之前调用

这里有一个简单的例子来说明我的意思。假设我有一个 class,它有 2 个整数字段和一个布尔值,它决定是随机化第二个字段还是保持其值不变(即调用 randomize() 之前的值):

class some_item;
  rand bit do_rand_other_field;
  rand int some_field;
  rand int some_other_field;

  // ...
endclass

我唯一能想到的就是声明一个额外的本地字段,它将在随机化之前存储 some_other_field 的值 运行:

class some_item;
  // ...

  local int some_other_field_init;

  function void pre_randomize();
    some_other_field_init = some_other_field;
  endfunction

  // ...
endclass

do_rand_other_field不成立时,我只是约束该字段取其初始值:

class some_item;
  // ...

  constraint randomize_some_other_field {
    if (!do_rand_other_field)
      some_other_field == some_other_field_init;
  }

  // ...
endclass

这行得通,但如果我有很多这样的条件随机化字段,存储和复制它们的效率就会降低。我可以将这些 "initial" 字段声明为 static,这将减少内存消耗,但复制的 运行 时间惩罚仍然存在。

随机化引擎必须将这些值存储在某个地方,因为在约束矛盾的情况下它将 return 未随机化的对象。我想找到一种方法来利用这些价值。有没有我忽略的语言功能可以帮助我做到这一点?

据我了解,pre/post_randomize 并不总是被调用。同样来自 Mentor Graphics,他们建议避免使用它们。对于您的情况,是否可以按顺序放置最后一笔交易的价值?对序列项进行正常随机化。然后检查该字段以决定是否需要用旧值覆盖另一个字段。

SystemVerilog 中没有任何功能可以在不复制您可能想要维护的状态或分成独立的随机化(单独的随机 class 对象或相同的 2-pass 的情况下执行您要求的操作对象)

SystemVerilog 中的约束求解器在概念上首先构建整个解决方案 space,然后随机选择其中一个解决方案。在解决方案 space 构建过程中,您不能动态更改其中一个变量的随机性。

我想 SystemVerilog 可以得到增强,这样引用随机变量的先前值可以在约束中用作状态变量,但这对您来说无论如何都需要几年的时间。