当前位置:   article > 正文

SystemVerilog约束随机(一)基本介绍_systemverilog urandom_range

systemverilog urandom_range


前言

本节记录SystemVerilog约束随机的基础的知识。更多相关内容参考《IEEE Std 1800™-2012, IEEE Standard for SystemVerilog—Unified Hardware Design, Specification, and Verification Language》。


1 Randomization basics

SystemVerilog提供了多种方法来生成和操作随机数据。

1.1 $urandom()

  • $urandom():系统函数用来生成无符号的随机数。该函数接受一个参数“seed”(可以是任何整数表达式),生成随机数序列。该函数每次不带seed实参调用时,返回一个新的32位无符号随机整数。当提供固定的种子实参时,每次调用$urandom()时(每次仿真时,不管初始模拟种子是什么),RNG都将生成相同的随机数序列。
function int unsigned $urandom [ (int seed ) ]
  • 1

1.2 $urandom_range()

  • $urandom_range():系统函数返回指定范围内的无符号整数。
function int unsigned $urandom_range(int unsigned maxval, int unsigned minval = 0 )
  • 1

1.3 randomize()

  • randomize():内置类方法,用于根据预先设置的约束对带有rand/randc限定符的字段进行随机化。当不带参数调用时,它将递归随机化类中的所有随机变量。它可以被调用来随机化特定的变量(可以用rand限定符定义,也可以不定义),同时保持所有预定义的约束条件都是可满足的。当使用" null "参数调用randomize()方法时,可以将其用作约束检查器。

    1. pre_randomize()虚方法在随机化过程之前被调用。该方法可以被用户覆盖。
    2. randomize()方法是内置的,不能被重写。
    3. 在成功的随机化过程之后调用post_randomize()方法。该方法可以被用户覆盖。
    4. 当randomize()失败时,随机变量将保留其旧值。
    5. 可以调用rand_mode()方法来启用/禁用随机变量。当使用0/1参数调用时,它将禁用/启用一个随机变量(当调用随机变量时)或所有类随机变量(当调用类对象时)。在不带参数调用时获取随机状态。
    6. 可以使用" with "子句接受内联约束。
class Bus;
    randc bit [15:0] addr;
    rand bit [31:0] data;
    int pkt_number;
    constraint word_align {addr[1:0] == 2’b0;}
endclass
Bus busA = new;
repeat (50)
    if ( busA.randomize() == 1 )
        $display("addr = %h data = %h",busA.addr,busA.data);
    else
        $display("Randomization FAILED");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

1.4 std::randomize()

  • std::randomize(): 可在类作用域外调用,以随机化非类成员。可以使用" with "子句接受内联约束。
    更多使用场景可以参考如下链接:
    在sequence中对变量随机

2 Constraints and solution space

  • 约束可以定义为类的显式属性,也可以通过randomize()调用内联指定。

  • 约束条件是求解器需要保持为真的表达式。约束表达式包括随机变量、非随机状态变量、操作符、分布、字面量和常量。

  • 约束操作符:

    1. Set membership: “inside”
    2. Implication: “->”
    3. Distribution/weighting: “dist”
    4. Iteration: “foreach”
    5. Conditional: “if…else”
    6. Probability and distribution: “solve…before”
  • 约束表达式有一定的局限性:

    1. 函数。不能有output或者ref的参数。变量必须是automatic。不能使用rand_mode()或者constraint_mode()。
    2. 操作符。不能使用++或者–这样的操作符。
    3. 随机循环变量(randc)不能在solve … before算子中使用。
    4. dist构造是一个约束表达式,不能出现在其他表达式中。
    5. 约束只支持2状态整数值。不支持X和Z。
    6. 不支持4状态操作符如=== 或者 !==。

具体可以查看SystemVerilog约束随机(二)


总结

本文主要简单的记录一下,SystemVerilog中的约束随机相关的基础知识。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/533904
推荐阅读
相关标签
  

闽ICP备14008679号