数字系统设计12-bak_第1页
数字系统设计12-bak_第2页
数字系统设计12-bak_第3页
数字系统设计12-bak_第4页
数字系统设计12-bak_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

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

文档简介

PATHPULSE$Specparam可以在specifyblock中使用控制脉冲传播。脉冲在模块的输出上有两个比通过模块输出延迟短的预定跳变。缺省情况下,脉冲会被模拟器滤掉;这意味着只有长于延迟的跳变才会通过模块传输。这种效果叫做惯性延迟。PATHPULSE$可以改变缺省的行为方式。还可以用于指定促使输出出现x的脉冲宽度范围。路径脉冲控制使用PATHPULSE$控制模块路径脉冲保持。Syntax:PATHPULSE$=(reject_limit[,error_limit]);PATHPULSE$Input$Output=(reject_limit[,error_limit]);Limit=ConstantMinTypMaxExpression如果errorlimit没给出,则它与rejectlimit相同。短于rejectlimit的脉冲将不被传输到输出。比rejectlimit长但是比errorlimit短的脉冲会被当做1‘bX传输。比errorlimit长的脉冲则正常传输。PATHPULSE$input$outputspecparam优先于普通的同一模块中的PATHPULSE$specparam

起作用。specify(en=>q)=12;(data=>q)=10;(clr,pre*>q)=4;specparamPATHPULSE$=3,PATHPULSE$en$q=(2,9),PATHPULSE$clr$q=1;endspecify

定时校验任务定时检查用于校验设计的定时。定时检查完成以下功能:测定两个事件之间的共用时间。比较共用时间和指定的时间限制。如果共用时间超指定的时间限制报告时间冲突。(冲突被当作warning报告并不影响模块输出。)Verilog执行的时间检查有:建立保持脉冲宽度时钟周期倾斜恢复定时校验任务$hold$nochange$period$recovery$setup$setuphold$skew$width$setup$setup(DataEvent,ReferenceEvent,Limit,[Notifier]);如果(time_of_reference_event-time_of_data_event)<limit则报告时序冲突(timingviolation);系统调用实例如下:$setup(data,posedge

clk,4);$hold$hold(ReferenceEvent,DataEvent,Limit[,Notifier]);如果(time_of_data_event-time_of_reference_event)<limit,则报数据保持时间时序冲突。例如:$hold(posedge

clk,data,3);$setuphold系统任务$setuphold是$setup和$hold任务的结合:$setuphold(ReferenceEvent,DataEvent,SetupLimit,HoldLimit[,Notifier]);实例:$setuphold(posedge

clk,data,4,3);$width$width(ReferenceEvent,Limit[,Threshold[,Notifier]]);则检查信号的脉冲宽度限制,如果threshold<(time_of_data_event-time_of_reference_event)<limit则报告信号上出现脉冲宽度不够宽的时序错误。数据事件来源于基准事件:它是带有相反边沿的基准事件,例如:$width(negedge

Ck,10,0.3);$period$period(ReferenceEvent,Limit[,Notifier]);检查信号的周期,若(time_of_data_event-time_of_reference_event)<limit则报告时序错误。基准事件必须是边沿触发事件。数据事件来源于基准事件:它是带有相同边沿的基准事$skew$skew(ReferenceEvent,DataEvent,Limit[,Notifier]);检查信号之间(尤其是成组的时钟控制信号之间)的偏斜(skew)是否满足要求,若time_of_data_event-time_of_reference_event>limit则报告信号之间出现时序偏斜太大的错误。如果data_event的时间等于reference_event的时间,则不报出错。$recovery$recovery(ReferenceEvent,DataEvent,Limit[,Notifier]);主要检查时序状态元件(触发器、锁存器、RAM和ROM等)的时钟信号与相应的置/复位信号之间的时序约束关系,若(time_of_data_event-time_of_reference_event)<limit则报告时序冲突。该系统任务的基准事件必须是边沿触发事件。该系统任务在执行定时校检前记录新基准事件时间;因此,如果数据事件和基准事件在相同的模拟时间同时发生,就报告时序冲突错误。$nochange$nochange(ReferenceEvent,DataEvent,StartEdgeOffset,EndEdgeOffset[,Notifier]);如果在指定的基准事件区间发生数据变化,就报告时序冲突错误。基准事件必须是边沿触发事件。例如:$nochange(negedge

Clear,Perset,0,0);如果在Clear为低时Preset发生变化,将报告时序冲突错误。当发生时序冲突时,系统任务根据下列case语句改变自身的值来更新参数notifier。case(notifier)'bx:notifier='b0;'b0:notifier='b1;'b1:notifier='b0;'bz:notifier='bz;endnotifier参数可提供关于时序冲突或传播x到输出的时序冲突。使用参数notifier的例子如下:regNotifyDin;...$setuphold(negedgeClock,Din,tSETUP,tHOLD,NotifyDin);在这一实例中,NotifyDin是参数notifier。如果时序冲突发生,寄存参数NotifyDin根据前面对参数notifier描述的case语句改变其值。基准事件的跳变建立为定时校验建立基准时间。基准事件必须是与模块input或inout相关的。数据事件的跳变发起时间校验。数据事件必须是与模块input或inout相关的。当基准事件和数据事件同时发生无建立冲突报告。而保持冲突会被报告。对于$width脉冲短于threshold(如果给出)将不产生违规。以下时间校验基准事件必须是边沿触发状态:$width,$period,$recovery,$nochange。基准事件可以使用关键词edge,$recovery和$nochange除外,只能使用posedge

