Systemverilog中的随机化顺序

时间:2015-05-07 16:07:32

标签: verilog system-verilog

class data_s;
  int c=5;
endclass

class config_c;
  data_s format[];
  rand int num_supp = 5;

  function new();
    format = new[num_supp];
    foreach(format[i])
      format[i] = new();
  endfunction
endclass

class packet;
  rand int nsid;
  rand int a;
  rand int b;  
endclass

  program p;
     packet p = new;
     config_c conf = new;

     initial begin
       p.randomize() with {nsid < (conf.num.supp + 1);
                      nsid > 0;
                      if(a < conf.format[nsid - 1].c)
                        b=0;
                      else
                        b=1;
                     } 
     end
 endprogram

在这段代码中,我遇到了致命的错误,因为nsid不在num_supp的范围内,因此在if条件下它试图访问一个未创建的对象(如格式[32'hb235_44d5])。

“在b之前解决nsid”也无效。

我可以使用if条件,在randomize函数之外它可能有效,但是这个问题在随机函数中可以解决什么?

1 个答案:

答案 0 :(得分:4)

问题SystemVerilog不允许您使用带有随机变量的表达式作为数组的索引。您需要根据 foreach 循环来设置约束。此外 - 解决前指令不会更改解决方案空间,只会选择作为解决方案选择的值的分布。

class data_s;
  bit [31:0] c=5;
endclass

class Config;
  data_s format[];
  rand int num_supp = 5;

  function new();
    format = new[num_supp];
    foreach(format[i])
      format[i] = new();
  endfunction
endclass

class packet;
  rand bit [31:0] nsid;
  rand bit [31:0] a,b;
endclass

module top;

   packet p = new;

   // Some other stuff
Config conf=new();
initial begin
  p.randomize() with {nsid < (conf.num_supp + 1);
                      foreach (conf.format[i])
              i == (nsid -1) ->
                      if(a < conf.format[i].c)
                        b==0;
                      else
                        b==1;
                      };
   $display("%p",p);
   end

endmodule