Verilog HDL入门基础之门级建模
Verilog门级建模

Verilog门级建模 门级建模就是将逻辑电路图⽤HDL规定的⽂本语⾔表⽰出来,即调⽤Verilog语⾔中内置的基本门级元件描述逻辑图中的元件以及元件之间的连接关系。
Verilog语⾔内置了12个基本门级元件模型,如下表所⽰。
门级元件的输出、输⼊必须为线⽹类型的变量。
1.多输⼊门 and、nand、or、nor、xor和xnor是具有多个输⼊的逻辑门,它们的共同特点是:只允许有⼀个输出,但可以有多个输⼊。
and的⼀般调⽤格式为:and A1(out, in1, in2, in3); 其中,调⽤名A1可以省略。
nand、or、nor、xor和xnor的调⽤格式与and的类似。
2.多输出门 buf、not是具有多个输出的逻辑门,它们的共同特点是:允许有多个输出,但只有⼀个输⼊。
⼀般的调⽤格式为: buf B1(out1, out2,..., in);not N1(out1, out2,..., in); 其中,调⽤名B1、N1可以省略。
3.三态门 bufif1、bufif0、notif1和notif0是三态门元件模型。
这些门有⼀个输出、⼀个数据输⼊和⼀个输⼊控制。
如果输⼊控制信号⽆效,则三态门的输出为⾼阻态z。
⼀般的调⽤格式为:bufif1 B1(out, in, ctrl);bufif0 B0(out, in, ctrl);notif1 N1(out, in, ctrl);notif0 N0(out, in, ctrl); 其中,调⽤名B1、B0、N1和N0可以省略。
例1:1module _2to1muxtri(A, SEL, L);23input A, SEL;4output L;5tri L;67bufif1(L, A, SEL);89endmodule。
第2讲 Verilog HDL层次建模

2.1.6 自顶向下的设计实例
例2.3 脉动进位计数器顶层模块
例2.4 触发器T_FF 例ຫໍສະໝຸດ .5 带异步复位的D触发器 D_FF
例2.6 激励模块
激励信号和波形输出
2.1.7 小结
用于数字电路设计的两种方法:自顶向下方法和自底向上
方法。在当今的数字电路设计中,这两种方法经常组合使 用。随着设计复杂性的增加,使用这些结构化的方法来进 行设计管理变得越来越重要。 模块是Verilog中的基本功能单元。模块通过调用(实例引 用)来使用,模块的每个实例都被惟一标识,以区别于同 一模块的其他实例。每个实例都拥有其模板模块的不同副 本。读者需要将模块和模块实例区别开来。 仿真有两个不同的组成部分:设计块和激励块,激励块用 于测试设计块。激励块通常是顶层模块。对设计块施加激 励有两种不同的模式。 以脉动进位计数器为例,一步步地解释了为各个部分创建 仿真的过程。
说明为向量,则默认线网的位宽为1。线网的默认值为 z(trireg类型的线网例外,其默认值为x)。线网的值 由其驱动源确定,如果没有驱动源,则线网的值为z。
2.2.2.3 寄存器(reg,integer,real,time)
寄存器用来表示存储元件,它保持原有的数值,直到被
改写。寄存器数据类型一般通过使用关键字reg来声明, 默认值为x。例3.1给出了如何使用寄存器的例子。 例3.1 寄存器的声明和使用
一个模块的示例
Verilog HDL的四种描述方式
行为或算法级:Verilog所支持的最高抽象层次。设计者只
注重其实现的算法,而不关心其具体的硬件实现细节。在 这个层次上进行的设计与C语言编程非常类似。 数据流级:通过说明数据的流程对模块进行描述。设计者 关心的是数据如何在各个寄存器之间流动,以及如何处理 这些数据。 门级:从组成电路的逻辑门及其相互之间的互连关系的角 度来设计模块。这个层次的设计类似于使用门级逻辑简图 来完成设计。 开关级:Verilog所支持的最低抽象层次。通过使用开关、 存储节点及其互连关系来设计模块。在这个层次进行设计 需要了解开关级的实现细节。
第3讲 Verilog HDL常用建模方法汇总

