下载

2下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 夏宇文老师vlogRef3

夏宇文老师vlogRef3.doc

夏宇文老师vlogRef3

lsy512
2018-09-10 0人阅读 举报 0 0 暂无简介

简介:本文档为《夏宇文老师vlogRef3doc》,可适用于工程科技领域

Net线路连接Net是结构描述中为线路连接(连线和总线)建立的模型。net的值是由net的驱动器所决定的。驱动器可以是门、UDP、实例模块或者连续赋值语句的输出。语法:{either}NetTypeExpansionRangeDelayNetName,triregExpansionStrengthRangeDelayNetName,{Netdeclarationwithcontinuousassignment}用连续声明语句对net进行声明NetTypeExpansionStrengthRangeDelayNetAssign,NetAssign=NetName=ExpressionNetType={either}wiretri{equivalent}wortrior{equivalent}wandtriand{equivalent}tritrisupplysupplyExpansion={either}vectoredscalaredRange=ConstantExpression:ConstantExpression在程序中位于何处:module<HERE>endmodule规则:·supply和supply类型的net分别具有逻辑值和并可以为它定义驱动能力(Supplystrength)。·tri和tri类型的nets当没有驱动时分别具有逻辑值和并可以为它定义驱动能力(Pullstrength)。·如果net的扩展(Expansion)选项选用了关键词vectored则不允许对它进行某位和某些位的选择也不允许对它定义强度PLI会认为该net是不可扩展的如果扩展(Expansion)选项选用了关键词scalared则允许对它进行某位和某些位的选择也允许对它定义强度PLI将会认为该net是可扩展的这些关键词是有参考价值的。·除了结构描述中的端口和标量连线不用声明其net类型外其他类型的net变量在应用之前必须声明。TruthTable真值表当Net具有两个或两个以上驱动时同时假定其驱动器强度值均相等这些真值表则告诉我们输出的结果。如果不相等则驱动强度大者驱动该Net。注意!·当net未被驱动时对tri或tri类型的net的连续赋值不影响其值和强度经常为强度(strength)保持为Pull和逻辑值保持为(对tri)或(对tri)。·在IEEE标准和已成事实的Cadence公司标准中扩展可选项的保留字scalared或vectored的位置有所不同在Cadence标准中保留字位于范围(range)选项的跟前。可综合性问题:·Net类型的变量被综合成线路连接但是某些线路连接经优化后有可能被删去。·综合工具只支持Net类型中wire型的综合其它的Net类型均不支持。提示:·在每个模块的块首明确地声明所有的nets即使是缺省的类型也应该明确地加以说明。通过清楚地说明设计意图可以提高Verilog程序的可读性和可维护性。·只能用supply和supply来声明地和电源。举例说明:wireClockwire:Addresstri:Data,Bustrireg(large)C,Cwiref=ab,g=a||b连续赋值还请参照:连续赋值寄存器类型说明Number数整数或者实数。在Verilog中整数是通过若干位来表示的其中某些位可以是不定值(X)或高阻态(Z)。语法:{either}BinaryNumber(二进制数)OctalNumber(八进制数)DecimalNumber(十进制数)HexNumber(十六进制数)RealNumber(实数)BinaryNumber=SizeBinaryBaseBinaryDigitOctalNumber=SizeOctalBaseOctalDigitDecimalNumber={either}SignDigit{signednumber}SizeDecimalBaseDigitHexNumber=SizeHexBaseHexDigitRealNumber={either}SignDigitDigitSignDigitDigiteSignDigitSignDigitDigitESignDigitBinaryBase={either}'b'BOctalBase={either}'o'ODecimalBase={either}'d'DHexBase={either}'h'HSize=DigitSign={either}Digit={either}BinaryDigit={either}xXzZOctalDigit={either}xXzZHexDigit={either}xXzZaAbBcCdDeEfFUnsignedNumber=Digit在程序中位于何处:请参阅表达式。规则:·表示进制的字母、十六进制数、X和Z在数的表示中是不区分大小写的字符Z和?在数的表示中是等价的。·数字中不能有空格但是在表示进制的字母两侧可以出现空格。·负数表示为其二进制的补数。·数字的第一个字符不允许出现下划线’’但标识符可以。为了提高数字的可读性可用下划线把长的数字分段在处理数字时下划线将被忽略。·位宽指明了数字的准确位数。·不指明位宽的数字它的位宽应为位或位以上取决于主机字长。·如果位宽大于实际的二进制位数时高位部分补但除非左边最高位是X或Z在这种情况下则补X或Z。·如果位宽小于实际的二进制数位时超过位宽的高位(左边)被舍去。注意!·定义了位宽的负数被赋值到寄存器后它将被认为是无符号的数。reg:bytereg:nibbleinitialbeginnibble=例如'bbyte=nibble变为'bend当寄存器类型的数或者定义了位宽的数被用在表达式中时其值通常被当作一个无符号数。integeriinitiali='di变成(即'b)可综合性问题:·和分别被综合成接地和接电源的连线赋值为X的则被认为是无关项。除了使用casex语句如用其它的条件语句与X的比较都认为是假的。(case等式运算符===和!==一般情况下都是不可综合的)·除了在casex和casez语句中Z被认为是无关项在其它情况下Z则被用来表示三态驱动器。提示:·在case语句的标号中通常用?要比用Z好。在程序的其它地方不要使用?号否则会产生混淆。·用下划线来分隔较长的数字从而提高可读性。举例说明:有符号的十进制数'Haf未定义位宽的十六进制数'o位宽为六的八进制数'bx位宽为的二进制数其值为不定值'bz位宽为四的二进制数最低位为其余高三位均为高阻值('bzzz)。下面所列的数为不合法的数并解释其原因:以开头'HFF包含两个非法空格ae十进制数中出现十六进制数字x是名字不是数字(应用'bx)应该是还请参照:表达式字符串说明Operators运算符在表达式中使用运算符便可根据操作数(诸如数字、参量以及其它子表示式)计算出表达式的值。Verilog语言中的运算符和C语言中的很相似。单目运算符:正负号!逻辑非~按位取反~|~|^~^^~缩位运算符(~^和^~等价)二目运算符:*算术运算符取模运算符>>=<<=关系运算符||逻辑运算符==!=逻辑等式运算符===!==case等式运算符|^^~~^逐位运算符(^~和~^等价)<<>>移位运算符其它运算符:AB:C条件运算符{A,B,C}位拼接运算符{N{A}}重复运算符在程序中位于何处:参阅表达式说明。规则:·逻辑运算符把它的操作数当作布尔变量。例如非零的操作数被认为是真('b)零被认为是假('b)不确定的值例如'bXX因不能判断其值为真还是假就被认为是不确定的('bX)。·位运算符(~|^^~~^)和全等运算符(===!==)把它们操作数的逐位分别进行处理。·在包含==或!=的逻辑比较式中如果有任何一个操作数为X或Z其结果便是不确定的('bX)。(请仔细看注意事项)·在包含(<><=>=)的比较式中如果操作数不确定其结果为不定值。('bX)例如:'b>'bX结果为真'b>'bX结果不定('bX)(请看注意事项)·缩位运算符(~|~|^~^^~)将一个矢量缩减为一个标量。·位宽确定的表达式的运算采用溢出的位不计的办法,例如:'b'b='b·整数作除法运算时小数部分被截掉。·取模运算()的结果是第一个操作数被第二个操作数除的余数符号与第一个操作数一致。·只有某些特定的运算符允许出现在实数表达式中例如单目运算符+和-、算术运算符、关系运算符、逻辑运算符以及条件运算符。实数逻辑或关系运算符的结果是一个只有一位的值。运算符的优先级:!~单目(unary)最高优先级*双目(binary)<<>><<=>>===!====!==~^^~|~|||:最低优先级注意:·应用==、!=、<、>、<=和>=对某些位不确定的值进行比较的规则并不适用于所有的仿真器这点请特别注意!·注意单目缩位运算符与逐位逻辑运算符之间的区别运算符本身是相同的可根据上下文的关系来判断是哪一种有时必须要用括号才能表达清楚。可综合性问题:·逻辑运算符、逐位运算符、移位运算符是可综合的都被综合成逻辑运算。·条件运算符是可综合的被综合成多路器或带使能端的三态门。·运算符、、*、<、<=、>、>=、==和!=都是可综合的被分别综合成加法器、减法器、乘法器和比较器。·运算符和一般是不可综合的只有当能用移位寄存器来表示运算时才是可综合的。而常量的和运算是可综合但结果只能用二进制数表示。·其它运算符均不能被任何工具所综合。提示:在写表达式的时候运用括号要比依靠运算符的优先级要好这样可预防错误产生并且使那些不太了解Verilog语言的人更容易理解你的意思。举例说明:'d这是表达式是负运算不是有符号数!abxyReset!Enable与Reset(!Enable)相同ab||cd与(ab)||(cd)相同~'b结果为'b'hff结果为’b,即一位的逻辑值还请参照:Expression的说明Parameter参数参数是为常数命名的一种手段。在Verilog代码模块编译时(而不是在仿真期间)可以改写参数的值。使用参数就有可能重新定义Verilog代码中的常数如数组的宽度等。语法:parameterName=ConstantExpression,Name=ConstantExpression,有些工具支持下列非标准的语法:parameterRangeName=ConstantExpression,Name=ConstantExpression,Range=ConstantExpression:ConstantExpression在程序中位于何处:module<HERE>endmodulebegin:Label<HERE>endfork:Label<HERE>jointask<HERE>endtaskfunction<HERE>endfunction规则:·参数是常量在仿真期间更改参数的值是非法的。·在编译期间用defparam或者当包含参数的模块被引用时可以改写其参数的值。可综合性问题:有些综合工具能把含有参数的模块当作模板一旦读入模板便能够用不同的参数值多次对该模板进行综合。所有的综合工具都支持不带改动参数的模块实例的综合。提示:尽可能用参数给常数起一个有含义的名字。举例说明:下面的例子是一个N位宽的(可通过参数改变位宽的)移位寄存器。实例引用该参数化移位寄存器时可重新定义不同的位宽。moduleShifter(Clock,In,Out,Load,Data)parameterNBits=inputClock,In,LoadinputNBits:DataoutputOutalways(posedgeClock)if(Load)ShiftReg<=DataelseShiftReg<={ShiftRegNBits:,In}assignOut=ShiftRegNBitsendmodulemoduleTestShifterdefparamUNBits=Shifter#()U()位移位寄存器ShifterU()位移位寄存器Endmodule还请参阅:`define,Defparam,Instantiation,Specparam语句的说明。PATHPULSE$路径脉冲参数·在指定块中用指定参数(即用specparam)对PATHPULSE$参数赋值可控制脉冲的传输。这里所谓的脉冲是指在模块输出端出现的两个跳变沿和它们之间的一段持续时间其持续时间必须小于信号从模块的输入端直到输出端的延时。·如果使用缺省的PATHPULSE$参数值仿真器将不考虑脉冲这就是指因为路径脉冲的持续时间比模块传输延时短故脉冲不能传过该模块这种效应被称为“时延惯性”。用指定参数(即用specparam)可给PATHPULSE$参数赋新的值。语法:{either}PATHPULSE$=(Limit,Limit){(Reject,Error)}PATHPULSE$Input$Output=(Limit,Limit)Limit=ConstantMinTypMaxExpression在程序中位于何处:specify<HERE>endspecify规则:·如果PATHPULSE$的第二个极限参数(即Error)没有给定它就应该与第一个极限参数(即reject)相同。·维持时间比第一个极限参数(即reject)短的脉冲不会输出。·维持时间比第一个极限参数(即reject)长而比第二个极限参数(即Error)短的脉冲将输出一位的不确定值(即'bX)。·维持时间比第二个极限参数长的脉冲将正常地输送出去。·用specparam对PATHPULSE$input$output参数重新赋值将改写常规值。·在同一个模块中可通过使用specparam对PATHPULSE$赋值来描述从输入到输出的延时。可综合性问题:综合工具不考虑延时结构包括指定块的定义。举例说明:specify(clk=>q)=(rst=>q)=specparamPATHPULSE$clk$q=(,),PATHPULSE=()Endspecify还请参阅:Specify,Specparam说明Port端口模块的端口是硬件器件的引脚或接口的模型。语法:{definition}{either}PortExpression{orderedlist}PortName(PortExpression){namedlist}PortExpression={either}PortReference{PortReference,}PortReference={either}NameNameConstantExpressionNameConstantExpression:ConstantExpression{declaration}{either}inputRangeName,{ofportreference}outputRangeName,{ofportreference}inoutRangeName,{ofportreference}Range=ConstantExpression:ConstantExpression{在上述部分位选择(即Range)选项内冒号左侧常量表达式表示最高位(即MSB)冒号右侧常量表达式表示最底位(即LSB)}在程序中位于何处:module(<HERE>){definition}<HERE>{declaration}endmodule规则:·在端口列表中列出的所有端口必须按次序排列或按端口名称排列这两种排列方式是不同的不能混合使用。·有端口的名称但没有端口表达式如A()则表示在本模块中定义了不与任何东西相连的端口。·每个端口除了必须在端口列表中列出外还必须声明该端口是输出(output)、输入(input)、还是双向端口(inout)。·每个端口不但要声明是输出、输入、还是双向端口而且还要声明是连线(wire)还是寄存器(reg)类型如果没声明则会隐含地认为该端口是连线(wire)类型且其位宽与相应的端口一致。如果某端口已被声明为一矢量则其端口的方向和类型两个声明中的位宽必须一致。·输入和双向端口不能声明为寄存器类型。·输出端口的类型不能声明为实型(Real)或实时型(realtime)。提示:·在测试模块中不要定义端口。·在模块定义时不建议使用命名的端口的列表因为很少有人这样来定义模块端口大家都不了解这种端口的定义形式。举例说明:module(A,B,C:)inputAinput:Boutput:Cmodule(A(X),B(Y),C(Z:)inputXinput:Youtput:Z还请参照:Module,UserDefinedPrimitive,Instantiation的说明。ProceduralAssignment过程赋值语句改变寄存器的值或者安排以后的变化。语法:{Blockingassignment}阻塞赋值RegisterLValue=TimingControlExpression{Nonblockingassignment}非阻塞赋值RegisterLValue<=TimingControlExpressionRegisterLValue={either}RegisterNameRegisterNameExpressionRegisterNameConstantExpression:ConstantExpressionMemoryExpression{RegisterLValue,}在程序中位于何处:请参阅statement语句的说明。规则:·对寄存器的赋值(不包括正负号)·对于实型和实时数据类型的寄存器不允许选择某位和某几位的。·当赋值语句执行时右侧的表达式被计算出值但是直到定时控制事件或延时(也被称为‘内部指定的延时’)发生后左侧的表达式才更新。·直到左侧的表达式更新后(例如内部定义的延时过后)阻塞赋值语句才算完成。在beginend模块中只有当前一条语句执行完后才能执行其后面的一条语句。在forkjoin模块中只有当块中所有的阻塞赋值语句结束后整个块才算结束。·如果仿真时刻相同要待所有的阻塞赋值语句执行后非阻塞赋值语句才执行。A<=#A=#个时间单位后A将变为而不是变为注意!寄存器变量可以在一个或几个initial或always语句中赋值。无论何时寄存器变量的值都是由最近的赋值所决定与事件的来源无关。这一点与net类型的变量不同。net可以由两个或更多的源驱动其结果值则取决于net变量的类型(wire型,wand型等)。可综合性问题:·综合工具不考虑延时。·定时控制或延时是不可综合的。·同一个寄存器类型变量虽然可以在几个always语句中赋值但只有在一个always语句中赋值的才有可能被综合。·同一个寄存器类型变量不能既用阻塞赋值和非阻塞赋值。·在描述组合逻辑的always块中右侧表达式被综合成组合逻辑左侧的表达式被综合成连线如有不完整的赋值则综合成锁存器。在描述时序逻辑的用时钟沿触发的always块中非阻塞赋值符的左侧被综合成触发器阻塞赋值符的左侧则被综合成一个连接除非它被用在该always块之外或者在赋值之前它的值已被读取。提示:·通常采用非阻塞赋值语句来生成触发器组成的时序逻辑而阻塞赋值常用于其它方面这样做可以防止时钟沿触发的always块中发生竞争冒险。这样做也可使设计意图更加清晰又能避免生成不需要的触发器。·在时钟树的模型已确定的情况下可用一个简单的内部指定的延时来避免RTL时钟沿对不齐的问题。举例说明:always(Inputs)begin:CountOnesintegerIf=for(I=I<I=I)if(InputsI)f=fendalwaysSwapfork交换a和b的值a=#bb=#ajoin延时秒后完成always(posedgeClock)beginc<=b用旧的b值b<=ab被a值替换end用非阻塞赋值语句时加一个延时来做输出与时钟沿有些偏移的仿真:always(posedgeClock)Count<=#Count在时钟周期的第五个下降沿插入复位信号:initialbeginReset=repeat()(negedgeClock)Reset=(negedgeClock)End还请参照:TimingControl,ContinuousAssignment的说明。ProceduralContinuousAssignment过程连续赋值语句启动过程连续赋值语句将给一个或多个寄存器赋值并同时防止一般的过程赋值语句影响已赋值的寄存器。语法:assignRegisterLValue=ExpressiondeassignRegisterLValueRegisterLValue={either}RegisterNameRegisterNameExpressionRegisterNameConstantExpression:ConstantExpressionMemoryNameExpression{RegisterLValue,}在程序中位于何处:请参阅Statement的说明。规则:·过程连续赋值语句执行后它会对指定的寄存器(组)强制地维持过程连续赋值直到解除赋值(deassign)语句的执行或直到另一个过程连续赋值语句又对该寄存器(组)赋值。·用force(强制)语句可以改写已由过程连续赋值语句赋值的寄存器类型变量直到release语句的执行此时强制赋值被解除而原过程连续赋值对该寄存器类型变量的作用又重新恢复。注意!连续赋值语句与过程连续赋值语句尽管很相似但并不是完全一致。在编写程序时确认将assign写在正确的位置。过程连续赋值语句可以写在声明语句允许出现的位置(在initial,always,task,function等内部)而连续赋值语句则必须写在任何initial或always块之外。可综合性问题:无论用什么综合工具过程连续赋值语句是都不能综合的。提示:过程连续赋值语句可以用来为异步复位和中断建立仿真模型。举例说明:always(posedgeClock)Count=Count受下面always块控制的计时钟个数的计数器always(Reset)异步复位if(Reset)assignCount=当Reset为高时使Count为不计数elsedeassignCount当Reset为低时解除Count为于是下一个时钟的上升沿又重新开始计数。还请参阅:ContinuousAssignment,Force的说明ProgrammingLanguageInterface编程语言接口Verilog编程语言接口(PLI)为用户提供了在Verilog模块中调用用C语言编写的函数的手段。这些函数可以动态地访问和修改被引用的Verilog数据结构中的数据用PLI编写的系统任务使上述功能变得容易使用。通过调用用户定义的系统任务和函数的可以来启动PLI用户编写自己的PLI模块的目的是扩大系统任务和函数的内容。用户自定义的系统任务和函数在调用时都用以$字符开头的任务和函数名。这与Verilog语言提供的系统任务和函数库名一致。如用户自定义的系统任务和函数名与原系统任务或函数名相同时则执行用户自定义的系统任务和函数。下面列举的是PLI在某些方面的应用:·延迟计数·测试矢量读入·波形演示·源代码调试接口模型可用C语言或其他语言(例如VHDL或硬件建模工具)编写或生成。对于PLI的全面讨论超出了本参考指南的范围。Register寄存器寄存器可存储在initial、always、task和function块中所赋的值广泛地应用在行为建模中。语法:{either}regRangeRegisterOrMemory,integerRegisterOrMemory,timeRegisterOrMemory,realRegisterName,realtimeRegisterName,RegisterOrMemory={either}RegisterNameMemoryNameRangeRange=ConstantExpression:ConstantExpression在程序中位于何处:module<HERE>endmodulebegin:Label<HERE>endfork:Label<HERE>jointask<HERE>endtaskfunction<HERE>endfunction规则:·寄存器类型变量只能用过程赋值语句赋值。·在具体实现时整数(integer)类型的变量至小用位时间(time)类型的变量至小用位寄存器。·integer或time类型的寄存器变量与位数相同的reg类型的寄存器变量行为是相同的。Integer和time型的寄存器变量也可像reg类型的寄存器变量一样对某位或某些位操作。而在表达式中整数类型的值被当作有符号值而reg、time类型的值被当作无符号值。·存储器类型数组中的每个元素作为整体可以进行读或写操作如果要单独访问数组中某个元素的个别位则必须先把这个元素的内容复制到某个位数相同的寄存器变量中才能进行。注意!·虽然register这个词指的是硬件寄存器(例如触发器)而寄存器(register)这个名字在这里是指软件寄存器(即变量)。Verilog寄存器常用于组合逻辑电路、锁存器、触发器和接口电路的描述和综合。·realtime类型寄存器变量是Verilog语言新增加的变量类型目前还没有任何工具支持这种类型的变量。·有符号和无符号值的概念不同版本的Verilog和用不同厂家的仿真器时并不是完全一致的。因此当使用位宽大于位的有符号数或矢量时要特别注意。可综合性问题:·Real,time和realtime类型的寄存器变量是不可综合的。·在描述组合逻辑的always块中寄存器被综合成wire型如果存在不完整赋值的情况则被综合成锁存器。在描述时序逻辑的always块中寄存器根据块内语句的内容被综合成连线(wire)或者触发器。·运用目前的综合工具整数被综合成位其值用二进制数表示负数则用其二进制补码表示。·根据所用语句存储器数组会被综合成触发器或连线而不会被综合成RAM或ROM的器件。提示:运用reg类型变量来描述寄存器逻辑integer类型变量用于循环变量和计数real类型变量用于系统模块time和realtime类型变量用于测试模块中记录仿真时刻。举例说明:rega,b,creg:mem:,bytebyte不是数组只是一个位的reg类型矢量integeri,j,ktimenowrealrrealtimet下面的部分显示了reg类型和integer类型变量的一般用法integerireg:VregParityalways(V)for(i=i<=i=i)Parity=Parity^Vi还请参阅:Net的说明。Repeat重复执行语句把一个或多个声明语句重复地执行指定的次数。语法:repeat(Expression)Statement在程序中位于何处:参见Statement的说明规则:重复执行的次数是由表达式的数值所决定的如果该值为,X或Z则不会有重复。可综合性问题:只有部分综合工具可以综合repeat语句而且只有当该循环中的每个循环的分支都被时钟事件如被(posedgeClock)所中断时才有可能被综合成电路。举例说明:initialbeginClock=repeat(MaxClockCycles)begin#Clock=#Clock=endend还请参阅:For,Forever,While,TimingControl的说明。ReservedWords关键词下列词汇是Verilog语言规定的所有的关键词请注意千万不要把这些标识符用作自定义的标识符除非把他们改写为大写的字符或扩展字符。AndforoutputstrongAlwaysforceparametersupplyAssignforeverpmossupplyBeginforkposedgetableBuffunctionprimitivetaskbufifhighzpulldowntranbufifhighzpulluptranifcaseifpulltranifcasexifnonepulltimecasezinitialrcmostricmosinoutrealtrianddeassigninputrealtimetriordefaultintegerregtriregdefparamjoinreleasetridisablelargerepeattriedgemacromokulemmosvectoredelsemediumrpmoswaitendmodulertranwandendcasenandrtranifweakendfunctionnegedgertranifweakendprimitivenorscalaredwhileendmodulenotsmallwireendspecifynotifspecifyworendtablenotifspecparamxnorendtasknmosstrengthxoreventorstrongSpecify指定的块延时Specify块(指定延时块)用于描述从模块的输入到输出的路径延时以及定时约束例如信号的建立和保持时间。用指定延时块可以在设计时把模块的信号传输延时与行为或结构分开来进行描述。语法:specifySpecifyItemsendspecifySpecifyItem={either}SpecparamPathDeclarationTaskEnable{Timingchecksonly}PathDeclaration={either}SimplePath=PathDelayEdgeSensitivePath=PathDelayStateDependentPath=PathDelaySimplePath={either}(Input,Polarity*>Output,){full}(InputPolarity=>Output){parallel}EdgeSensitivePath={either}(EdgeInput,*>Output,Polarity:Expression)(EdgeInput=>OutputPolarity:Expression)StateDependentPath={either}if(Expression)SimplePath=PathDelayif(Expression)EdgeSensitivePath=PathDelayifnoneSimplePath=PathDelayInput={either}InputNameInputNameConstantExpressionInputNameConstantExpression:ConstantExpressionOutput={either}OutputNameOutputNameConstantExpressionOutputNameConstantExpression:ConstantExpressionEdge={either}posedgenegedgePolarity={either}PathDelay={either}ListOfPathDelays(ListOfPathDelays)ListOfPathDelays={either}tt,t{Rise,Fall}t,t,t{Rise,Fall,TurnOff}t,t,t,t,t,t{,,Z,Z,Z,Z}t,t,t,t,t,t,t,t,t,t,t,t{,,Z,Z,Z,Z,X,X,X,X,XZ,ZX}t=MinTypMaxExpression在程序中位于何处:module<HERE>endmodule规则:·路径必须从模块的输入端开始在该模块的输出端结束而且在模块内部只能有一个驱动器。·在路径声明中可使用全连接符(*>)或者并行连接符(=>)来描述。全连接符指所有从输入端到输出端可能的路径并行连接符指命名的输入端的某些位到命名的输出端的某些位的路径。·模块路径的极性可选是指着路径可以选择正极性或者负极性分别指路径是同相的或是反相的(即路径的输入端若是正跳沿输出端也是正跳沿则路径是同相的。反之是反相的)。无论选哪一个都不影响仿真但路径的相位可改变的选项便于时序分析等工具使用。·跳变沿敏感的路径数据表达式同样也不影响仿真。·与状态有关的路径延时(SDPD)表达式只跟端口、常量、局部定义的寄存器或者net类型变量有关。只有部分运算符在SDPD表达式中是有效的:如逐位计算符(~|^^~~^)、逻辑运算和逻辑等式运算符(==!=||!)、缩位运算符(|^~~|^~~^)、位拼接运算符、重复拼接运算符和条件运算符({}{{}}:)。如果条件表达式的值为真(在SDPD表达式中XZ均被认为是真)路径延时只影响路径。·如果没有一个if条件为真则用Ifnone来定义缺省的SDPD。如果同一条路径既定义为ifnone与状态有关的路径延时(SDPD)又定义为一般简单的路径延时则是非法的。·无条件的路径优先于SDPD路径。·对于同一条路径跳变沿敏感的SDPD路径声明必须是唯一的必须用不同的电平或不同的沿(或者两者)。在每条语句中必须以同样的方式(整个端口、某一位、某些位)来引用输出端的信号。·如果模块的延时既包括指定的块延时(specifydelays)又包括分布的延时(即由门、UDP、Net引起的延时)应选用最长的延时作为每条路径的延时。可综合性问题:综合工具不能综合指定延时块。指定延时块只用于模块的时延仿真建模。注意!·目前还没有一个仿真工具支持上面语法中列出的那种可用种不同跳变参数表示某条路径延时的方法。·有关路径目的地的规则比当前许多仿真工具所能支持的灵活。提示:·运用指定延时块来描述库中的单元(cell)延时。请注意建立库模型时延时是怎样计算的。以PLI(编程语言接口)为基础的延时计算需要依据并访问设计中所有单元的指定延时块中的信息。·可运用指定延时块来描述“黑匣子”元件的定时特性但这时还需要借助于支持指定延时块特性的时序验证工具或综合工具。举例说明:moduleM(F,G,Q,Qb,W,A,B,D,V,Clk,Rst,X,Z)inputA,B,D,Clk,Rst,Xinput:VoutputF,G,Q,Qb,Zoutput:WregCFunctionalDescription功能描述specifyspecparamTLH$Clk$Q=,THL$Clk$Q=,TLH$Clk$Qb=,THL$Clk$Qb=,Tsetup$Clk$D=,Thold$Clk$D=单一路径全连接(A,B*>F)=(::,::)单一路径并行连接正极性(V=>W)=,,沿敏感路径带极性(posedgeClk*>Q:D)=(TLH$Clk$Q,THL$Clk$Q)(posedgeClk*>Qb:D)=(TLH$Clk$Qb,THL$Clk$Qb)电平敏感路径if(C)(X*>Z)=if(!CV=='hff)(X*>Z)=ifnone(X*>Z)=缺省为SDPD,从X(不定值)到Z(高阻值)时序检测$setuphold(posedgeClk,D,Tsetup$Clk$D,Thold$Clk$D,Err)endspecifyendmodule还请参阅:Specparam,PATHPULSE$,$setup的说明。Specparam延时参数类似于parameter(参数)但只能用在指定延时块中。语法:specparamName=ConstantExpression,Name=ConstantExpression,在程序中位于何处:specify<HERE>endspecify规则:·Specify块中的常量表达式可以用数字和specparam来定义但不能用参数(parameter)来定义specparam不能用在Specify块(即指定延时模块)外。·利用defparam或在模块的实例引用时使用#可以改写用specparam定义的延时参数值用编程语言接口(PLI)也可以修改其值。提示·在Specify块中用specparam来定义命名的延时参数比直接用数字要好。·这些延时参数应有一个命名的规则这样便于对它们进行修改如果有必要的话也可以采用PLI的延时计数来进行修改。举例说明:specifyspecparamtRise$a$f=,tFall$a$f=,tRise$b$f=,tFall$b$f=(a*>f)=(tRise$a$f,tFall$a$f)(b*>f)=(tRise$b$f,tFall$b$f)endspecify还请参阅:PATHPULSE$,Specify的说明。Statement声明语句运用声明语句可以描述硬件模块的行为。声明语句在定时控制的(延时、控制程序、等待)时刻执行。若两个或两个以上的语句是一起的必须把它们写在beginend或forkjoin块中。在beginend块中每条语句是顺序执行的在forkjoin块中它们是并行执行的。initial或always块中的语句是同其它initial或always块中的语句是同时执行的。语法:{either}{statement}TimingControlStatement{Statementmaybe}BeginForkProceduralAssignmentProceduralContinuousAssignmentForceIfCaseForForeverRepeatWhileDisable>EventName{Eventtrigger}TaskEnable在程序中位于何处:initial<HERE>always<HERE>begin<HERE>endfork<HERE>jointask<HERE>endtask{allowed}function<HERE>endfunctionif()<HERE>else<HERE>{allowed}caselabel:<HERE>endcase{allowed}for(<HERE>)<HERE>forever<HERE>repeat()<HERE>while()<HERE>还请参阅:TimingControl的说明。

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/23

夏宇文老师vlogRef3

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利