和negedge

。有条件定时校验

(使用

&&&符号)仅当条件为真(1、x、z)时发生作用。

如果存在Notifier参量则必须是寄存器。当冲突发生时寄存器值发生变化。如果它的值是X则变为0,如果是0则变为1,如果是1则变为0。如果是Z则不变。定时校验系统任务只能在specifyblock中调用。对于复杂条件,在specifyblock外描述条件,并且驱动一个用在specifyblock内的,条件信号。regErr,FastClock;//Notifierregistersspecifyspecparam

Tsetup=3.5,Thold=1.5,Trecover=2.0,Tskew=2.0,Tpulse=10.5,Tspike=0.5;$hold(posedge

Clk,Data,Thold);$nochange(posedgeClock,Data,0,0);$period(posedge

Clk,20,FastClock);$recovery(posedge

Clk,Rst,Trecover);$setup(Data,posedge

Clk,Tsetup);$setuphold(posedge

Clk&&&!Reset,Data,Tsetup,Thold,Err);$skew(posedgeClk1,posedgeClk2,Tskew);$width(negedge

Clk,Tpulse,Tspike);endspecify模拟时间函数下列系统函数返回模拟时间。$time:返回64位的整型模拟时间给调用它的模块,返回值被四舍五入。$stime:返回32位的整型模拟时间。$realtime:向调用它的模块返回实型模拟时间。变换函数下列系统函数是数字类型变换的功能函数:$rtoi(real_value):通过截断小数值将实数变换为整数。$itor(integer_value):将整数变换为实数。$realtobits(real_value):将实数变换为64位的实数向量表示法(实数的IEEE745表示法)$bitstoreal(bit_value):将位模式变换为实数(与$realtobits相反)概率分布函数函数:$random[(seed)]根据种子变量(seed)的取值按32位的有符号整数形式返回一个随机数。种子变量(必须是寄存器、整数或时间寄存器类型)控制函数的返回值,即不同的种子将产生不同的随机数。如果没有指定种子,每次$random函数被调用时根据缺省种子产生随机数。integerSeed,Rnum;wireClk;initialSeed=12;always@(Clk)Rnum=$random(Seed);在Clk的每个边沿,$random被调用并返回一个32位有符号整型随机数。如果数字在取值范围内,下述模运算符可产生-10~+10之间的数字。Rnum