specify块 也可以给使用开关设计的模块指定路径延迟(引脚到引
脚的延迟)以及时序检查。用specify块可以描述路径延 迟。在第10章中详细讨论了路径延迟说明,它在开关级 模型中也完全适用。
描述方式:
因为开关是用Verilog原语定义的,类似 于逻辑门,实例名称是可选项,所以调用 (实例引用)开关时可以不给出实例名称。
信号out的值由信号data和control的值确定。 out的逻 辑值如表11.1所示。 信号data和control的不同组合导致 这两个开关输出1,0或者z或x,逻辑值(如果不能确定 输出为1或0,就有可能输出z值或x值)。符号L代表0或 z,H代表1或z。
因此,NMOS开关在control信号是1时导通。如果 control信号是0,则输出为高阻态值。与此类似,如 果control信号是0,则PMOS开关导通。 具体的输入 输出参见下表:
CMOS开关用关键字cmos声明。CMOS开关的符号如下图所 示。
CMOS开关实例的引用: CMOS门本质上是两个开关(NMOS和PMOS)的组合体可
f=ab …
主讲 陈付
安徽师范大学 2015
第3讲 Verilog HDL常用建模方法
电路(开关级)级建模
门级(逻辑级)建模
数据流建模
行为级(RTL级)建模
Verilog模型可以是实际电路不同级别的抽象。这些抽象的级别和它们对应的模型 类型共有以下五种: (1)系统级(system) (2)算法级(algorithmic) (3)RTL级(Register Transfer Level): (4)门级(gate-level): (5)开关级(switch-level)
Verilog_HDL模型门级_RTL级_算法级_系统级

