System Verilog 约束技巧

System Verilog的约束与随机

约束

  • 简单表达式:一个表达式中最多只能使用一个关系操作符,约束块里只能包含表达式,所以在约束块里不能进行赋值。

  • 权重分布:dist

    src dist {0:40,[1:3]:=60}; //权重和不用等于100,值和权重可以是常数或者变量
    
  • 集合(set)和inside

    c inside {[lo:hi]} ; 
    c inside {[$:4],[20:$]} //可以使用$取位宽范围内的最大或者最小值
    int fib[5] = '{1,2,3,4,5};
    c inside fib; //可以使用数组进行约束
    
  • randc:

    //randc变量表示周期随机性,即所有可能的值都被取过之后才可能重复
    class RandcInside;  //集合里的值只被取一次
    	int              array[] ;
    	randc bit [15:0] index   ;
    	function new(input int a[]);
    		array = a ;
    	endfunction
        function int pick;
    		return array[index] ;
    	endfunction 
        constraint c_size {index < array.size;}
    endclass
    
    initial begin
        RandcInside ri ;
     	ri = new('{1,3,5,6,2,8}) ;
        repeat(ri.array.size) begin 
        	assert(ri.randomize());
        	$display("Picked %2d[%0d]",ri.pick(),ri.index) ;
        end
    end 
    
  • 条件约束:

    • -> 操作符

      //相当于case
      type == 0 -> a == 0 ;
      type == 1 -> a == 1 ;
      type == 2 -> a == 2 ;
      //相当于:
      case(type)
          0:
      		a == 0 ;
      	1:
      		a == 1;
      	2: 
      		a == 2;
      endcase  //当然约束中不能使用case
      
    • if-else //程序代码中使用begin end分割代码块,而在约束中使用{}

  • 双向约束

    > 、< 、== 等这种比较操作符回同时计算左右两边的值

  • 简单的数学运算:

约束求解器可以处理简单的数学运算,如加、减、位提取和移位,约束求解对于32位数值的乘除和取模运算量是非常大的。有时可以用移位计算代替乘除减少计算量。

  • 使用solve before约束引导概率分布

    constraint c_xy{
        x==0 -> y==0;
        solve x before y;
    } //先求解x再求解y
    
  • randomize () with

    t.randomize () with {addr >= 50 ;} ;
    
  • pre_randomize 和 post_randomize

    分别在randomize之前和之后自动执行

  • 随机数函数

    $random() //平均分布,返回32位有符号随机数
    $urandom() //平均分布,返回32位无符号随机数
    $urandom_range() //在指定范围内的平均分布
    $dist_exponential() //指数衰落
    $dist_normal() //钟型分布
    $dist_poisson() //钟型分布
    $dist_uniform() //平均分布
    
  • rand_mode

    class Packet;
    	rand bit [3:0] length , load ;
    endclass
    Packet p ;
    initial begin 
        p = new();
    	p.constraint_mode(0) ;  //关闭约束 , 1为打开
     	p.length.rand_mode(0) ; //设置length为非随机值;
    	p.length = 42 ;
    	p.randomize;
    	p.ramdomize(load); //随机化load
    end
    
  • handle.randomize(null)

    调用时,sv会把所有的变量当作非随机变量,仅仅检查变量是否满足约束条件。

  • 可以使用条件操作符(-> 或者 if-else)构建由非随机变量控制的约束

  • 迭代和数组约束:

  • 数组大小:size()方法

  • 元素的和:sum()方法;但是需要注意,这里保存的和的位宽和元素的位宽是一致的,所以很容易sum溢出导致约束错误,所以约束数组的和时需要特别注意,如果元素位宽为8位,约束如下:

    bit [10:0] array[$]; //宽度设为sum的最大宽度,确保不会溢出
    constraint size_con{
    	array.size <= 8 ;
        array.size >= 3 ;
    }
    constraint sum_con{
        solve array.size before array.sum;
        array.sum <= 11'1f;  //11位确保sum不会溢出
        foreach(array[i]) {
            array[i] <= 8'hff ; //单独约束每个元素至8位
        }
    }
    
  • 产生具有唯一值的元素

    class UniqueSlow;
    	rand bit [7:0] ua [64] ;
    	constraint c{
            foreach(ua[i])
                foreach(ua[j])
                	if(i!=j)
                        ua[i] != ua[j] ;
        }
    endclass //使用foreach 这种方式比较慢
        
    class randc8;
    	randc bit [7:0] val ;
    endlcass 
    class LittleUniqueArray;
    	bit [7:0] ua [64];
    	function viod pre_randomize;
    		randc8 rc8;
    		rc8 = new();
    		foreach(ua[i]) begin 
                assert(rc8.randomize());
    			ua[i] = rc8.val ;
    		end 
        endfunction
    endclass //使用randc更高效的获取目标数组
    
  • 使用randcase建立决策树

    randcase:
    	AA:do_aa();
    	BB:do_bb();
    	CC:do_cc();
    endcase
    
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: SystemVerilog Assertion 应用指南电子版提供了对于SystemVerilog Assertion(SVA)在硬件验证的应用的详细指导和建议。 SVA是一种在硬件验证使用的特殊语言,用于对设计规范和行为进行验证。它与Verilog HDL结合使用,可以对设计的时序和功能进行表达和验证。SVA在验证过程可以帮助设计人员更好地发现和排除设计的错误,并提高验证效率。 在SystemVerilog Assertion 应用指南电子版,主要包括以下内容: 1. SVA基础知识:介绍SVA的语法和基本语句,包括property语句、assertion语句、sequence语句等。通过学习这些基础知识,读者可以了解SVA的基本用法和功能。 2. SVA高级应用:介绍一些复杂的SVA用法和技巧,如时序检查、复杂约束、错误定位等。这些高级应用可以帮助读者更好地应用SVA进行验证。 3. SVA调试技巧:提供了一些在验证过程调试SVA的实用技巧和方法,帮助读者定位问题和提高调试效率。 4. SVA实例:给出了一些实际的SVA验证案例,在实例展示了如何使用SVA进行验证,并提供了相关的代码和解释。 通过阅读SystemVerilog Assertion 应用指南电子版,读者可以全面了解SVA的应用和使用方法,掌握SVA在硬件验证的关键技巧,提高验证效率和准确性。无论是初学者还是有一定经验的验证工程师,都可以从获得实用的知识和指导,提高自己在硬件验证的能力。 ### 回答2: SystemVerilog是一种硬件描述语言,它支持断言(Assertion)的应用。系统级别验证是确保设计和验证的正确性的重要步骤,断言在此过程起着关键作用。断言是一种用于描述设计预期行为和验证目标的形式规范。以下是SystemVerilog断言的应用指南。 1.断言语法:SystemVerilog提供了一种断言语言来描述设计和验证要求。断言语句使用assert、assume和cover等关键字来定义,可以包含条件表达式和时序属性。 2.时序属性:时序属性是断言的重要组成部分。它们描述了信号行为在时间上的相对顺序。SystemVerilog提供了丰富的时序属性,如延迟(delay)、周期周期(repeat)和到达(property)等。 3.设计验证目标:在使用断言时,首先需要明确验证目标。验证目标可以是功能、性能、时序或其他特定方面的需求。这有助于确定需要编写的断言类型和属性。 4.模划分:将设计划分为多个模可以更好地管理断言。根据设计功能不同,可以设计独立的断言来验证每个模的功能。 5.调试和报告:SystemVerilog断言提供了一种检测设计错误的方法。在验证过程,可以通过断言的报告和调试信息来定位错误。根据断言的触发条件和时序属性,可以确定错误出现的位置。 6.性能优化:断言的数量和复杂性可能会对验证过程产生负面影响。因此,应该根据设计的规模和复杂性进行性能优化,以确保验证效率。 7.仿真和形式验证:SystemVerilog断言可以用于仿真和形式验证。在仿真,通过断言验证设计行为的正确性。在形式验证,断言可以指导形式验证工具进行验证,以寻找潜在错误。 总结:使用SystemVerilog断言,可以更好地管理系统级别验证的过程。它提供了丰富的语法和时序属性,用于描述设计预期行为和验证目标。通过模划分和性能优化,可以提高验证效率。同时,以断言为基础的调试和报告方法可以快速定位设计错误,从而加快验证过程。无论是在仿真还是形式验证,断言都是验证流程不可或缺的一部分。 ### 回答3: 《SystemVerilog 断言应用指南》是一本非常有用的电子书,旨在帮助工程师们更好地理解和应用 SystemVerilog 断言。以下是对该电子书的简要回答。 该电子书通过简单明了的方式解释了 SystemVerilog 断言的基本概念和语法,并提供了丰富的示例来帮助读者快速上手。它深入讲解了断言的不同类型和用法,例如基本断言、连续断言和并发断言等。对于初学者来说,这些示例有助于更好地理解断言在各种情况下的实际应用。 此外,该电子书还介绍了断言的调试技巧和最佳实践。通过详细讲解断言的调试过程和常见的问题,读者可以了解到如何有效地调试断言并解决相关问题。此外,最佳实践部分提供了一些建议和技巧,包括如何编写清晰、可读性强的断言以及如何在实际项目集成断言等。 除了基本内容之外,这本电子书还提供了一些高级主题,如在面向对象设计使用断言、如何使用参数化断言以及如何在验证环境使用断言等。这些主题对于有一定经验的工程师来说非常有价值,可以帮助他们进一步提升断言的应用水平。 总的来说,《SystemVerilog 断言应用指南》是一本全面而实用的电子书,对于想要学习和应用 SystemVerilog 断言的工程师来说是一本不可或缺的参考书。无论你是初学者还是有经验的工程师,这本电子书都能够帮助你更好地理解和应用断言,并提升你的设计和验证能力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值