1、Verilog HDL历史历史v 1983年,年,Gateway Design Automation公司推出公司推出Verilog语言,开发语言,开发了仿真与验证工具;了仿真与验证工具;v 1985年,年,GDA推出推出Verilog仿真器仿真器Verilog-XL:仿真速度快,处理能:仿真速度快,处理能力强,具有交互式调试手段;力强,具有交互式调试手段;v 1987年,年,Synopsys公司的综合软件开始接受公司的综合软件开始接受Verilog输入;输入;v 1989年,年,Cadence公司收购公司收购GDA,进一步扩大,进一步扩大Verilog的影响;的影响;v 1990年,年,Ope
2、n Verilog International(OVI)成立,推广)成立,推广Verilog HDL和和Veriog-XL被广泛推广;被广泛推广;v 1993年,年,OVI推出推出Verilog2.0,作为,作为IEEE提案提出申请;提案提出申请;v 2019年,年,IEEE(Institute of Electrical and Electronics Engineers)通过通过Verilog HDL标准标准IEEE Std.1364-2019;v 2019年,年,IEEE 发布了发布了Verilog IEEE 1364-2019标准。标准。本课程以本课程以IEEE Std.1364-20
3、19为主为主Verilog HDL现状现状vVerilog HDL是最广泛使用的、具有国际标准支是最广泛使用的、具有国际标准支持的硬件描述语言,绝大多数的持的硬件描述语言,绝大多数的EDA厂商都支持;厂商都支持;v在工业界和在工业界和ASIC设计领域,设计领域,Verilog HDL应用更应用更加广泛。加广泛。Verilog HDL与与VHDLvVHDL Very-High-Speed Integrated Circuit Hardware Description Language v诞生于诞生于1982年;年;1987年底被年底被IEEE和美国国防部和美国国防部确认为标准硬件描述语言确认为标
4、准硬件描述语言。vIEEE 1076(1983)vIEEE 1076-2019vVerilog HDL与与VHDLv 建模层次建模层次 系统级系统级(system):用高级语言结构实用高级语言结构实现设计模块的外部性能的模型。现设计模块的外部性能的模型。算法级算法级(algorithmic):用高级语言结用高级语言结构实现设计算法的模型。构实现设计算法的模型。RTL级级(Register Transfer Level):描述数据在寄存器之间流动和如何描述数据在寄存器之间流动和如何处理这些数据的模型。处理这些数据的模型。门级门级(gate-level):描述逻辑门以及描述逻辑门以及逻辑门之间的连
5、接的模型。逻辑门之间的连接的模型。开关级开关级(switch-level):描述器件中描述器件中三极管和储存节点以及它们之间连三极管和储存节点以及它们之间连接的模型。接的模型。逻辑级 电路级 系统级 算法级 算法级 RTL 级 RTL 级 门级 门级 开关级 VHDL Verilog HDL 行为级 Verilog HDL与与VHDLv相同点:相同点:都能形式化抽象表示电路行为和结构;都能形式化抽象表示电路行为和结构;支持逻辑设计中层次与范围的描述;支持逻辑设计中层次与范围的描述;具有电路仿真和验证机制;具有电路仿真和验证机制;与工艺无关。与工艺无关。不专门面向不专门面向FPGA设计设计v不同
6、点:不同点:Verilog与与C语言相似,语法灵活;语言相似,语法灵活;VHDL源于源于Ada语言,语言,语法严格;语法严格;Verilog更适合更适合ASIC设计。设计。SystemVerilog与与SystemCvSystemVerilog:IEEE 1364 Verilog-2019 标准标准的扩展增强,兼容的扩展增强,兼容Verilog 2019,将硬件描述语,将硬件描述语言(言(HDL)与现代的高层级验证语言()与现代的高层级验证语言(HVL)结)结合。合。vSystemC:一种软:一种软/硬件协同设计语言硬件协同设计语言,既是系,既是系统级语言,也是硬件描述语言。统级语言,也是硬件
7、描述语言。系统建模系统建模v设计方法学设计方法学 自顶向下自顶向下 自底向上自底向上 混合式混合式v描述方式描述方式 数据流描述:描述电路数据流行为:数据流描述:描述电路数据流行为:assign 行为描述:描述功能:行为描述:描述功能:initial,always 结构化描述:描述元器件间连接关系:例化结构化描述:描述元器件间连接关系:例化 混合描述:混合描述:Verilog允许多描述方式共存于同一模块。允许多描述方式共存于同一模块。简单的简单的Verilog程序程序module trist1(out,in,enable);output out;/*输出信号输出信号*/input in,ena
8、ble;/输入信号输入信号 mytri tri_inst(out,in,enable);endmodulemodule mytri(out,in,enable);output out;input in,enable;assign out=enable?in:bz;endmodulev 三态门三态门v 模块模块trist1 trist1 调用调用模块模块 mytri mytri 的实的实例元件例元件tri_insttri_inst;v通过这种结构性通过这种结构性模块构造可构成模块构造可构成特大型模块。特大型模块。简单的简单的Verilog程序程序v三态门(综合)三态门(综合)简单的简单的Veri
9、log程序程序vVerilog HDLVerilog HDL程序是由模块构成的;程序是由模块构成的;v每个模块要进行端口定义每个模块要进行端口定义,并说明输入输出口并说明输入输出口,然然后对模块的功能进行逻辑描述;后对模块的功能进行逻辑描述;vVerilog HDLVerilog HDL程序的书写格式自由程序的书写格式自由,一行可以写几一行可以写几个语句个语句,一个语句也可以分写多行;一个语句也可以分写多行;v除了除了endmoduleendmodule语句外语句外,每个语句和数据定义的最每个语句和数据定义的最后必须有分号。后必须有分号。同一电路的多种描述方法同一电路的多种描述方法v 二选一的
10、选择器二选一的选择器 门级(结构化)描述门级(结构化)描述module muxtwo(out,a,b,sl);input a,b,sl;output out;wire nsl,sela,selb;not#1 u1(nsl,sl);/#1是仿真延迟是仿真延迟 and#1 u2(sela,a,nsl);and#1 u3(selb,b,sl);or#1 u4(out,sela,selb);endmodule RTL级行为描述级行为描述module muxtwo(out,a,b,sl);input a,b,sl;output out;reg out;always(sl or a or b)if(!sl
11、)out=a;else out=b;endmodule 布尔代数级行为描述布尔代数级行为描述module muxtwo(out,a,b,sl);input a,b,sl;output out;assign out=sel?b:a;endmodule 同一电路的多种描述方法同一电路的多种描述方法v 二选一的选择器(综合)二选一的选择器(综合)混合描述混合描述v 混合设计方式的混合设计方式的1位全加器实例位全加器实例module FA_Mix(A,B,Cin,Sum,Cout);input A,B,Cin;output Sum,Cout;reg Cout;reg T1,T2,T3;wire S1;
12、xor X1(S1,A,B);/门实例语句。门实例语句。always (A or B or Cin)/always 语句。语句。beginT1=A&Cin;T2=B&Cin;T3=A&B;Cout=(T1|T2)|T3;endassign Sum=S1 Cin;/连续赋值语句。连续赋值语句。endmodule混合描述混合描述v 混合设计方式的混合设计方式的1位全加器实例(综合)位全加器实例(综合)模块基本结构模块基本结构module 模块名模块名(端口列表端口列表);端口端口I/OI/O说明说明内部信号声明内部信号声明功能定义功能定义endmodule时延时延v Verilog HDL模型中的
13、所有时延都根据时间单位定义。下模型中的所有时延都根据时间单位定义。下面是带时延的连续赋值语句实例。面是带时延的连续赋值语句实例。assign#2 Sum=A B;#2指指2个时间单位。使用编译指令将时间单位与物理时间相关联。个时间单位。使用编译指令将时间单位与物理时间相关联。这样的编译器指令需在模块描述前定义,如下所示这样的编译器指令需在模块描述前定义,如下所示:timescale 1ns/100ps 此语句说明时,延时间单位为此语句说明时,延时间单位为1ns并且时间精度为并且时间精度为100ps(时间精时间精度是指所有的时延必须被限定在度是指所有的时延必须被限定在0.1ns内内)。如果此编译
14、器指令所。如果此编译器指令所在的模块包含上面的连续赋值语句在的模块包含上面的连续赋值语句,#2 代表代表2ns。v 如果没有这样的编译器指令如果没有这样的编译器指令,Verilog HDL 模拟器会指定模拟器会指定一个缺省时间单位。一个缺省时间单位。IEEE Verilog HDL 标准中没有规定标准中没有规定缺省时间单位。缺省时间单位。语言要素:标识符语言要素:标识符v 所谓标识别符就是用户为程序描述中的所谓标识别符就是用户为程序描述中的Verilog 对象所起对象所起的名字。的名字。模块名、变量名、常量名、函数名、任务名模块名、变量名、常量名、函数名、任务名v 标识符必须以英语字母(标识符
15、必须以英语字母(a-z,A-Z)起头,或者用下横线)起头,或者用下横线符(符(_)起头。其中可以包含数字、)起头。其中可以包含数字、$符和下划线符。符和下划线符。v 标识符最长可以达到标识符最长可以达到1023个字符。个字符。v 模块名、端口名和实例名都是标识符。模块名、端口名和实例名都是标识符。v Verilog语言大小写敏感,语言大小写敏感,sel 和和 SEL 是两个不同的标识符。是两个不同的标识符。所有的关键词都是小写的。所有的关键词都是小写的。语言要素:系统任务和函数语言要素:系统任务和函数v以以$字符开始的标识符表示系统任务或系统函数。字符开始的标识符表示系统任务或系统函数。v任务
16、可以返回任务可以返回0个或多个值,函数除只能返回一个或多个值,函数除只能返回一个值以外与任务相同。个值以外与任务相同。v函数在函数在0时刻执行,即不允许延迟,而任务可以时刻执行,即不允许延迟,而任务可以带有延迟。带有延迟。v常用于测试模拟,一般不用于源代码设计。常用于测试模拟,一般不用于源代码设计。$display(Hi,you have reached LT today);/*$display系统任务在新的一行中显示。*/$time/该系统任务返回当前的模拟时间。语言要素:编译指令语言要素:编译指令v以以(反引号)开始的某些标识符是编译器指令。(反引号)开始的某些标识符是编译器指令。defi
17、ne 和和undef,很像,很像C语言中的宏定义指令语言中的宏定义指令 ifdef、else 和和endif,用于条件编译,用于条件编译 include 文件既可以用相对路径名定义,也可以绝对文件既可以用相对路径名定义,也可以绝对路径路径 timescale 编译器指令将时间单位与实际时间相关联。编译器指令将时间单位与实际时间相关联。该指令用于定义时延的单位和时延精度。该指令用于定义时延的单位和时延精度。语言要素:值集合语言要素:值集合vVerilog HDL有下列四种基本的值:有下列四种基本的值:0:逻辑:逻辑0或或“假假”1:逻辑:逻辑1或或“真真”x:未知:未知 z:高阻:高阻 (x,z
18、不区分大小写)不区分大小写)vVerilog HDL中有三类常量:中有三类常量:整型整型 实数型实数型 字符串型字符串型语言要素:常量语言要素:常量1.整数整数v 表达方式:表达方式:标准方式标准方式:默认位宽,与机器类型有关默认位宽,与机器类型有关:不指明进制默认为十进制不指明进制默认为十进制v 进制进制 二进制(二进制(b或或B):):8b10101100,b1010 十进制(十进制(d或或D):):4d1543,512 十六进制(十六进制(h或或H):8ha2 八进制(八进制(o或或O):):6O41v x和和z值值 x:不确定:不确定:4b100 x z:高阻:高阻:16hzzzz,没
19、有驱动元件连接到线网,线网的缺省值为没有驱动元件连接到线网,线网的缺省值为z。语言要素:常量语言要素:常量v 负数:负数:在位宽表达式前加一个减号,在位宽表达式前加一个减号,如如-8d5 减号不可以放在位宽和进制之间,也不可以放在进制和具体的数之间,减号不可以放在位宽和进制之间,也不可以放在进制和具体的数之间,如如8d-5v 下划线:下划线:只能用在具体的数字之间,只能用在具体的数字之间,如如16b1010_1111_1010 位数指的是二进制位数。位数指的是二进制位数。v 数位扩展:(定义的长度比为常量指定的长度长)数位扩展:(定义的长度比为常量指定的长度长)最高位是最高位是0、1,高位用,
20、高位用0扩展:扩展:8b1111 等于等于 8b00001111 最高位是最高位是z、x,高位自动扩展:,高位自动扩展:4bz 等于等于 4bzzzzv 数位截断:数位截断:如果长度定义得更小,最左边的位被截断,如:如果长度定义得更小,最左边的位被截断,如:3 b1001_0011 等于等于 3b011,5H0FFF等于等于5H1F 语言要素:常量语言要素:常量v2.实数实数 十进制计数法;例如2.05.68 科学计数法;23_5.1e2 其值为23510.0,忽略下划线3.6E2 其值为360.0(e与E相同)实数通常不用于实数通常不用于FPGA源代码的常量源代码的常量语言要素:常量语言要素
21、:常量v3.字符串字符串 字符串是双引号内的字符序列。字符串不能分成多行字符串是双引号内的字符序列。字符串不能分成多行书写。例如书写。例如:INTERNAL ERROR REACHEDHERE“用用8位位ASCII值表示的字符可看作是无符号整数。值表示的字符可看作是无符号整数。为存储字符串“INTERNAL ERROR”,变量需要8*14位。reg 1:8*14 Message;(Message=“INTERNAL ERROR“)字符串较少用于字符串较少用于FPGA源代码的常量源代码的常量语言要素:数据类型语言要素:数据类型v 两大类数据类型两大类数据类型 线网型线网型 寄存器型寄存器型v 线
22、网型线网型 包含下述不同种类的线网子类型包含下述不同种类的线网子类型wire/FPGA设计中,通常只用设计中,通常只用wire型型triwortriorwandtriandtriregtri1tri0supply0supply1msb和lsb 定义了范围,并且均为常数值表达式。范围定义是可选的;如果没有定义范围,缺省值为1位线网wire Reset;wire 3:0 data_in;wire 3:2 select;wire 0:2 point;wire msb:lsb reg1,reg2,.regN;语言要素:数据类型语言要素:数据类型v寄存器型寄存器型 5种不同的寄存器类型。reg/FPGA
23、设计中,通常只用设计中,通常只用reg型,默认初始值型,默认初始值x。integer /其他类型用于仿真其他类型用于仿真timerealrealtimemsb和lsb 定义了范围,并且均为常数值表达式。范围定义是可选的;如果没有定义范围,缺省值为1位寄存器reg Reset;reg 3:0 data_in;reg 3:2 select;reg 0:2 point;reg msb:lsb reg1,reg2,.regN;语言要素:数据类型语言要素:数据类型v存储器存储器 存储器是一个寄存器数组。存储器使用如下方式说明存储器是一个寄存器数组。存储器使用如下方式说明reg msb:lsb memor
24、y1 upper1:lower1,memory2 upper2:lower2,.;reg 3:0 MyMem 63:0/MyMem为64个4位寄存器的数组。reg Bog 1:5/Bog为5个1位寄存器的数组。存储器赋值不能在一条赋值语句中完成,寄存器可以。存储器赋值不能在一条赋值语句中完成,寄存器可以。存储器常用于存储器常用于FPGA外围器件的仿真建模外围器件的仿真建模语言要素:数据类型语言要素:数据类型v 存储器赋值存储器赋值 2)系统任务赋值)系统任务赋值reg 3:0 RomB 7:0;$readmemb(ram.patt,RomB);Romb是存储器。文件“ram.patt”必须包含
25、二进制值。文件也可以包含空白空间和注释。下面是文件中可能内容的实例。1 1 0 11 1 1 01 0 0 00 1 1 10 0 0 01 0 0 10 0 1 10 0 0 1语言要素:数据类型语言要素:数据类型v存储器赋值存储器赋值 1)对每个单元逐一赋值)对每个单元逐一赋值reg 0:3 Xrom 0:2;.Xrom0=4hA;Xrom1=4h8;Xrom2=4hF;语言要素:参数语言要素:参数v参数是一个常量,常用于定义时延和变量的宽度。参数是一个常量,常用于定义时延和变量的宽度。parameter LINELENGTH=132;parameter ALL_X_S=16bx;para
26、meter BIT=1,BYTE=8,PI=3.14;parameter STROBE_DELAY=(BYTE+BIT)/2;v参数值也可以在编译时被改变。改变参数值可以参数值也可以在编译时被改变。改变参数值可以使用参数定义语句或通过在模块初始化语句中定使用参数定义语句或通过在模块初始化语句中定义参数值义参数值语言要素:空白符、注释语言要素:空白符、注释v除了字符串中的空白符,其他空白符编译被忽略除了字符串中的空白符,其他空白符编译被忽略v注释注释 多行注释多行注释 /*/(不允许嵌套)(不允许嵌套)单行注释单行注释 /习题习题1v 1 使用使用timescale 编译器指令的目的是什么?编译
27、器指令的目的是什么?v 2 写出产生下图所示波形的变量写出产生下图所示波形的变量BullsEye的初始化语句。的初始化语句。v 3 使用数据流描述方式编写下图所示的异或逻辑的使用数据流描述方式编写下图所示的异或逻辑的Verilog HDL描述,描述,并使用规定的时延。并使用规定的时延。v 4下列表达式的位模式是什么?下列表达式的位模式是什么?7o44,Bx0,5bx110,hA0,10d2,hzF表达式表达式v表达式由表达式由操作数操作数和和操作符操作符组成;组成;v表达式可以在出现数值的任何地方使用;表达式可以在出现数值的任何地方使用;v表达式是数据流描述的基础。表达式是数据流描述的基础。A
28、&BAddr13:0+Addr23:0Count+1(a0 b0)|(a1&b1)表达式:操作数表达式:操作数v操作数可以是以下类型中的一种:操作数可以是以下类型中的一种:常数常数 参数参数 线网线网 寄存器寄存器 位选择位选择 部分选择部分选择 存储器单元存储器单元 函数调用函数调用表达式:操作数表达式:操作数 常数常数表达式中的整数值可被解释为有符号数或无符号数;表达式中的整数值可被解释为有符号数或无符号数;如果整数是基数型整数,作为无符号数对待。如果整数是基数型整数,作为无符号数对待。1201100的的5位向量形式位向量形式(有符号)(有符号)-1210100的的5位向量形式位向量形式(
29、有符号)(有符号)5b01100 十进制数十进制数12(无符号)(无符号)参数参数参数类似于常量,并且使用参数声明进行说明。例如参数类似于常量,并且使用参数声明进行说明。例如parameter LOAD=4d12,STORE=4d10;LOAD和和STORE为参数,值分别被声明为为参数,值分别被声明为12和和10。表达式:操作数表达式:操作数 线网线网线网中的值被解释为无符号数,线网中的值被解释为无符号数,表达式中可使用:表达式中可使用:标量线网标量线网(1位位)和和向量线网向量线网(多位多位)。wire 3:0 led;/4位向量线网。位向量线网。wire line;/标量线网。标量线网。a
30、ssign led=4ha;/被赋于位向量被赋于位向量1010,为十进制,为十进制10。表达式:操作数表达式:操作数 寄存器寄存器integer型的值被解释为有符号的二进制补码数,型的值被解释为有符号的二进制补码数,reg型型或或time型的值被解释为无符号数,型的值被解释为无符号数,real型和型和realtime的值被解释为有符号浮点数。的值被解释为有符号浮点数。reg 4:0 state;State=5b01011;/值为位向量值为位向量01011,十进制值,十进制值11。State=9;/值为位向量值为位向量01001,十进制值,十进制值9。为何没有用为何没有用assign语句赋值?语
31、句赋值?表达式:操作数表达式:操作数 位选择位选择位选择从向量中抽取特定的位。形式如下:位选择从向量中抽取特定的位。形式如下:net_or_reg_vectorbit_select_exprState1&State4/寄存器位选择。寄存器位选择。led0|line/线网位选择。线网位选择。如果选择表达式的值为如果选择表达式的值为x、z或越界,则位选择的值为或越界,则位选择的值为Statex值为值为x。(。(FPGA设计中禁用设计中禁用)表达式:操作数表达式:操作数 部分选择部分选择net_or_reg_vectormsb_const_expr:lsb_const_exprState 4:1/寄
32、存器部分选择。寄存器部分选择。reg 4:0 state;led 2:0/线网部分选择。线网部分选择。wire 3:0 led;选择范围越界或为选择范围越界或为x、z时,部分选择的值为时,部分选择的值为x。(FPGA设计中禁用越界设计中禁用越界)表达式:操作数表达式:操作数 存储器单元存储器单元存储器单元从存储器中选择一个存储器单元从存储器中选择一个memoryword_addressreg 7:0 Dram 63:0;Dram 60;/存储器的第存储器的第61个单元。个单元。不允许对存储器变量值部分选择或位选择。不允许对存储器变量值部分选择或位选择。(思考:在存储器中读取一个位或部分选择一个
33、字?)(思考:在存储器中读取一个位或部分选择一个字?)函数调用函数调用 表达式中可使用函数调用。表达式中可使用函数调用。$time+SumOfEvents(A,B)/*$time是系统函数,并且是系统函数,并且SumOfEvents是在别处定义的是在别处定义的用户自定义函数。用户自定义函数。*/表达式:操作符表达式:操作符vVerilog HDL中的操作符可以分为下述类型:中的操作符可以分为下述类型:算术操作符算术操作符 关系操作符关系操作符 相等操作符相等操作符 逻辑操作符逻辑操作符 按位操作符按位操作符 归约操作符归约操作符 移位操作符移位操作符 条件操作符条件操作符 连接和复制操作符连接
34、和复制操作符表达式:操作符表达式:操作符表达式:操作符表达式:操作符v除条件操作符从右向左关联外,其余所有操作符除条件操作符从右向左关联外,其余所有操作符自左向右关联。自左向右关联。A+B-C等价于:等价于:(A+B)-C/自左向右自左向右 A?B:C?D:F等价于:等价于:A?B:(C?D:F)/从右向左从右向左v圆扩号能够用于改变优先级圆扩号能够用于改变优先级(A?B:C)?D:F表达式:操作符表达式:操作符v算术运算符算术运算符+(加)(加)(减)(减)*(乘)(乘)/(除)(除)%(取模)(取模)1)后三种不常用,是具体设计结构而定;后三种不常用,是具体设计结构而定;2)任意操作数是任
35、意操作数是X或或Z,那么整个结果为,那么整个结果为X;3)结果的长度由最长的操作数决定;结果的长度由最长的操作数决定;4)reg和和wire保存无符号数。保存无符号数。表达式:操作符表达式:操作符v关系操作符有:关系操作符有:(大于)(大于)=(不小于)(不小于)4552 =b01110表达式:操作符表达式:操作符v等式运算符(相等关系运算符)等式运算符(相等关系运算符)=(逻辑相等)(逻辑相等)!=(逻辑不等)(逻辑不等)=(全等)(全等)!=(非全等)(非全等)1)如果比较结果为假则结果为如果比较结果为假则结果为0,为真结果为,为真结果为1;2)在全等比较中,值在全等比较中,值x和和z严格
36、按位比较。严格按位比较。=01xz=01xz01000010 xx10100101xxx0010 xxxxxz0001zxxxx习题:求下列表达式真值习题:求下列表达式真值假定假定Data=b11x0;Addr=b11x0;求求 Data=AddrData=Addr表达式:操作符表达式:操作符v逻辑操作符有逻辑操作符有:&(逻辑与逻辑与)|(逻辑或逻辑或)!(逻辑非逻辑非)1)只对逻辑值运算,结果一位,逻辑只对逻辑值运算,结果一位,逻辑值值1、0或或x;2)对于向量操作对于向量操作,非非0向量作为向量作为1处理;处理;3)如果任意一个操作数包含如果任意一个操作数包含x,结果,结果也为也为x。习
37、题:求下列表达式真值习题:求下列表达式真值假定假定:C=b0;/0为假为假D=b1;/1为真为真A_Bus=b0110;B_Bus=b0110;求求 C&DC|D !DA_Bus&B_Bus A_Bus|B_Bus!A_Bus表达式:操作符表达式:操作符v按位操作符有按位操作符有:(一元非)(一元非)&(二元与)(二元与)|(二元或)(二元或)(二元异或)(二元异或)或或(二元异或非)(二元异或非)操作数对应位上按位操操作数对应位上按位操作,并产生向量结果。作,并产生向量结果。习题:求下列表达式真值习题:求下列表达式真值假定假定A=b0110;B=b0100;求求A|BA&B表达式:操作符表达
38、式:操作符v归约操作符有归约操作符有:&(归约与)(归约与)&(归约与非)(归约与非)|(归约或)(归约或)|(归约或非)(归约或非)(归约异或)(归约异或)(归约异或非)(归约异或非)在单一操作数的所有位上操作,并产生在单一操作数的所有位上操作,并产生1位结果。位结果。习题:求下列表达式真值习题:求下列表达式真值假定假定:A=b0110;B=b0100;MyReg=4b01x0;求求&AA|B&B|MyRegMyReg表达式:操作符表达式:操作符v移位操作符有移位操作符有:(右移右移)1)左侧操作数移动右侧操作数表示的次数,逻辑移位,左侧操作数移动右侧操作数表示的次数,逻辑移位,空闲位添空闲
39、位添0补位;补位;2)如果右侧操作数的值为如果右侧操作数的值为x或或z,移位操作的结果为移位操作的结果为x。应用实例:使用移位操作为应用实例:使用移位操作为2-4解码器建模解码器建模wire 3:0 DecodeOut;assign DecodeOut =4b1 2表达式:操作符表达式:操作符v条件操作符条件操作符 根据条件表达式的值选择表达式,形式根据条件表达式的值选择表达式,形式:cond_expr?expr1:expr2三目运算符三目运算符wire 2:0 Student;assign Student=Marks 18?Grade_A:Grade_C;表达式:操作符表达式:操作符v位拼接
40、运算符(连接和复制操作)位拼接运算符(连接和复制操作)连接操作:将小表达式合并形成大表达式的操作。形式:连接操作:将小表达式合并形成大表达式的操作。形式:expr1,expr2,.,exprN 复制操作:指定重复次数来执行操作。如下:复制操作:指定重复次数来执行操作。如下:repetition_number expr1,expr2,.,exprN实例:实例:wire 7:0 Dbus,11:0 Abus;assign Dbus 7:4=Dbus0,Dbus1,Dbus2,Dbus3;assign Abus=34b1011;/位向量位向量12b1011_1011_1011)assign Abus
41、=4Dbus7,Dbus;/*符号扩展符号扩展*/习题习题2模块与端口模块与端口v模块:基本单元定义成模块形式模块:基本单元定义成模块形式module module_name(port _list);Declarations_and_Statementsendmodule 端口队列端口队列port_list列出了该模块通过哪些端口与外部列出了该模块通过哪些端口与外部模块通信。模块通信。模块与端口模块与端口v端口端口 模块的端口可以是模块的端口可以是input(输入端口输入端口)、output(输出端口输出端口)或者或者inout(双向双向端口端口);缺省的端口类型为缺省的端口类型为wire型型
42、;output或或inout能够被重新声明为能够被重新声明为reg型型,但是,但是input不不可以;可以;线网或寄存器必须与端口说明中指定的长度相同。线网或寄存器必须与端口说明中指定的长度相同。模块与端口模块与端口v 例:例:module Micro(PC,Instr,NextAddr);/端口说明端口说明input 3:1 PC;output 1:8 Instr;inout 16:1 NextAddr;/重新说明端口类型:重新说明端口类型:wire 16:1 NextAddr;/该说明是可选的,但如果指定了,就必须与它的端口说明保持相同该说明是可选的,但如果指定了,就必须与它的端口说明保持
43、相同长度。长度。reg 1:8 Instr;/Instr已被重新说明为已被重新说明为reg型,因此能在型,因此能在always语句或在语句或在initial语句语句中赋值。中赋值。.endmodule模块与端口模块与端口v 模块实语句模块实语句 一个模块能够在另外一个模块中被引用,这样就建立了描述的层次。模一个模块能够在另外一个模块中被引用,这样就建立了描述的层次。模块实例语句形式块实例语句形式module_name instance_name(port _associations);信号端口可以通过位置或名称关联;但是关联方式不能够混合使用。端信号端口可以通过位置或名称关联;但是关联方式不能
44、够混合使用。端口官廉形式口官廉形式port_expr/通过位置,隐式关联通过位置,隐式关联.PortName(port_expr)/通过名称,显示关联,通过名称,显示关联,强烈推荐!强烈推荐!port_expr可以是以下的任何类型:可以是以下的任何类型:1)标识符(标识符(reg型或型或wire型)型)2)位选择位选择 3)部分选择部分选择 4)上述类型的合并上述类型的合并 5)表达式(只适用于表达式(只适用于input型信号)型信号)Micro M1(UdIn3:0,WrN,RdN,Status0,Status1,&UdOut0:7,TxData);模块与端口模块与端口v 使用两个半加器模块
45、构造全加器使用两个半加器模块构造全加器module HA(A,B,S,C);input A,B;output S,C;assign S=A B;assign C=A&B;endmodulemodule FA(P,Q,Cin,Sum,Cout);input P,Q,Cin;output Sum,Cout;wire S1,C1,C2;HA h1(P,Q,S1,C1);/通过位置关联。通过位置关联。HA h2(.A(Cin),.S(Sum),.B(S1),.C(C2);/通过端口与信号的名字关联。通过端口与信号的名字关联。or O1(Cout,C1,C2);/或门实例语句或门实例语句endmodul
46、e考虑如何模块参数化?考虑如何模块参数化?模块与端口模块与端口使用两个半加器模块构造全加器(模块参数化)使用两个半加器模块构造全加器(模块参数化)module HA(A,B,S,C);input A,B;output S,C;parameter AND_DELAY=1,XOR_DELAY=2;assign#XOR_DELAY S=A B;assign#AND_DELAY C=A&B;endmodulemodule FA(P,Q,Cin,Sum,Cout);input P,Q,Cin;output Sum,Cout;parameter OR_DELAY=1;wire S1,C1,C2;HA h1
47、(P,Q,S1,C1);/通过位置关联。通过位置关联。HA h2(.A(Cin),.S(Sum),.B(S1),.C(C2);/通过端口与信号的名字关联。通过端口与信号的名字关联。or#OR_DELAY O1(Cout,C1,C2);/或门实例语句或门实例语句endmodule模块与端口模块与端口v 悬空端口悬空端口 通过将端口表达式表示为空白来指定为悬空端口通过将端口表达式表示为空白来指定为悬空端口DFF d1(.Q(QS),.Qbar(),.Data(D),.Preset(),.Clock(CK);v 端口长度不同端口长度不同 通过无符号数的右对齐或截断方式进行匹配通过无符号数的右对齐或截
48、断方式进行匹配module Child(Pba,Ppy);input 5:0 Pba;output 2:0 Ppy;.endmodulemodule Top;wire 1:2 Bdl;wire 2:6 Mpr;Child C1(.Pba(Bdl),.Ppy(Mpr);endmodule模块与端口模块与端口v模块参数值改变模块参数值改变 1)参数定义语句()参数定义语句(defparam)module TOP(NewA,NewB,NewS,NewC);input New A,New B;output New S,New C;defparam Ha1.XOR_DELAY=5,/实例实例Ha1中的参
49、数中的参数XOR_DELAY。Ha1.AND_DELAY=2;/实例实例Ha1中参数的中参数的AND_DELAY。HA Ha1(NewA,NewB,NewS,NewC);endmodule模块与端口模块与端口v模块参数值改变模块参数值改变 2)带参数值的模块引用带参数值的模块引用module TOP(NewA,NewB,NewS,NewC);input New A,New B;output New S,New C;HA#(5,2)Ha1(NewA,NewB,NewS,NewC);/第第1个值个值5赋给参数赋给参数AND_DELAY,该参数在模块,该参数在模块HA中说明。中说明。/第第2个值个值
50、2赋给参数赋给参数XOR_DELAY,该参数在模块,该参数在模块HA中说明。中说明。endmodule模块与端口模块与端口v 外部端口外部端口 显式地指定外部端口。(较少使用)显式地指定外部端口。(较少使用)module Scram_B(.Data(Arb),.Control(Ctrl),.Mem_Word(Mem_Blk),.Addr(Byte);input 0:3 Arb;input Ctrl;input 8:0 Mem_Blk;output 0:3 Byte;.endmodule习题习题3v1.模块实例语句与门实例语句的区别是什么?模块实例语句与门实例语句的区别是什么?v2.当端口悬空时