=$random(Seed)%11;下面是没有显式指定种子的例子。Rnum=$random;//种子变量是可选的。数字产生的顺序是伪随机排序的,即对于一个初始种子值产生相同的数字序列。表达式:{random}%11产生0~10之间的一个随机数。并置操作符({})将$random函数返回的有符号整数变换为无符号数。$dist_chi_square(Seed,DegreeOfFreedom);$dist_erlang(Seed,K_stage,Mean);爱尔兰$dist_exponential(Seed,Mean);指数$dist_normal(Seed,Mean,StandardDeviation);$dist_poisson(Seed,Mean);泊松$dist_t(Seed,DegreeOfFreedom);$dist_uniform(Seed,Start,End);统一所有参数都必须是整数禁止语句禁止语句是过程性语句(因此它只能出现在always或initial语句块内)。禁止语句能够在任务或程序块没有执行完它的所有语句前终止其执行。它能够用于对硬件中断和全局复位的建模。其形式如下:disabletask_id;disableblock_id;终止命名的block(begin-end或fork-join)或任务。命名的blocktask可以用内部的disable语句终止自身。当任务被终止时,以下的内容不确定:任何outputs或inouts的值尚未生效的非阻塞性赋值事件持续赋值和force语句函数不能被终止。任务终止其自身不同于任务返回,输出不定。disable只有在终止自身的时候才可综合。建议最好在任务定义中不要使用disable禁止语句,尤其是当任务具有一定的返回值时更是如此。这是因为当任务被禁止时,Verilog语言给出的输出和输入参数值是不确定的。如果必须在任务中这样做,一种比较稳妥的方法是:如果有,就在任务中禁止顺序程序块。taskExample;output[0:3]Count;begin:LOCAL_BLK//语句10。Count=10;disableExample;

//Count的值不确定。endendtasktaskExample;output[0:3]Count;begin:LOCAL_BLK//语句10。Count=10;disableLOCAL_BLK;//Count的值为10endendtask命名事件Events可以用于描述通讯和行为建模中同步。SyntaxeventName,...;{Declaretheevent}->EventName;{Triggertheevent}Event声明可以出现在以下位置:module-<HERE>-endmodulebegin:Label-<HERE>-endfork:Label-<HERE>-jointask-<HERE>-endtaskfunction-<HERE>-endfunction命名事件moduleadd_mult(out,a,b);input[2:0]a,b;output[3:0]out;reg[3:0]out;eventadd,mult;//defineeventsalways@(aorb)if(a>b)->add;//triggereventelse->mult;//triggereventalways@(add)//respondtoaneventtriggerout=a+b;always@(mult)//respondtoaneventtriggerout=a*b;endmoduleEvents没有值或者延迟,是简单的事件触发语句触发的事件,并且有边沿敏感定时控制检测。命名事件在测试和系统级建模时,同一module中两个always块之间或者层次化中不同module之间通讯是很有用的。不可综合。层次路径名Verilog

HDl中的标识符具有一个唯一的层次路径名。层次路径名通过由句点(.)隔开的名字组成。新层次由以下定义:1)模块实例化2)任务定义3)函数定义4)命名程序块所有的nets,registers,events,parameters,tasks和functions都可以通过层次名从block外访问。数据不仅可读,而且可以通过路径名更新任何层次中的数据项的值。较低层模块能够通过使用模块实例名限定变量引用高层(称为向上引用)或低层(称为向下引用)模块。moduleSeparate;parameterP=5;//Separate.PendmodulemoduleTop;regR;//Top.RBottomU1();endmodulemoduleBottom;regR;//Top.U1.RtaskT;//Top.U1.TregR;//Top.U1.T.R;...endtaskinitialbegin:InitialBlockregR;//Top.U1.InitialBlock.R;$display(Bottom.R);//向上引用Top.U1.R$display(U1.R);//向上引用Top.U1.R...endendmodule共享任务和函数一种在不同模块间共享任务和函数的方法是在文本文件中编写共享任务和函数的定义,然后使用`include编译指令在需要的模块中包含这些定义。另一种可选的方法是在模块内定义共享任务和函数,然后用层次名在不同的模块中引用需要的任务或函数。share.hfunctionSignedPlus;...endfunctionfunctionSignedMinus;...endfunctiontaskPresetClear;...endtaskmoduleSignedAlu(A,B,Operation,Z);input[0:3]A,B;inputOperation;output[0:3]Z;reg

[0:3]Z;//包含共享函数的定义。`include“share.h”always@(AorBorOperation)if(Operation)Z=SignedPlus(A,B);elseZ=SignedMinus(A,B);endmodulemoduleShare;functionSignedPlus;...endfunctionfunctionSignedMinus;...endfunctiontaskPresetClear;...endtaskendmodulemoduleSignedAlu2(A,B,Operation,Z);input[0:3]A,B;inputOperation;output[0:3]Z;reg

[0:3]Z;always@(AorBorOperation)if(Operation)Z=Share.SignedPlus

(A,B);elseZ=Share.SignedMinus

