设计中心 Verilog HDL 设计中心 Verilog HDL 第一章 Verilog简介 第二章 Verilog速成指南 第三章 Verilog语言要素 第四章 Verilog设计进阶 设计中心 第一章 Verilog简介 ? HDL主要类型 ? 什么是Verilog ? Verilog历史 ? Verilog 与VHDL的比较 ? Verilog的主要能力 设计中心 HDL主要类型 ? VHDL “Tell me how your circuit should behave and I will give you the hardware that does the job.” ? Verilog HDL Similar to VHDL ? ABEL-HDL、 AHDL( Altera HDL) “Tell me what hardware you want and I will give it to you” ? 硬件C语言:SystemC 、 Handle-C 设计中心 什么是Verilog ? Verilog HDL是硬件描述语言的一种,用 于数字电子系统设计。设计者可用它进 行各种级别的逻辑设计,可用它进行数 字逻辑系统的仿真验证、时序分析和逻 辑综合。它是目前应用最广泛的一种硬 件描述语言。 设计中心 Verilog历史 ?Verilog HDL是在 1983年,由 GDA(Gateway Design Automation)公司的 Phil Moorby首创的。 Phil Moorby后 来成为 Verilog-XL的主要设计者和 Cadence公司的第一 个合伙人。 ?在1984—1985 年间, Moorby设计出了第一个关于 Verilog-XL的仿真器。 ?1989年,Cadence公司收购了 GDA公司, Verilog HDL 语言成为 Cadence公司的私有财产。 ?1990年,Cadence公司决定公开发表 Verilog HDL语言, 于是成立了 OVI组织来负责 Verilog HDL语言的发展。 ?基于 Verilog HDL的优越性, IEEE于1995 年制定了 Verilog HDL的IEEE 标准,即 IEEE std 1364—1995。 设计中心 设计中心 Verilog 与 VHDL的比较 ? 从推出过程来看,VHDL 偏重于标准化的 考虑,而Verilog HDL与EDA 工具的结合 更为紧密。 9VHDL是国际上第一个标准化的 HDL语言 (1987 年 IEEE-1076),是为了实现美国国 防部 VHSIC计划推出的 9Verilog HDL则是在 EDA供应商 Cadence扶持 下针对 EDA工具开发的 HDL语言。 设计中心 Verilog 与 VHDL的比较(续) ? Verilog HDL的编程风格比VHDL 更加简 洁明了、高效便捷。如果单纯从描述结 构上考察,两者的代码之比约为1:3。 ? Verilog HDL也于1995 年实现了标准化 (IEEE-1364 )。目前市场上所有的 EDA工具都支持这两种语言。而在ASIC 设计领域, Verilog HDL占有明显优势。 设计中心 Verilog VHDL 开关电路级 逻辑门级 RTL级 算法级 系统级 行为级 的抽象 设计中心 Verilog的主要能力 ? 基本逻辑门:内置 and、or 、nand 等 ? UDP创建的灵活性(组合逻辑、时序逻辑) ? 开关级基本结构模型:内置 pmos、nmos等 ? 端口到端口时延、路径时延、设计的时序检查 ? 三种描述方式:行为描述、数据流、结构化 ? 提供两类数据类型:线网类型、寄存器类型 ? 能够描述多层次设计(结构描述) ? 设计规模可大可小 设计中心 Verilog的主要能力(续) ? 人机对话方便(设计者与 EDA工具间交互) ? 设计能在多个抽象级别上描述:开关级、门级、 RTL级、算法级等 ? 能够使用内置开关级原语对设计完整建模 ? 可以创建测试激励 Testbench ? 在行为级描述中能运用: RTL、结构、算法 ? 内置逻辑函数:如 &(按位与)、 |(按位或) ? 高级语言结构: if语句、 case语句、循环语句 设计中心 第二章 Verilog速成指南 ? Verilog主要参考书 ? Verilog的基本描述单位——module ? 时延 ? Verilog主要描述方式 ? Verilog的仿真与测试 设计中心 Verilog主要参考书 ? 《 Verilog HDL硬件描述语言》, (美)J.Bhasker 著,徐振林 等译, 机械工业出版社,2000 ? 《 Verilog HDL数字系统设计及其应用》 , 袁俊泉 等编著,西电出版社,2002 ? 《硬件描述语言Verilog 》 (第四版) , Phil Moorby 等著,刘明业 等译, 清华大学出版社,2001 设计中心 Verilog的基本描述单位——module module module_name (port_list); port declarations data type declarations circuit functionality endmodule 注意:所有的关键字都小写。 设计中心 设计中心 【例1】 半加器的module module HalfAdder ( A, B, sum, carry); input A, B ; output sum, carry ; assign #2 sum = A ^ B ; assign #5 carry = A & B ; endmodule ?半加器 sum=A⊕ B carry = AB carry sum A B 设计中心 关于时延 assign #2 sum = A ^ B ; ? #2指 2个时间单位 ? 时延可以细分为两种类型: 1) 语句间时延:语句执行的时延 sum = (A ^ B) ^ Cin; #4 T1 = A & Cin; 2) 语句内时延: 右边数值计算与左边赋值间的时延 sum = #3 (A ^ B) ^ Cin; 设计中心 关于时延(续 ) ? 时间单位通过编译指令与物理时间相关联 ‘timescale 1ns/100ps ; 即:时延时间单位为1ns ,时间精度为 100ps ? 时间精度 #5.21 // 对应5.2ns #6.17 // 对应6.2ns 设计中心 Verilog主要描述方式 ? 数据流描述方式 ? 行为描述方式 ? 结构化描述方式 设计中心 数据流描述方式 ? 最基本的建模机制:连续赋值语句 ? 连续赋值语句基本语法: assign [delay] 线网变量 = 表达式 ; 如: assign #2 sum = A ^ B ; 其中[delay]为语句内时延,缺省时延为0 。 ? 组合逻辑电路的行为最好使用连续赋值语 句建模 设计中心 【例2】 2- 4解码器电路 A B EN Z[0] Z[1] Z[2] Z[3] V0 V1 N0 N1 N2 N3 设计中心 ‘timescale 1ns/1ns module Decoder2x4 (A, B, EN, Z) ; input A, B, EN ; output [0:3] Z ; //端口说明 wire Abar, Bbar ; //数据类型说明 assign #1 Abar = ~A ; //连续赋值语句 assign #1 Bbar = ~B ; assign #2 Z[0] = ~(Abar & Bbar & EN) ; assign #2 Z[1] = ~(Abar & B & EN) ; assign #2 Z[2] = ~(A & Bbar & EN) ; assign #2 Z[3] = ~(A & B & EN) ; endmodule 设计中心 行为描述方式 ? 行为功能常使用下述过程语句结构描述: 1) initial语句:此语句只执行一次; Used to initialize behavioral statements for simulation(Not supported by synthesis ) 2) always语句:此语句总是循环执行。 Used to describe the circuit functionality using behavioral statements 设计中心 【例3】 1位全加器电路 (always) Sum Cout Cin A B S1 X2 X1 O1 A1 A2 T1 T2 A3 T3 设计中心 module Fulladder (A, B, Cin, Sum, Cout) ; input A, B, Cin ; output Sum, Cout ; //端口说明 reg Sum, Cout ; reg T1, T2, T3 ; //数据类型说明 always @(A or B or Cin) begin Sum = (A ^ B) ^ Cin ; T1 = A & B ; T2 = A & Cin ; T3 = B & Cin ; Cout = (T1 | T2) | T3 ; end // 多条语句时必须要 begin-end endmodule 设计中心 【例4】 initial语句示例 `timescale 1ns / 1ns module Test (pop, pid) ; output pop, pid ; //端口说明 reg pop, pid ; //数据类型说明 initial begin pop = 0 ; pid = 0 ; pop = #5 1 ; pid = #3 1 ; pop = #6 0 ; pid = #2 0 ; end endmodule 设计中心 结构化描述方式 在Verilog HDL 中可使用如下方式描述结构: 1) 内置门原语(在门级); 2) 开关级原语(在晶体管级); 3) 用户定义的原语UDP (在门级); 4) 模块实例(创建层次结构)。 通过使用线网来相互连接。 设计中心 【例 5】 用 内置门原语描述的全加器电路 Sum Cout Cin A B S1 X2 X1 O1 A1 A2 T1 T2 A3 T3 设计中心 module Full_adder (A, B, Cin, Sum, Cout ) ; input A, B, Cin ; output Sum, Cout ; wire S1, T1, T2, T3 ; //线网类型变量 xor X1 (S1, A, B) , X2 (Sum, S1, Cin) ; //标点符号 and A1 (T3, A, B ) , A2 (T2, B, Cin) , A3 (T1, A, Cin) ; or O1 (Cout, T1, T2, T3 ) ; endmodule 设计中心 【例 6】4位全加器电路的结构描述 FTemp[1]FTemp[2]FTemp[3] 设计中心 module FourBitFA (FA, FB, FCin, FSum, FCout ) ; parameter SIZE = 4; input [SIZE:1] FA, FB; output [SIZE:1] FSum; input FCin, FCout; wire [1:SIZE-1] FTemp; Full_Adder FA1(.A(FA[1]), .B(FB[1]), .Cin(FCin), .Sum(FSum[1]), .Cout(FTemp[1])), FA2(.A(FA[2]), .B(FB[2]), .Cin(FTemp[1]), .Sum(FSum[2]), .Cout(FTemp[2])), FA3(FA[3], FB[3], FTemp[2], FSum[3], FTemp[3]), FA4(FA[4], FB[4], FTemp[3], FSum[4], FCout); endmodule 设计中心【例7】混合描述方式 module FA_Mix (A, B, Cin, Sum, Cout) ; input A, B, Cin; output Sum, Cout; reg T1, T2, T3, Cout; wire S1; xor X1(S1, A, B); // 门实例语句。 always @(A or B or Cin) begin // always 语句。 T1 = A & Cin; T2 = B & Cin; T3 = A & B; Cout = (T1 | T2) | T3; end assign Sum = S1 ^ Cin; // 连续赋值语句。 endmodule 设计中心 Verilog的仿真与测试 ?VerilogHDL不仅提供描述设计的能力, 而且提供对激励、控制、存储响应和设 计验证的建模能力。激励和控制可用初 始化语句( initial)产生。 设计中心 【例 8】 全加器模块(例3)的测试 module Full_adder (A, B, Cin, Sum, Cout ) ; Sum Cout Cin S1 X2 X1 O1 A1 A2 T1 T2 A B A3 T3 设计中心 `timescale 1 ns/1 ns module Top; // 一个模块可以有一个空的端口列表 reg PA, PB, PCin; wire PCout, PSum; Full_Adder F1(PA, PB, PCin, PSum, PCout ); //被测模块 initial begin: ONLY_ONCE reg [3:0] Pal; for (Pal = 0; Pal < 8; Pal = Pal + 1) begin {PA, PB, PCin} = Pal; #5 $display ("PA, PB, PCin = %b%b%b", PA, PB, PCin, " : : : PCout, PSum=%b%b", PCout, PSum) ; end end endmodule 设计中心 【例 9】 RS_FF的设计与仿真测试 R S Q Qbar S R Q Qbar 00Q n-1 Qbar n-1 01 01 10 10 11 未定 设计中心 RS_FF电路设计描述 `timescale 1 ns / 1 ns module RS_FF (Q, Qbar, R, S) ; output Q, Qbar; input R, S; nor #1 (Q, R, Qbar); nor #1 (Qbar, S, Q) ; endmodule 设计中心 RS_FF测试程序 `timescale 10 ns / 1 ns module Test; module Test; reg TS, TR; wire TQ, TQb; RS_FF NSTA ( .Q(TQ), .S(TS), .R(TR), .Qbar(TQb)); initial begin TR = 0; TS = 0; #5 TR = 1; #5 TS = 1; TR = 0; #5 TS = 0; #5 TS = 1; #5 TR = 1; end endmodule 设计中心 设计中心 ? 标识符 ? 注释 ? 格式规范 ? 系统任务(task)与函数( function) ? 编译指令 ? 值集合 ? 数据类型 ? 操作符与表达式 第三章 Verilog语言要素 设计中心 标识符 (identifier) ?VerilogHDL中的 标识符 可以是任意一组 字母、数字、 $符号和_(下划线) 符号的组合,但标识符的 第一个 字符必须是字母或者下划线。另外,标识符是 区分 大小写 的。例如: Count COUNT _R1_D2 R56_68 FIVE $ ? 转义标识符 (escaped identifier)可以在一条标识符 中包含任何可打印字符。转义标识符以 \(反斜线) 符号开头,以空白结尾。例如: \7400 \.*.$ \{****} \~Q \OutGate 设计中心 注释 ? 在Verilog HDL 中有两种形式的注释。 1) /*第一种形式:可以扩展至 多行*/ 2) //第二种形式:在本行结束。 设计中心 格式规范 ?VerilogHDL区分大小写 ?VerilogHDL是自由格式的,即结构可以跨越多行 编写,也可以在一行内编写。白空(新行、制表符 和空格)没有特殊意义。例如: initial beginTop = 3'b001; #2 Top = 3' b011; end 和下面的指令一样 : initial begin Top = 3'b001; #2 Top = 3'b 0 1 1 ; end 设计中心 系统任务(task)与函数(function ) ? 以$字符开始 的标识符表示系统任务或系统函数。 ? 任务 提供了一种封装行为的机制。这种机制可在设计 的不同部分被调用。任务可以返回0个或多个值 。 ? 函数 除只能 返回一个值 以外与任务相同。 ? 此外,函数在0时刻执行,即不允许延迟,而任务可以 带有延迟。 ? $display ("Hi, you have reached LT today"); /* $display 系统任务在新的一行中显示。 * / ? $time //该系统任务返回当前的模拟时间。 设计中心 编译指令 ? 以`(反引号)开始的某些标识符是编译器指令。 ? 在Verilog 语言编译时,特定的编译器指令在整个 编译过程中有效(编译过程可跨越多个文件), 直到遇到其它的不同编译程序指令。 ? 例如: `timescale `define, `undef `include 设计中心 `timescale ? 在Verilog HDL 模型中,所有时延都用单位时间表 述。使用 `timescale编译器指令将时间单位 与 实际 时间 相关联。 ? 该指令用于定义 时延单位 和 时延精度 。`timescale 编译器指令格式为: `timescale time_unit / time_ precision // time_unit和 time_precision由值1、10、和100 以及单位 s、ms、us、ns、ps 和fs 组成。例如: `timescale 1 ns / 100 ps //表示时延单位为1ns, 时延精度为100 ps。 ?`timescale编译器指令在模块说明外部出现, 并 且影响后面所有的时延值。 设计中心 `define, `undef ? `define指令用于文本替换,它很像 C语言中的 #define 指令,如 : `define SIZE 32 reg [SIZE -1:0 ] AddReg; ? 一旦 `define指令被编译,其在整个编译过程中 都有效。例如,通过另一个文件中的 `define指 令, SIZE能被多个文件使用。 ? `undef 指令取消前面定义的宏。例如 : `define WORD 16 //建立一个文本宏替代。 wire [WORD : 1] Bus; `undef WORD // 在`undef 编译指令后 , WORD的宏定义不再有效 . 设计中心 `include ? `include编译器指令用于嵌入内嵌文件的 内容。文件既可以用相对路径名定义,也可 以用全路径名定义, 例如: `include " . ./. ./primitives.v " //编译时,这一行由文件“ . ./. ./primitives.v” 的内容替代。 设计中心 值集合 ?VerilogHDL有内置了下列四种基本的值: 1) 0:逻辑0 或“ 假” 2) 1:逻辑1 或“ 真” 3) x:未知 4) z:高阻 ? x值和 z值都是不分大小写的。 即:值0x1z与值0X1Z相同。 设计中心 Verilog HDL中有三类常量 1) 整型 2) 实数型 3) 字符串型 ? 下划线符号(_ )可以随意用在整数或实 数中,它们就数量本身没有意义。它们 能用来提高易读性;唯一的限制是下划 线符号不能用作为首字符。 设计中心 整型数 ? 整型数可以按如下两种方式书写: 1) 简单的十进制数格式 32 -15 2) 基数表示法 格式:[size] ’base value 例如: 5'O37 // 5位八 进制数 4'D2 // 4位十 进制数 4'B1x_01 // 4位二 进制数 8'h 2 A // 8位 十六 进制数 设计中心 实数 ? 整型数可以按如下两种方式书写: 1) 十进制计数法 3.2 5.678 2. 0.1 2) 科学计数法 例如: 23_5.1e2 // 23510.0 3.6E2 // 360.0 (e与E相同 ) 5e-3 // 0.005 设计中心 字符串 ? 字符串是双引号内的字符序列。 ? 字符串不能分成多行书写。 ? 例如: " INTERNAL ERROR" " REACHED- >HERE " 设计中心 数据类型 ? Verilog HDL 有两大类数据类型。 1) 线网类型 。net type 表示 Verilog结构化元件间的 物 理连线 。它的值由驱动元件的值决定,例如:连续 赋值或门的输出。 如果没有驱动元件连接到线网,线网的缺省值为 z。 2) 寄存器类型 。 register type表示一个抽象的 数据存 储单元 ,它 只能 在 always语句和 initial语句中被赋 值,并且它的值从一个赋值到另一个赋值被保存下 来。寄存器类型的变量具有 x的缺省值。 设计中心 线网类型 ? wire --> represents a node ? tri --> represents a tri-state node ? Bus Declarations: – <data_type> [MSB : LSB]<signal_name> ; – <data_type> [LSB : MSB]<signal_name> ; ? Examples: – wire s1 ; – wire [15:0] add, ins ; 设计中心 线网类型 设计中心 ? reg - unsigned variable of any bit size ? integer - signed variable (usually 32 bits) ? Examples: – reg cin ; – reg [7 : 0] sum ; 寄存器类型 设计中心 寄存器类型 设计中心 操作符 Verilog HDL中的操作符可以分为下述类型: 1) 算术操作符 2) 按位操作符 3) 相等操作符 4) 逻辑操作符 5) 关系操作符 6) 归约操作符 7) 移位操作符 8) 条件操作符 9) 连接和复制操作符 设计中心 算术操作符 设计中心 按位操作符 设计中心 归约操作符 设计中心 关系操作符 设计中心 相等关系操作符 设计中心 逻辑操作符 设计中心 移位操作符 设计中心 条件、连接、复制操作符 设计中心 ? 门电平模型化 ? UDP ? 行为建模 ? 结构建模 第四章 Verilog设计进阶 设计中心 § 4-1 门电平模型化 ? Verilog HDL中提供下列内置基本门: 1) 多输入门: and, nand, or, nor, xor, xnor 2) 多输出门: buf, not 3) 三态门: bufif0, bufif1, notif0, notif1 4) 上拉、下拉电阻: pullup, pulldown 5) MOS开关: cmos, nmos, pmos, rcmos, rnmos, rpmos 6) 双向开关: tran,tranif0, tranif1, rtran, rtranif0, rtranif1 设计中心 多输入门 例如: and A1(Out1, In1, In2) ; and RBX (Sty, Rib, Bro, Qit, Fix ) ; 设计中心 多输出门 例如 : not N1( PhA, PhB, Ready) ; buf B1( Fan[0], Fan[1], Fan[2], Fan[3], Bin); 设计中心 MOS开关 ?MOS开关有: cmos pmos nmos rcmos rpmos rnmos ? 这类门用来为单向开关建模。即数据从输 入流向输出,并且可以通过设置合适的控 制输入关闭数据流。 ?pmos( p类型MOS 管 )、nmos ( n 类型MOS 管 )、rnmos ( r代表电阻) 和rpmos 开关有 一个输出、一个输入和一个控制输入。 设计中心 ? 例如: pmos P1 (OutputA, InputB, ControlC ) ; rnmos RN1 (ControlBit, ReadyBit, Hold ) ; 设计中心 ? 例如: cmos C1(OutputA, InputB, NControl,PControl); 设计中心 【例10 】 2- 4解码器 (门电平建模 ) A B EN Z[0] Z[1] Z[2] Z[3] V0 V1 N0 N1 N2 N3 设计中心 module DEC2x4 (A, B, Enable, Z) ; input A, B, Enable; output [0:3] Z; wire Abar, Bbar; not V0(Abar, A) , V1(Bbar, B) ; nand N0(Z[3], Enable, A, B) , N1(Z[0], Enable, Abar, Bbar) , N2(Z[1], Enable, Abar, B) , N3(Z[2], Enable, A, Bbar) ; endmodule 设计中心 UDP(用户定义原语) ? UDP的定义是由一个独立的定义模块构成,该 模块关键字 “primitive”和 “endprimitive”。 ? UDP的实例语句与基本门的实例语句完全相同。 ? UDP只能有 一个输出 和 一个或多个输入 。第一 个端口 必须 是输出端口。 ? 输出可以取值 0、 1或x (不允许取 z值) 。输入中 出现值 z以x 处理。 ? UDP的行为以 表的形式描述。 设计中心 【例11 】 UDP( 2-1选择器) primitive MUX2x1 (Z, Hab, Bay, Sel) ; output Z; input Hab,Bay, Sel; table // Hab Bay Sel : Z 注:本行仅作为注释。 0 ? 1 : 0 ; // ?代表不必关心其具体值 1 ? 1 : 1 ; ? 0 0 : 0 ; ? 1 0 : 1 ; 0 0 x : 0 ; 1 1 x : 1 ; endtable endprimitive 设计中心 行为建模 ? 行为建模的主要机制。 1) initial 语句:只执行一次 2) always语句:重复执行 ? 一个模块中可以包含任意多个initial 或 always语句。这些语句相互并行执行,即 这些语句的执行顺序与其在模块中的顺 序无关。 设计中心 语句块 ? 语句块提供将两条或更多条语句组合成 语法结构上相当于一条语句的机制。在 Verilog HDL中有两类语句块,即: 1) 顺序语句块(begin ... end):语句块 中的语句按给定次序顺序执行。 2) 并行语句块(fork ... join):语句块 中的语句并行执行。 设计中心 顺序语句块 ? 顺序语句块中的语句按顺序方式执行。每条语句 中的时延值与其前面的语句执行的模拟时间相关。 ? 例如: begin #2 Stream = 1; #5 Stream = 0; #3 Stream = 1; #4 Stream = 0; #2 Stream = 1; #5 Stream = 0; 顺序语句块中的累积时延 End 设计中心 并行语句块 ? 并行语句块带有定界符fork 和join ,并行语句块中的各 语句 并行执行 。并行语句块内的各条语句指定的时延值 都与语句块开始执行的时间相关。 ? 例如: fork #2 Stream = 1; #7 Stream = 0; #10 Stream = 1; #14 Stream = 0; #16 Stream = 1; #21 Stream = 0; 并行语句块中的相对时延 join 设计中心 过程性赋值 ? 过程性赋值是在initial 语句或always 语句内 的赋值,它只能对寄存器数据类型的变量 赋值。表达式的右端可以是任何表达式。 ? 过程性赋值分两类: 1) 阻塞性过程赋值( =) 2) 非阻塞性过程赋值( <=) 设计中心 阻塞性过程赋值(= ) ? 阻塞性过程赋值在其后所有语句执行前执行,即在 下一语句执行前该赋值语句完成执行。 ? 例如: always @ (A or B or Cin) begin reg T1, T2, T3 ; T1 = A & B ; T2 = B & Cin ; //T1赋值生效后执行 T2赋值 T3 = A & Cin ; Cout = T1 | T2 | T3; end 设计中心 非阻塞性过程赋值(<= ) ? 通常非阻塞性赋值执行次序彼此不相关 ? 例如: initial begin A <= B ; B <= A ; //执行结果是A 与B 取值互换 end 设计中心 连续赋值与过程赋值的比较 过程赋值 连续赋值 在always语句或 initial语句 内出现 执行与周围其它语句有关 驱动寄存器 使用 “=”或“ <=”赋值符号 无assign关键词(在过程 性连续赋值中有 assign关 键词除外) 在一个模块内出现 与其它语句并行执行;右端 操作数的值发生变化时执行 驱动线网 使用 “=”赋值符号 有assign关键词 设计中心 其它语句 ? if语句 ? case语句 ? 循环语句 1) forever循环 2) repeat循环 3) while循环 4) for 循环 设计中心 设计中心 作业