systemverilog验证学习笔记_第1页
systemverilog验证学习笔记_第2页
systemverilog验证学习笔记_第3页
systemverilog验证学习笔记_第4页
systemverilog验证学习笔记_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、=阻塞串行3); /0,2,4,5得到的是脚标Tq=d.find with (item3); /9,8,4,4数组求和Int count,total;Count=d.sum with(item7); /2:9,8 返回结果为元素与7比较表达式返回1为真或者零这里面返回 ,1,0,1,0,0,0求和得2Total=d.sum with (item7)*item) ; /1,0,1,0,0,0和对应元素相乘求和得17=9加8数组排序d.reverse(); /逆序d.sort(); /从小到大d.rsotr(); /从大到小d.shuffle(); 时钟块指定同步信号相对于时钟的时序Interfa

2、ce 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);EndinterfaceModule arb(arb_if.test arbif);Initial beginArbif.cb.a 2:4 $rose(b); endproperty a2b_a: assert property(a2b_p); a2b_c: cover property(a2b_p);并发断言并发断言的计算基于时钟

3、周期,在时钟边沿根据变量的采样值计算表达式。它可以放在过程块(proceduralblock)、模块(module)、接口(interface)或一个程序块(program)的定义中。并发断言可以在静态(形式化)验证工具和动态(仿真)验证工具中使用。上面的例子就是并发断言SVA提供了3个内嵌函数,用于检查信号的边沿变化。 $rose(布尔表达式或信号名) 当信号/表达式的最低位由0或x变为1时返回真值。 $fell(布尔表达式或信号名) 当信号/表达式的最低位由1变为0或x时返回真值。 $stable(布尔表达式或信号名) 当信号/表达式的最低位不发生变化时返回真值。断言的建立过程“编写布尔表

4、达式 编写序列(sequence) 编写属性(property) 编写断言(assert property)和覆盖语句(cover property)”唯一性和优先级决定语句 在Verilog中,如果没有遵循严格的编码风格,它的if-else和case语句会在RTL仿真和RTL综合间具有不一致的结果。如果没有正确使用full_case和parallel_case综合指令还会引起一些其它的错误。 SystemVerilog能够显式地指明什么时候一条决定语句的分支是唯一的,或者什么时候需要计算优先级。我们可以在if或case关键字之前使用unique或requires关键字。这些关键字可以向仿真器

5、、综合编译器、以及其它工具指示我们期望的硬件类型。工具使用这些信息来检查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 (a2:1=0) y = in1; / a是0或1 else if (a2=0) y = in2; / a是2或3 else y = i

6、n3; / 如果a为其他的值unique case (a) 0, 1: y = in1; 2: y = in2; 4: y = in3; endcase / 值3、5、6、7会引起一个警告类Class trans;Endclasstrans a;声明一个句柄(指针)a=new();/为一个trans对象分配空间用户定义的new()函数Class trans;Logic 31:0 addr,crc,data8;Function new;Addr=3;Foreach (datai) Datai=5;EndfunctionEndclass随机化Class packetRand bit 31:0 a,

