systemverilog验证学习笔记

=阻塞串行

<=非阻塞并行

1)时序逻辑----使用非阻塞赋值 2)锁存器----使用非阻塞赋值

3)用always块生成的组合逻辑----用阻塞赋值 4)在同一个always块中既有时序逻辑又有组合逻辑--- 用非阻塞赋值

5)在同一个always块中不要既用阻塞赋值又用非阻塞赋值 6)不要在一个以上的always块中对同一个变量赋值 7)用$strobe显示用非阻塞赋值指定的变量值

8)不要用 #0 过程性赋值Modport将信号分组并指明方向

函数不能消耗时间,不能有#100@(posedge clk)wait之类的阻塞语句

Interface arb_if(input bit clk); Logic [1:0] a,b; Logic rst;

Modport test(output a,rst, Input b,clk); Endinterface

Module arb(arb_if.test arbif); ………… Endmodule

数组定位

Int tq[$],d[]=’{9,1,8,3,4,4};

Tq=d.find_index(x) with (item>3); //{0,2,4,5}得到的是脚标 Tq=d.find with (item>3); //{9,8,4,4} 数组求和 Int count,total;

Count=d.sum with(item>7); //2:{9,8} 返回结果为元素与7比较表达式返回1为真或者零这里面返回 ,{1,0,1,0,0,0}求和得2 Total=d.sum with ((item>7)*item) ; //{1,0,1,0,0,0}和对应元素相乘求和得17=9加8 数组排序

d.reverse(); //逆序 d.sort(); //从小到大 d.rsotr(); //从大到小 d.shuffle();

时钟块

指定同步信号相对于时钟的时序

Interface arb_if(input bit clk); Logic [1:0] a,b; Logic rst;

Clocking cb @(posedge clk); Output a; Input b;

Modport test(output rst, Clocking cb); Endinterface

Module arb(arb_if.test arbif); Initial begin Arbif.cb.a<=0; @arbif.cb; $dispiay(………..) Endmodule

断言

A1:assert(bus.cb.a==2’b01)

Else $error(“grant not asserted”);

四种有输出消息的函数可在断言内部使用 $info $waring $error $fatal

要验证这样一个属性:“当信号a在某一个时钟周期为高电平时,那么在接下来的2~4个时钟周期内,信号b应该为高电平”。用Verilog语言描述这样一个属性需要一大段代码,而用SVA描述就只需要几行代码。下面的代码为SVA。 例1:

property a2b_p; @(posedge sclk) $rose(a) |-> [2:4] $rose(b); endproperty

a2b_a: assert property(a2b_p); a2b_c: cover property(a2b_p);

并发断言

并发断言的计算基于时钟周期,在时钟边沿根据变量的采样值计算表达式。它可以放在过程块(procedural block)、模块(module)、接口(interface)或一个程序块(program)的定义中。并发断言可以在静态(形式化)验证工具和动态(仿真)验证工具中使用。上面的例子就是并发断言

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4