版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、=阻塞串行<=非阻塞并行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; 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,
3、0,0,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);Endin
4、terfaceModule arb(arb_if.test arbif);Initial beginArbif.cb.a<=0;arbif.cb;$dispiay(.)Endmodule断言A1:assert(bus.cb.a=2b01)Else $error(“grant not asserted”);四种有输出消息的函数可在断言内部使用$info$waring$error$fatal要验证这样一个属性:“当信号a在某一个时钟周期为高电平时,那么在接下来的24个时钟周期内,信号b应该为高电平”。用Verilog语言描述这样一个属性需要一大段代码,而用SVA描述就只需要几行代码。下面的代
5、码为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)的定义中。并发断言可以在静态(形式化)验证工具和动态(仿真)验证工具中使用。上面的例子就是并发断
6、言SVA提供了3个内嵌函数,用于检查信号的边沿变化。 $rose(布尔表达式或信号名) 当信号/表达式的最低位由0或x变为1时返回真值。 $fell(布尔表达式或信号名) 当信号/表达式的最低位由1变为0或x时返回真值。 $stable(布尔表达式或信号名) 当信号/表达式的最低位不发生变化时返回真值。断言的建立过程“编写布尔表达式 > 编写序列(sequence)> 编写属性(property)> 编写断言(assert property)和覆盖语句(cover property)”唯一性和优先级决定语句 在Verilog中,如果没有遵循严格的编码风格,它的if-else和
7、case语句会在RTL仿真和RTL综合间具有不一致的结果。如果没有正确使用full_case和parallel_case综合指令还会引起一些其它的错误。 SystemVerilog能够显式地指明什么时候一条决定语句的分支是唯一的,或者什么时候需要计算优先级。我们可以在if或case关键字之前使用unique或requires关键字。这些关键字可以向仿真器、综合编译器、以及其它工具指示我们期望的硬件类型。工具使用这些信息来检查if或case语句是否正确建模了期望的逻辑。例如,如果使用unique限定了一个决定语句,那么在不希望的case值出现的时候仿真器就能够发布一个警告信息bit 2:0 a;
8、 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 = in3; / 如果a为其他的值unique case (a) 0, 1: y = in1; 2: y = in2; 4: y = in3; endcase / 值3、5、6、7会引起一个警告类Class trans;Endclasstrans a
9、;声明一个句柄(指针)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,b,c8;Randc bit7:0 k;Constraint da>10;a<15;endclasspacket p;initial beginp=new();assert (p.randomize();transmit(p);en
10、d指示通过引用传递的参数,参数声明需要以ref关键字开始线程always_comb过程来建模组合逻辑行为 在0时刻结束时自动触发一次always_latch过程来建模锁存逻辑行为 always_ff过程可以用来建模可综合的时序逻辑行为它仅能包含一个事件控制过程并且没有阻塞定时控制always_comb过程提供了不同于正常always过程的功能:· 具有一个推断的敏感列表 · 赋值语句左侧的变量不应该被任何其它进程写入。 · 在所有的initial和always块被启动以后,过程在时间0处被自动地触发一次,因此过程的输出与输入一致。 SystemVerilog的al
11、ways_comb过程在下述几个方面上不同于Verilog-2001的always *:· always_comb在时间0处自动执行,而always *直到推断的敏感列表中的一个信号发生变化的时候才会执行。 · always_comb敏感于一个函数内容内部的改变,而always *仅敏感于一个函数自变量的改变。 · 在always_comb内部赋值左侧的变量(包括来自被调用函数内容中的变量)不应该被其它进程写入,而always *则允许多个进程写入相同的变量。 · always_comb中的语句不应该包含阻塞语句、具有阻塞定时或事件控制的语句,或者for
12、k.join语句。 如果always_comb过程内的行为没有代表组合逻辑,例如推断出了锁存器,软件工具执行额外的检查来发布警告信息。Forkjoin所有并行语句执行完毕才执行后续Fork.join_none 执行块儿内语句的同时父线程后面的程序继续进行Fork.join_any当块内第一个语句完成后,父线程才继续执行。停止单个线程Parameter timeout=1000;Task check(trans tr); Fork beginFork: check_stop Begin Wait(tbus.cb.addr=tr.addr); $display(“.”); End#timeout
13、$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回调测试程序在不修改原始累得情况下注入新代码可以用来注入错误放弃事务延迟事务将事务放入记分板收集功能覆盖率等等记分板保存期望事务,找出测试平台接收到的实际事务相匹配的期望事务。Clas
14、s 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”);1:scb.delete(q0);Default: $display(“error,multiple matches found
15、”);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; Tr=new(); Ck=new();Repeat(32)begin Assert(tr.randomize); Ifc.cb.po
16、rt<=tr.port; Ck.sample(); /收集覆盖率,触发覆盖组ifc.cb;EndEndEndprogramAuto_bin_max指明了自动创建仓的最大值Covergroup CovPort; Option. 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
17、个独立的仓,hi_0,hi_1. Bins misc=deflaut; /一个仓代表剩余的值 Bins t1=(1,2=>3,4); /翻转覆盖率,表示自重翻转过程 Ignore_bins h2=6,7; /被忽略的仓 Illegal_bins h3=6,7; /非法的仓,出现会报错Port:coverpoint tr.port;Cross kind,port; /交叉覆盖率Endgroup测试发生器代理驱动器计分板检测器断言监视器待测设计功能覆盖率 发生器Class generationUNI_cell blueprint;/定义的需要测试的对象的蓝图,可以通过修改起约束或者扩展替换他
18、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,blue
19、print.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 vUtopiaRx
20、Rx, Input Int portid;)Extern task run();Extern task send();Endclass:driveTask drive:run() UNI_cell cell; Bit drop=0; Rx.cbr.data<=0;. /初始化端口Forever beginGen2drv.peek(); /从信箱中读取一个数据/发送前回调begin:tx Foreach(cbsi);Cbsi.pre_tx(this,cell,drop);If (drop) disable tx; /不发送这个数据EndSend(cell);/发送后的回调Foreach(c
21、bsi);Cbsi.post_tx(this,cell,drop);End:txGen2drv.get(cell); /删除数据->drv2gen;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”);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注册只
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024综合岗位劳动协议模板版B版
- 2024年版城市出租车租赁协议样式版B版
- 2025年消防安全管理咨询及标准制定合同2篇
- 2024-2025学年高中历史第七单元复杂多样的当代世界第24课两极对峙格局的形成学案含解析岳麓版必修1
- 2024-2025学年高中语文课时分层作业4归去来兮辞并序含解析新人教版必修5
- 二零二四年度时尚传媒广告投放及制作合同
- 2025年度道路照明灯具批发合同范本3篇
- 2025年酒店客房销售渠道建设与维护合同3篇
- 2025年度绿色生态农业种植承包合同范本3篇
- 2025年蔬菜种植户与农产品电商平台合作合同范本3篇
- 2024年涉密人员考试试题库保密基本知识试题附答案(考试直接用)
- 2024年桂林中考物理试卷
- DL∕T 5362-2018 水工沥青混凝土试验规程
- (正式版)JC∕T 60023-2024 石膏条板应用技术规程
- DL-T5054-2016火力发电厂汽水管道设计规范
- (权变)领导行为理论
- 2024届上海市浦东新区高三二模英语卷
- 家用电器可靠性与寿命预测研究
- 中考语文二轮复习:诗歌鉴赏系列之边塞军旅诗(知识点+方法+习题)
- 2024年智慧工地相关知识考试试题及答案
- 五年级上册脱式计算练习300题及答案
评论
0/150
提交评论