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

System verilog 在生成运行期间从随机化中排除某些字段,system-verilog,System Verilog,我不想基于在同一随机化运行过程中确定的特定条件而将某些字段排除在随机化之外。这意味着我不能使用rand\u模式(0),因为在调用randomize()之前需要调用它 这里有一个简单的例子来说明我的意思。假设我有一个类,它有两个整型字段和一个布尔值,决定是将第二个字段随机化还是将其值保持不变(即调用randomize())之前的字段): 我唯一能想到的是声明一个额外的本地字段,它将在随机运行之前存储some\u other\u field的值: class some_item; // ...

我不想基于在同一随机化运行过程中确定的特定条件而将某些字段排除在随机化之外。这意味着我不能使用
rand\u模式(0)
,因为在调用
randomize()
之前需要调用它

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

我唯一能想到的是声明一个额外的本地字段,它将在随机运行之前存储
some\u other\u field
的值:

class some_item;
  // ...

  local int some_other_field_init;

  function void pre_randomize();
    some_other_field_init = some_other_field;
  endfunction

  // ...
endclass
do\u rand\u other\u字段
不为真时,我只会约束该字段取其初始值:

class some_item;
  // ...

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

  // ...
endclass
这是可行的,但如果我有许多这样的条件随机字段,那么存储和复制它们可能会变得效率低下。我可以将这些“初始”字段声明为
static
,这将减少内存消耗,但复制的运行时惩罚仍然存在


随机化引擎必须将这些值存储在某个位置,因为在约束矛盾的情况下,它将返回未随机化的对象。我想找到一种方法来挖掘这些价值。语言中有什么我忽略的功能可以帮助我做到这一点吗?

据我所知,pre/post\u randomize并不总是被称为。同时,从Mentor Graphics来看,他们建议避免使用它们。对于您的情况,是否可以将最后一个事务的值按顺序排列?对序列项进行正常的随机化。然后检查该字段,以确定是否需要使用旧值覆盖另一个值。

SystemVerilog中没有任何功能可以执行您要求的操作,而无需复制您可能要维护的状态,或将其分离为独立的随机化(分离随机类对象或对同一对象进行2次传递)

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


我认为SystemVerilog可以得到增强,这样引用随机变量的前一个值就可以在约束中用作状态变量,但无论如何,这都需要几年的时间。

可以在EDAPlayde上找到一个运行示例:我不想做2次随机。Hi@Tudor。对不起,我的英语很差,我不知道你说的“2次随机分组”是什么意思。我只是在这里放了一个修改过的代码,你可以看看。二次随机化是指当你先随机化对象的一部分,然后再运行一次随机化,然后再随机化。我检查了你的代码,它基本上是一样的(副本),只是你把字段放在了其他地方。我猜您这样做是为了避免使用
pre\u randomize()
。不总是调用的是
post\u randomize()
(以防随机化失败)。而且,这样做很难封装。如果我想在一些完全不同的范围内随机分组呢?这是我所期望的,但我想从马的嘴里听到。今天对科学来说不是个好日子。
class some_item;
  // ...

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

  // ...
endclass