(A,B);endmodule值变转储文件值变转储(VCD)文件包含设计中指定变量取值变化的信息。它的主要目的是为其它后处理工具提供信息。Verilog提供了一套系统任务用于以标准VCD格式记录信号值的变化。大多数的波形显示工具读取这种格式。$dumpfile(“file.dump”); 为记录打开一个VCD文件$dumpvars(); 为记录选择信号$dumpflush; 刷新所有的VCD数据$dumpoff; 停止记录$dumpon; 再次开始记录$dumplimit(<file_size>); 限制创建的VCD文件的大小$dumpall; 转储所有当前指定的变量值VCD文件记录你的设计模拟期间所发生的数据信号变化。你可以指定所要记录的信号。除了$dumpvars其他所有$dump系统任务都很简单。必须首先用$dumpfile系统任务打开一个VCD文件,并且每次模拟只能打开一个。为了看到全部的历史值,必须在0时刻就探测波形。周期性的刷新磁盘数据是一个好方法,这可以避免记录任何意外的系统错误。VCD数据库不记录模拟结束时刻,因此如果要波形工具在最后模拟值变化后显示波形,必须在仿真结束前用$dumpall(转储当前值)。$dumpvars[(<levels>,<scope>*)];scope引用信号、实例或层次化模块。Levels是要转储的指定模块的层次,0转储指定的层次和低级的所有实例,1只转储指定层次。如果没有参数,设计中的所有变量都被转储。.$dumpvars可以多次调用,但是必须在同一时刻(通常在仿真起始时)。5~12之间计数的可逆计数器moduleCountUpDown(Clk,Count,Up_Down);inputClk,Up_Down;output[0:3]Count;reg

[0:3]Count;initialCount=‘d5;always@(posedge

Clk)beginif(Up_Down)beginCount=Count+1;if(Count>12)Count=12;endelsebeginCount=Count-1;if(Count<5)Count=5;endendendmodulemoduleTest;reg

Clock,UpDn;wire[0:3]Cnt_Out;parameterON_DELAY=1, OFF_DELAY=2;CountUpDownC1(Clock,Cnt_Out,UpDn);alwaysbeginClock=1;#ON_DELAY;Clock=0;#OFF_DELAY;endinitialbeginUpDn=0;#50UpDn=1;#100$dumpflush;$stop;//停止模拟。endinitialbegin$dumpfile

(count.dump”);$dumplimit

(4096);$dumpvars

(0,Test;)$dumpvars

(0,Cl.Count,Cl.Clk,C1.Up_Down);endendmoduleVCD文件格式VCD文件是ASCII文件。VCD文件包含如下信息:•文件头信息:提供日期、模拟器版本和时间标度单位。•节点信息:定义转储作用域和变量类型。•取值变化:实际取值随时间变化。记录绝对模拟时间。VCD文件实例强度在VerilogHDL中除了指定四个基本值0、1、x和z外,还可以对这些值指定如驱动强度和电荷强度等属性。逻辑强度建模是Verilog建模的一个重要部分。

一般只用于元件建模(如FPGA、ASIClibrary开发工具),电路设计者必须了解电路的各种可能性。Verilog提供了多个级别的逻辑强度。逻辑强度建模解决信号组合跳变为已知和未知值,以最大精度描述硬件行为。

逻辑强度建模的几种情况:集电极开路输出(pulluprequired)单一节点的多个三态驱动MOS电荷存储射极耦合逻辑门(ECLGates)驱动强度驱动强度可以在如下情况中指定:1)在线网说明中带赋值的线网。2)原语门实例中的输出端口。3)在连续赋值语句中。驱动强度定义有两个值:一个是线网被赋值为1时的强度值;另一个是线网被赋值为0时的强度值。形式如下:(strength_for_1,strength_for_0)对于值1的赋值,允许如下的信号驱动强度:•supply1•strong1•pull1•weak1•highz1(禁止对门级原语使用)对于值0的赋值,允许如下的信号驱动强度:•supply0•strong0•pull0•weak0•highz0(禁止对门级原语使用)缺省的信号驱动强度定义为(strong0,strong1)。线网的强度:wire(pull1,weak0)#(2,4)Lrk=Pol&&Ord;信号的驱动强度定义仅适用于标量类型的信号,如:wire、wand、wor

、tri、triand、trior、trireg、tri0和tri1。门级原语输出端口的驱动强度定义:nand

(pull1,strong0)#(3:4:4)A1(Mout,MinA,MinB,MinC);信号驱动强度仅适用于定义下列门级原语的外部端口:and、or、xor、na

温馨提示

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

评论

0/150

提交评论