在systemverilog中随机化对象队列

时间:2018-03-07 11:19:13

标签: class random queue system-verilog

我已经看过用于随机化整数值队列的技术,但是我遇到了对象队列的困难。示例代码:

class int_queue_class;
  rand int x[$];

  function void print;
    $display($sformatf("Size: %0d", x.size()));
    foreach(x[i])
      $display($sformatf("x[%0d] = %0d", i, x[i]));
  endfunction : print

endclass : int_queue_class


class obj;
  rand int value;
endclass : obj

class obj_queue_class;
  rand obj x[$];

  function void print;
    $display($sformatf("Size: %0d", x.size()));
    foreach(x[i])
      $display($sformatf("x[%0d] = %0d", i, x[i].value));
  endfunction : print

endclass : obj_queue_class


program top();
  initial
  begin
    int_queue_class iqc;
    obj_queue_class oqc;
    iqc = new();
    iqc.randomize() with {x.size() == 5; x[2] == 5;};
    iqc.print();
    oqc = new();
    oqc.randomize() with {x.size() == 5; x[2].value == 5;};
    oqc.print();
  end
endprogram : top

对于对象,似乎不能使用相同的方法。有没有办法随机化这样的队列,同时保持同时约束队列大小和单个元素字段的能力?我提出的使用前/后随机化方法的想法都至少松开了这两个选项中的一个。

1 个答案:

答案 0 :(得分:1)

随机化不会创建新对象。随机化队列大小时,它将创建包含默认值的新条目,类类型为null

您唯一能做的就是在队列中预先分配对象,以备不时之需。您无法随机化更多的对象而不是最初创建的对象,因此这限制了队列大小的值:

class obj_queue_class;
  rand obj x[$];
  local const max_size;

  constraint legal_size {
    x.size() <= max_size;
  }

  function void pre_randomize();
    x = new[max_size];
    foreach (x[i])
      x[i] = new();
  endfunction

  function void print();
    $display($sformatf("Size: %0d", x.size()));
    foreach(x[i])
      $display($sformatf("x[%0d] = %0d", i, x[i].value));
  endfunction

endclass

我已将max_size设为局部常量值,但它可以是您可以从外部设置的内容,包参数等。

pre_randomize()中,您实例化max_size个对象。由于x.size()始终小于或等于max_size,因此随机化的任何值都将导致包含对象实例且不为null的队列。当队列缩小时,其余的对象将被抛弃。