SystemVerilog Constraints

1 Constraints Overview

1.1什么是直接测试?

验证工程师将首先创建验证计划,详细说明在RTL仿真中需要测试的设计的每个功能,以及每个测试将如何创建针对特定功能的独立场景。例如,如果有一个外设需要配置其寄存器以启动 AXI 总线事务,那么我们将进行不同的测试,以不同的方式配置这些寄存器并实现良好的覆盖率。这些是直接测试,其中每个测试执行特定任务来完成某些任务。

1.2什么是随机测试?

复杂的设计有很多场景和许多极端情况,通过随机测试可以更好地验证,并且花费更少的精力和时间。以上面的相同示例为例,每次使用不同的种子运行测试时,测试将使用随机值配置外围寄存器,从而为每次运行实现不同的方案。这将确保我们遇到极端情况并发现任何隐藏的错误。

1.3约束

SystemVerilog 允许用户以紧凑的声明性方式指定约束,然后由内部求解器处理这些约束,以生成满足所有条件的随机值。基本上,约束只不过是一种让我们定义应该为随机变量分配哪些合法值的方法。正态变量由关键字声明为随机变量。

class Pkt;
    rand bit [7:0]addr;
    rand bit [7:0]data;
    
    constraint addr_limit{ addr <= 8'hB;}
endclass

上面的示例声明了一个调用的 Pkt,并对其地址字段进行了约束。请注意,它的两个属性都以关键字为前缀,该关键字告诉求解器在被要求时应随机化这些变量。该约束称为 addr_limit,并指定求解器可以为地址分配小于或等于 8'h8 的任何随机值。由于 8 位变量 addr 的类型为 ,它可以具有 0 到 255 之间的任何值,但使用约束时,有效值将限制为 11。

如您所见,这个强大的功能将使我们能够创建约束在对设计有效的范围内的变量,并将产生更好的验证效果。在接下来的几个会话中,我们将了解如何有效地使用 SystemVerilog 中的不同构造,这些构造使我们能够以更好的方式描述约束。

2 Rand Variables

2.1rand

class Packet;
    rand int count;
    rand byte master[$];
    rand bit [7:0] data[];

endclass

让我们取一个简单的类,其中包含一个名字为data 的3位变量,该变量随机化10次。该函数作为类对象的一部分调用,以随机化该类对象中的所有类型变量。

class Packet;
    rand bit [2:0] data;
endclass

module tb;
    initial begin
        Packet pkt = new();
        for(int i = 0; i<10;i++)begin
            pkt.randomize();
            $display("itr=%0d data=0×%0d", i, pkt.data);
        end
    end
endmodule
/*simulation log
run -all;
#KERNEL: itr=0 data=0×7
#KERNEL: itr=1 data=0×2
#KERNEL: itr=2 data=0×2
#KERNEL: itr=3 data=0×1
#K
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值