verilog语言学习6-9.ppt
- 文档编号:18790062
- 上传时间:2023-11-15
- 格式:PPT
- 页数:96
- 大小:687KB
verilog语言学习6-9.ppt
《verilog语言学习6-9.ppt》由会员分享,可在线阅读,更多相关《verilog语言学习6-9.ppt(96页珍藏版)》请在冰点文库上搜索。
第六章Verilog的数据类型及逻辑系统,学习Verilog逻辑值系统学习Verilog中不同类的数据类型理解每种数据类型的用途及用法数据类型说明的语法,学习内容:
Verilog采用的四值逻辑系统,0,Low,False,LogicLow,Ground,VSS,NegativeAssertion1,High,True,LogicHigh,Power,VDD,VCC,PositiveAssertionXUnknown:
OccursatLogicalWhichCannotbeResolvedConflictHiZ,HighImpedance,Tri-Stated,DisabledDriver(Unknown),主要数据类型,Verilog主要有三类(class)数据类型:
net(线网):
表示器件之间的物理连接register(寄存器):
表示抽象存储元件parameters(参数):
运行时的常数(run-timeconstants),net(线网),net需要被持续的驱动,驱动它的可以是门和模块。
当net驱动器的值发生变化时,Verilog自动的将新值传送到net上。
在例子中,线网out由or门驱动。
当or门的输入信号置位时将传输到线网net上。
net类的类型(线网),有多种net类型用于设计(design-specific)建模和工艺(technology-specific)建模没有声明的net的缺省类型为1位(标量)wire类型。
但这个缺省类型可由下面的编译指导改变:
default_nettype,综合编译器不支持的net类型,net类的类型(线网),wire类型是最常用的类型,只有连接功能。
wire和tri类型有相同的功能。
用户可根据需要将线网定义为wire或tri以提高可读性。
例如,可以用tri类型表示一个net有多个驱动源。
或者将一个net声明为tri以指示这个net可以是高阻态Z(hign-impedance)。
可推广至wand和triand、wor和triorwand、wor有线逻辑功能;与wire的区别见下页的表。
trireg类型很象wire类型,但trireg类型在没有驱动时保持以前的值。
这个值的强度随时间减弱。
修改net缺省类型的编译指导:
default_nettypenettype不能是supply1和supply0。
net类在发生逻辑冲突时的决断,Verilog有预定义的决断函数支持与工艺无关的逻辑冲突决断wire-and用于集电极开路电路wire-or用于射极耦合电路,寄存器类(register),寄存器类型在赋新值以前保持原值寄存器类型大量应用于行为模型描述及激励描述。
在下面的例子中,reg_a、reg_b、reg_sel用于施加激励给2:
1多路器。
用行为描述结构给寄存器类型赋值。
给reg类型赋值是在过程块中。
寄存器类的类型,寄存器类有四种数据类型,不要混淆寄存器数据类型与结构级存储元件,如udp_dff,Verilog中net和register声明语法,net声明rangedelay,net_name;net_type:
net类型range:
矢量范围,以MSB:
LSB格式delay:
定义与net相关的延时net_name:
net名称,一次可定义多个net,用逗号分开。
寄存器声明range,reg_name;reg_type:
寄存器类型range:
矢量范围,以MSB:
LSB格式。
只对reg类型有效reg_name:
寄存器名称,一次可定义多个寄存器,用逗号分开,Verilog中net和register声明语法,举例:
rega;/一个标量寄存器wandw;/一个标量wand类型netreg3:
0v;/从MSB到LSB的4位寄存器向量reg7:
0m,n;/两个8位寄存器tri15:
0busa;/16位三态总线wire0:
31w1,w2;/两个32位wire,MSB为bit0,选择正确的数据类型,moduletop;wirey;rega,b;DUTu1(y,a,b);initialbegina=0;b=0;#5a=1;endendmodule,moduleDUT(Y,A,B);outputY;inputA,B;wireY,A,B;and(Y,A,B);endmodule,输入端口可以由net/register驱动,但输入端口只能是net,输出端口可以是net/register类型,输出端口只能驱动net,在过程块中只能给register类型赋值,若Y,A,B说明为reg则会产生错误。
in1,in2,O,A,B,Y,双向端口输入/输出只能是net类型,选择数据类型时常犯的错误,用过程语句给一个net类型的或忘记声明类型的信号赋值。
信息:
illegalassignment.将实例的输出连接到声明为register类型的信号上。
信息:
hasillegaloutputportspecification.将模块的输入信号声明为register类型。
信息:
incompatibledeclaration,下面所列是常出的错误及相应的错误信息(errormessage),信号可以分为端口信号和内部信号。
出现在端口列表中的信号是端口信号,其它的信号为内部信号。
对于端口信号,输入端口只能是net类型。
输出端口可以是net类型,也可以是register类型。
若输出端口在过程块中赋值则为register类型;若在过程块外赋值(包括实例化语句),则为net类型。
内部信号类型与输出端口相同,可以是net或register类型。
判断方法也与输出端口相同。
若在过程块中赋值,则为register类型;若在过程块外赋值,则为net类型。
若信号既需要在过程块中赋值,又需要在过程块外赋值。
这种情况是有可能出现的,如决断信号。
这时需要一个中间信号转换。
信号类型确定方法总结如下:
选择数据类型时常犯的错误举例,修改前:
moduleexample(o1,o2,a,b,c,d);inputa,b,c,d;outputo1,o2;regc,d;rego2andu1(o2,c,d);always(aorb)if(a)o1=b;elseo1=0;endmodule,修改后:
moduleexample(o1,o2,a,b,c,d);inputa,b,c,d;outputo1,o2;/regc,d;/rego2rego1;andu1(o2,c,d);always(aorb)if(a)o1=b;elseo1=0;endmodule,example.v,选择数据类型时常犯的错误举例,Compilingsourcefileexample.vError!
Illegalleft-hand-sideassignmentVerilog-ILHSAexample.v,11:
o1=b;Error!
Illegalleft-hand-sideassignmentVerilog-ILHSAexample.v,12:
o1=0;2errors,第一次编译信息verilogcexample.v,第二次编译信息,Compilingsourcefileexample.vError!
Incompatibledeclaration,(c)definedasinputatline2Verilog-IDDILexample.v,5:
Error!
Incompatibledeclaration,(d)definedasinputatline2Verilog-IDDILexample.v,5:
Error!
Gate(u1)hasillegaloutputspecificationVerilog-GHIOSexample.v,8:
3errors,参数(parameters),用参数声明一个可变常量,常用于定义延时及宽度变量。
参数定义的语法:
parameter;可一次定义多个参数,用逗号隔开。
在使用文字(literal)的地方都可以使用参数。
参数的定义是局部的,只在当前模块中有效。
参数定义可使用以前定义的整数和实数参数。
modulemod1(out,in1,in2);.parametercycle=20,prop_del=3,setup=cycle/2-prop_del,p1=8,x_word=16bx,file=/usr1/jdough/design/mem_file.dat;.wirep1:
0w1;/Awiredeclarationusingparameter.endmodule,注意:
参数file不是string,而是一个整数,其值是所有字母的扩展ASCII值。
若file=“AB”,则file值为8h4142。
用法:
$fopen(file);$display(“%s”,file);,参数重载(overriding),可用defparam语句在编译时重载参数值。
defparam语句引用参数的层次化名称使用defparam语句可单独重载任何参数值。
Defparam语句(现在综合工具还不支持),modulemod1(out,in1,in2);.parameterp1=8,real_constant=2.039,x_word=16bx,file=/usr1/jdough/design/mem_file.dat;.endmodule,moduletest;.mod1I1(out,in1,in2);defparamI1.p1=6,I1.file=./my_mem.dat;.endmodule,参数重载(overriding),modulemod1(out,in1,in2);.parameterp1=8,real_constant=2.039,x_word=16bx,file=/usr1/jdough/design/mem_file.dat;.endmodulemoduletop;.mod1#(5,3.0,16bx,./my_mem.dat)I1(out,in1,in2);.endmodule,模块实例化时参数重载,使用#,次序与原说明相同,不需要给所有参数赋新值,但不能跳跃赋值,假设模块MOD顺序定义三个参数a,b,c,则:
MODu1#(a,b)(.);MODu2#(a)(.);MODu3#(a,c)(.);MODu4#(,b,c)(.);,为什么编译器认为这是参数而不是延时呢?
因为#说明延时的时候只能用于gate或过程语句,不能用于模块实例。
gate(primitives)在实例化时只能有延时,不能有模块参数。
寄存器数组(RegisterArrays),在Verilog中可以说明一个寄存器数组。
integerNUMS7:
0;/包含8个整数数组变量timet_vals3:
0;/4个时间数组变量reg类型的数组通常用于描述存储器其语法为:
regMSB:
LSBfirst_addr:
last_addr;MSB:
LSB定义存储器字的位数first_addr:
last_addr定义存储器的深度例如:
reg15:
0MEM0:
1023;/1Kx16存储器reg7:
0PREPhFFFE:
hFFFF;/2x8存储器描述存储器时可以使用参数或任何合法表达式parameterwordsize=16;parametermemsize=1024;regwordsize-1:
0MEM3memsize-1:
0;,存储器寻址(Memoryaddressing),存储器元素可以通过存储器索引(index)寻址,也就是给出元素在存储器的位置来寻址。
mem_nameaddr_exprVerilog不支持多维数组。
也就是说只能对存储器字进行寻址,而不能对存储器中一个字的位寻址。
modulemems;reg8:
1mema0:
255;/declarememorycalledmemareg8:
1mem_word;/tempregistercalledmem_word.initialbegin$displayb(mema5);/显示存储器中第6个字的内容mem_word=mema5;$displayb(mem_word8);/显示第6个字的最高有效位endendmodule,若要对存储器字的某些位存取,只能通过暂存器传递,复习(review),问题:
在Verilog中,什么情况下输出端会输出X值?
net和register类型的主要区别是什么?
在Verilog中如何定义一个常数?
解答:
若输出端输出X值,一种可能是输出net上发生驱动冲突,二是由一个未知值传递到net上引起。
register有存储功能,而net必须持续驱动。
在Verilog中使用parameter定义一个常数。
文本宏也是常数的一种形式。
第7章结构描述(structuralmodeling),如何使用Verilog的基本单元(primitives)如何构造层次化设计了解Verilog的逻辑强度系统,学习内容:
术语及定义(termsanddefinations),结构描述:
用门来描述器件的功能primitives(基本单元):
Verilog语言已定义的具有简单逻辑功能的功能模型(models),结构描述,Verilog结构描述表示一个逻辑图结构描述用已有的元件构造。
moduleMUX4x1(Z,D0,D1,D2,D3,S0,S1);outputZ;inputD0,D1,D2,D3,S0,S1;and(T0,D0,S0_,S1_),(T1,D1,S0_,S1),(T2,D2,S0,S1_),(T3,D3,S0,S1);not(S0_,S0),(S1_,S1);or(Z,T0,T1,T2,T3);endmodulemodulers_latch(y,yb,r,s);outputy,yb;inputr,s;norn1(y,r,yb);norn2(yb,s,y);endmodule,结构描述等价于逻辑图,都是连接简单元件构成更复杂元件,通过门的实例使用门,忽略了门的实例名。
同一种门可以通过一个语句实例化,Latch,结构描述(续),结构描述等价于逻辑图。
它们都是连接简单元件来构成更为复杂的元件。
Verilog使用其连接特性完成简单元件的连接。
在描述中使用元件时,通过建立这些元件的实例来完成。
上面的例子中MUX是没有反馈的组合电路,使用中间或内部信号将门连接起来。
描述中忽略了门的实例名,并且同一种门的所有实例可以在一个语句中实例化。
上面的锁存器(latch)是一个时序元件,其输出反馈到输入上。
它没有使用任何内部信号。
它使用了实例名并且对两个nor门使用了分开的实例化语句。
Verilog基本单元(primitives),Verilog基本单元提供基本的逻辑功能,也就是说这些逻辑功能是预定义的,用户不需要再定义这些基本功能。
基本单元是Verilog开发库的一部分。
大多数ASIC和FPGA元件库是用这些基本单元开发的。
基本单元库是自下而上的设计方法的一部分。
基本单元的引脚(pin)的可扩展性,基本单元引脚的数目由连接到门上的net的数量决定。
因此当基本单元输入或输出的数量变化时用户不需要重定义一个新的逻辑功能。
所有门(除了not和buf)可以有多个输入,但只能有一个输出。
not和buf门可以有多个输出,但只能有一个输入。
带条件的基本单元,Verilog有四种不同类型的条件基本单元这四种基本单元只能有三个引脚:
output,input,enable这些单元由enable引脚使能。
当条件基本单元使能信号无效时,输出高阻态。
带条件的基本单元(续),条件基本单元有三个端口:
输出、数据输入、使能输入,三种未知状态:
值强度x1,0,z未知L0,z未知H1,z未知,基本单元实例化,在端口列表中,先说明输出端口,然后是输入端口实例化时实例的名字是可选项and(out,in1,in2,in3,in4);/unnamedinstancebufb1(out1,out2,in);/namedinstance延时说明是可选项。
所说明的延时是固有延时。
输出信号经过所说明的延时才变化。
没有说明时延时为0。
notif0#3.1n1(out,in,cntrl);/delayspecified信号强度说明是可选项not(strong1,weak0)n1(inv,bit);/strengthspecified,moduleintr_sample;regA;wireY;not#10intrinsic(Y,A);initialbeginA=0;#15A=1;#15A=0;#8A=1;#8A=0;#11A=1;#10$finish;endendmodule,仿真波形,固有延时,模块实例化(moduleinstantiation),模块实例化时实例必须有一个名字。
使用位置映射时,端口次序与模块的说明相同。
使用名称映射时,端口次序与位置无关没有连接的输入端口初始化值为x。
modulecomp(o1,o2,i1,i2);outputo1,o2;inputi1,i2;.endmodulemoduletest;compc1(Q,R,J,K);/Positionalmappingcompc2(.i2(K),.o1(Q),.o2(R),.i1(J);/Namedmappingcompc3(Q,J,K);/Oneportleftunconnectedcompc4(.i1(J),.o1(Q);/Named,twounconnectedportsendmodule,名称映射的语法:
.内部信号(外部信号),没有连接时通常会产生警告,moduledriver(in,out,en);input2:
0in;output2:
0out;inputen;bufif0u2:
0(out,in,en);/arrayofbuffersendmodule,实例数组(ArrayofInstances),实例名字后有范围说明时会创建一个实例数组。
在说明实例数组时,实例必须有一个名字(包括基本单元实例)。
其说明语法为:
();,两个模块功能完全等价,范围说明语法:
MSB:
LSB,moduledriver_equiv(in,out,en);input2:
0in;output2:
0out;inputen;/Eachprimitiveinstantiationisdoneseparatelybufif0u2(out2,in2,en);bufif0u1(out1,in1,en);bufif0u0(out0,in0,en);endmodule,实例数组(ArrayofInstances)(续),如果范围中MSB与LSB相同,则只产生一个实例。
一个实例名字只能有一个范围。
下面以模块comp为例说明这些情况,moduleoops;wirey1,a1,b1;wire3:
0a2,b2,y2,a3,b3,y3;compu15:
5(y1,a1,b1);/只产生一个comp实例compm10:
3(y2,a2,b2);compm14:
7(y3,a3,b3);/非法endmodule,ml作为实例阵列名字使用了两次,逻辑强度(strength)模型,Verilog提供多级逻辑强度。
逻辑强度模型决定信号组合值是可知还是未知的,以更精确的描述硬件的行为。
下面这些情况是常见的需要信号强度才能精确建模的例子。
开极输出(Opencollectoroutput)(需要上拉)多个三态驱动器驱动一个信号MOS充电存储ECL门(emitterdotting)逻辑强度是Verilog模型的一个重要部分。
通常用于元件建模,如ASIC和FPGA库开发工程师才使用这么详细的强度级。
但电路设计工程师使用这些精细的模型仿真也应该对此了解。
逻辑强度(strength)模型(续),用户可以给基本单元实例或net定义强度。
基本单元强度说明语法:
();例:
nand(strong1,pull0)#(2:
3:
4)n1(o,a,b);/strengthanddelayor(supply0,highz1)(out,in1,in2,in3);/noinstancename用户可以用%v格式符显示net的强度值$monitor($time,output=%v,f);电容强度(large,medium,small)只能用于net类型trireg和基本单元tran例如:
trireg(small)tl;,信号强度值系统,Verilog多种强度决断,在Verilog中,级别高的强度覆盖级别低的强度,复习,问题:
什么是Verilog中的结构化描述?
连接模块端口有哪两种方法?
哪一种更通用一些?
什么是实例数组?
什么时候实例名字是可选的?
解答:
结构化描述是使用Verilog基本单元或单元(cell)级元件对设计进行描述,与逻辑图很相似。
可以根据次序(位置映射)或名字(名称映射)来映射端口。
虽然在这个教程中大多使用位置映射,这主要是为了节省空间。
在实际设计中,名称映射可能更通用一些。
实例数组用一条语句创建模型(模块或基本单元)的多个实例。
基本单元实例化时实例名是可选的,说明基本单元数组时除外。
当实例化模块时,实例名是必须的。
第8章延时模型,学习内容:
如何说明块延时如何说明分布延时如何说明路径延时怎样在模块中说明时序检查标准延时格式SDF(StandardDelayFormat),术语及定义,模块路径(modulepath):
穿过模块,连接模块输入(input端口或inout端口)到模块输出(output端口或inout端口)的路径。
路径延时(pathdelay):
与特定路径相关的延时PLI:
编程语言接口,提供Verilog数据结构的过程访问。
时序检查(timingcheck):
监视两个输入信号的关系并检查的系统任务,以保证电路能正确工作。
时序驱动设计(timingdrivendesign):
从前端到后端的完整设计流程中,用时序信息连接不同的设计阶段,延时模型类型(DelayModelingTypes),延时有三种描述模型:
将全部延时集中到最后一个门,延时分布在每一个门上,分布延时,块延时,路径延时,块延时(LumpedDelay),块延时方法是将全部延时集中到最后一个门上。
这种模型简单但不够精确,只适用于简单电路。
因为当到输出端有多个路径时不能描述不同路径的不同延时。
可以用这种方法描述器件的传输延时,并且使用最坏情况下的延时(最大延时)。
timescale1ns/1nsmodulenoror(Out,A,B,C);outputOut;inputA,B,C;norn1(net1,A,B);or#3o1(Out,C,net1);endmodule,用块延时描述时,不同路径的延时完全相同,左边例中各路径延时为:
A-Outis3nsB-Outis3nsC-Outis3ns,分布延时(DistributedDelays),分布延时方法是将延时分散到每一个门。
在相同的输出端上,不同的路径有不同的延时。
分布延时有两个缺点:
在结构描述中随规模的增大而变得异常复杂。
仍然不能描述基本单元(primitive)中不同引脚上的不同延时。
timescale1ns/1nsmodulenoror(Out,A,B,C);outputOut;inputA,B,C;nor#2n1(net1,A,B);or#1o1(Out,C,net1);endmodule,这种描述方法描述的不同路径的延时。
例中各路径延时为:
A-Outis3nsB-Outis3ns
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- verilog 语言 学习