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


前言

本节记录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.2 $urandom_range()

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

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.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中的约束随机相关的基础知识。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值