繁体   English   中英

SystemVerilog中类内部的类对象的随机化

[英]Randomization of a class object inside a class in SystemVerilog

class c2;
  rand bit[1:0] a;
  rand bit[1:0] b;

  function void my_print();
    $display("a = %b", a);
    $display("b = %b", b);
  endfunction   
endclass

class c1;
  rand bit[1:0] i;
  rand bit[1:0] j;
  rand c2 o2;

  function new();
    o2 = new();
  endfunction

  function void my_print();
    $display("i = %b", i);
    $display("j = %b", j);
  endfunction
endclass

program p1;   
  c1 o1 = new;
  c2 o2_local = new;

  initial begin
  if (o1.randomize() with {o2 == o2_local;}) begin
    o1.my_print();
    o2.my_print();
  end
endprogram

在此程序中,o1.randomize()的随机化操作失败。 如果我将o2的各个变量用作变量并对其使用内联约束(例如o2.a == o2_local.a),则它可以工作。

有没有其他方法可以进行这种类型的随机化,因为我的原始班级包含将近38个变量,并且个人分配会很麻烦。

当将==运算符应用于对象时,它不会执行您认为的操作。 它仅比较手柄。 求解器失败,因为它发现o1.o2o2_local是不同的对象,因此不是“相等”的。

如果不应该通过随机更改o2_local则可以执行以下操作:

o1.o2 = o2_local;
o1.o2.rand_mode(0);
if (o1.randomize()) begin
  o1.print();
  o1.o2.print();
end
o1.o2.rand_mode(1);

这样,您已经将o2_local分配给了o2并且如果您有任何引用o2o1字段的约束,那么它们将得到解决。

对象等效性的问题是所有OOP语言的症状。 您需要一个将对象的所有字段都考虑在内的函数,以确定两个对象是否相等:

class c2;
  // ...

  function bit equals(c2 obj);
    return a == obj.a && b == obj.b;
  endfunction
endclass

该函数在过程代码中可以正常工作,但由于在约束中使用函数比较棘手,因此无法帮助您进行随机化。

一个丑陋的解决方案是声明一个扩展为equals(...)函数主体的宏,因为展开==语句将在约束条件下工作。

如果需要将c2类中的所有变量随机化为“ with”,因为“ with”仅用于约束某些值,因此没有太大的影响,一种简单的方法可以进行所有变量随机化,因此我怀疑LRM不会这样做。谈论嵌套类的内联约束

 initial begin
  if (o1.randomize()) begin
     if (o2_local.randomize()) begin
       o1.my_print();
       o2_local.my_print();
     end
  end
  else $fatal ("Randomize failed");
  end
endprogram

正如您已经了解了如何约束每个变量一样,如果仅内联约束特定值,这将有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM