下载 第2章HDL指南 本章提供HDL语言的速成指南。 2.1模块 模块是 Verilog的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的 外部端口。一个设计的结构可使用开关级原语、门级原语和用户定义的原语方式描述;设计的 数据流行为使用连续赋值语句进行描述;时序行为使用过程结构描述。一个模块可以在另一个 模块中使用 个模块的基本语法如下: nodule module name (port list) Declarations reg, wire, parameter input, output, inout. function, task, sta tements Always statement Module⊥ nstant⊥at⊥on Gate instantiat⊥on UDP instant⊥ ation Continuous assignment endmodule 说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。语句定义设计的功 能和结构。说明部分和语句可以散布在模块中的任何地方:但是变量、寄存器、线网和参数 等的说明部分必须在使用前出现。为了使模块描述清晰和具有良好的可读性,最好将所有的说 明部分放在语句前。本书中的所有实例都遵守这一规范。 图2-1为建模一个半加器电路的模块的简单实例 module HalfAdder (A, B, Sum, Carry output Sum, Carryi assign #2 Sum =A Bi assign #5 Carry=a&B 模块的名字是 HalfAdder模块有4个端口:两个输A Sum 入端口A和B,两个输出端口Sm和Camy。由于没有定 义端口的位数,所有端口大小都为1位:同时,由于没有 各端口的数据类型说明,这四个端口都是线网数据类型 模块包含两条描述半加器数据流行为的连续赋值 图2-1半加器电路
下载 第2章 HDL指南 本章提供H D L语言的速成指南。 2.1 模块 模块是Verilog 的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的 外部端口。一个设计的结构可使用开关级原语、门级原语和用户定义的原语方式描述 ; 设计的 数据流行为使用连续赋值语句进行描述 ; 时序行为使用过程结构描述。一个模块可以在另一个 模块中使用。 一个模块的基本语法如下: 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 : reg, wire, parameter, input, output, inout, function, task, . . . S t a t e m e n t s : Initial statement Always statement Module instantiation Gate instantiation UDP instantiation Continuous assignment e n d m o d u l e 说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。语句定义设计的功 能和结构。说明部分和语句可以散布在模块中的任何地方;但是变量、寄存器、线网和参数 等的说明部分必须在使用前出现。为了使模块描述清晰和具有良好的可读性 , 最好将所有的说 明部分放在语句前。本书中的所有实例都遵守这一规范。 图2 - 1为建模一个半加器电路的模块的简单实例。 m o d u l e H a l f A d d e r (A, B, Sum, Carry) ; i n p u t A, B; o u t p u t Sum, Carry; a s s i g n #2 Sum = A ^ B; a s s i g n #5 Carry = A & B; e n d m o d u l e 模块的名字是H a l f A d d e r。 模块有4个端口: 两个输 入端口A和B,两个输出端口S u m和C a rry。由于没有定 义端口的位数, 所有端口大小都为1位;同时, 由于没有 各端口的数据类型说明, 这四个端口都是线网数据类型。 模块包含两条描述半加器数据流行为的连续赋值 图2-1 半加器电路
chinapub.com 第章BDL指南5 下载 语句。从这种意义上讲,这些语句在模块中出现的顺序无关紧要,这些语句是并发的。每条 语句的执行顺序依赖于发生在变量A和B上的事件。 在模块中,可用下述方式描述一个设计: 1)数据流方式; 2)行为方式 3)结构方式; 4)上述描述方式的混合 下面几节通过实例讲述这些设计描述方式。不过有必要首先对Ⅴ erilog hdl的时延作简要 介绍。 2.2时延 Verilog hdl模型中的所有时延都根据时间单位定义。下面是带时延的连续赋值语句实 assign #2 Sum =A B #2指2个时间单位。 使用编译指令将时间单位与物理时间相关联。这样的编译器指令需在模块描述前定义 timescalelns /100ps 此语句说明时延时间单位为Ins并且时间精度为100ps(时间精度是指所有的时延必须被限定在 0.lns内)。如果此编译器指令所在的模块包含上面的连续赋值语句,#2代表2ns。 如果没有这样的编译器指令,Ⅴ erilog HDl模拟器会指定一个缺省时间单位。 IEEE Verilog HDL标准中没有规定缺省时间单位 2.3数据流描述方式 用数据流描述方式对一个设计建模的最基本的机制就是使用连续赋值语句。在连续赋值 语句中,某个值被指派给线网变量。连续赋值语句的语法为 assign [delay] LHs net Rhs expressi 右边表达式使用的操作数无论何时发生变化,右边表达式都重新计算,并且在指定的时延后变 化值被赋予左边表达式的线网变量。时延定义了右边表达式操作数变化与赋值给左边表达式 间的持续时间。如果没有定义时延值,缺省时延为0。 图2-2显示了使用数据流描述方式对2-4解码器电路的建模的实例模型。 abar A B 图2-22-4解码器电路
语句。从这种意义上讲,这些语句在模块中出现的顺序无关紧要,这些语句是并发的。每条 语句的执行顺序依赖于发生在变量 A和B上的事件。 在模块中,可用下述方式描述一个设计: 1) 数据流方式; 2) 行为方式; 3) 结构方式; 4) 上述描述方式的混合。 下面几节通过实例讲述这些设计描述方式。不过有必要首先对 Verilog HDL的时延作简要 介绍。 2.2 时延 Verilog HDL模型中的所有时延都根据时间单位定义。 下面是带时延的连续赋值语句实 例。 a s s i g n #2 S u m = A ^ B; # 2指2个时间单位。 使用编译指令将时间单位与物理时间相关联。这样的编译器指令需在模块描述前定义, 如下所示: ` timescale 1ns /100ps 此语句说明时延时间单位为 1 n s并且时间精度为100ps (时间精度是指所有的时延必须被限定在 0 . 1 n s内)。 如果此编译器指令所在的模块包含上面的连续赋值语句 , #2 代表2 n s。 如果没有这样的编译器指令 , Verilog HDL 模拟器会指定一个缺省时间单位。 IEEE Ve r i l o g HDL 标准中没有规定缺省时间单位。 2.3 数据流描述方式 用数据流描述方式对一个设计建模的最基本的机制就是使用连续赋值语句。在连续赋值 语句中,某个值被指派给线网变量。 连续赋值语句的语法为: a s s i g n [d e l a y] L H S _ n e t = RHS_ expression; 右边表达式使用的操作数无论何时发生变化 , 右边表达式都重新计算 , 并且在指定的时延后变 化值被赋予左边表达式的线网变量。时延定义了右边表达式操作数变化与赋值给左边表达式 之间的持续时间。如果没有定义时延值 , 缺省时延为0。 图2 - 2显示了使用数据流描述方式对 2 - 4解码器电路的建模的实例模型。 图2-2 2-4解码器电路 第2章 HDL指南 5 下载
6 Verilog hdl硬件描述语言 China-pub. coM 下载 module Decoder2x4(A, B, EN, 4 input A, B, EN. wire Abar, Bbar /语句1 语句2 assign #2 Z[0]=~ bar c bbar c e;//语句3 ass⊥gnz[1] Abar & B& EN assign #22[2]=*(A& Bbar EN //语句5 捏z[3] endmodule 以反引号“”开始的第一条语句是编译器指令,编译器指令' timescale将模块中所有时延 的单位设置为1ns,时间精度为lns。例如,在连续赋值语句中时延值#1和#2分别对应时延lns 和2ns 模块 Decoder2x4有3个输入端口和1个4位输出端口。线网类型说明了两个连线型变量Abar 和Bbar(连线类型是线网类型的一种)。此外,模块包含6个连续赋值语句 参见图2-3中的波形图。当EN在第5ns变化时,语句3、4、5和6执行。这是因为EN是这些 连续赋值语句中右边表达式的操作数。0]在第7ns时被赋予新值0。当A在第15ns变化时,语 句1、5和6执行。执行语句5和6不影响Z0]和Z1]的取值。执行语句5导致Z[2]值在第17ns变为 0。执行语句1导致Abar在第16ns被重新赋值。由于Abwr的改变,反过来又导致Z0]值在第18ns 变为1。 请注意连续赋值语句是如何对电路的数据流行为建模的:这种建模方式是隐式而非显式 的建模方式。此外,连续赋值语句是并发执行的,也就是说各语句的执行顺序与其在描述中出 现的顺序无关。 图2-3连续赋值语句实例 24行为描述方式 设计的行为功能使用下述过程语句结构描述: l) initial语句:此语句只执行一次
` t i m e s c a l e 1ns/ 1ns m o d u l e D e c o d e r 2 x 4 (A, B, EN, Z) ; i n p u t A, B, EN; o u t p u t [ 0 :3] Z; wire Abar, Bbar; assign #1 Abar = ~ A; / / 语句 1。 assign #1 Bbar = ~ B; / / 语句 2。 assign #2 Z[0] = ~ (Abar & Bbar & EN) ; / / 语句 3。 assign #2 Z[1] = ~ (Abar & B & EN) ; / / 语句 4。 assign #2 Z[2] = ~ (A & Bbar & EN) ; / / 语句 5。 assign #2 Z[3] = ~ ( A & B & EN) ; / / 语句 6。 e n d m o d u l e 以反引号“ ` ”开始的第一条语句是编译器指令, 编译器指令` t i m e s c a l e 将模块中所有时延 的单位设置为1 n s,时间精度为1 ns。例如,在连续赋值语句中时延值# 1和# 2分别对应时延1 ns 和2 ns。 模块D e c o d e r 2 x 4有3个输入端口和1个4位输出端口。线网类型说明了两个连线型变量 A b a r 和B b a r (连线类型是线网类型的一种 )。此外,模块包含6个连续赋值语句。 参见图2 - 3中的波形图。当 E N在第5 ns变化时,语句3、4、5和6执行。这是因为 E N是这些 连续赋值语句中右边表达式的操作数。 Z[ 0 ]在第7 ns时被赋予新值0。当A在第15 ns变化时, 语 句1、5和6执行。执行语句5和6不影响Z[ 0 ]和Z[ 1 ]的取值。执行语句5导致Z[ 2 ]值在第17 ns变为 0。执行语句1导致A b a r在第16 ns被重新赋值。由于A b a r的改变,反过来又导致Z[ 0 ]值在第18 n s 变为1。 请注意连续赋值语句是如何对电路的数据流行为建模的;这种建模方式是隐式而非显式 的建模方式。此外 ,连续赋值语句是并发执行的,也就是说各语句的执行顺序与其在描述中出 现的顺序无关。 图2-3 连续赋值语句实例 2.4 行为描述方式 设计的行为功能使用下述过程语句结构描述: 1) initial语句:此语句只执行一次。 6 Verilog HDL 硬件描述语言 下载
inaopub.com 第2章HDL指南 7 下载 2) always语句:此语句总是循环执行,或者说此语句重复执行 只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持原 有值不变。所有的初始化语句和 always语句在0时刻并发执行 下例为 always语句对1位全加器电路建模的示例,如图2-4 module FA Seg(A,B,C⊥n,Sum,Co山t input A, B, Cin output sum, Cout reg sum, Cout reg TI, T2, T3 always e( A or B or Cin ) begin (A B) 1=A4C⊥ T3=A E Cou endmodule 块 FA Seq有三个输入和两个输出。由于Sm、Cou、T、T2和73在 always语句中被赋值, 它们被说明为reg类型(reg是寄存器数据类型的一种)。 always语句中有一个与事件控制(紧跟在字符@后面的 表达式)。相关联的顺序过程( begin-end对)。这意味着B 只要A、B或Cin上发生事件,即A、B或Cin之一的值发 生变化,顺序过程就执行。在顺序过程中的语句顺序 行,并且在顺序过程执行结束后被挂起。顺序过程 行完成后, always语句再次等待A、B或Cm上发生的 在顺序过程中出现的语句是过程赋值模块化的实 图241位全加器电路 例。模块化过程赋值在下一条语句执行前完成执行。过程赋值可以有一个可选的时延。 时延可以细分为两种类型 1)语句间时延:这是时延语句执行的时延。 2)语句内时延:这是右边表达式数值计算与左边表达式赋值间的时延。 下面是语句间时延的示例: Sum =(A B) Cin; #4 TI=A& Cin 在第二条语句中的时延规定赋值延迟4个时间单位执行。就是说,在第一条语句执行后等待4 个时间单位,然后执行第二条语句。下面是语句内时延的示例。 Sum =#3(A B)A Cin 这个赋值中的时延意味着首先计算右边表达式的值,等待3个时间单位,然后赋值给Sum 如果在过程赋值中未定义时延,缺省值为0时延,也就是说,赋值立即发生。这种形式以 及在 al ways语句中指定语句的其他形式将在第8章中详细讨论。 下面是inia语句的示例: timescale Ins lns
2) always语句:此语句总是循环执行 , 或者说此语句重复执行。 只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持原 有值不变。所有的初始化语句和 a l w a y s语句在0时刻并发执行。 下例为a l w a y s语句对1位全加器电路建模的示例,如图 2 - 4。 m o d u l e F A _ S e q (A, B, Cin, Sum, Cout) ; i n p u t A, B, Cin ; o u t p u t Sum, Cout; r e g Sum, Cout; r e g T1, T2, T3; a l w a y s @ ( A o r B o r C i n ) b e g i n Sum = (A ^ B) ^ Cin; T1 = A & Cin; T2 = B & Cin; T3 = A & B; C o u t = (T 1| T 2) | T 3; e n d e n d m o d u l e 模块FA _ S e q 有三个输入和两个输出。由于S u m、C o u t、T 1、T 2和T 3在always 语句中被赋值, 它们被说明为 reg 类型(reg 是寄存器数据类型的一种)。 always 语句中有一个与事件控制(紧跟在字符@ 后面的 表达式)。相关联的顺序过程( b e g i n - e n d对)。这意味着 只要A、B或C i n 上发生事件,即A、B或C i n之一的值发 生变化,顺序过程就执行。在顺序过程中的语句顺序 执行,并且在顺序过程执行结束后被挂起。顺序过程 执行完成后,always 语句再次等待A、B或C i n上发生的 事件。 在顺序过程中出现的语句是过程赋值模块化的实 例。模块化过程赋值在下一条语句执行前完成执行。过程赋值可以有一个可选的时延。 时延可以细分为两种类型: 1) 语句间时延: 这是时延语句执行的时延。 2) 语句内时延: 这是右边表达式数值计算与左边表达式赋值间的时延。 下面是语句间时延的示例: S u m = (A ^ B) ^ C i n; #4 T 1 = A & C i n; 在第二条语句中的时延规定赋值延迟 4个时间单位执行。就是说,在第一条语句执行后等待 4 个时间单位,然后执行第二条语句。下面是语句内时延的示例。 S u m = #3 (A^ B) ^ C i n; 这个赋值中的时延意味着首先计算右边表达式的值 , 等待3个时间单位,然后赋值给S u m。 如果在过程赋值中未定义时延,缺省值为 0时延,也就是说,赋值立即发生。这种形式以 及在always 语句中指定语句的其他形式将在第 8章中详细讨论。 下面是i n i t i a l语句的示例: ` t i m e s c a l e 1ns / 1ns 第2章 HDL指南 7 下载 图2-4 1位全加器电路
8 Verilog hdl硬件描述语言 China°b60M 下载 module Test (Pop, Pid)i output Pop, Pid reg in⊥t⊥a1 begin //句1 Pid= 0 //语句2。 PQp=#51; //语句3。 Pid=#3 //语句4 Pop =#60 /缙句5 P⊥a=#20 /句6 dimodule 这一模块产生如图2-5所示的波形。 initial语句包含一个顺序过程。这一顺序过程在0ns时 开始执行,并且在顺序过程中所有语句全部执行完毕后, initial语句永远挂起。这一顺序过程 包含带有定义语句内时延的分组过程赋值的实例。语句1和2在0ns时执行。第三条语句也在0 时刻执行,导致Pp在第5ns时被赋值。语句4在第5ns执行,并且Pid在第8ns被赋值。同样, Pop在14ns被赋值0,Pid在第16ns被赋值0。第6条语句执行后, initial语句永远被挂起。第8 章将更详细地讲解 initial语句 图2-5Test模块的输出波形 2.5结构化描述形式 在 Verilog hdl中可使用如下方式描述结构 1)内置门原语(在门级): 2)开关级原语(在晶体管级) 3)用户定义的原语(在门级); 4)模块实例(创建层次结构)。 通过使用线网来相互连接。下面的结构描述形式使用内置门原语描述的全加器电路实例。 该实例基于图24所示的逻辑图 module FA Str (A, B, Cin, Sum, Cout input A, B, Cin output Sum, Cout wire SI, T1, T2, T. x2(Sum,S1,c⊥ and
m o d u l e Test (Pop, Pid) ; o u t p u t Pop, Pid; r e g Pop, Pid; i n i t i a l b e g i n P o p = 0; // 语句 1。 P i d = 0; // 语句 2。 P o p = #5 1; // 语句 3。 P i d = #3 1; // 语句 4。 Pop = #6 0; // 语句 5。 P i d = #2 0; // 语句 6。 e n d e n d m o d u l e 这一模块产生如图2 - 5所示的波形。i n i t i a l语句包含一个顺序过程。这一顺序过程在 0 ns时 开始执行,并且在顺序过程中所有语句全部执行完毕后 , initial语句永远挂起。这一顺序过程 包含带有定义语句内时延的分组过程赋值的实例。语句 1和2在0 ns时执行。第三条语句也在 0 时刻执行,导致P o p 在第5 ns时被赋值。语句 4在第5 ns执行,并且P i d 在第8 ns被赋值。同样, P o p在14 ns被赋值0,P i d在第16 ns被赋值0。第6条语句执行后,i n i t i a l语句永远被挂起。第 8 章将更详细地讲解i n i t i a l语句。 图2-5 Test 模块的输出波形 2.5 结构化描述形式 在Verilog HDL中可使用如下方式描述结构 : 1) 内置门原语(在门级); 2) 开关级原语(在晶体管级); 3) 用户定义的原语(在门级); 4) 模块实例 (创建层次结构)。 通过使用线网来相互连接。下面的结构描述形式使用内置门原语描述的全加器电路实例。 该实例基于图2 - 4所示的逻辑图。 m o d u l e F A _ S t r (A, B, Cin, Sum, Cout) ; i n p u t A, B, Cin ; o u t p u t Sum, Cout; w i r e S1, T1, T2, T3; x o r X 1 (S1, A, B) , X 2 (Sum, S1, Cin) ; a n d 8 Verilog HDL 硬件描述语言 下载