Chia°bub0 下载 第9章结构建模 本章讲述 Verilog HDl中的结构建模方式。结构建模方式用以下三种实例语句描述: Gate实例语句 ·UDP实例语句 Module实例语句 第5章和第6章已经讨论了门级建模方式和UDP建模方式,本章讲述模块实例语句 9.1模块 Verilog hdli中,基本单元定义成模块形式,如下所示 module module name(port list)i Declarations and statement 端口队列pσ rt list列出了该模块通过哪些端口与外部模块通信。 92端口 模块的端口可以是输入端口、输出端口或双向端口。缺省的端口类型为线网类型(即 wire类型)。但是,端口可被显式地指定为线网。输出或输入输出端口能够被重新声明为reg型 寄存器。无论是在线网说明还是寄存器说明中,线网或寄存器必须与端口说明中指定的长度 相同。下面是一些端口说明实例 module Micro (PC, Instr, Nex tAdde //端口说明 output [1: 8] Instr inout [16: 1] NextAddri //重新说明端口类型 wire[16:1] Nex aDdr;//该说明是可选的,但如果指定了,就必须与它的端口说明保持相同长度 reg [1: 8] Instr. nstr已被重新说明为reg类型,因此它能在 always语句或在 initia1语句中赋值。 9.3模块实例语句 一个模块能够在另外一个模块中被引用,这样就建立了描述的层次。模块实例语句形式 module name instance name port associations 信号端口可以通过位置或名称关联;但是关联方式不能够混合使用。端口关联形式如下
下载 第9章 结 构 建 模 本章讲述Verilog HDL中的结构建模方式。结构建模方式用以下三种实例语句描述: • Gate实例语句 • UDP实例语句 • Module实例语句 第5章和第6章已经讨论了门级建模方式和 U D P建模方式,本章讲述模块实例语句。 9.1 模块 Verilog HDL中,基本单元定义成模块形式,如下所示 : m o d u l e m o d u l e _ n a m e(p o r t _ l i s t) ; D e c l a r a t i o n s _ a n d _ S t a t e m e n t s e n d m o d u l e 端口队列p o rt _ l i s t列出了该模块通过哪些端口与外部模块通信。 9.2 端口 模块的端口可以是输入端口、输出端口或双向端口。缺省的端口类型为线网类型(即 w i r e类型)。但是,端口可被显式地指定为线网。输出或输入输出端口能够被重新声明为 r e g型 寄存器。无论是在线网说明还是寄存器说明中,线网或寄存器必须与端口说明中指定的长度 相同。下面是一些端口说明实例。 m o d u l e M i c r o (PC, Instr, NextAddr); / /端口说明 i n p u t [3:1] P C; o u t p u t [1:8] I n s t r; i n o u t [16:1] N e x t A d d r; / /重新说明端口类型: w i r e [16:1] N e x t A d d r; //该说明是可选的,但如果指定了,就必须与它的端口说明保持相同长度。 r e g [1:8] I n s t r; / /I n s t r已被重新说明为r e g类型,因此它能在always 语句或在i n i t i a l语句中赋值。 . . . e n d m o d u l e 9.3 模块实例语句 一个模块能够在另外一个模块中被引用,这样就建立了描述的层次。模块实例语句形式 如下: module_name instance_name(p o r t _ a s s o c i a t i o n s) ; 信号端口可以通过位置或名称关联;但是关联方式不能够混合使用。端口关联形式如下:
84 Verilog hdl硬件描述语言 China-pub. coM 下载 //通过位置 PortName (port expr) //通过名称 port expr可以是以下的任何类型 1)标识符(reg或net) 2)位选择 3)部分选择 4)上述类型的合并 5)表达式(只适用于输入端口) 在位置关联中,端口表达式按指定的顺序与模块中的端口关联。在通过名称实现的关联 中,模块端口和端口表达式的关联被显式地指定,因此端口的关联顺序并不重要。下例使用 两个半加器模块构造全加器:逻辑图如图9-1所示 module HA(A, b,s, C) output s, parameter AND DELAY 1, XOR DELAY 2 assign #XOR DELAY S=A B ssign # AND DELAY C=A&B: module FA(P, 0, Cin, Sum, Cout 0, cin 图9-1使用两个半加器模块构造 output Sum, Cout 的全加器 parameter OR DELAY wire s1, C1, C2 //两个模块实例语句 HAh1(P,Q,S1,C1;//通过位置关联。 HAh2(.A(Cin),.s(sum),.B(S1),,C(C2));//通过端口与信号的名字关联 or #OR DELAY ol Cout, Cl, Ci 在第一个模块实例语句中,HA是模块的名字,hl是实例名称,并且端口按位置关联,即 信号P与模块(HA)的端口A连接,信号Ω与端口B连接,Sl与S连接,Cl与模块端口C 在第二个实例中,端口按名称关联,即模块(HA)和端口表达式间的连接是显示地定义 下例是使用不同端口表达式形式的模块实例语句。 Micro MI (UdIn[3: 0], rN, RaN), Status[o], Status [1] UdOut [0: 7], TxDa ta) 这个实例语句表示端口表达式可以是标识符( TxData)、位选择(Saus[0])、部分位选 择(Udm3:0])、合并({NRN})或一个表达式(& doull0:7]);表达式只能够连接到 输入端口 9.3.1悬空端口 在实例语句中,悬空端口可通过将端口表达式表示为空白来指定为悬空端口,例如:
p o r t _ e x p r / /通过位置。 .P o r t N a m e (p o r t _ e x p r) / /通过名称。 p o rt _ e x p r可以是以下的任何类型: 1) 标识符(r e g或n e t) 2) 位选择 3) 部分选择 4) 上述类型的合并 5) 表达式(只适用于输入端口) 在位置关联中,端口表达式按指定的顺序与模块中的端口关联。在通过名称实现的关联 中,模块端口和端口表达式的关联被显式地指定,因此端口的关联顺序并不重要。下例使用 两个半加器模块构造全加器;逻辑图如图 9 - 1所示。 m o d u l e H A(A , B , S , C); i n p u t A , B; o u t p u t S, C; p a r a m e t e r A N D _ D E L A Y = 1, X O R _ D E L A Y = 2; a s s i g n #X O R _ D E L A Y S = A ^ B; a s s i g n #A N D _ D E L A Y C = A & B; e n d m o d u l e m o d u l e F A(P, Q, Cin, Sum, Cout) ; i n p u t P, Q, Cin; o u t p u t Sum, Cout; p a r a m e t e r O R _ D E L A Y = 1; w i r e S1, C1, C2; / /两个模块实例语句 HA h1 (P, Q, S1, C1); //通过位置关联。 HA h2 ( .A(C i n), .S(S u m), .B(S 1), .C(C 2)); //通过端口与信号的名字关联。 / /门实例语句: or #O R _ D E L A Y O1 (Cout, C1, C2) ; e n d m o d u l e 在第一个模块实例语句中, H A是模块的名字 ,h 1是实例名称,并且端口按位置关联,即 信号P与模块(H A)的端口A连接,信号Q与端口B连接,S 1与S连接,C 1与模块端口 C连接。 在第二个实例中,端口按名称关联,即模块( H A)和端口表达式间的连接是显示地定义 的。 下例是使用不同端口表达式形式的模块实例语句。 Micro M1 (U d I n[3:0], {WrN, RdN}, S t a t u s[0], S t a t u s[ 1 ] , & U d O u t [0:7], T x D a t a) ; 这个实例语句表示端口表达式可以是标识符( T x D a t a)、位选择(S t a t u s[ 0 ])、部分位选 择(U d I n[ 3 : 0 ])、合并({Wr N,R d N})或一个表达式(& u d O u t[ 0 : 7 ]);表达式只能够连接到 输入端口。 9.3.1 悬空端口 在实例语句中,悬空端口可通过将端口表达式表示为空白来指定为悬空端口,例如: 84 Verilog HDL 硬件描述语言 下载 图9-1 使用两个半加器模块构造 的全加器
Chinaopub.com 物结建85 下载 DFF dI(o(0s),. obar(,. Data(D), Preset(),. Clock(CK));/名称对应方式 DFFd2(QS,,D,,CK;//位置对应方式。 //输出端口Qbax悬空 //输入端口 Preset打开,其值设定为z。 在这两个实例语句中,端口Qbar和 Preset悬空 模块的输入端悬空,值为髙阻态z。模块的输岀端口悬空,表示该输岀端口废弃不用 932不同的端口长度 当端口和局部端口表达式的长度不同时,端口通过无符号数的右对齐或截断方式进行匹 配。例如: endmodule odule Top; wire [1: 2] BaI wire [2: 6] Mpr Chila c1(Bd1,№r) endmodule 在对 Child模块的实例中,Bd2]连接到Pba[0],Bal[连接到Pba[1],余下的输入端口 Pba[5]、Pba[4]和Pba[3悬空,因此为高阻态z。与之相似,Mr6连接到Ppy[0],Mpr[5]连 接到Ppy[1l,Mpr[4]连接到Ppy{2]。参见图9-2。 Pp[432|10 F[2|10 如[2|34||6 图92端口匹配 9.3.3模块参数值 当某个模埉在另一个模块内被引用时,髙层模块能够改变低层模块的参数值。模块参数 值的改变可采用下述两种方式: 1)参数定义语句( defparam) 2)带参数值的模块引用 参数定义语句 参数定义语句形式如下: defparam hier path name l= valuel hier path name2= value2,..i 较低层模块中的层次路径名参数可以使用如下语句显式定义(层次路径名在下一章中讲
DFF d1 ( .Q(Q S), .Q b a r(), .D a t a( D ) , .P r e s e t(), .C l o c k(CK)); //名称对应方式。 DFF d2 (QS, , D, , CK) ; / /位置对应方式。 / /输出端口Q b a r悬空。 / /输入端口P r e s e t打开,其值设定为z。 在这两个实例语句中,端口 Q b a r和P re s e t悬空。 模块的输入端悬空,值为高阻态 z。模块的输出端口悬空,表示该输出端口废弃不用。 9.3.2 不同的端口长度 当端口和局部端口表达式的长度不同时,端口通过无符号数的右对齐或截断方式进行匹 配。例如: m o d u l e C h i l d(Pba, Ppy) ; i n p u t [5:0] P b a; o u t p u t [2:0] P p y; . . . e n d m o d u l e m o d u l e T o p; w i r e [1:2] B d l; w i r e [2:6] M p r; Child C1 (Bdl, Mpr) ; e n d m o d u l e 在对C h i l d模块的实例中, B d l[ 2 ]连接到P b a[ 0 ],B d l[1] 连接到P b a[ 1 ],余下的输入端口 P b a[ 5 ]、P b a[ 4 ]和P b a[ 3 ]悬空,因此为高阻态 z。与之相似,M p r[ 6 ]连接到P p y[ 0 ],M p r[ 5 ]连 接到P p y[ 1 ],M p r[4] 连接到P p y[ 2 ]。参见图9 - 2。 图9-2 端口匹配 9.3.3 模块参数值 当某个模块在另一个模块内被引用时,高层模块能够改变低层模块的参数值。模块参数 值的改变可采用下述两种方式: 1) 参数定义语句(d e f p a r a m); 2) 带参数值的模块引用。 1. 参数定义语句 参数定义语句形式如下: d e f p a r a m hier_path_name1 = v a l u e 1, hier_path_name2 = v a l u e 2, ...; 较低层模块中的层次路径名参数可以使用如下语句显式定义(层次路径名在下一章中讲 第9章 结 构 建 模 85 下载
86wiD)硬停述语言 Chinapub.com 下载 述)。下面是一个例。模块FA和HA已在本节前面描述过 module ToP(Ne wA, Ne wB, News, NewC) input NewA, NewB output News, NewC defparam Hal XOR DELAY =5 //实例Ha1中的参数 XOR DELAY a1 AND DELAY 2 //实例Ha1中参数的 AND DELAY HA HaI(NewA, NewB, News, Newc endmodule module ToP2(NewP, Ne wo, Ne wCin, Ne wSum, Ne wcout input NewP, Ne wQ, Ne wCin utput New Sum, NewCout defparam Fal. hI. XOR DELAY =2 //实例Fa1的实例h中的参数 XOR DELAY。 Fa1. h1. AND DELAY =3 //实例Fa1的实例h1中的参数 AND DELAY FaI OR DELAY= 3: //实例Fa1中的参数 OR DELAY) FA FaI (NewP, Newo, NewCin, NewSum, NewCojurt 2.带参数值的模块引用 在这种方法中,模块实例语句自身包含有新的参数值。下面的例子在前几节中也出现过, 本例中采用带参数的模块引用方式。 module ToP3(NewA, NewB, News, New C)i input NewA, Ne wB; HA (5, 2) HaI(NewA, NewB, News, NewC) ′/第1个值5赋给参数 AND DELAY,该参数在模块HA中说明。 /第2个值2赋给参数 XOR DELAY,该参数在模块HA中说明 endmodule module TOP4( NewP, Newo, NewCin, Newcout)i output Ne wSum, NewCounti defparam 2,/例Fa1中实例h1的参数xOR Fa1.h1. AND DELAY=3;/例Fa1中实例h1的参数 AND DELAY。 FA #(3) Fal(NewP, Newo, Newcin, NewCout //值3是参数 OR DELAY的新值 模块实例语句中参数值的顺序必须与较低层被引用的模块中说明的参数顺序匹配。在模 块TOP3中, AND DELAY已被设置为5, XOR DELAY已被设置为2 模块TOP3和TOP4解释说明了带参数的模块引用只能用于将参数值向下传递一个层次(例 如, OR DELAY),但是参数定义语句能够用于替换层次中任意一层的参数值 应注意到:在带参数的模块引用中,参数的指定方式与门级实例语句中时延的定义方式
述)。下面是一个例。模块FA和H A已在本节前面描述过。 m o d u l e TOP (N e w A , N e w B , N e w S , N e w C) ; i n p u t N e w A , N e w B; o u t p u t N e w S , N e w C; d e f p a r a m H a 1 . X O R _ D E L A Y = 5, / /实例H a 1中的参数X O R _ D E L A Y。 H a 1 . A N D _ D E L A Y = 2; / /实例H a 1中参数的A N D _ D E L A Y。 HA Hal (NewA, NewB, NewS,NewC) ; e n d m o d u l e m o d u l e T O P 2 (NewP, NewQ, NewCin,NewSum,NewCout ) ; i n p u t NewP, NewQ, NewCin; o u t p u t N e w S u m , N e w C o u t; d e f p a r a m F a 1 . h 1 . X O R _ D E L A Y = 2, / /实例F a 1的实例h 1中的参数X O R _ D E L A Y。 F a 1 . h 1 . A N D _ D E L A Y = 3, / /实例F a 1的实例h 1中的参数A N D _ D E L A Y。 F a 1 . O R _ D E L A Y = 3; / /实例F a 1中的参数O R _ D E L A Y) FA Fa1 (NewP, NewQ, NewCin,NewSum,NewCout ) ; e n d m o d u l e 2. 带参数值的模块引用 在这种方法中,模块实例语句自身包含有新的参数值。下面的例子在前几节中也出现过, 本例中采用带参数的模块引用方式。 m o d u l e T O P 3 (N e w A , N e w B , N e w S , N e w C) ; i n p u t N e w A , N e w B; o u t p u t N e w S , N e w C; H A #(5,2) H a 1(N e w A , N e w B , N e w S , N e w C) ; / /第1个值5赋给参数A N D_D E L A Y,该参数在模块H A中说明。 / /第2个值2赋给参数 X O R_D E L A Y,该参数在模块H A中说明。 e n d m o d u l e m o d u l e T O P 4(N e w P , N e w Q , N e w C i n , N e w C o u t) ; i n p u t N e w P , N e w Q , N e w C i n; o u t p u t N e w S u m , N e w C o u n t; d e f p a r a m F a 1 . h 1 . X O R _ D E L A Y = 2, //实例F a 1中实例h 1的参数X O R _ D E L A Y。 F a 1 . h 1 . A N D _ D E L A Y = 3; //实例F a 1中实例h 1的参数A N D _ D E L A Y。 F A #(3) F a 1(N e w P , N e w Q , N e w C i n , N e w C o u t) ; / /值3是参数O R _ D E L A Y的新值。 e n d m o d u l e 模块实例语句中参数值的顺序必须与较低层被引用的模块中说明的参数顺序匹配。在模 块TO P 3中,A N D _ D E L AY已被设置为5,X O R _ D E L AY已被设置为2。 模块TO P 3和TO P 4解释说明了带参数的模块引用只能用于将参数值向下传递一个层次(例 如,O R _ D E L AY),但是参数定义语句能够用于替换层次中任意一层的参数值。 应注意到:在带参数的模块引用中,参数的指定方式与门级实例语句中时延的定义方式 86 Verilog HDL 硬件描述语言 下载
物结建颇87 下载 相似:但由于对复杂模块的引用时,其实例语句不能像对门实例语句那样指定时延,故此处 不会导致混淆。 参数值还可以表示长度。下面是通用的M×N乘法器建模的实例。 module Multiplier(Opd 1, Opd 2, Result parameter EM=4,EN=2;//默认值 input [EM: 1] Opd 1 input [EN: 1] opd 2 output [EM+EN: 1] Result assign Result Opd 1* Opd 2: endmodule 这个带参数的乘法器可在另一个设计中使用,下面是8×6乘法器模块的带参数引用方式: wire [1: 8] Pipe Reg: wire [l: 6]Dbus; wire [1: 14 Addr counter Multiplier #(8, 6)Mi(Pipe Reg, Dbus, Addr counter) 第1个值8指定了参数EM的新值,第2个值6指定了参数EN的新值 94外部端口 在迄今为止所见到的模块定义中,端口表列举出了模块外部可见的端口。例如 module Scram A(Arb, Ctrl, Mem Blk, Byte)i input[0: 3] Arb input ctrl input [8: 0] Mem Blk; output [0: 3] Byte endmodule Amb、Cmrl、 Mem blk和Bvte为模块端口。这些端口同时也是外部端口,即在实例中, 釆用名称关联方式时,外部端口名称用于指定相互连接。下面是模块 Scram a的实例, Scram A SX. Byte(B1), Mem Blk(Mi), ctrI(CI), Arb(Al))i 在模块ScrωmA中,外部端口名称隐式地指定。Ⅴ erilog HDl中提供显式方式指定外部端 口名称。这可以通过按如下形式指定一个端口来完成 external port name (internal port name) 下面是同一个例子,只不过是显式地指定外部端口 module Scram B(. Da ta(Arb), Control(ctrl) Mem Word (Mem Blk), Addr(Byte)) input [0: 3] Arbi input ctrl input [8: 0]Mem Blk; utput [0: 3] Byte 模块 Scram B在此实例中指定的外部端口是Data、 Control、 Mem Word和Addr。端口表显 式地表明了外部端口和内部端口之间的连接。注意外部端口无需声明,但是模块的内部端口
相似;但由于对复杂模块的引用时,其实例语句不能像对门实例语句那样指定时延,故此处 不会导致混淆。 参数值还可以表示长度。下面是通用的 M×N乘法器建模的实例。 m o d u l e M u l t i p l i e r(O p d _ 1 , O p d _ 2 , R e s u l t) ; p a r a m e t e r E M = 4,E N = 2; //默认值 i n p u t [E M:1] O p d_ 1 ; i n p u t [E N:1] O p d_ 2 ; o u t p u t [E M+E N:1] R e s u l t; a s s i g n R e s u l t = O p d _ 1 * O p d _ 2; e n d m o d u l e 这个带参数的乘法器可在另一个设计中使用,下面是 8×6乘法器模块的带参数引用方式: w i r e [1:8] P i p e _ R e g; w i r e [1:6] D b u s; w i r e [1:14] A d d r _ C o u n t e r; . . . M u l t i p l i e r #(8,6) M 1(P i p e_R e g,D b u s,A d d r_C o u n t e r) ; 第1个值8指定了参数E M的新值,第2个值6指定了参数E N的新值。 9.4 外部端口 在迄今为止所见到的模块定义中,端口表列举出了模块外部可见的端口。例如, m o d u l e S c r a m _ A(A r b , C t r l , M e m _ B l k , B y t e) ; i n p u t[0:3] A r b; i n p u t C t r l; i n p u t [8:0] M e m _ B l k; o u t p u t [0:3] B y t e; . . . e n d m o d u l e A r b、C t r l、M e m _ B l k和B y t e为模块端口。这些端口同时也是外部端口,即在实例中,当 采用名称关联方式时,外部端口名称用于指定相互连接。下面是模块 S c r a m _ A的实例。 Scram_A SX( .B y t e(B 1) , .M e m _ B l k(M 1) , .C t r l(C 1) , .A r b(A 1) ) ; 在模块S c r a m _ A中,外部端口名称隐式地指定。 Verilog HDL中提供显式方式指定外部端 口名称。这可以通过按如下形式指定一个端口来完成: .e x t e r n a l _ p o r t _ n a m e(i n t e r n a l _ p o r t _ n a m e) 下面是同一个例子,只不过是显式地指定外部端口。 m o d u l e S c r a m _ B ( .D a t a(A r b) , .C o n t r o l(C t r l) , .M e m _ W o r d(M e m _ B l k) , .A d d r(B y t e) ) ; i n p u t [0:3] A r b; i n p u t C t r l; i n p u t [ 8 : 0 ]M e m _ B l k; o u t p u t [0:3] B y t e; . . . e n d m o d u l e 模块S c r a m _ B在此实例中指定的外部端口是 D a t a、C o n t ro l、M e m _ Wo rd和A d d r。端口表显 式地表明了外部端口和内部端口之间的连接。注意外部端口无需声明,但是模块的内部端口 第9章 结 构 建 模 87 下载