3Verilog1.VerilogHDL是一种硬件描述语言,用于从算法级、RTL级、门级到开关级的多种抽象设计层次的数字系统建模。行为级描述:数据结构和过程类似C;用于描述算法级和RTL级的Verilog模型。结构级描述:用于描述门级和开关级电路;特点:支持门级延时信息和驱动能力等的描述。VHDL侧重于系统级描述,从而更多的为系统级设计人员所采用;Verilog侧重于电路级描述,从而更多的为电路级设计人员所采用。2.VerilogHDL设计入门模块(module)模块是Verilog的基本描述单位模块的定义从关键词module开始,到关键词endmodule结束每条VerilogHDL语句以分号“;”作为结束模块的基本结构⑴、模块定义行以module开头接着给出所定义模块的模块名括号内给出端口名列表(端口名等价于硬件中的外接引脚,模块通过这些端口与外界发生联系)以分号结束⑵、端口类型说明端口类型只有input、output、inout三种⑶、数据类型说明支持的数据类型有连线类(wire)和寄存器(reg)类两个大类一位宽的wire类可被缺省外,其它凡将在后面的描述中出现的变量都应给出相应的数据类型说明⑷、描述体部具体展开对模块的描述⑸、结束行用关键词endmodule标志模块定义的结束它的后面没有分号行为描述与结构描述行为描述(Behavior)描述行为或功能特性结构描述(Structure)描述通过什么样的结构方式将不同的实体连接起来用以实现所要求的行为或功能。测试与仿真测试平台(TestBench):在输入端口加入测试信号,从输出端口检测其输出结果是否正确。通常将需要测试的对象称之为DUT(DeviceUnderTest)。测试模块:要调用DUT;包含用于测试的激励信号源;能够实施对输出信号的检测,并报告检测的结果。过程语句Initial:只顺序地执行一次;没有触发条件。Always:当顺序执行到最后一条语句后,会自动返回到第一条语句重新开始执行,是一条没有穷尽的循环语句往往带有触发条件3.VerilogHDL基础知识基本词法定义空白符空白符是以下几种字符与控制符的总称:①空格、②TAB键、③换行符、④换页符。空白符起分隔符的作用:允许在一行内写多条VerilogHDL语句注释行单行注释:以“//”开始到行末结束,不允许续行多行注释:以“/*”开始,到“*/”结束,可以跨越多行,但不允许嵌套注释行中的内容只是为了便于阅读理解在必要的地方增加适当的注释说明,在HDL编程中尤为重要有些操作控制命令以注释行的方式出现在HDL描述中,它不影响HDL的仿真,但其它工具可以识别这些控制命令四种逻辑状态VerilogHDL需要用数字或字符去表达在数字电路中存储与传送的逻辑状态。0逻辑零、逻辑非、低电平x或X不确定的逻辑状态1逻辑1、逻辑真、高电平z或Z高阻态整数及其表示整数可以表示成:十进制、十六进制、八进制、二进制等表示方法有两种:①直接由0~9的数字串组成的十进制数②+/-位宽‘基数符号按基数表示的数值位宽是指所要表示的整数用二进制展开时所需的二进制位的个数(bit数),其值用十进制数表示位宽在表示中可以被缺省基数符号问号“?”是高阻态z的另一种表示下划线“_”的引入只是为了增加可读性在数值表示中,左边为最高有效位(MSB),右边为最低有效位(LSB)在二进制表示中,x,z只代表相应位的逻辑状态;在八进制表示中,一位的x,z代表的是三个二进制位都处于x或z态,在十六进制中则对应代表四个二进制位都处于x或z态对于带符号的整数,正、负号的表示应在最左边基数表示实例实数及其表示实数可以用十进制数表示,也可用指数表示。在verilogHDL中,实数可以参与的运算是受限制的。当实数被转换为整数时,是按四舍五入的方式进行的。字符串定义:为两个双引号“”之间的字符;字符串不允许跨行。可通过前导的控制键(反斜杠及百分号)引入一些特殊字符取名规则必须是由字母(a~z,A~Z)或下划线开头,长度小于1024字符的一串字符序列后续部分可以是字母(a~z,A~Z)、数字(0~9)、下划线、$还可以是反斜杠“\”开头,并以空白符结尾的任何字符序列。但反斜杠本身及空白符都不属标识符组成部分系统命令以$开头的标识符用以代表系统命令(系统任务与系统函数)$display$monitor$finish关键词VerilogHDL语言内部已经使用的词称为关键词或保留词,应避免使用所有的关键词都是小写always,and,assign,attribute,begin,buf,case,default,else……数据类型连线类型和寄存器类型驱动方式(或赋值方式)不同保持方式不同对应硬件实现不同wire连线类型对应硬件电路中的物理信号连接驱动有两种方式:在结构描述中把它连接到一个门或模块的输出端用连续赋值语句assign对其进行赋值没有电荷保持作用,当没有被驱动时,将处于高阻态z连线主要出现在模块的结构描述中,对应硬件电路中物理信号连接。在对连线进行描述时,必须用连线类型定义语句进行说明,当说明被缺省时,表示的是位宽为1bit的wire型连线。Wire是标准的,不附带其它逻辑功能的连线。Tri与wire的功能是完全一致的。Wire与wor以及wand三者之间的差别体现在有多重驱动时连线所具有的不同逻辑特性reg寄存器类型对应的是具有状态保持作用的硬件电路元件,如触发器、锁存器等驱动可以通过过程赋值语句实现过程赋值在接受下一次的过程赋值之前,将保持原值不变当寄存器类型没有被赋值前,将处于不定态X所有寄存器类的量,都有“寄存”性,即在接受下一次赋值前,将保持原值不变。所有寄存器类都必须给出类型说明(无缺省状态)。寄存器类的量,必须通过过程赋值语句进行赋值。Integer、real、time都是纯数学的抽象描述,不对应于任何具体的硬件电路实现。标量与矢量线宽只有一条的连线,以及位数只有一位的寄存器称之为标量。线宽大于一条的连线,或位数大于一位的寄存器称之为矢量。矢量的说明:矢量的范围由括在方括号中的一对数字表示,中间一个冒号相隔。形式为:[msb:lsb]。参数定义语句parameter用于对延时、线宽、寄存器位数等物理量的定义用一个文字参数来代替一个数字量优点:增加描述的可读性;为以后的修改带来方便。形式描述:参数定义表项给出具体的各个参数与数字量之间所谓对应关系,相互间用逗号“,”相隔宏替换`define宏替换的形式描述:`define宏名进行宏替换的文本内容宏替换是在编译时告知编译器,用宏替换定义中的文本内容来直接替代模块描述文件中出现的宏名。一条宏定义语句只能定义一个宏替换,且定义结束时无分号。补充宏替换定义本身以及用到宏替换的地方必须有撇号“`”作开头模拟时间定标对模拟器的时间单位及时间计算的精度进行定标定义:`timescale计时单位/计时精度计时单位与计时精度都由整数及相应的时间单位两部分组成时间单位:S、ms(毫秒)、us(微秒)、Ns(纳秒)、ps(微微秒)、Fs(毫微微秒)时间精度:延迟时间的最小分辨率计时单位必须大于等于精度单位对timescale的定义必须在模块描述的外部进行模拟器允许对不同模块定义不同的时标,但以最小的精度进行模拟计算运算符运算符的分类单目运算符:只有一个操作数,且运算符位于操作数的左边双目运算符:有两个操作数,各位于运算符的两边三目运算符:属于这一类的只有条件运算符(?:)一个运算符的优先级顺序算术运算符:1、加法运算符;+,实现加法运算2、减法运算符;-,实现减法运算3、乘法运算符;×,实现乘法运算4、除法运算符;/,实现除法运算5、取模运算符;%,实现取模运算在算术运算操作中,操作数是作为一个整体参与运算的,因而,如果某个操作数的某一位为不定态(x值),则整个表达式的运算结果也为不定态。位运算符:按位取反运算符:~按位与运算符:&按位或运算符:|按位异或运算符:^按位同或运算符:^~或~^缩位运算符:单目运算符,按位进行逻辑运算,最后结果为一位的二进制数缩位运算符包括:&|^(异或)~&~|~^or^~(同或)逻辑运算符:逻辑与运算符:&&(双目运算符)A=6;A&&B1&&00逻辑或运算符:||(双目运算符)B=0;A||!B1||11逻辑非运算符:!(单目运算符)C=x;x关系运算符:1、小于:2、大于:3、小于等于:=4、大于等于:=结果是一位值:0,1或x相等与全等运算符:共有四种:1、相等运算符:==2、不等运算符:!=3、全等运算符:===4、不全等运算符:!==4’b1z0x==4’b1z0xx4’b1z0x!=4’b1z0xx4’b1z0x===4’b1z0x14’b1z0x!==4’b1z0x0都是双目运算符,得到的结果是1位的逻辑值相等算符:逐位比较两个操作数相应位的值是否相等,只有当每一位都相等时,相等关系才满足。如果任何一个操作数中的某一位存在不定态或高阻态,则将得到一个不定态的结果。全等算符:将不定态或高阻态看作是逻辑状态的一种而参与比较逻辑移位运算符:1、逻辑左移:2、逻辑右移:Resultissamesizeasfirstoperand,alwayszerofilled例:a=4’b1010;d=a2;//d=0010c=a1;//c=0100连接运算符:将两组或两组以上的信号用大括号括起来,拼接成一组新的信号。对于一些重复信号的连接,可以用它的简化表示方法{n{a}},表示将信号a重复连接n次。Operandsmustbesized!!(数的进制相同)条件运算符:条件运算符?条件为真时的表达式:条件为假时的表达式:Assignout=(sel==0)?a:b允许实型量参与的运算符不允许实型量参与的运算符4.Verilog行为描述Verilog行为描述的构成框架模块的基本结构过程块VerilogHDL对模块的行为描述以过程块为基本组成单位,一个模块的行为描述由一个或多个并行运行的过程块组成。过程块的形式定义:过程语句@(事件控制敏感表)块语句开始标识符:块名块内局部变量说明一条或多条过程赋值或高级程序语句块语句结束标识符斜体表示的是可缺省的部分过程语句是指Initial或always事件控制敏感表只在always过程语句中出现,用于激活过程语句的执行块语句标识符分begin-end(串行块)与fork-join(并行块)两类块名和块内局部变量说明均为可选项过程语句Initial与always1、都是从模拟的0时刻开始执行,但initial过程语句后面的块语句沿时间轴只执行一次,而always则循环地重复执行其后的块语句。2、initial过程语句不带触发条件,因而必定从模拟的0时刻开始执行它后面的块语句;always过程语句则通常带有触发(激活)条件,只有当触发条件被满足时,其后的块语句才真正开始执行。如果触发条件被缺省,则认为触发条件始终被满足。3、一个模块的行为描述中可以有多个initial与always语句,代表多个过程块的存在,它们之间相互独立,并行运行。Initial过程语句在实际的描述过程中,最经常地应用于测试模块中对激励向量的描述。在对硬件功能模块的行为描述中,仅在必要时给寄存器变量赋以初值。是一条主要面向模拟的过程语句,通常不为逻辑综合工具接受。Always过程语句在测试模块中一般用于对时钟的描述,但更多地用于对硬件功能模块的行为描述。功能模块的行为描述是由过程块构成的,每个过程块都要由过程语句所引导,因而每个功能模块的行为描述中,至少存在一个always过程语句。块语句由块标识符be