1.02k likes | 1.24k Views
第六讲. HDL 及仿真验证 + 补充内容 微电子与光电子研究所. 韩雁 2014 年 3 月. 大纲. 数字 IC 设计方法 两种 HDL 语言 Verilog HDL 简介 VHDL 简介. 当前的数字 IC 设计分可分成以下几个层次 : 1. 算法级设计: 利用高级语言 ( 如 C 语言 ) 及其他一些系统分析工具(如 MATLAB )对设计从系统的算法级进行描述。算法级不需要包含时序信息。 2 . RTL 级设计: 用信号在寄存器间传输的模式来对设计进行描述。 3. 门级设计: 用逻辑门及门级之间的连线对设计进行描述。
E N D
第六讲 HDL及仿真验证+补充内容微电子与光电子研究所 韩雁 2014年3月
大纲 • 数字IC设计方法 • 两种HDL语言 • Verilog HDL简介 • VHDL简介 浙大微电子
当前的数字IC设计分可分成以下几个层次: 1. 算法级设计:利用高级语言(如C语言)及其他一些系统分析工具(如MATLAB)对设计从系统的算法级进行描述。算法级不需要包含时序信息。 2. RTL级设计:用信号在寄存器间传输的模式来对设计进行描述。 3. 门级设计:用逻辑门及门级之间的连线对设计进行描述。 4. 开关级设计:用晶体管及其连线来对设计进行描述。 浙大微电子
TOP-DOWN 设计方法 系统级 功能级 门级 数字IC一般采用自顶向下(TOP-DOWN)的设计方法 • 在系统级(顶层)进行功能的划分和架构设计 • 在功能级进行仿真、纠错,并用硬件描述语言对功能进行描述 • 用综合工具将设计转化为具体门级电路网表 • 物理级可以是FPGA器件或专用集成电路(ASIC) TOP-DOWN 设计思想 浙大微电子
电子设计规模越来越大(百万/千万门的量级),复杂度越来越高,只能用高级语言来描述其功能,在设计初期隐藏其具体的细节实现。电子设计规模越来越大(百万/千万门的量级),复杂度越来越高,只能用高级语言来描述其功能,在设计初期隐藏其具体的细节实现。 可读性强,易修改。 提高逻辑设计的效率,降低设计成本,更重要的是缩短设计周期。 HDL追求对硬件的描述,而将该描述在目标器件上实现则由EDA工具的综合器完成。 受限于目标器件,并不是所有HDL语句均可被综合。 浙大微电子
VHDL和Verilog HDL是目前世界上流行最广的两种硬件描述语言,都是在20世纪80年代中期开发出来的。均为IEEE标准。 • VHDL语法严谨,易于学习;逻辑综合能力强。在欧洲使用较多。 • Verilog HDL语法灵活(类似C语言,较难掌握)底层综合出色。美国使用较多。 浙大微电子
Verilog HDL是一种应用广泛的硬件描述语言,是IC硬件设计人员和EDA工具之间的桥梁。其功能为 • 编写设计文本(脚本) • 建立电子系统行为级的仿真模型并进行仿真 • 自动综合生成数字逻辑网表(Netlist)及具体电路 • 生成某工艺条件下具体电路的延时模型并进行时序仿真 • 仿真验证无误后用于制造ASIC或写入FPGA器件中 • 常用的Verilog HDL开发软件有 • Altera公司的MAX+PLUS II,Quartus II • Xilinx公司的Foundation ISE 浙大微电子
Verilog HDL语言的主要特征 1、语法结构上,与C语言有许多相似之处,并借鉴C语言的多种操作符 2、既包含高级程序设计语言的结构形式,同时也兼顾描述硬件线路连接的具体构件 3、通过使用结构级或行为级描述可以在不同的抽象层次上进行设计 浙大微电子
这两点显示了 Verilog HDL与C语言的最大区别 4、Verilog HDL语言是并发的,即具有在同一时刻执行多任务的能力,因为在实际硬件中许多操作都是在同一时刻发生的。 而计算机编程语言往往是顺序执行的。 5、有时序概念,因为在硬件电路中从输入到输出总是有延迟存在的 浙大微电子
数字电路可简单归纳为两种要素:连线和器件 Verilog HDL建模--使用硬件语言对数字电路的这两种基本要素进行描述。 浙大微电子
Verilog HDL的基本结构 模块名 输入、输出端口描述 --描述外部特性 8 ∑ ina 8 sum 8 inb cout co ci cin 程序为模块结构,包含在module与endmodule之间 端口列表 简单的Verilog HDL的例子 准备实现的逻辑功能 module adder8 (cout, sum, ina,inb, cin); output [7:0] sum; output cout; input [7:0] ina,inb; input cin; assign{cout,sum}= ina+inb+cin; endmodule 逻辑功能描述 --描述内部特性 八位加法器的Verilog HDL源代码 浙大微电子
Verilog HDL模块的结构 一.模块的概念 模块是Verilog HDL语言的基本单元,数字系统用 模块集合的形式来描述 模块描述某个设计的功能、结构和与其它模块通信的外部端口 Verilog HDL中各个模块是并行运行的 模块可以调用其它模块的实体(实例) 浙大微电子
二.模块的结构 module <模块名> (<端口列表>) 端口说明(input,output,inout) 参数定义 //可选 数据类型定义 //wire、reg、task、function 连续赋值语句(assign)//组合逻辑 过程块(always和initial) -行为描述语句 低层模块实例 //调用其它模块 任务和函数 延时说明块 endmodule 浙大微电子
模块端口(module ports) 端口等价于硬件的引脚(pin) 端口在模块名字后的括号中列出 端口可以说明为input, output及inout 注意模块的名称DFF,端口列表及说明 模块通过端口与外部通信 浙大微电子
模块实例化(module instances) REG4有模块DFF的四个实例 module DFF (d, clk, clr, q, qb); .... endmodule module REG4( d, clk, clr, q, qb); output [3: 0] q, qb; input [3: 0] d; input clk, clr; DFF d0 (d[ 0], clk, clr, q[ 0], qb[ 0]); DFF d1 (d[ 1], clk, clr, q[ 1], qb[ 1]); DFF d2 (d[ 2], clk, clr, q[ 2], qb[ 2]); DFF d3 (d[ 3], clk, clr, q[ 3], qb[ 3]); endmodule 浙大微电子
vERILOG语言的主要特点 模块实例化(module instances): 将模块的实例通过端口连接起来构成一个大的系统 每个实例都有自己的名字(d0, d1, d2, d3)。实例名是每个对象唯一的标记,通过这个标记可以查看每个实例的内部。 实例中端口的次序与模块定义的次序相同。 模块实例化与程序调用不同。每个实例都是模块的一个完全的拷贝,相互独立、并行。 浙大微电子
时延 • 信号在电路中传输会有传播延时,如线延时、器件延时等 • assign # 2 B = A; 表示 B信号在2个时间单位后得到A信号的值 • 所有时延都必须根据时间单位进行定义 • 定义方式为在文件头添加语句: `timescale 1ns /100ps • 其中’timescale 是Verilog HDL 提供的预编译处理命令,1ns 表示时间单位是1ns,100ps表示时间精度是100ps 根据该命令,编译工具可以认知 #2 为2ns 浙大微电子
空白符和注释 module MUX2_1 (out, a, b, sel); // Port declarations output out; input sel, // control input b, /* data inputs */ a; /* The netlist logic selects input ”a” when sel = 0 and it selects ”b” when sel = 1. */ not (sel_, sel); and (a1, a, sel_), (b1, b, sel); or (out, a1, b1); endmodule 格式自由 一条语句可多行书写;一行可写多个语句。空白(新行、制表符、空格)没有特殊意义。 如input A;input B; 与input A; input B;是一样的。 使用空白符提高可读性Verilog忽略空白符 单行注释 到行末结束 多行注释,在/* */内 浙大微电子
Verilog采用的四值逻辑系统 ’0’, Low, False, Logic Low, Ground, ‘1’, High, True, Logic High, Power, VDD, ’X’ Unknown: Occurs at Logic Which Cannot be Resolved Conflict HiZ, High Impedance, Tri- Stated, 浙大微电子
具体实例 5 ‘O37 5位八进制数(二进制 11111 ) 4 'D2 4位十进制数 (二进制0010) 4 ‘B1x_01 4位二进制数 7 ’Hx 7位x (扩展的x), 即xxxxxxx 4 ‘hZ 4 位z (扩展的z) , 即zzzz 4 ’d-4 非法:数值不能为负 8 ‘h 2A在位长和基数之间,以及基数和数值之间允许出现空格 3' b 001 非法: ' 和基数b 之间不允许出现空格 (2+3) 'b10 非法:位长不能为表达式 浙大微电子
字符串(string) 格式符 转义符 浙大微电子
标识符(identifiers) Verilog标识符 • 标识符是用户在描述时给对象起的名字 • 标识符必须以字母(a-z, A-Z)或( _ )开头,后面可以是字母、数字、( $ )或( _ )。 • 最长可以是1023个字符 • 标识符区分大小写,sel和SEL是不同的标识符 • 模块、端口和实例的名字都是标识符 module MUX2_1 (out, a, b, sel); output out; input a, b, sel; not not1 (sel_, sel); and and1 (a1, a, sel_); and and2 (b1, b, sel); or or1 (out, a1, b1); endmodule 浙大微电子
标识符(续) • 有效标识符举例: shift_reg_a busa_index _bus3 • 无效标识符举例: 34net // 开头不是字母或“_” a*b_net // 包含了非字母或数字, “$” “_” n@238 //包含了非字母或数字, “$” “_” • Verilog区分大小写,所有Verilog关键词使用小写字母 浙大微电子
书写规范建议 A、用有意义的名字如 Sum 、CPU_addr等。 B、用下划线区分词。 C、采用一些前缀或后缀,如时钟采用Clk 前缀:Clk_50,Clk_CPU;低电平采用_n 后缀:Enable_n; D、统一缩写, 如全局复位信号 Rst。 E、同一信号在不同层次保持一致性,如同一时钟信号必须在各模块保持一致。 F、自定义的标识符不能与保留字同名。 G、参数采用大写,如SIZE 浙大微电子
主要变量类型 Verilog主要有三类数据类型: net (线网) : 表示器件之间的物理连接 register (寄存器) :表示存储元件 parameters(参数) : 运行时的常数 浙大微电子
net(线网) net需要被持续的驱动,驱动它的可以是门和模块。 当net驱动器的值发生变化时, 会自动将新值传送到net上。在例子中,线网out由or门驱动。当or门的输入信号变化时将传输到线网net上。 浙大微电子
net类的类型 wire类型是最常用的类型,只有连接功能。 wire常用来表示用assign语句赋值的组合逻辑信号 取值为:0,1,x(不定值),z(高阻) wire和tri类型有相同的功能。用户可根据需要将线网定义为wire或tri以提高可读性。例如,可以用tri类型表示一个net有多个驱动源,或者指示这个net可以是高阻态 Z (hign-impedance)。 浙大微电子
wire型变量的定义 语法: wire 数据1,数据2,……数据n; 例子: wire a,b,c//定义了三个wire型变量a,b,c wire[7:0] databus//定义了八位宽wire型向量数据总线 wire[20:1] addrbus //定义了20位宽wire型向量地址总线 浙大微电子
寄存器类 (register) • 寄存器类型在赋新值以前保持原值 • 用行为描述结构给寄存器类型赋值(在过程块中进行) • 寄存器类型大量应用于行为描述及激励描述 • reg_a、reg_b、reg_sel用于施加激励给2:1多路器 浙大微电子
寄存器类的类型 寄存器类有四种数据类型 浙大微电子
Verilog中net和register声明语法 举例: reg a; //一个标量寄存器 reg [3: 0] v; // 从MSB到LSB的4位寄存器向量 reg [7: 0] m, n; // 两个8位寄存器 tri [15: 0] busa; // 16位三态总线 wire [0: 31] w1, w2; // 两个32位wire,MSB为bit0 浙大微电子
选择正确的数据类型 输入端口可以由net/register驱动,但输入端口只能是net 输出端口可以是net/register类型,输出端口只能驱动net A in1 Y O B in2 双向端口只能是net类型 浙大微电子
操作符类型 Verilog操作符。“与”操作符的优先级总是比相同类型的“或”操作符高 最高 优先级 最低 浙大微电子
相等操作符 注意逻辑等与 case等的差别 逻辑等 == a = 2'b1x; b = 2'b1x; if (a == b) $display(" a is equal to b"); else $display(" a is not equal to b"); 2‘b1x==2’b0x 值为0,因为不相等 2‘b1x==2’b1x 值为x,因为可能不相等,也可能相等 case等 === a = 2'b1x; b = 2'b1x; if (a === b) $display(" a is identical to b"); else $display(" a is not identical to b"); 2‘b1x===2’b0x 值为0,因为不相同 2‘b1x===2’b1x 值为1,因为相同 Case等只能用于行为描述,不能用于RTL描述。综合工具不支持 浙大微电子
级联操作符 module concatenation; reg [7: 0] rega, regb, regc, regd; reg [7: 0] new; initial begin rega = 8'b0000_0011; regb = 8'b0000_0100; regc = 8'b0001_1000; regd = 8'b1110_0000; end initial fork #10 new = {regc[ 4: 3], regd[ 7: 5], regb[ 2], rega[ 1: 0]}; // new = 8'b11111111 #20 $finish; join endmodule 级联 { } 可以从不同的矢量中选择位并用它们组成一个新的矢量。 用于位的重组和矢量构造 浙大微电子
编译预处理 • 1、Verilog HDL语言提供了十多条的编译指令,例如: • `define • `include • `timescale 2、说明 • 编译指令以`(反引号)开头。 • 编译指令结束不需要加分号。 • 编译指令对同一个文件中的所有模块有效。 • 在进行Verilog HDL语言编译时,已定义的编译指令一直有效,直至有其它编译指令修改它或取消它 浙大微电子
`timescale 说明时间单位及精度 格式:`timescale <time_unit> / <time_precision> 如:`timescale 1 ns / 100 ps `timescale必须在模块之前出现 `timescale 1 ns / 10 ps // All time units are in multiples of 1 nanosecond module MUX2_1 (out, a, b, sel); output out; input a, b, sel; not #1 not1( sel_, sel); and #2 and1( a1, a, sel_); and #2 and2( b1, b, sel); or #1 or1( out, a1, b1); endmodule 浙大微电子
Timescale • time_precision不能大于time_unit • precision的时间单位应尽量与设计的实际精度相同 • precision是仿真器的仿真时间步长 • 若time_unit与precision_unit差别很大将严重影响仿真速度 • `timescale 1s / 1ps,则仿真器在1秒内要扫描其事件序列1012次;而`timescale 1s/1ms则只需扫描103次。 • 如果没有timescale说明将使用缺省值,一般是ns 浙大微电子
Verilog HDL语句模块的描述方法 结构型描述 系统级 行为描述级 算法级 寄存器级 数据流描述 混合型描述 浙大微电子
结构型描述 术语及定义 • 结构描述 : 用门来描述器件的功能,是通过实例进行描述的,将预定义的基本元件实例嵌入到语言中,监控实例的输入,一旦其中任何一个发生变化便运算并输出。 • primitives(基本单元) : Verilog语言已定义的具有基本逻辑功能的模型(models) 浙大微电子
结构描述 module rs_latch (y, yb, r, s); output y, yb; input r, s; nor n1( y, r, yb); nor n2( yb, s, y); endmodule 结构描述表示一个逻辑图 结构描述用已有的元件构造更为复杂的元件 浙大微电子
Verilog基本单元(primitives) Verilog基本单元提供基本的逻辑功能,这些逻辑功能是预先定义的,用户不需要再定义这些基本功能 基本单元是Verilog 库的一部分,基本单元库是自下而上(Bottom Up)设计方法的一部分 浙大微电子
调用基本单元的句法: 可以只有一个输出 语法:门类型关键字 <例化的门名称>(端口列表) 其中端口列表为: 多输入门:(输出,输入1,输入2,……) 多输出门:(输出1,输出2,……输入) 三态门: (输出,输入,使能输入) 浙大微电子
带条件的基本单元 • Verilog有四种不同类型的条件基本单元 • 这四种基本单元只能有三种引脚:output, input, enable • 这些单元由enable引脚使能。 • 当使能信号无效时,输出高阻态。 浙大微电子
基本单元实例化 • 在端口列表中,先说明输出端口,然后是输入端口 • 实例化时实例的名字是可选项 and (out, in1, in2, in3, in4); // unnamed instance buf b1 (out1, out2, in); // named instance • 延时说明是可选项。所说明的延时是固有延时。输出信号经过该延时才变化。没有说明时延时为0。 notif0 #3.1 n1 (out, in, cntrl); // delay specified 浙大微电子
模块实例化(module instantiation) module comp (o1, o2, i1, i2); output o1, o2; input i1, i2; . . . endmodule module test; comp c1 (Q, R, J, K); // Positional mapping comp c2 (.i2(K), .o1(Q), .o2(R), .i1(J)); // Named mapping comp c3 (Q, , J, K); // One port left unconnected endmodule 名称映射的语法: .内部信号(外部信号) 没有连接时通常会产生警告 模块实例化时实例必须有一个名字。 使用位置映射时,端口次序与模块的说明相同。 使用名称映射时,端口次序与位置无关 没有连接的输入端口初始化值为x。 浙大微电子
行为描述 DFF 在每一个时钟上升沿, 若Clr不是低电平, 置Q为D值, 置Qb为D值的反 无论何时Clr变低 置Q为0, 置Qb为1 • 行为级描述是对系统的高抽象级描述。 • 在这个抽象级,注重的是整个系统的功能而不是实现。 • Verilog将高级编程语言结构用于行为描述,包括: wait, while, if then, case和forever 浙大微电子
过程(procedural)块 • 过程块是行为描述的基础 • 过程块有两种: • initial块,只能执行一次 • always块,循环执行 浙大微电子
initial过程块 (3)说明: (1) initial 块语句模板: • 主要面向功能模拟,通常不具有可综合性。 • initial • begin • 语句1; • 语句2; • …… • end • 0时刻开始执行,只执行一次 • 同一模块内的多个initial过程块,0时刻开始并行执行 (2)例 initial begin #2 Stream = 1; #5 Stream = 0; #3 Stream = 1; #4 Stream = 0; #2 Stream = 1; #5 Stream = 0; end • initial过程块不能嵌套使用。 initial语句中的积累延时 浙大微电子