clk,clrb;
input[3:0]
d;
output[3:0] q;
flop f1(d[0],clk,clrb,q[0],), f2(d[1],clk,clrb,q[1],), f3(d[2],clk,clrb,q[2],), f4(d[3],clk,clrb,q[3],);
endmodule
9
9.2 Verilog HDL的行为描述建模
3
9.1 门级结构
一个逻辑网络是由许多逻辑门和开关所组成,因此用逻辑门的 模型来描述逻辑网络是最直观的。 Verilog HDL提供了一些门类型的关键字,可以用于门级结构建 模。
4
9.1.1 与非门、或门和反向器及其说明语法 Verilog HDL中有关门类型的关键字共有26个之多。我们只介绍 8个。
2
对于数字系统的逻辑设计工程师而言,熟练地掌握门级、 RTL级、算法级、系统级是非常重要的。而对于电路基本部 件(如门、缓冲器、驱动器等)库的设计者而言,则需要掌 握用户自定义源语元件(UDP)和开关级的描述。
一个复杂电路的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。 这些模块可以分别用不同抽象级别的Verilog HDL描述,在 一个模块中也可以有多种级别的描述。利用Verilog HDL语 言结构所提供的这种功能就可以构造一个模块间的清晰层次 结构来描述极其复杂的大型设计。
`define stim #100 data=4'b //宏定义 stim,可使源程序简洁 event end_first_pass; //定义事件end_first_pass
hardreg reg_4bit (.d(data), .clk(clock), .clrb(clearb), .q(qout));
Verilog-HDL的建模

第四章 Verilog-HDL的建模1.内容回顾通常认为,给硬件建模的模型可以分为5个层次:▪系统级和算法级建模通常是软件工程师用C语言开发的软件模型,目的在于验证设计思想是否正确。
HDL也能做一些算法级建模的工作,但是有很多算法描述不被综合工具支持。
▪行为级建模主要考虑一个模块的抽象功能描述,而不考虑其具体以实现(具体电路结构由综合工具得到)。
▪门级模型是对电路结构的具体描述,主要是描述与、或、非等基本门电路的连接方式。
▪开关级模型是把最基本的MOS晶体管连接起来实现电路功能。
注:这5个层次从高到低越来越接近硬件。
Verilog HDL有两种建模方法:结构建模方法和行为建模方法。
结构建模方法是对电路具体结构的描述:1.调用Verilog内置门元件(门级结构描述)2.调用开关级元件(晶体管级结构描述)3.用户自定义元件UDP(也在门级)4.子模块调用行为建模方法是对电路功能的描述1.数据流行为建模2.顺序行为建模2.结构建模结构建模是对电路具体结构的描述,是一种比较底层的方法。
简单说,就是把所需要的基本电路单元(逻辑门、MOS开关等)调出来,再用连线把这些基本单元连接起来。
(调用、连线)。
2.1 内置的基本单元Verilog HDL为门级电路建模提供了26个内置基本单元,分类如下:多输入门:and, nand, or, nor, xor, xnor多输出门:buf, not三态门: bufif0, bufif1, notif0, notif1上拉、下拉电阻:pullup, pulldownMOS开关:cmos, nmos, pmos, rcmos, rnmos, rpmos双向开关:tran,tranif0, tranif1, rtran, rtranif0, rtranif1注:多输入门、多输出门和三态门构成Verilog-HDL的内置基本门。
2.1.1多输入门1.内置的多输入门包括: and nand nor or xor xnor2.这些逻辑门只有单个输出, 1个或多个输入。
第2章 Verilog HDL门级建模

9
语法形式:
端口类型 [端口位宽左界:端口位宽右界] 端口名;
端口类型
输入—input 输出—output 双向—inout
宽度
input [2:0] cin; cin[2]、cin[1]、cin[0] output [0:4] cout; cout[0]、cout[1]、cout[2]、cout[3]、cout[4] inout [4:7] fast; fast[4]、fast[5]、fast[6]、fast[7]
范例
bufif1 bufif0 notif1 notif0 b1(Y,A,ctrl); b2(Y,A,ctrl); n1(Y,A,ctrl); n2(Y,A,ctrl);
16
模块实例化
语法形式
模块名称 实例名称(端口连接);
两种连接方式
按顺序连接 按名称连接
17
按顺序连接
欲调用此模块
module MUX4x1(Y,A,B,C,D,S1,S0,En_); 顺 output Y; 序 input A,B,C,D; module Test; 一 input S1,S0; reg a,b,c,d,en_; //连接输入端 致 ! input En_; reg s1,s0; …… wire y; //连接输出端 //模块功能部分 …… //省略 endmodule MUX4x1 mymux(y,a,b,c,d,s1,s0,en_); endmodule
10
定义一个2位宽度的输入信号a
input input input input [1:0] [0:1] [3:4] [2:1] a; a; a; a;
第2章 Verilog HDL门级建模

UDP基本结构
Verilog HDL数字系统设计及仿真
primitive UDP名称(输出端口,输入端口1,……,输入端口n); output 输出端口名; input 输入端口名;
reg 寄存器名; initial //初始化寄存器,这两行在时序UDP中使用
table ……//状态表信息
endtable
endprimitive
28
UDP基本规则
Verilog HDL数字系统设计及仿真
➢ 1.UDP只能有一个1位的输出端口,输出端口必须
在端口列表的第一个位置。不允许有多个输出端 口或多位输出端口。如下声明均是违法的:
output a,b;
//多个输出违法
output [1:0] c; //多位输出违法
5
门级建模结构
Verilog HDL数字系统设计及仿真
➢模块定义 ➢端口声明 ➢内部连线声明 ➢门级调用
6
模块定义
Verilog HDL数字系统设计及仿真
➢语法要求
module 模块名(端口名1,端口名2……);
……
endmodule
➢例如:
端口列表,只写名称 标识符,自己定义
module MUX4x1(Y,A,B,C,D,S1,S0,En_); module abc(a,b,c); module adder(a,b,cin,sum,cout); module test;
endmodule
25
Verilog HDL数字系统设计及仿真
➢测试模块
module Test;
reg a,b;
wire y;
mynand nand1(y,a,b);
initial
verilog语言建模

真值表:
实例引用: buf B1 ( F1, F2, F3, F4, CLK);
not N1 (A, B, ready); clk
F1 F2 F3 F4
Verilog语言建模 Verilog语言建模
内建三态门
名称 高有效 三态门 bufif1 关键字 图标 名称 高有效 三态非门 低有效 低有效 三态门 bufif0 三态非门 notif0 notif1 关键字 图标
Verilog语言建模 Verilog语言建模
带门延迟的实例引用
无延迟值: 无延迟值: not N1 (Qbar, Q) ; 延,门时延为0。 1个延迟值: nand #6 个延迟值: (Out, In1, In2) ; 所有时 延均为6,即上升时延和下降时延都是6。 2个延迟值: and #(3,5) (Out, In1, In2, In3 ) ; 个延迟值 上升时延被定义为3,下降时延为5,转换到x的时延是 x 3和5中间的最小值,即3。 3个延迟值:notif1 #(2,8,6) ( Dout, Din1, Din2) ; 个延迟值 notif1 上升时延为2,下降时延为8,截止时延为6,转换到x x 的时延是2、8和6中的最小值,即2。 因为没有定义时
4选1多路选择器的门级结构建模 选 多路选择器的 多路选择器的门级结构建模
module MUX4x1 (Z , D0 , D1 , D2 , D3 , S0 , S1) ; output Z; //端口说明 input D0 , D1 , D2 , D3 , S0 , S1; //端口说明 wire T1,T2, T3, T4; //内部线网说明,缺省说明 S0bar, S1bar and (T0 , D0 , S0bar , S1bar) , (T1 , D1 , S0bar , S1) , (T2 , D2 , S0 , S1bar) , (T3 , D3 , S0 , S1) ; not (S0bar , S0) , (S1bar , S1) ; or (Z , T0 , T1 , T2 , T3) ; endmodule // 1个或门 // 2个非门 // 4个与门
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
门级建模门级建模是指调用Verilog内部自定义的基本门元件(或者用户自定义基本元件)来对硬件电路进行结构描述门级建模方式采用的是一种特殊的模块调用方式。
此时所调用的模块式Verilog内部预先定义好的基本门级元件或者用户自定义的基本元件,在这种建模方式下硬件电路将被描述成由一组基本门级元件的实例组成。
内置基本门级元件Verilog HDL内含的基本门级元件有14中,包括and(与门)、nand(与非门)、or(或门)、nor(或非门)、xor(异或门)、xnor(异或非门)、buf(缓冲器)、not(非门)、bufif1(高电平使能缓冲器)、bufif0(低电平使能缓冲器)、notif1(高电平使能非门)、notif0(低电平使能非门)、pullup(上拉电阻)、pulldown(下拉电阻)基本门级元件的调用其语法格式为:<门级元件名><驱动强度说明>#(<门级延时量>)<实例名>(端口连接表);对上述格式做如下说明:•<门级元件名>:就是前面列出的Verilog HDL内含的14种基本门级元件类型中的任意一种,它用于指明被当前模块调用的是哪一种门级基本元件。
•<驱动强度说明>:这一项是可选项,它的格式为:(<对高电平的驱动强度>,<对低电平的驱动强度>)<驱动强度说明>用来对本次基本门级元件调用所引用的门级元件实例的输出端驱动能力加以说明。
这是因为:在结构建模方式下,一条连线可能会由多个前级输出端同时驱动,该连线最终的逻辑状态将取决于各个驱动端的不同驱动能力,因此有必要对元件实例的输出驱动能力进行说明。
对于门级元件,驱动强度分为对高电平(逻辑1)的驱动强度和对低电平(逻辑0)的驱动强度,因此<驱动强度说明>部分由<对高电平的驱动强度>和<对低电平的驱动强度>这两种成分组成。
其中的每一种驱动强度成分可以是supply、strong、pull、weak和highz中的某一个等级。
因此有如下关键字出现在<驱动强度说明>中:Supply1 strong1 pull1 weak1 highz1Supply0 strong0 pull0 weak0 highz0上面第一行中表示<对高电平的驱动强度>的五个等级,第二行中表示<对低电平的驱动强度>的五个等级。
在基本门级元件实例语句的<驱动强度说明>中,<对高电平的驱动强度>和<对低电平的驱动强度>这两个成分在括号内的前后位置可以互换,比如:and(strong0,weak1) AND_1(out,in1,in2);and(weak1,strong0) AND_2(out,in1,in2);其中引入了两个与门实例AND_1和AND_2。
这两个实例拥有相同的输出端驱动强度,高电平输出强度为weak,低电平输出强度为strong。
如果基本门级元件实例语句中的<驱动强度说明>部分被省略,则默认的驱动强度为(strong0,strong1)。
•#(<门级延时量>):这一项也可以是默认的,它说明了信号从门级元件实例的输入端流动到输出端时所经历的延迟时间长度。
其中<门级延时量>是由若干个延时值组成的,当它只包含一个延时值时,其外部的圆括号可以省略。
请读者注意:上述门级元件实例的门级延时量进行指定的方式与前面讲述的对模块参数值进行修改的第一种方式(使用带有参数值的模块实例语句)是相似的。
这两种情况下,对应的实例语句中都出现了“#<数量值>”部分。
该部分内容在模块实例语句中代表模块参数的新参数值;而在门级实例语句中则代表了门级元件实例输入输出端口间的门级延时量。
在进行模块调用时不能采用像门级元件调用那样的方式指定延时量(只能利用specify块结构来指定延时量);而在进行基本门级元件调用时又不能像模块调用那样对参数值进行修改(只有用户自定义元件才能有参数值)•<实例名>:是为本次元件调用后生成的门级元件实例所取的第一个名称。
与进行模块调用的情况不同,在进行基本门级元件调用时,<实例名>可以省略。
在默认<实例名>的情况下,Verilog编译系统将自动以“<元件名><实例序号>”的形式为门级元件实例取名•(端口连接表):与模块实例语句中的端口连接表类似,但是在进行基本门级元件调用时只能采用端口位置关联方式。
而且与基本门级元件实例各个端口相连的信号端子只能是宽度为一位的表达式或变量标识符多输入门内置多输入门包括6种门级元件:and、nand、or、nor、xor、xnor。
其格式为:<门级元件名>(<输出端口>,<输入端口1>,<输入端口2>,……,<输入端口n>)其中的<门级元件名>就是上面给出的六种多输入门名称之一,在端口列表中出现的第一个端口是输出端口,其后是多个输入端口。
这六种门的真值表为:AND 0 1 X Z0 0 0 0 01 0 1 x ZX 0 x x zZ 0 x x xNAND 0 1 X Z0 1 1 1 11 1 0 x XX 1 X x xZ 1 X x xOR 0 1 X Z0 0 1 x X1 1 1 1 1X X 1 X XZ X 1 X XNOR 0 1 X Z0 1 0 X X1 0 0 0 0X X 0 X XZ X 0 X XXOR 0 1 X Z0 0 1 X X1 1 0 X XX X X X XZ X X X XXOR 0 1 X Z0 1 0 X X1 0 1 X XX X X X XZ X X X X对多输入门进行调用的元件实例语句将采用如下形式:<多输入门元件名><驱动强度说明>#(<门级延时量>)<延时量>(<输出信号端子>,<输入信号端子1>,<输入信号端子2>,…….,<输入信号端子n>);在上述元件实例语句格式中,与多输入门元件输出端相连的外部信号端子(即<输出信号端子>)必须出现在端口连接表的第一项中,与多输入门的各个输入端相连的外部信号端子则只能出现在端口连接表的后面几项内。
这些输入信号端子将以此与多输入门的各个输入端相连。
信号端子和元件端口之间的连接关系是采用“端口位置关联方式“来确定。
多输出门内置多输出门包括两种门级元件:buf和not。
这两种逻辑门的共同特点是:允许有多个输出,但只能有一个输入。
这两种多输出门的元件模型可以表示为:<门级元件名>(<输出端口1>,<输出端口2>,……,<输出端口n>,……,<输入端口>)其中,<门级元件名>是元件名称buf和not之一;端口列表中的最后一项是输入端口,前面的其余端口为输出端口。
它们的真值表如下:<多输出门元件名><驱动强度说明>#(<门级延时量>)<实例名>(<输出信号端子1>,<输出信号端子2>,……,<输出信号端子n>,<输入信号端子>);上述格式中,端口连接表中出现的最后一个信号端子将被连接到多输出门的输入端,而排在前面的其余信号端子将与多输出门的各个输出端依次相连。
信号端子和元件端口之间的连接关系是采用“端口位置关联方式”来确定的。
三态门内置三态门包括四种元件:bufif0、bufif1、notif0和notif1。
这四种逻辑门用来对三态驱动器建模,它们都有一个数据输出端。
一个数据输入端和一个控制输入端。
这几种三态门的特点是:它们的数据输出可以实现三态输出。
其元件模型可以表示为:<门级元件名>(<数据输出端口>,<数据输入端口>,<控制输入端口>)其中,<门级元件名>是前面给出的四种元件名称bufif0、bufif1、notif0和notif1之一;端口列表中的第一项是<数据输出端口>,第二项是<数据输入端口>,最后一项是<控制输入端口>。
它们的真值表为:真值表中有些项是不确定的,比如“0/z”表示输出状态既可以是0也可以是高阻态。
调用三态门的元件实例语句如下:<元件名><驱动强度说明>#(<门级延时量>)<实例名>(<输出信号端子>,<输入信号端子>,<控制信号端子>);上拉、下拉电阻上拉、下拉电阻包括两种元件:pullup和pulldown。
上拉电阻和下拉电阻这两种门级元件都只有一个输出端口而没有输入端口。
上拉电阻将置为1,下拉电阻将输出置为0.。
其调用的语法格式如下:<元件名><驱动强度说明><实例名>(<输出信号端子>);上述格式中,端口连接表内只能出现一个信号端子(输出信号端子),该信号端子将被连接到元件实例的输出端口。
由于上拉电阻只能输出逻辑状态1,下拉电阻只能输出逻辑状态0,所以在进行驱动强度说明时(在需要进行说明的情况下),对pullup元件只需指出对高电平的驱动强度,而对pulldown元件则只需指出对低电平的驱动强度。
下面两条语句就分别对上拉电阻和下拉电阻进行了调用。
Pullup (supply1) U1(power);Pulldown (pull0) U2(gnd);其中,第一条语句引入了上拉电阻的一个实例U1,该实例的输出端被连接到信号端子power;该输出端的驱动高强度为supply1。
第二句,仿照可以分析,此处不再赘述。
门级延时的说明门级延时反映的是信号变化从门级元件的任一输入端口流动到任一输出端口所经历的传输延时。
门级延时可以分为如下几类。
•上升延时:表示信号从“0”、“x”或“z”状态变化到“1”状态时受到的门传输延时。
•下降延时:表示信号从“1”、“x”或“z”状态变化到“0”状态时受到的门传输延时。
•截止延时:表示信号从“0”、“x”或“1”状态变化到“z”状态时受到的门传输延时。
•到不定态的延时:表示信号从“0”、“1”或“z”状态变化到“x”状态时受到的门传输延时。
由于多输入门(and、nand、or、nor、xor、xnor)以及多输入门(buf、not)的输出不可能是高阻态“z”,所以多输入门和多输出门这两类元件没有“截止延时”这类门级延时;对于三态门(bufif0、bufif1、notif0、notif1),这类元件具有全部的四种门级延时;对于上拉电阻和下拉电阻,这类元件不存在任何形式的门级延时。