受约束的随机化

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

endclass
module top; Transaction tr =new; initial begin :random_repeat #20 repeat (32) begin if ( tr.randomize() == 1 ) $display("addr = %16h data = %h\n", tr.addr,tr.data); else $display("Randomization failed.\n"); end end :random_repeat endmodule
组合的约束举例:以太网中payload等于13-14个字节 序列的约束举例:当一个申请之后,应答需要在4-10个周期内给出
简单的例子
例子说明: 随机变量使用rand/randc修饰词 使用约束constraint确定变量的 范围 调用类的randomize函数来执行 随机化,如果遇到随机化问题, randomize函数返回0 普通随机数rand 循环随机数randc
需随机化的设计配置:
随机约束的简介
随机约束目的:
使用随机激励能够节省人力和时间,但是纯粹的随机激励是接近无限 空间的,没有实际使用价值。所以限制和规定随机激励的自由度,以 产生既随机又让人感兴趣的测试场景 能够表达复杂的场景 可以灵活地、动态地控制随机数 可以产生组合的或者序列的约束
随机约束特点: 约束块的位置: Nhomakorabea部class A; rand integer x; constraint c { x < 0; } endclass class B extends A; constraint c { x > 0; } endclass
说明:randomize() task是一个虚拟的task,如果 外部定义了一个约束,那么会覆盖内部的约束 约束块设置成员inside
数组的维度遍历顺序:
// 1 2 3 3 4 1 2 -> 维度编号 int A [2][3][4]; bit [3:0][2:1] B [5:1][4]; foreach( A [ i, j, k ] ) ... // 0 to 1, j from 0 to 2, and k from 0 to 3 foreach( B [ q, r, , s ] ) ... //q from 5 to 1, r from 0 to 3, and s from 2 to 1.
条件约束:关系操作符 -> 及if…else
条件约束:让一个约束表达式只在某些时候有效
关系操作符更合适枚举表达式(等价case) mode == small -> len < 10; // mode为small时 len约束为 小于10; mode == large -> len > 100; //mode 为large时 len约束为大于 100; if else 适合真—假类型表达式 constraint c_len_rw{ if (mode == small)
内嵌方式:
随机约束块的格式
constraint_declaration ::=
[ static ] constraint constraint_identifier constraint_block constraint_block ::= { { constraint_block_item } } constraint_block_item ::= solve identifier_list before identifier_list ; | constraint_expression constraint_expression ::= expression_or_dist ; |expression – > constraint_set | if ( expression ) constraint_set [ else constraint_set ] | foreach ( array_identifier [ loop_variables ] ) constraint_set constraint_set ::= constraint_expression | { { constraint_expression } } dist_list ::= dist_item { , dist_item } dist_item ::= value_range [ dist_weight ] dist_weight ::= := expression | :/ expression constraint_prototype ::= [ static ] constraint constraint_identifier ; extern_constraint_declaration ::= [ static ] constraint class_scope constraint_identifier constraint_block identifier_list ::= identifier { , identifier } expression_or_dist ::= expression [ dist { dist_list } ] loop_variables ::= [ index_variable_identifier ] {
随机变量约束设置的方式
typedef enum {low, mid, high} //test.sv AddrType; 这种定义方法的好处:每个不同测试定 普通方式: class MyBus extends Bus; 义的约束的不同版本以产生不同的激励 rand AddrType atype; programe automatic test; 坏处:约束过于分散,有潜在风险 include “packet.sv” //packet.sv constraint addr_range constraint MyBus:: addr_range { { (atype ==}; low ) -> addr inside { [0 : 15] }; typedef enum (atype {low, mid, high} AddrType; == low ) -> addr inside { [0 : 15] (atype mid ) -> addr inside { [16 : 127]}; class MyBus extends Bus; (atype == mid ) -> addr inside { [16 == : 127]}; (atype high) -> addr inside {[128 : 255]}; rand AddrType(atype atype;== high) -> addr inside {[128== : 255]}; }… } constraint addr_range endprograme endclass endclass task exercise_bus (MyBus bus); int res; // EXAMPLE 1: restrict to low addresses res = bus.randomize() with {atype == low;}; // EXAMPLE 2: restrict to address between 10 and 20 res = bus.randomize() with {10 <= addr && addr <= 20;}; // EXAMPLE 3: restrict data values to powers-of-two res = bus.randomize() with {data & (data - 1) == 0;}; endtask
SystemVerilog中受约束的随机化
薛晓军 xueislark@ 中科院自动化所集成中心 2014-02-25
为何要引入受约束的随机测试方法CRT
原因:
产生完整的激励集测试设计的功能越来越困难,编写足够的定向 测试集变得不可能 功能项的关系是大多错误的来源,而这种错误很难通过清单检查 方法排查
randc bit [1:0] y; 初始序列: 下一个序列: 下一个序列: 0321 2130 2013…
class Transaction; rand bit[15:0] addr; rand bit[31:0] data; rand bit[ 2:0] port; rand bit request; rand bit[1:0] grant; constraint word_align {addr[1:0] == 2'b0;}
1
b
0 1 0
迭代约束格式
迭代约束
, [ index_variable_identifier ] }
constraint_expression ::= ... | foreach ( array_identifier [ loop_variables ] ) constraint_set loop_variables ::= [ index_variable_identifier ] {
len < 10;
else if (mode == large)
len > 100
} 注意:constraint中使用{ }把多个表达式组成呢一个块,而程序代码使用begin end关键字 a bit a, b; 0 0 constraint c { (a == 1) -> (b == 0); } //等价 {!(a==1) || b==0}
迭代约束说明 可以遍历一个数组的元素(数组可以是固定大小、动态的、联合队列、队列) 例子:
class C; rand byte A[] ; constraint C1 { foreach ( A [ i ] ) A[i] inside {2,4,8,16}; } constraint C2 { foreach ( A [ j ] ) A[j] > 2 * j; } endclass ]}
与定向测试环境的不同:
受约束测试环境需要通过参考模型、传输函数或其他方法预测结果 需要对待测设计的所有关键点(控制路径的每一个分支)都采用随 机化测试 提高效率,充分利用计算机来节省人工检查和验证时间 器件配置 原始输入 协议异常 事务状态 环境配置 封装后 的输入数据 延时 错误和违规
权重分布dist(不能针对randc变量)
x dist {100 := 1, 200 := 2, 300 := 5} x dist { [100:102] := 1, 200 := 2, 300 := 5} 说明:100, 101, 102, 200, or 300 的比 率是:1-1-1-2-5 x dist { [100:102] :/ 1, 200 := 2, 300 := 5} 说明:100, 101, 102, 200, or 300 的比 率是1/3-1/3-1/3-2-5.
,
[ index_variable_identifier ] }
随机约束的位置、成员、权重分布
约束块的位置: 外部
class XYPair; rand integer x, y; constraint c; endclass // 外部定义随机约束块 constraint XYPair::c { x < y; }
rand integer x, y, z; constraint c1 {x inside {3, 5, [9:15], [24:32], [y:2*y], z};} rand integer a, b, c; constraint c2 {a inside {b, c};} integer fives[0:3] = { 5, 10, 15, 20 }; rand integer v; constraint c3 { v inside fives; }
相关文档
最新文档