System verilog 如何使用另一个随机参数对参数进行随机化?

System verilog 如何使用另一个随机参数对参数进行随机化?,system-verilog,System Verilog,我试图将一个随机参数写入我的程序,但我的程序的某个参数将使用其他参数作为范围。我试图从网上获取,但无法获取。然后,我决定来这里问一下。 希望有人能帮忙 rand bit COMMON_CLK; rand int DEPTH; rand int DATA_WIDTH rand int PROG_FULL_ASSERT; rand int PROG_FULL_NEGATE; rand int PROG_EMPTY_ASSERT; rand int PROG_EMPTY_NEGATE; constra

我试图将一个随机参数写入我的程序,但我的程序的某个参数将使用其他参数作为范围。我试图从网上获取,但无法获取。然后,我决定来这里问一下。 希望有人能帮忙

rand bit COMMON_CLK;
rand int DEPTH;
rand int DATA_WIDTH
rand int PROG_FULL_ASSERT;
rand int PROG_FULL_NEGATE;
rand int PROG_EMPTY_ASSERT;
rand int PROG_EMPTY_NEGATE;
constraint DEPTH {
      DEPTH inside {[16:100000]};
      DATA_WIDTH inside {[1:1024]};
      }
   constraint ASSERT {
      PROG_FULL_ASSERT inside {[1:DEPTH.size]};
      }
   constraint NEGATE {
      PROG_FULL_NEGAT inside {(1:PROG_FULL_ASSERT.size]};
      }
   constraint ASSERT {
      PROG_EMPTY_ASSERT inside {[1:((DEPTH.size) - 1)]};
   }
   constraint NEGATE {
      PROG_EMPTY_NEGATE inside {[(PROG_EMPTY_ASSERT.size) : ((DEPTH.size) - 1)]};         
   }

首先,正如Dave_59所指出的,深度。大小即使做了合法的事情也不是好代码。 第二,如果您想要类似于{[1:DEPTH]}内的
PROG_FULL_ASSERT
您可能希望在PROG\u FULL\u ASSERT之前添加
求解深度
,以避免分发问题

最后,根据我的经验,有时在
post.randomize()
中对某些事情进行随机处理会更好,或者至少更容易。这是假设没有其他东西依赖于他们。例如:

int array; 
rand int array_size;
constraint {array_size inside [100000:200000];}

void function post_randomize();
  array = new[array_size];
  array_data_randomization_function();
endfunction

这并不总是一个好主意,因为它增加了以后添加随机变量的风险,这些随机变量依赖于后随机变量(数组),但它确实将随机性分解为两个独立的操作,使代码更容易理解,在大量随机的情况下,也会使计算速度更快。

您不能有与其他约束同名的约束。确保每个约束都有唯一的名称。没有
int
变量的大小方法。也许你的意思是,
$bits()
@dave\u 59没有int变量的size方法,那么为什么size方法建议为100000?我不理解你的问题。也许你可以给我们一些你正在寻找的值的示例集。好的。谢谢你的帮助,我已经得到了其他的帮助