systemverilog验证学习笔记

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

=阻塞串行

<=非阻塞并行

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)的定义中。并发断言可以在静态(形式化)验证工具和动态(仿真)验证工具中使用。上面的例子就是并发断言

SVA提供了3个内嵌函数,用于检查信号的边沿变化。

$rose(布尔表达式或信号名)

当信号/表达式的最低位由0或x变为1时返回真值。

$fell(布尔表达式或信号名)

当信号/表达式的最低位由1变为0或x时返回真值。

$stable(布尔表达式或信号名)

当信号/表达式的最低位不发生变化时返回真值。

断言的建立过程

“编写布尔表达式—> 编写序列(sequence)-> 编写属性(property)—> 编写断言(assert property)和覆盖语句(cover property)”

唯一性和优先级决定语句

在Verilog中,如果没有遵循严格的编码风格,它的if-else和case语句会在RTL仿真和RTL综合间具有不一致的结果。如果没有正确使用full_case和parallel_case综合指令还会引起一些其它的错误。SystemVerilog能够显式地指明什么时候一条决定语句的分支是唯一的,或者什么时候需要计算优先级。我们可以在if或case关键字之前使用unique或requires关键字。这些关键字可以向仿真器、综合编译器、以及其它工具指示我们期望的硬件类型。工具使用这些信息来检查if或case语句是否正确建模了期望的逻辑。例如,如果使用unique限定了一个决定语句,那么在不希望的case值出现的时候仿

真器就能够发布一个警告信息

bit [2:0] a;

unique if ((a==0) || (a==1)) y = in1;

else if (a==2) y = in2;

else if (a==4) y = in3; // 值3、5、6、7会引起一个警告priority if (a[2:1]==0) y = in1; // a是0或1

else if (a[2]==0) y = in2; // a是2或3

else y = in3; // 如果a为其他的值

unique case (a) 0, 1: y = in1; 2: y = in2; 4: y = in3; endcase // 值3、5、6、7会引起一个警告

Class trans;

…………

Endclass

trans a;声明一个句柄(指针)

a=new();//为一个trans对象分配空间

用户定义的new()函数

Class trans;

Logic [31:0] addr,crc,data[8];

Function new;

相关文档
最新文档