7、b,c8;Randc bit7:0 k;Constraint da10;a15;endclasspacket p;initial beginp=new();assert (p.randomize();transmit(p);end指示通过引用传递的参数,参数声明需要以ref关键字开始线程always_comb过程来建模组合逻辑行为 在0时刻结束时自动触发一次always_latch过程来建模锁存逻辑行为 always_ff过程可以用来建模可综合的时序逻辑行为它仅能包含一个事件控制过程并且没有阻塞定时控制always_comb过程提供了不同于正常always过程的功能: 具有一个推断的敏感列表

8、赋值语句左侧的变量不应该被任何其它进程写入。 在所有的initial和always块被启动以后,过程在时间0处被自动地触发一次,因此过程的输出与输入一致。 SystemVerilog的always_comb过程在下述几个方面上不同于Verilog-2001的always *: always_comb在时间0处自动执行,而always *直到推断的敏感列表中的一个信号发生变化的时候才会执行。 always_comb敏感于一个函数内容内部的改变,而always *仅敏感于一个函数自变量的改变。 在always_comb内部赋值左侧的变量(包括来自被调用函数内容中的变量)不应该被其它进程写入,而al

9、ways *则允许多个进程写入相同的变量。 always_comb中的语句不应该包含阻塞语句、具有阻塞定时或事件控制的语句,或者fork.join语句。 如果always_comb过程内的行为没有代表组合逻辑,例如推断出了锁存器,软件工具执行额外的检查来发布警告信息。Forkjoin所有并行语句执行完毕才执行后续Fork.join_none 执行块儿内语句的同时父线程后面的程序继续进行Fork.join_any当块内第一个语句完成后,父线程才继续执行。停止单个线程Parameter timeout=1000;Task check(trans tr); Fork beginFork: check

10、_stop Begin Wait(tbus.cb.addr=tr.addr); $display(“.”); End#timeout $display(“.”);Join_anyDisable check_stop;EndJoin_noneEndtask事件信箱扩展的类Class badtr extands transaction;Rand bit bad_crc;Virtual function void calc_crc; Super.calc_crc();/super调用基类里面的函数 .EndfunctionEndclass:badtr回调测试程序在不修改原始累得情况下注入新代码可以用

11、来注入错误放弃事务延迟事务将事务放入记分板收集功能覆盖率等等记分板保存期望事务,找出测试平台接收到的实际事务相匹配的期望事务。Class scorebroad; Transaction scb$;Function void save_expect(transaction tr); Scb.push_back(tr);EndfunctionFunction void compare_actual(transation tr); Int b$;B=scb.find_index(x) with (x.src=tr.src);Case(b.size()0:$display(“no match find

12、”);1:scb.delete(q0);Default: $display(“error,multiple matches found”);EndcaseEndfunction: compare_actualEndclass功能覆盖率Program automatic test(busifc.TB.ifc);Class transaction;Rand bit31:0data;Rand bit2:0port;EndclassCovergroup covport; Coverpoint tr.port;EndgroupInitial beginTransaction tr;Covport ck;

13、 Tr=new(); Ck=new();Repeat(32)begin Assert(tr.randomize); Ifc.cb.port3,4); /翻转覆盖率,表示自重翻转过程 Ignore_bins h2=6,7; /被忽略的仓 Illegal_bins h3=6,7; /非法的仓,出现会报错Port:coverpoint tr.port;Cross kind,port; /交叉覆盖率Endgroup测试发生器代理驱动器计分板检测器断言监视器待测设计功能覆盖率 发生器Class generationUNI_cell blueprint;/定义的需要测试的对象的蓝图,可以通过修改起约束或者

14、扩展替换他mailbox gen2drv; /信箱event drv2gen; /drive 完成时的事件int ncells;Function new(Input mailbox gen2drv, Input event drv2gen, .) This.gen2drv=gen2drv; This.drv2gen=drv2gen;This.ncell=ncell;.Blueprint=new();Endfunction:newTask run(); UNI_cell cell;Repeat(ncells)beginAssert(blueprint.randomize();$cast(cell

15、,blueprint.copy(); /基类句柄指向拓展对象Gen2drv.put(cell); /事务放进信箱发送给驱动器drv2gen;end Endtask:runEndclass:generation驱动类Typedef class Drive_cbs;Class driveMailbox gen2drv;Event drv2gen;vUtopiaRx Rx; /发送的数据的接口Drive_cbs cbs$; /回调队列Int portid;Extern function new(Input Mailbox gen2drv,InputEvent drv2gen, Input vUtop

16、iaRx Rx, Input Int portid;)Extern task run();Extern task send();Endclass:driveTask drive:run() UNI_cell cell; Bit drop=0; Rx.cbr.datadrv2gen;Endtask:runTask drive:send(input UNI_cell cell) . Rx.cbr.data=cell.data /数据发送给接口时钟块 rx.cbr.EndtaskFactory机制uvm_componet_utils(my_driver);Run_test(“my_driver”);

17、Factory集中在一个宏uvm_componet_utils中这个宏将类my_driver登记在uvm内部一张表中,在定义一个新的类时使用这个宏,就相当于把这个类注册到了这张表中。Run_test语句会创建一个my_driver实例,然后自动调用其中的main_phase.uvm_object_utils(my_transaction);My_transaction有生命周期,用uvm_object_utils实现factory机制。而整个仿真中一直存在的用uvm_componet_utils注册只有用uvm_componet才能成为uvm树的结点,而uvm_object不能。为了使用fac

18、tory机制的重载功能验证平台的组件在实例化是都应该使用type_name:type_id:createMy_driver div;Virtual function void build_phase(uvm_phase phase); Super. build_phase(phase); Drv=my_driver:type_id:create(“drv”,this) Endfuntion实例化传递两个参数,一个名字,一个是是parent最为父结点,通过parent 的形式建立了uvm的树形结构env建立一个容器类,在这个容器类中实例化driver,monitor,reference model和scoreboard.验证平台实时监测dut行为的组件monitor,收集端口数据转刷成transaction交给后续组件处理。Objection在每个phase中,u

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论