1、Verilog 语言的特点和基本语法2022-8-9GUET School of Information&Communications2课程内容 Verilog基本语法要素 Verilog门级设计及数据流设计 Verilog行为级设计 基本组合逻辑电路及时序逻辑电路设计2022-8-9GUET School of Information&Communications3一Verilog HDL基本要素 基本术语 模块 语法要素2022-8-941.1 基本术语1.EDA1.EDA EDA(Electronic Design Automation)电子设计自动化电子设计自动化 特点:硬件的设计“软
2、件化”软件设计软件设计l借助于EDA软件l硬件描述语言(VHDL或Verilog)l计算机仿真硬件设计硬件设计l下载接口下载接口lPLDPLD芯片芯片2022-8-952.HDL2.HDL HDL(Hardware Description Language)具有特殊结构能够对具有特殊结构能够对数字数字硬件逻辑电路的功能进行描述硬件逻辑电路的功能进行描述的一的一种高级编程语言种高级编程语言HDLHDL主要有两种:主要有两种:VerilogVerilog和和VHDLVHDLVerilog HDLVerilog HDL是在是在19831983年由年由Phil MoorbyPhil Moorby所创。
3、所创。类似类似C,易学,易学,Verilog 2001Verilog 2001标准标准 20052005标准标准VHDLVHDL(Very-High-Speed Integrated Circuit HardwareVery-High-Speed Integrated Circuit Hardware Description LanguageDescription Language)19871987美国国防部。美国国防部。IEEE 1706-1985IEEE 1706-1985标准标准2022-8-963.Verilog HDL设计设计器件:集成芯片,Verilog中用模块(module)描述
4、线:器件管脚之间的物理连线;Verilog中用变量wireVerilog HDL的设计:用的设计:用HDL语言描述语言描述器件器件和和线线的特性及相的特性及相互关系。互关系。数字电路两种要素:数字电路两种要素:器件器件和和线线。2022-8-971.2 Verilog程序基本结构程序基本结构 1.模块模块:是是verilog设计中的基本程序结构,定义设计的设计中的基本程序结构,定义设计的输输入入/出出端口,端口,I/O接口的接口的类型和数量类型和数量.module 模块名(端口列 表);端口声明端口声明,参数声明参数声明功能描述语句功能描述语句endmodule必须必须出现出现lmodule描
5、述器件描述器件l关键词关键词module开开始,由关键词始,由关键词endmodule结束结束。l一个一个verilog源文源文件件(.v)中可以有多中可以有多个个module,且对排,且对排列顺序不做要求列顺序不做要求。2022-8-982.端口端口(Terminal)l 端口是模块与外界环境交互的接口l模块内部是不可见的,对模块的调用模块内部是不可见的,对模块的调用(实例引用实例引用)只能通过只能通过其其端口端口进行。进行。l设计灵活:只要接口保持不变,模块内部的修改并不会影响到外部环境l端口称为终端(Terminal)。l模块端口等价于芯片的管脚(pin)2022-8-99l端口列表和端
6、口声明端口列表和端口声明input 输入端口输入端口output 输出端口输出端口inout 双向端口双向端口端口声明端口声明module D_FF(d,clk,clr,q,q_n);input d,clk,clr;output q,q_n;.endmodule端口可以说明为端口可以说明为input,output及及inout端口在模块名字端口在模块名字后的括号中列出后的括号中列出qclkdq_nclrD_FF端口等价于硬端口等价于硬件的引脚件的引脚(pin)2022-8-910module adder(cout,sum,a,b,cin);input 2:0 a,b;input cin;out
7、put cout;output 2:0 sum;assign cout,sum=a+b+cin;endmodule例设计三位全加器例设计三位全加器这个例子描述了一个三位的加法器。从例子中可以看出整个这个例子描述了一个三位的加法器。从例子中可以看出整个Verilog HDL程序是嵌套在程序是嵌套在module和和endmodule声明语句里的,声明语句里的,只出现了一个只出现了一个assign语句。语句。adderaddersum2:0a2:0a2:0b2:0b2:0cincincoutcout模块名模块名端口列表端口列表端口声明端口声明数据流语句数据流语句2022-8-911例例SR触发器模块
8、触发器模块/SR 触发器触发器module SR_FF(Q,Q_n,S,R);output Q,Q_n;/端口声明端口声明input S,R;nand n1(Q,S,Q_n);nand n2(Q_n,R,Q);endmodule模块中的模块中的5个部分并没全部出现,个部分并没全部出现,只出现在低层次模块实例只出现在低层次模块实例化化nand为为verilog中的与中的与非门门级原语部件非门门级原语部件2022-8-9121.3 Verilog 语法要素 标识符 关键词 空白和注释 常量 字符串 延时 操作符2022-8-913标识符是用户在描述时给标识符是用户在描述时给Verilog对象起的名
9、字对象起的名字标识符必须以字母标识符必须以字母(a-z,A-Z)或或(_)开头,后面可以是字母、数字、开头,后面可以是字母、数字、($)或或(_)。最长可以是最长可以是1023个字符个字符标识符区分大小写,标识符区分大小写,sel和和SEL是不同的标识符是不同的标识符模块、端口和实例的名字都是标识符模块、端口和实例的名字都是标识符module MUX2_1(c,a,b,sel);output c;input a,b,sel;not not1(sel_,sel);and and1(a1,a,sel_);and and2(b1,b,sel);or or1 (c,a1,b1);endmodule1.
10、标识符标识符(identifiers)Verilog标识符标识符2022-8-9141、用有意义的有效的名字如、用有意义的有效的名字如Sum、CPU_addr等。等。2、用下划线区分词。、用下划线区分词。3、采用一些前缀或后缀,如、采用一些前缀或后缀,如时钟采用时钟采用Clk 前缀:前缀:Clk_50,Clk_CPU;低电平采用低电平采用_n 后缀:后缀:Enable_n;4、统一一定的缩写如全局复位信号、统一一定的缩写如全局复位信号Rst。5、同一信号在不同层次保持一致性,如同一时钟信号必、同一信号在不同层次保持一致性,如同一时钟信号必须在各模块保持一致。须在各模块保持一致。6、参数采用大写
11、,如、参数采用大写,如SIZE。标识符书写注意事项:标识符书写注意事项:2022-8-9152.关键词关键词Verilog HDL 定义了一系列保留字,叫做关键词。注意只有小写的关键词才是保留字。例如,标识符always(这是个关键词)与标识符ALWAYS(非关键词)是不同的。always and assign begin buf buf if0 bufif1 case casex casez cmos deassign default defparam disable edge else end endcase endmodule endfunction endprimitive endsp
12、ecify endtable endtask event for force forever fork function highz0 highz1 if ifnone initial inout input integer join large macrmodule medium module nand negedge nmos nor not notif0 notif1 or output parameter pmos posedge primitive pull0 pull1 pullup pulldown rcmos real realtime reg release repeat r
13、nmos rpmos rtran rtranif0 rtranif1 scalared small specify specparam strong0 strong1 supply0 supply1table task time trantranif0 tranif1 tri tri0 tri1 triand trior trireg vectored wait wand weak0 weak1 while wire wor xnor xor2022-8-9163.空白符和注释空白符和注释module MUX2_1(out,a,b,sel);/Port declarations output
14、out;input sel,/control input b,/*data inputs*/a;/*The netlist logic selects input”a”when sel=0 and it selects”b”when sel=1.*/not(sel_,sel);and(a1,a,sel_),(b1,b,sel);/What does this/line do?or(out,a1,b1);endmodule格式自由格式自由使用空白符提高可读性及代码组使用空白符提高可读性及代码组织。织。Verilog忽略空白符除非用于忽略空白符除非用于分开其它的语言标记。分开其它的语言标记。多行注
15、释,在多行注释,在/*/内内单行注释单行注释到行末结束到行末结束2022-8-9174.整数常量和实数常量整数常量和实数常量格式:格式:其中其中 size:位宽,:位宽,缺省为缺省为32位位 base:可为可为 b(2)、h(16)、d(10)、缺省、缺省10 value:是所选数基内任意有效数字,包括是所选数基内任意有效数字,包括X、Z。实数常量可以用十进制或科学表示法表示。实数常量可以用十进制或科学表示法表示。Verilog中,常量中,常量(literals)可是整数也可以是实数可是整数也可以是实数d12 12 8b1100_ 0001 4b001164hff01 H83a 2022-8-
16、9185.延时说明延时说明“#”用于说明语句和门的实例的延时用于说明语句和门的实例的延时 module MUX2_ 1(out,a,b,sel);output out;input a,b,sel;not#1 not1(sel_,sel);and#2 and1(a1,a,sel_);and#2 and2(b1,b,sel);or#1 or1(out,a1,b1);endmodule2022-8-9196.操作符操作符 对数据进行运算,可分为 算术操作符+-*/关系操作符 =相等操作符=逻辑操作符&|其它2022-8-9201.4 Verilog的数据类型及逻辑系统的数据类型及逻辑系统 学习学习V
17、erilog逻辑值系统逻辑值系统 学习学习Verilog中不同类的数据类型中不同类的数据类型 理解每种数据类型的用途及用法理解每种数据类型的用途及用法 数据类型说明的语法数据类型说明的语法学习内容:学习内容:2022-8-9211.主要数据类型主要数据类型Verilog主要有三类主要有三类(class)数据类型:数据类型:net(线网)(线网):表示器件之间的物理连接表示器件之间的物理连接 register(寄存器)(寄存器):表示抽象存储元件表示抽象存储元件 parameters(参数参数):运行时的常数运行时的常数(run-time constants)2022-8-922(1)net类的
18、类型(线网)类的类型(线网)wire类型是最常用的类型,表示物理连线,只有连接功能。类型是最常用的类型,表示物理连线,只有连接功能。net声明格式声明格式 range ,net_name;net_type:net类型类型range:矢量范围,以矢量范围,以MSB:LSB格式格式net_name:net名称,一次可定义多个名称,一次可定义多个net,用逗号分开。用逗号分开。举例:举例:wire a;wire 15:0 busa;/16位三态总线位三态总线wire 0:31 w1,w2;/两个两个32位位wire,MSB为为bit02022-8-923(2)寄存器类的类型寄存器类的类型 寄存器类有
19、四种数据类型寄存器类有四种数据类型寄存器类型 功能 reg 可定义的无符号整数变量,可以是标量(1位)或矢量,是 最常用的寄存器类型 integer 32位有符号整数变量,算术操作产生二进制补码形式的 结果。通常用作不会由硬件实现的的数据处理。real 双精度的带符号浮点变量,用法与integer相同。time 64位无符号整数变量,用于仿真时间的保存与处理realtime 与real内容一致,但可以用作实数仿真时间的保存与 处理2022-8-924Verilog中中register声明语法声明语法 举例:举例:reg a;/一个标量寄存器一个标量寄存器reg 3:0 v;/从从MSB到到LS
20、B的的4位寄存器向量位寄存器向量reg 7:0 m,n;/两个两个8位寄存器位寄存器 integer A,B,C;/3个整数型寄存器个整数型寄存器寄存器声明寄存器声明 range,reg_name;reg_type:寄存器类型寄存器类型 range:矢量范围矢量范围 reg_name:寄存器名称:寄存器名称2022-8-925(3)Verilog中中net和和register区别区别l线网类型用于对结构化器件之间的物理连线的建模线网类型用于对结构化器件之间的物理连线的建模。线网。线网类型主要有类型主要有wire 和和tri 两种。两种。l由于线网类型代表的是物理连接线,因此它不存贮逻辑值,由于
21、线网类型代表的是物理连接线,因此它不存贮逻辑值,必须由器件所驱动。必须由器件所驱动。l当一个当一个wire 类型的信号类型的信号没有被驱动时,缺省值为没有被驱动时,缺省值为Z(高(高阻)阻)。l信号信号没有定义数据类型时,缺省为没有定义数据类型时,缺省为wire 类型。类型。线网(线网(net)2022-8-926l寄存器类型寄存器类型通常用于对通常用于对存储单元的描述存储单元的描述,如,如D型触发器、型触发器、ROM等。存储器类型的信号当在等。存储器类型的信号当在某种触发机制下分配了一某种触发机制下分配了一个值,在分配下一个值之时保留原值个值,在分配下一个值之时保留原值。reg 是是最常用的
22、寄最常用的寄存器类型,表示无符号整数变量。存器类型,表示无符号整数变量。l但必须注意的是,但必须注意的是,reg 类型的变量,类型的变量,不一定都是存储单元不一定都是存储单元,如在如在always 语句中进行描述的必须用语句中进行描述的必须用reg 类型的变量。类型的变量。l寄存器类型的值可取负数寄存器类型的值可取负数,但若该变量用于表达式的运算,但若该变量用于表达式的运算中,则按无符号类型处理中,则按无符号类型处理寄存器(寄存器(Register)2022-8-927(4)参数()参数(parameters)用参数声明一个用参数声明一个常量常量 参数定义的语法:参数定义的语法:paramet
23、er ;可一次定义多个参数,用逗号隔开。可一次定义多个参数,用逗号隔开。例:例:parameter cycle=20,prop_ del=3,setup=cycle/2-prop_del,p1=8;parameter x_ word=8b0011_1011;2022-8-928(5)寄存器数组寄存器数组(Register Arrays)reg类型的数组通常用于描述存储器类型的数组通常用于描述存储器 其语法为:其语法为:reg 位宽位宽 ;位宽位宽:定义存储器字的位数定义存储器字的位数 字长字长:定义存储器的深度:定义存储器的深度 例:例:reg 15:0 MEM 0:1023;/1K x 16
24、存储器存储器 reg 7:0 PREP hFFFE:hFFFF;/2 x 8存储器存储器2022-8-929例如:例如:reg 7:0 Areg;/8bit寄存器寄存器7Areg0reg Amem 7:0;/8X1存储器存储器Amem70reg 7:0 Cmem 0:3;/4X8存储器存储器Cmem03702022-8-930存储器寻址存储器寻址(Memory addressing)存储器元素可以通过存储器索引(存储器元素可以通过存储器索引(index)寻址,寻址,也就是给出元素在存储器的位置来寻址。也就是给出元素在存储器的位置来寻址。mem_name addr_exprreg 7:0 mem
25、a 0:255;reg 7:0 mem_word;.mem_word=mema5;2022-8-9312.Verilog采用的四值逻辑系统采用的四值逻辑系统0,Low,False,Logic Low,Ground,VSS,Negative Assertion1,High,True,Logic High,Power,VDD,VCC,Positive AssertionX Unknown:Occurs at Logical Which Cannot be Resolved ConflictHiZ,High Impedance,Tri-Stated,Disabled Driver(Unknown)2
26、022-8-932二Verilog HDL门级结构设计及数据流设计 结构设计 数据流设计2022-8-9332.1 结构化设计:门级建模结构化设计:门级建模Verilog语言通过使用预定义的语言通过使用预定义的逻辑门原语逻辑门原语(Gate Primitives)来支持用户进行逻辑门级设计,可直来支持用户进行逻辑门级设计,可直接使用,无需声明。逻辑门原语包括三大类:接使用,无需声明。逻辑门原语包括三大类:1.与与/或门类(或门类(and/or)2.缓冲缓冲/非门类非门类(buf/not)3.带控制端的缓冲带控制端的缓冲/非门非门2022-8-9341.与与/或门类原语或门类原语基本单元名称功能
27、andorxornandnorxnor Logical And(与)与)Logical Or(或或)Logical Exclusive Or(异或异或)Logical And Inverted(与非与非)Logical Or Inverted(或非或非)Logical Exclusive Or Inverted(同或同或)特点:特点:一个一个输出端输出端,多个,多个输入端输入端端口列表的端口列表的第一个为输出端口第一个为输出端口,其它为输入端口,其它为输入端口2022-8-935wire IN1,IN2,IN3,OUT;/基本门引用实例基本门引用实例and a1(OUT,IN1,IN2);or
28、 or1(OUT,IN1,IN2);and a1(OUT,IN1,IN2,IN3);xor x1(OUT,IN1,IN2,IN3,IN4);输入端超过二个以上时输入端超过二个以上时不给实例名的引用不给实例名的引用and(OUT,IN1,IN2,IN3);xor(OUT,IN1,IN2);实例引用实例引用2022-8-9362.缓冲缓冲/非门类原语非门类原语基本单元名称功能notbufInverter Buffer 特点:特点:一个一个输入端输入端,多个,多个输出端输出端端口列表的最后一个端口端口列表的最后一个端口为输入端口为输入端口,其它为输出端口,其它为输出端口2022-8-937实例引用实
29、例引用/基本门的实例引用基本门的实例引用buf b1(OUT1,IN1);not n1(OUT1,IN1);/输出端多于两个输出端多于两个buf b_2out(OUT1,OUT2,IN);/无实例名引用无实例名引用not(OUT1,IN);2022-8-9383.带控制端的缓冲带控制端的缓冲/非门非门 Verilog有四种带控制端的缓冲有四种带控制端的缓冲/非门非门 这四种基本单元只能有三个引脚:这四种基本单元只能有三个引脚:output,input,enable 这些单元由这些单元由enable引脚使能。引脚使能。当条件基本单元使能信号无效时,输出高阻态。当条件基本单元使能信号无效时,输出高
30、阻态。基本单元名称 功能bufif1 条件缓冲器,逻辑条件缓冲器,逻辑 1 使能使能bufif0 条件缓冲器,逻辑条件缓冲器,逻辑 0 使能使能notif1 条件反相器,逻辑条件反相器,逻辑 1 使能使能notif0 条件反相器,逻辑条件反相器,逻辑 1 使能使能2022-8-939 实例调用实例调用/基本门的实例引用基本门的实例引用bufif1 b1(out,in,ctr);bufif0 b0(out,in,ctr);notif1 n1(out,in,ctr);notif0 n0(out,in,ctr);2022-8-9404.设计实例设计实例d0d1d2d3s1s0yand3or4a设计一
31、个四选设计一个四选1数据选择器数据选择器s1 s0y0 00 11 01 1d0d1d2d3y0y1y2y3s0_ns1_n2022-8-941module mux4_to_1(y,d0,d1,d2,d3,s0,s1);/端口声明端口声明 output y;input d0,d1,d2,d3;input s0,s1;/内部网线声明内部网线声明wire y0,y1,y2,y3;wire s1_n,s0_n;/门级实例引用门级实例引用/生成生成s1_n和和s0_nnot (s1_n,s1);not (s0_n,s0);/调用三输入与门调用三输入与门and (y0,d0,s1_n,s0_n);and
32、 (y1,d1,s1_n,s0);and (y2,d2,s1,s0_n);and (y3,d3,s1,s0);/调用四输入或门调用四输入或门or (y,y0,y1,y2,y3);endmoduled0d1d2d3s1s0yand3or4y0y1y2y3s0_ns1_n2022-8-942b设计一个设计一个1进位加法器进位加法器1位的全加器的逻辑式为位的全加器的逻辑式为sum=a b c_inc_out=ab+c_in(a b)abc_insumc_outs1c1c22022-8-943abc_insumc_outs1c1c2module fulladd(sum,c_out,a,b,c_in);
33、/端口声明端口声明 output sum,c_out;input a,b,c_in;/内部网线声明内部网线声明wire s1,c1,c2;/门级实例引用门级实例引用xor (s1,a,b);and (c1,a,b);and (c2,s1,c_in);xor (sum,s1,c_in);or (c_out,c1,c2);endmodule1位全加器程序如下:位全加器程序如下:2022-8-944高层次模块对低层次模块的高层次模块对低层次模块的调用调用称为模块实例化。称为模块实例化。可以将模块的实例可以将模块的实例通过端口连接通过端口连接起来构成一个大的系统或起来构成一个大的系统或元件。元件。实例
34、名实例名是每个对象唯一的标记,通过这个标记可以查看每是每个对象唯一的标记,通过这个标记可以查看每个实例的内部。个实例的内部。实例中端口的次序与模块定义的实例中端口的次序与模块定义的次序相同次序相同。模块模块实例化与调用程序不同实例化与调用程序不同。每个实例都是模块的一个完。每个实例都是模块的一个完全的拷贝,相互独立、并行。全的拷贝,相互独立、并行。5.模块实例化模块实例化(module instances)2022-8-945在调用模块时,可以用在调用模块时,可以用顺序连接顺序连接和和按名连接按名连接把模块定义的把模块定义的端口与外部信号连接起来端口与外部信号连接起来顺序连接:需要连接的顺序连
35、接:需要连接的信号信号需要与模块声明的端口列表一致;需要与模块声明的端口列表一致;wire 3:0 d,q,qb;wire clk,clr;D_FF d0(d 0,clk,clr,q 0,qb 0);调用模块名调用模块名例化名例化名/D 触发器触发器module D_FF(d,clk,clr,q,qb);output q,qb;input d,clk,clr;.endmodule2022-8-946当设计大规模系统时,端口太多,记住端口顺序不大可能,当设计大规模系统时,端口太多,记住端口顺序不大可能,可以采用按名连接方法。可以采用按名连接方法。不需要连接的端口直接忽略掉即可不需要连接的端口直接
36、忽略掉即可D_FF d0(.d(d 0),.clk(clk),.clr(clr),.q(q 0),.qb(qb 0);D_FF d0(.d(d 0),.clk(clk),.clr(clr),.q(q 0);2022-8-947全加器fa0全加器fa1全加器fa2全加器fa3a0 b0a1 b1a2 b2a3 b3c_inc_outsum0sum1sum2sum3例:例:4位全加器构成:位全加器构成:module fulladd4(sum,c_out,a,b,c_in);/端口声明端口声明 output 3:0 sum output c_out;input 3:0 a,b;input c_in;
37、/内部网线声明内部网线声明wire c1,c2,c3;c1c2c3/调用一位全加器调用一位全加器fulladd fa0(sum0,c1,a0,b0,c_in);fulladd fa1(sum1,c2,a1,b1,c1);fulladd fa2(sum2,c3,a2,b2,c2);fulladd fa3(sum3,c_out,a3,b3,c3);endmodule2022-8-9482.2数据流设计数据流设计l连续赋值语句连续赋值语句l表达式、操作符表达式、操作符l数据流建模实例数据流建模实例2022-8-949l门级原语建模特点:优点:直接简洁优点:直接简洁 缺点:电路规模较大时,繁琐易错,需
38、要考虑高层次建模缺点:电路规模较大时,繁琐易错,需要考虑高层次建模l 数据流数据流(data flow)建模建模:描述数据在寄存器间的流动和处理描述数据在寄存器间的流动和处理过程。过程。l 当今设计公司已经不在从门级结构角度进行设计,而是从更当今设计公司已经不在从门级结构角度进行设计,而是从更高的抽象层次设计,典型的是高的抽象层次设计,典型的是RTL(Register Transfer Level)设设计,通常指的是计,通常指的是数据流建模数据流建模和和行为建模行为建模的结合。的结合。2022-8-950 连续赋值语句是连续赋值语句是verilog数据流建模的基本语句,以关键词数据流建模的基本
39、语句,以关键词assign开始,其语法如下:开始,其语法如下:assign 目标变量目标变量=表达式表达式;一、一、连续赋值语句连续赋值语句l 表达式表达式:由操作符和操作数构成,目的是根据操作符计算由操作符和操作数构成,目的是根据操作符计算出一个值。出一个值。l操作数操作数:可以是定义过的任何数据类型,有时要根据操作:可以是定义过的任何数据类型,有时要根据操作符的要求限制。符的要求限制。l操作符操作符:对操作数进行运算并产生一个结果。:对操作数进行运算并产生一个结果。2022-8-951/连续赋值语句,连续赋值语句,out是线网,是线网,i1和和i2也是线网也是线网wire out,i1,i
40、2;assign out=i1&i2;/连续赋值语句,连续赋值语句,adr是线网,是线网,adr1_bits和和adr2_bits是寄存器是寄存器assign adr15:0=adr1_bits15:0adr2_bits15:0;/连接操作,左边是一个标量线网和一个向量线网拼接连接操作,左边是一个标量线网和一个向量线网拼接assign c_out,sum3:0=a3:0+b3:0+c_in;左值左值目标变量目标变量只能是只能是线网类型线网类型,不能是,不能是寄存器寄存器 操作数类型无限制;操作数类型无限制;任意一个任意一个操作数操作数发生变化,表达式就会重发生变化,表达式就会重 新计算,并且新
41、计算,并且将结果赋给等号左边的将结果赋给等号左边的线网线网;连续赋值语句特点连续赋值语句特点:2022-8-9521.操作符类型操作符类型操作符类型操作符类型符号符号连接及复制操作符连接及复制操作符一元操作符一元操作符算术操作符算术操作符逻辑移位操作符逻辑移位操作符关系操作符关系操作符相等操作符相等操作符按位操作符按位操作符逻辑操作符逻辑操作符条件操作符条件操作符 !&|*/%+-=!=!=&|&|?:最高最高最低最低优先级优先级二、表达式、操作符和操作数二、表达式、操作符和操作数2022-8-9532.Verilog中的中的 数的位宽数的位宽 自动调整位宽。自动调整位宽。改变改变右边的值右边
42、的值以适应以适应左边变量左边变量的长度。的长度。当一个负数赋值给无符号变量如当一个负数赋值给无符号变量如regreg时,自动完成二进制补码计算时,自动完成二进制补码计算reg 3:0 a,b;reg 15:0 c;a=-1;/a是无符号数,因此其值为是无符号数,因此其值为1111b=8;c=8;/b=4b 1000 c=16b1000b=b+a;/结果结果10111截断截断,b=0111c=c+a;/c=16b101112022-8-9543.算术操作符算术操作符parameter five=5;integer ans,int;reg 3:0 rega,regb,num;always (*)b
43、eginans=five*int;ans=(int+5)/2;num=rega+1;num=regb%rega;end+加加-减减*乘乘/除除%模模2022-8-9554.按位逻辑操作符按位逻辑操作符not&and|orxor xnor xnor 按位操作符对矢量中相对应位按位操作符对矢量中相对应位运算。运算。regb=4b1 0 1 0 regc=4b1 x 1 0num=regb®c=1 0 1 0;位值为位值为x时不一定产生时不一定产生x结果。结果。当两个操作数位数不同时,当两个操作数位数不同时,位数少的操作数零扩展到位数少的操作数零扩展到相同位数。相同位数。a=4b1011;b=
44、8b01010011;c=a|b;/a零扩展为零扩展为 8b000010112022-8-9565.整体逻辑操作符整体逻辑操作符rega=4b0011;/逻辑值为逻辑值为“1”regb=4b10 xz;/逻辑值为逻辑值为“1”regc=4b0z0 x;/逻辑值为逻辑值为“x”ans=rega&0;/ans=0ans=regb®a;/ans=1 !not&and|or 逻辑操作符的结果为一位逻辑操作符的结果为一位1,0或或x。逻辑操作符只对逻辑操作符只对逻辑值运算逻辑值运算。如操作数为全如操作数为全0,则其逻辑值为,则其逻辑值为false 0如操作数有一位为如操作数有一位为1,则其逻辑值为
45、,则其逻辑值为true 1若操作数只包含若操作数只包含0、x、z,则逻辑值为,则逻辑值为x逻辑反操作符将操作逻辑反操作符将操作数的逻辑值取反。例数的逻辑值取反。例如,若操作数为全如,若操作数为全0,则其逻辑值为则其逻辑值为0,逻,逻辑反操作值为辑反操作值为1。2022-8-9576.逻辑反与位反的对比逻辑反与位反的对比rega=4b1011;bit=rega;/num=0100log=!rega;/num=0!logical not 逻辑反逻辑反 bit-wise not 位反位反 逻辑反的结果为一位逻辑反的结果为一位1,0或或x。位反的结果与操作数的位数位反的结果与操作数的位数相同相同202
46、2-8-9587.一元归约操作符一元归约操作符 rega=4b0100;val=®a;/val=0val=|rega;/val=1val=rega;/val=1val=®a;/(nand)val=1&and|orxor xnor xnor 归约操作符的归约操作符的操作数操作数只有一个。只有一个。对操作数的所有位进行位操作。对操作数的所有位进行位操作。结果只有一位,可以是结果只有一位,可以是0,1,X。2022-8-9598.移位操作符移位操作符 rega=8b00001100;regb =rega num 逻辑右移逻辑右移 rega;/val=xval=regb=rega;/val
47、=1val=regb regc;/val=1 大于大于=大于等于大于等于regcrega和和regc的的关系取决于关系取决于x2022-8-96110.相等操作符相等操作符 赋值操作符,将等式右边表达式的值拷贝到左边。赋值操作符,将等式右边表达式的值拷贝到左边。=逻辑等逻辑等=01xz010 xx101xxxxxxxzxxxx case等等=reg a,b;if(a=b).else 2022-8-962相等操作符相等操作符 逻辑等逻辑等 逻辑不等逻辑不等=!=rega=4b0011;regb=4b1010;regc=4b1x10;val=rega=regb;/val=0val=rega!=re
48、gc;/val=1值确定是指所有的位值确定是指所有的位为为0或或1。不确定值是。不确定值是有值为有值为x或或z的位。的位。2022-8-96311.条件操作符条件操作符条件操作符的语法为:条件操作符的语法为:=?:其意思是:其意思是:if condition is TRUE,then LHS=表达式表达式1,else LHS=表达式表达式2每个条件操作符必须有三个参数,缺少任何一个都会产生错每个条件操作符必须有三个参数,缺少任何一个都会产生错误。最后一个操作数作为缺省值误。最后一个操作数作为缺省值。例如:例如:assign out=(sel=0)?a:b;条件条件?:2022-8-96412.
49、级联操作符级联操作符 级联级联 可以从不同的矢量中可以从不同的矢量中选择位并用它们组成一选择位并用它们组成一个新的矢量。个新的矢量。用于位的重组和矢量用于位的重组和矢量构造构造 rega=8b0000_0011;regb=8b0000_0100;regc=8b0001_1000;regd=8b1110_0000;new=rega,regd;new=regc 4:3,regd 7:5;2022-8-96513.复制复制复制复制 num 复制一个变量或在复制一个变量或在 中的值中的值regb=2b11;regc=2b00;bus=4 regb;bus=2 regb,2 regc;前两个前两个 符号
50、之间的正符号之间的正整数指定复制次数整数指定复制次数。2022-8-966d0d1d2d3s1s0yand3or4y0y1y2y3s0_ns1_nmodule mux4_to_1(y,d0,d1,d2,d3,s0,s1);/端口声明端口声明 output y;input d0,d1,d2,d3;input s0,s1;assign y=(s1&s0&d0)|(s1&s0&d1)|(s1&s0&d2)|(s1&s0&d3);endmodule三、数据流设计实例三、数据流设计实例 1.4 选选1数据选择器数据流建模数据选择器数据流建模2022-8-967b.使用条件操作符使用条件操作符module