您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 浅析verilog语言
1浅析VerilogHDL硬件语义ONIONIONIONI2004.8.142内容简介内容简介n写本文的初衷是为了使已经对VerilogHDL有过初步了解的读者,能够更进一步的了解VerilogHDL与综合后的硬件之间的映射关系,从而把握VerilogHDL的应用规则,改善代码风格,写出高效,可综合的代码。n全文共分为3个部分:¨VerilogHDL的基本知识¨VerilogHDL从结构语句到门级映射¨模型的优化n参考文献:¨VerilogHDLSynthesisAPracticalPrimer.J.Bhasker¨AGuideToDigitalDesignAndSynthesis.SamirPalnitkar¨VerilogHDLReferenceManual.Synopsys3什么是综合?什么是综合?nn综合综合是从采用VerilogHDL描述的寄存器传输级(RTL)电路模型构造出门级网表的过程。n综合可能有个中间步骤,生成的网表是由一些RTL级功能块连接组成。这时就需要RTLRTL模块构造模块构造器器来针对用户指定的目标工艺从预定义库中构造或获取每一个必须的RTL功能块的门级网表。n产生门级网表之后,逻辑优化器逻辑优化器读入网表并以用户指定的面积和定时面积和定时约束约束为目标优化网表。这些面积和定时约束面积和定时约束也可以用来指导RTLRTL模块模块构造器构造器适当的选取或生成RTL级功能块。n这里我们研究Verilog的硬件语义是为了分析以下几个问题:¨1)数据类型如何变成硬件?2)常量如何映射成逻辑值?3)语句如何转变成硬件?4逻辑值体系逻辑值体系n硬件建模中常用的值有:¨逻辑0¨逻辑1¨高阻抗¨无关值¨不定值nVerilogHDL对于无关值之外的其它值都作了明确的定义,当值X被赋给某个变量时,系统通常把此值视为无关值。nVerilogHDL中的值与硬件建模中的值之间的对应关系如下:¨¨00--逻辑0¨¨11--逻辑1¨¨zz--高阻抗¨¨zz--无关值(casezcasez和casexcasex语句中)¨¨xx--无关值¨¨xx--不定值¨注:没有激励时,netnet类型变量通常被系统初始为zz,regreg类型变量则被初始为xx。5数据类型数据类型nVerilogHDL中的变量隶属于以下两种(不可综合的类型略去)¨¨网线数据类型(网线数据类型(netnet))nnwirewire仅有一个驱动源的节点。nntritri有多个驱动源的节点。nnworwor,wandwand由多个驱动源产生“或或”或者“与与”逻辑输出的节点。nnsupply0supply0,supply1supply1始终由逻辑逻辑00或逻辑逻辑11驱动的节点。¨¨寄存器数据类型(寄存器数据类型(regreg))nnregreg任意宽度的二进制变量。(无符号,可指定宽度)nnintegerinteger默认为32位二进制补码的变量。(有符号,系统根据该变量的赋值语句优化宽度)n注:regreg类型变量并不一定就被综合成寄存器。n在模块定义和例化模块时,数据类型的设定应按照以下规则:n例1:modulemoduleex1(in1,in2,out1,out2)inputinputin1,in2;outputoutputout1,out2;wirewirein1,out1;regregin2,out2;//in2应为netendmoduleendmodule例化时,in可为net/reg,out应为netinputoutputinoutnetnet/regnetnetnetnet/reg6数据类型(续)数据类型(续)nn持续赋值持续赋值语句中左端应为net。assignassigna=b;regrega;//非法nn过程赋值过程赋值语句中左端应为reg。alwaysalwaysa=b;alwaysalwaysc=d;wirea,c;//非法nreg类型变量如果在一个块语句中先被赋值,再被引用,不生成寄存器。n在右边的例2中,变量TrqTrq,先被赋值,后被引用,其间没有必要存储该变量的值,因而未生成器存器。例2:————————————————————————11:begin….end是一个块语句,内部的语句按顺序执行。此例中用的是阻塞赋值,没有生成寄存器,非阻塞赋值时则可能生成。以后将详细说明。7值保持器的硬件建模值保持器的硬件建模n硬件中有3种基本的值保持器:¨¨连线连线¨¨触发器触发器(边沿触发)¨¨锁存器锁存器(电平触发)nnet型变量被映射成硬件连线连线。nreg型变量则根据上下文被映射成存储元件。(触发器触发器或锁存器锁存器)n例3:(改自例2)n从上图中我们发现虽然变量TrqTrq在赋值前就被引用,但同样没有映射出存储元件,因为它没有在任何条件的控制下被赋值。n如果TrqTrq是在某个电平控制下被赋值,则被映射成锁存器锁存器。n如果TrqTrq是在某个边沿控制下被赋值,则被映射成触发器触发器。n本文后续部分还将继续说明不同的结构语句对于值保持器硬件建模的影响。8常量与参数常量与参数nVerilogHDL中有3种常量:整整形形、实型实型和字符串型字符串型。后两种的常量不能用来综合。n整形常量有两种形式:¨简单的十进制(有符号数)¨基数格式(无符号数)n只有赋值语句中指定了整形常量的位宽,综合时才使用指定的位宽,否则位宽为32。n请看以下示例:3032位有符号数-2二进制补码形式的32位有符号数2’b10位宽为2的无符号数-6’b46位无符号数(-4的补码)n参数是命名常量。由于不能指定位宽,因此其位宽与其对应的常量位宽相同。parameterparameterRED=-1;parameterparameterREADY=2’b01;nRED为有符号常量参数,READY为位宽为2的参数。n注意:defparamdefparam在某些综合器中无效。应尽量采用重载模块参数的方法。如:Memmem_inst#(32,1024)(clr,rstN,wrN,rdN,din,dout);9运算符体系运算符体系nn算术运算符算术运算符:¨¨++,--,**,//,%%(取模)¨可直接对加法器硬件建模,但要注意位宽的统一性,否则会丢失进位。乘法器则应调用综合器的RTLRTL功能块。功能块。除法器在某些综合器中无效。nn位运算符位运算符:¨¨&&,||,~~,^^,^~^~,~^~^¨可直接用来逻辑门硬件建模,但要注意对于矢量,是按照位生成逻辑门的,多用于编码/解码器硬件建模。nn逻辑运算符逻辑运算符:¨¨!!,&&&&,||||¨多用于优先级电路的硬件建模。nn关系运算符关系运算符:¨¨,,==,==¨可直接对比较器硬件建模,也可用于生成优先级电路。nn相等性运算符相等性运算符:¨¨====,!=!=(======,!==!==不能综合)¨多用于编码/解码器硬件建模。nn移位运算符移位运算符:¨¨,¨多用于移位寄存器硬件建模。特别是对于位宽不定的移位寄存器建模。nn条件运算符条件运算符:¨?:¨多用于多路选择器硬件建模。10运算符体系(续)运算符体系(续)n在VerilogHDL的运算符体系中,必须注意以下三个问题:¨运算表达式中的变量如果为“xx”,或“zz”,则表达式的值为未知。应尽量避免这种情况的发生。¨运算表达式中变量的位宽应尽量统一,否则将无法顺利通过综合。¨应重视非常量下标的应用,可产生译码,编码,多路选择,等电路。一个多路选择器一个译码器11锁存器建模锁存器建模----IfIf语句语句nnIfIf语句中,应注意变量是否在所有分支中都被赋值。如果不是,则会产生锁存器。n上例生成锁存器,如果在分支条件中再加上elseGrade=EXCELLENT;则不会产生锁存器。12锁存器建模锁存器建模----CaseCase语句语句n与IfIf语句一样,如果变量没有在所有分支中被赋值,也会生成锁存器。n通常为了避免生成CaseCase语句生成锁存器,有以下几种方法。¨默认分支¨默认赋值¨综合指令full_casefull_case。n注:full_casefull_case指令可能导致设计模型和综合后的网表功能不一致。要慎用!会生成锁存器默认分支默认赋值13锁存器建模--小结锁存器建模--小结n根据前面的几个例子,我们可以对锁存器建模的规则作出如下总结:¨变量在条件语句中被赋值。¨变量未在所有分之中被赋值。¨在alwaysalways语句中多次调用需要保存变量值。¨必须同时满足以上3个条件,变量才能生成锁存器。n以下再通过几个例子来说明。n上面4段程序中只有程序(3)中的BdyBdy会被综合成锁存器。n其他的几段程序都违反了锁存器建模的规则,综合时会出现警告,并提示可能发生功能不一致。(1)(2)(3)(4)14优先级编码器优先级编码器//译码器建模--译码器建模--CaseCase语句语句nnCaseCase语句暗示了检查分支项的优先级顺序。极易综合出优先级逻辑(if…,elseif…,else…),如果分支项很多,则会导致嵌套得很深。n如果设计者知道所有的分支项相互排斥,可是用综合指令parallel_caseparallel_case来生成译码电路,取代优先级电路。n第一个图为优先级电路n第二个图为译码电路n显然,第二个图的电路更简洁,高效。注意15循环语句--循环语句--ForFor语句语句nVerilogHDL中有4种不同类型的循环语句:¨¨WhileWhile循环¨¨ForFor循环¨¨ForeverForever循环¨¨RepeatRepeat循环n其中forfor循环语句是典型的能用于综合的循环语句。其综合是通过展开循环来实现的,这就要求对forfor循环的边界加以限制,要保证循环边界都是常量。n当forfor循环次数很多时,应注意加上综合指令,//synthesissynthesisloop_limitloop_limit200200否则综合器会报出警告,应尽量避免forfor语句多次使用。上述代码等价于:16触发器建模触发器建模n触发器建模的规则如下:¨如果变量在时钟沿的控制下被赋值,则生成触发器。但有一个例外,若对变量的赋值和引用仅出现在同一条alwaysalways语句中。则该变量会被视作中间变量,而不会生成触发器。nnalwaysalways@(时钟事件)语句n在触发器建模中应尽量使用非阻塞赋值,这样可以防止设计模型与综合出的网表之间存在的任何功能上的不一致。n对于变量的赋值,则不能受多个时钟控制,也不能受两种不同的时钟条件的控制。n同步预置位和清零:仅在时钟控制的alwaysalways语句中描述同步预置位和清零逻辑就行了。n异步预置位和清零:使用特定形式的ifif语句,以下是一个简单的模板。17阻塞式与非阻塞式赋值阻塞式与非阻塞式赋值n阻塞式与非阻塞式赋值的语义差异如下:¨阻塞赋值,在执行下一条语句之前就完成了对左端对象的赋值。¨非阻塞赋值:对左端对象的赋值安排在该仿真周期(一个时钟)结束时。(即赋值并不立即生效)n我们可以通过下面的例子清楚的看到它们之间的差异:非阻塞赋值阻塞赋值18阻塞式与非阻塞式赋值(续)阻塞式与非阻塞式赋值(续)n从之前的例子,我们可以发现,阻塞赋值更容易生成组合逻辑(赋值立刻生效),而非阻塞赋值更容易生成时序逻辑(赋值不立刻生效)。我们在选择这两种赋值方式的时候,应慎重考虑时序所要受到的影响。n对于组合逻辑建模应注意:¨非阻塞赋值不反映逻辑流。¨需要将所有赋值对象都列入事件表中。n对于时序逻辑建模应注意:¨禁止使用阻塞赋值在多个块语句内对同一变量多次赋值,将有可能导致毛刺的生成。¨如果在某alwaysalways语句内对变量赋值而在该alwaysalways语句外读取变量,那么应采用非阻塞赋值。¨如果仅在一条alwaysalways语句内,要求变量既被赋值,又被引用,则应改用阻塞赋值,这样引用的实时性较好。n通常我们建议多使用
本文标题:浅析verilog语言
链接地址:https://www.777doc.com/doc-6216135 .html