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

下载本文档

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

文档简介

1、=阻塞串行<=非阻塞并行1)时序逻辑-使用非阻塞赋值2)锁存器-使用非阻塞赋值3)用always 块生成的组合逻辑-用阻塞赋值4)在同一个always 块中既有时序逻辑又有组合逻辑-用非阻塞赋值5)在同一个always 块中不要既用阻塞赋值又用非阻塞赋值6)不要在一个以上的always 块中对同一个变量赋值7)用$strobe显示用非阻塞赋值指定的变量值8)不要用 0 过程性赋值Modport 将信号分组并指明方向函数不能消耗时间,不能有#100(posedge clkwait之类的阻塞语句Interface arb_if(input bit clk;Logic 1:0 a,b;Logi

2、c rst;Modport test(output a,rst,Input b,clk;EndinterfaceModule 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

3、,0求和得2Total=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;EndinterfaceModule arb

4、(arb_if.test arbif;Initial beginArbif.cb.a<=0;arbif.cb;$dispiay(.Endmodule断言A1:assert(bus.cb.a=2b01Else $error(“grant not asserted”;四种有输出消息的函数可在断言内部使用$info$waring$error$fatal要验证这样一个属性:“当信号a 在某一个时钟周期为高电平时,那么在接下来的24个时钟周期内,信号b 应该为高电平”。用Verilog 语言描述这样一个属性需要一大段代码,而用SVA 描述就只需要几行代码。下面的代码为SVA 。例1:propert

5、y a2b_p; (posedge sclk $rose(a |-> 2:4 $rose(b; endpropertya2b_a: assert property(a2b_p; a2b_c: cover property(a2b_p;并发断言并发断言的计算基于时钟周期,在时钟边沿根据变量的采样值计算表达式。它可以放在过程块(procedural block)、模块(module )、接口(interface )或一个程序块(program )的定义中。并发断言可以在静态(形式化)验证工具和动态(仿真)验证工具中使用。上面的例子就是并发断言SVA 提供了3个内嵌函数,用于检查信号的边沿变化

6、。$rose(布尔表达式或信号名当信号/表达式的最低位由0或x 变为1时返回真值。$fell(布尔表达式或信号名当信号/表达式的最低位由1变为0或x 时返回真值。$stable(布尔表达式或信号名当信号/表达式的最低位不发生变化时返回真值。断言的建立过程“编写布尔表达式 > 编写序列(sequence )> 编写属性(property )> 编写断言(assert property)和覆盖语句(cover property)”唯一性和优先级决定语句在Verilog 中,如果没有遵循严格的编码风格,它的if-else 和case 语句会在RTL 仿真和RTL 综合间具有不一致的

7、结果。如果没有正确使用full_case和parallel_case综合指令还会引起一些其它的错误。SystemVerilog 能够显式地指明什么时候一条决定语句的分支是唯一的,或者什么时候需要计算优先级。我们可以在if 或case 关键字之前使用unique 或requires 关键字。这些关键字可以向仿真器、综合编译器、以及其它工具指示我们期望的硬件类型。工具使用这些信息来检查if 或case 语句是否正确建模了期望的逻辑。例如,如果使用unique 限定了一个决定语句,那么在不希望的case 值出现的时候仿真器就能够发布一个警告信息bit 2:0 a;unique if (a=0 | (

8、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或1else if (a2=0 y = in2; / a是2或3else y = in3; / 如果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 对象

9、分配空间用户定义的new(函数Class trans;Logic 31:0 addr,crc,data8;Function new;Addr=3;Foreach (dataiDatai=5;EndfunctionEndclass随机化Class packetRand bit 31:0 a,b,c8;Randc bit7:0 k;Constraint da>10;a<15;endclasspacket p;initial beginp=new(;assert (p.randomize(;transmit(p;end指示通过引用传递的参数,参数声明需要以ref 关键字开始线程alway

10、s_comb过程来建模组合逻辑行为 在0时刻结束时自动触发一次always_latch过程来建模锁存逻辑行为always_ff过程可以用来建模可综合的时序逻辑行为它仅能包含一个事件控制过程并且没有阻塞定时控制always_comb过程提供了不同于正常always 过程的功能: 具有一个推断的敏感列表 赋值语句左侧的变量不应该被任何其它进程写入。 在所有的initial 和always 块被启动以后,过程在时间0处被自动地触发一次,因此过程的输出与输入一致。SystemVerilog 的always_comb过程在下述几个方面上不同于Verilog-2001的always *: always_c

11、omb在时间0处自动执行,而always *直到推断的敏感列表中的一个信号发生变化的时候才会执行。 always_comb敏感于一个函数内容内部的改变,而always *仅敏感于一个函数自变量的改变。 在always_comb内部赋值左侧的变量(包括来自被调用函数内容中的变量)不应该被其它进程写入,而always *则允许多个进程写入相同的变量。 always_comb中的语句不应该包含阻塞语句、具有阻塞定时或事件控制的语句,或者fork.join 语句。如果always_comb过程内的行为没有代表组合逻辑,例如推断出了锁存器,软件工具执行额外的检查来发布警告信息。Fork join 所有并

12、行语句执行完毕才执行后续Fork .join_none 执行块儿内语句的同时父线程后面的程序继续进行Fork .join_any当块内第一个语句完成后,父线程才继续执行。 停止单个线程Parameter timeout=1000;Task check(trans tr;ForkbeginFork: check_stopBeginWait(tbus.cb.addr=tr.addr;$display(“. ”;End#timeout $display(“. ”;Join_anyDisable check_stop;EndJoin_noneEndtask事件信箱扩展的类Class badtr ext

13、ands transaction;Rand bit bad_crc;Virtual function void calc_crc;Super.calc_crc(;/super调用基类里面的函数 .EndfunctionEndclass:badtr回调测试程序在不修改原始累得情况下注入新代码 可以用来注入错误放弃事务延迟事务将事务放入记分板收集功能覆盖率等等记分板保存期望事务,找出测试平台接收到的实际事务相匹配的期望事务。 Class scorebroad;Transaction scb$;Function void save_expect(transaction tr;Scb.push_bac

14、k(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”;1:scb.delete(q0;Default:$display(“error,multiple matches found”;EndcaseEndfunction: compare_actualEndclass功能覆盖率Program automatic test(busifc.TB.ifc;Class tra

15、nsaction;Rand bit31:0data;Rand bit2:0port;EndclassCovergroup covport;Coverpoint tr.port;EndgroupInitial beginTransaction tr;Covport ck;Tr=new(;Ck=new(;Repeat(32beginAssert(tr.randomize;Ifc.cb.port<=tr.port;Ck.sample(; /收集覆盖率,触发覆盖组ifc.cb;EndEndEndprogramAuto_bin_max指明了自动创建仓的最大值Covergroup CovPort;O

16、ption. Auto_bin_max=2;Coverpoint tr.port;Endgroup分成两个仓bit2:0portauto0:3auto4:7两个仓仓Covergroup Covport;Kind : Coverpoint tr.kind; bins zero=0;Bins lo=1:3,5; /1:3和5是一个仓Bins hi=8:$; /8到最大值15,8个独立的仓,hi_0,hi_1. Bins misc=deflaut; /一个仓代表剩余的值Bins t1=(1,2=>3,4; /翻转覆盖率,表示自重翻转过程 Ignore_bins h2=6,7; /被忽略的仓Il

17、legal_bins h3=6,7; /非法的仓,出现会报错Port:coverpoint tr.port;Cross kind,port; /交叉覆盖率Endgroup 发生器Class generationUNI_cell blueprint ;/定义的需要测试的对象的蓝图,可以通过修改起约束或者扩展替换他mailbox gen2drv; /信箱event drv2gen ; /drive 完成时的事件int ncells;Function new(Input mailbox gen2drv,Input event drv2gen,.This.gen2drv=gen2drv; This.d

18、rv2gen=drv2gen; This.ncell=ncell;.Blueprint=new(;Endfunction:newTask run(;UNI_cell cell;Repeat(ncellsbeginAssert(blueprint.randomize(; $cast(cell,blueprint.copy(; /基类句柄指向拓展对象 Gen2drv.put(cell; /事务放进信箱发送给驱动器 drv2gen;endEndtask:runEndclass:generation 驱动类Typedef class Drive_cbs; Class driveMailbox gen2

19、drv;Event drv2gen;vUtopiaRx Rx; Drive_cbs cbs$; Int portid; Extern function new( Input Mailbox gen2drv, InputEvent drv2gen, /发送的数据的接口 /回调队列 Input vUtopiaRx Rx, Input ) Extern task run(; Extern task send(; Endclass:drive Task drive:run( UNI_cell cell; Bit drop=0; Rx.cbr.data<=0; . Forever begin Ge

20、n2drv.peek(; /发送前回调 begin:tx Foreach(cbsi; /从信箱中读取一个数据 /初始化端口 Int portid; Cbsi.pre_tx(this,cell,drop; If (drop disable tx; /不发送这个数据 End Send(cell; /发送后的回调 Foreach(cbsi; Cbsi.post_tx(this,cell,drop; End:tx Gen2drv.get(cell; ->drv2gen; Endtask:run Task drive:send(input UNI_cell cell . Rx.cbr.data&l

21、t;=cell.data rx.cbr . Endtask /数据发送给接口时钟块 /删除数据 Factory 机制 uvm_componet_utils(my_driver; Run_test(“my_driver ”; 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 不能。 为了使用 factory 机制的

温馨提示

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

最新文档

评论

0/150

提交评论