谈一谈SystemVerilog的randomize

提到systermverilog,最常接触的就是随机,与随机紧密相关的函数就是randomize,但是实际上我们又对randomize知道多少呢?本章节我们就梳理一下randomize()的坑。

一些之前踩过的坑:https://www.cnblogs.com/xuqing125/p/15772001.html

从下面几个例子入手:

例子一:randomize的正常使用。

  • 基类bird有自己的随机变量:src/drc
  • 扩展类parr有单属于自己的随机变量:a/b
仿真结果

例子二:A = B

  • A = B;
  • 仅仅对A.randomize()
仿真结果
  • 基类的句柄A指向的是扩展类的对象B.
  • A.randomize(),从结果来看B(a/b)也进行了随机化.randomize()其实就是类似于virtual的function。

例子三:A= B,A.randomize() with {a ==2 ;};

  • 结果会报错,究其原因基类的句柄不能访问扩展类对象里面独有的变量。
  • https://www.cnblogs.com/xuqing125/p/15931202.html
  • https://www.cnblogs.com/xuqing125/p/15934714.html
  • 这其实也是UVM中引入p_sequencer的原因所在。

解决方法:将基类句柄转换成扩展类的类型。

image.png

注意:这个在sequence中需要尤其注意,因为seq中涉及到随机化。

你可能感兴趣的:(谈一谈SystemVerilog的randomize)