1、哈尔滨工业大学微电子中心,1,电子设计自动化基础1,哈尔滨工业大学微电子中心 李晓明,哈尔滨工业大学微电子中心,2,内容,Verilog HDL设计入门 Verilog HDL基础知识 词法 数据类型 运算符 参数、宏替换及模拟时间定标 Verilog行为描述,哈尔滨工业大学微电子中心,3,Verilog HDL设计入门,module基本结构Verilog HDL是由module模块组成,模块定义关键词 module开始,到关键词 endmodule结束,每条Verilog语句以分号“;”作为结束(块语句、编译向导、endmodule等除外)。module module_name(Port_l
2、ist);端口声明;数据类型声明;电路描述;endmodule,哈尔滨工业大学微电子中心,4,例:上升沿D触发器module dff_pos(data,clk,q);input data,clk; /端口声明output q; /端口声明reg q; /数据类型声明always (posedge clk) q=data;/电路描述endmodule,哈尔滨工业大学微电子中心,5,Verilog HDL设计入门,哈尔滨工业大学微电子中心,6,Verilog HDL设计入门,行为描述、结构描述 行为描述:描述行为及功能特性,如a+b 结构描述:将不同实体连接的方式(加法器) 层次式设计(Hiera
3、rchical Design) 顶层设计 底层设计,哈尔滨工业大学微电子中心,7,Verilog HDL基础知识,基本词法定义 空白符 : 空格(space bar),TAB 键,return键 起到分隔符的作用。 注释 (Comment) : “/”或“/*, */”。 注释的重要性 便于理解及修改 便于重用(reuse) 便于交接,哈尔滨工业大学微电子中心,8,哈尔滨工业大学微电子中心,9,Verilog HDL基础知识,数字表示:整数,实数 整数:+/- :指定整数的大小,以bit为单位。:指定整数的基数,可以是:b(binary)二进制;o(octal)八进制;d(decimal)十进
4、制;h(hexadecimal)十六进制;:指定整数的值。,哈尔滨工业大学微电子中心,10,整数:17 /位宽, 基数符号不写会采用default值 (32bit十进制)8d32 /8-bit十进制值为328h12 /8b000100108h1A8b0001_1100 /* ”_”无特別意义,只是为了方便二进制数易读*/8o3732bx / ”x”表unknown4b0? / ”?”表High impedance实数: 7.21.8e-4 /1.8*10-49.5E6.12 2. / illegal,MSB(Most Significant Bit),LSB(Least Significant
5、 Bit),哈尔滨工业大学微电子中心,11,Verilog HDL基础知识,字符串与字符变量 字符串为两个双引号“ ”之间的字符,不许跨行 除普通的ASCII字符外,还支持通过前导的控制键(, %)引入一些特殊字符:如n(换行),t(TAB),(代表),”(代表”),%(代表%) EX: reg 8*17:1 stringvar;initial beginstringvar = “This is a string!”; /共17个字符end,哈尔滨工业大学微电子中心,12,Verilog HDL基础知识,取名规则 标识符必须是由a-z, A-Z, 0-9,_, $这些字符组成,最长只能到102
6、4个字符 开头必须由a-z, A-Z或下划线_开头 可以在标识符所取的非法名称前加上反斜杠“”,并在名称结尾加上空白键,这样就可以用任何可印出的ASCII字符来当作标识符的名称了;而反斜杠和空白键不会被视为标识符的一部分,哈尔滨工业大学微电子中心,13,EX1:module MUX_2(out, a, b, sel);output out;input a, b, sel;not U0(sel_, sel);and U1(a1, a, sel_),U2(b1, b, sel);or U3(out, a1, a2);endmodule,哈尔滨工业大学微电子中心,14,EX2: module 2:1
7、MUX (out, a, b, sel);output out;input a, b, sel;not not1 (sel , sel);and and1 (a1, a sel ),and2 (b1, b, sel);or or1 (out, a1, a2); endmodule,哈尔滨工业大学微电子中心,15,Verilog HDL基础知识,关键词keywords 是指一些Verilog语言内部已经使用的词,主要是用来定义语言的架构,并且所有的keyword都是用小写表示,用户应避免使用module, endmoduleinput, output, inoutreg, integer, re
8、alnot, and, or, xor, norbegin, endalways, assignif, else, casefunction, task ,哈尔滨工业大学微电子中心,16,Verilog HDL基础知识,特殊字符: $,#, $:以$开头的标识符代表系统命令$time:返回目前的仿真时间$display:显示出信号的值$stop:停止仿真 # not #3 not1(sel_, sel);/ instance delay#5 a = 0;b = 0;cin = 1; / procedural statement delay define,include,timescale,哈尔
9、滨工业大学微电子中心,17, definedefine EX:define ADD 3h0define SUB 3h1case(opcode)ADD:SUB:. endcase include EX:include “user_define_task.v” timescaletimescale /,哈尔滨工业大学微电子中心,18,EX: timescale 10ns / 1ps module MUX2(out, a, b, sel);output out;input a, b, sel;not #3 not1(sel_, sel); / delay 3个10ns. endmoduleEX: t
10、imescale 10ns / 1ns module MUX2(out, a, b, sel);output out;input a, b, sel;not #2.63 not1(sel_, sel); /* 2.63*10ns = 26.3ns . 四舍五入26ns.delay 26ns */ endmodule,哈尔滨工业大学微电子中心,19,Verilog HDL基础知识,Verilog的四种逻辑状态:0:逻辑零、逻辑非、低电平1:逻辑1、逻辑真、高电平x或X:不定态z或Z:高阻态,哈尔滨工业大学微电子中心,20,Verilog HDL基础知识,数据类型:为了能对硬件电路中的信号连线和寄
11、存器等物理量进行描述,引入特定数据类型 连线类(net):反映硬件电路的物理连接特性的变量 寄存器类(register):具有数据存储特性的变量,哈尔滨工业大学微电子中心,21,Verilog HDL基础知识,连线型与寄存器型区别: 连线型: 驱动方式(赋值方式):1.连接到一个门或模块的输出端;2.用assign赋值 电荷保持作用:没有电荷保持作用(trireg除外),未被驱动时将处于高阻态( trireg 为不定态) 对应硬件:物理信号连接 寄存器型 驱动方式(赋值方式) :通过过程赋值语句赋值 电荷保持作用:在下一次赋值之前保持不变 对应硬件:触发器、锁存器、组合逻辑,哈尔滨工业大学微电
12、子中心,22,Verilog HDL基础知识,连线类,哈尔滨工业大学微电子中心,23,wire out;/ tri out;,if en = 1, out = i; if en = 0, out = high impedance;,trireg out;/具有电荷保持作用的连线,if en = 1, out = i; if en = 0, out = its last value; 可用来表示DRAM单元,哈尔滨工业大学微电子中心,24,tri0 out;,if en = 1, out = i; if en = 0, out = 0;,tri1 out;,if en = 1, out = i;
13、 if en = 0, out = 1;,哈尔滨工业大学微电子中心,25,两个 cell 的 output 相连接时:,哈尔滨工业大学微电子中心,26,Verilog HDL基础知识,连线型变量声明:*; EX: wire net1;wand net2;tri 15:0 bus_in;wand 0:31 bus_a, bus_b; 当沒指定 net 是何种 type 时,Verilog 会以 default 值来设定,default 为一位的 wire型,哈尔滨工业大学微电子中心,27,Verilog HDL基础知识,寄存器类,哈尔滨工业大学微电子中心,28,Verilog HDL基础知识,寄
14、存器类变量声明:*; EX: reg a; reg 7:0 a; reg 31:0 a, b; reg 0:7 b;,哈尔滨工业大学微电子中心,29,在使用数据类型时要注意下列几点: (1)在电路外部一个 input port 可以用 net 或 reg 来驱动,而进到电路内部这个 input port 只能是net类型。 (2)在电路内部一个 output port 可以为 net 或 register 类型,而在电路外部output port 只能是 net类型。 (3)无论在电路内外,一个 inout port只能是 net 类型。,哈尔滨工业大学微电子中心,30,示意图,net,net
15、,net,net,input port,output port,reg or net,reg or net,inout port,哈尔滨工业大学微电子中心,31,Verilog HDL基础知识,标量与矢量 标量:只有一位的连线或寄存器类型 矢量:多于一位的连线或寄存器类型 存储器定义 EX: reg7:0 memory255:0; /字长8bit,256byte容量 reg mem255:0; /字长1bit,256bit容量 wire data; memory7 = 8hff; /只能按地址赋值 data = mem0;,哈尔滨工业大学微电子中心,32,Verilog HDL的运算符,哈尔滨
16、工业大学微电子中心,33,Verilog HDL基础知识,算术运算符 , , *:加法器,减法器,乘法器 / , %:除法器 /:整数除法舍弃小数 %:取模运算取余数,符号为第一个操作数的符号 如:-10 % 3= -1; 10 % (-3)= 1 如果操作数里包含x,则结果为不定态,哈尔滨工业大学微电子中心,34,Verilog HDL基础知识,位运算符:按位进行运算,结果的位数不变 : 按位取反反相器 典型应用:时钟信号发生 reg clock; initial clock = 0; always #10 clock = clock; reg7:0 data; wire7:0 dout;
17、assign dout = data; /8个反相器,哈尔滨工业大学微电子中心,35,Verilog HDL基础知识,& :按位与 与门 | :按位或 或门 :按位异或 异或门 , :按位同或 同或门 注意:上述操作数只要出现x,结果均为x EX:a=4b1011, b=4b0011 a=4b0100, a|b=4b1011a&b=4b0011, ab=4b1000ab=4b0111,哈尔滨工业大学微电子中心,36,Verilog HDL基础知识,缩位运算符:按位进行运算,结果为1位 &, |, : 与,或,异或 &, |, (或) : 对与,或,异或取反EX: a=4b1011 &a=1b0
18、, &a=1b1, |a=1b1,|a=1b0, a=1b1, a=1b0,哈尔滨工业大学微电子中心,37,Verilog HDL基础知识,逻辑运算符: &, |, ! : 与位运算符操作类似 操作数被看作一个整体:TRUE或FALSE;即可看作计算结果为TRUE或FALSE的操作:1代表TRUE,0代表FALSE 对于矢量来说,只有全0代表FALSE EX: a=4b1010 , b=4b0101 !a=0, a& b=1, a | b=1,a & &b=a& (&b)=a& 1b0 = 4b0,哈尔滨工业大学微电子中心,38,Verilog HDL基础知识,关系运算符: 比较两个操作数大小
19、 , =, 比较器 =, !=: 相等、不相等运算符比较器 =, !=: 全等、不全等运算符 比较器?No! 全等和相等的区别: 相等、不相等:当出现x,z时,结果为x 全等、不全等:把x,z当成逻辑状态参与比较 EX:a=4b1x0z, b=4b1x0z;a=b; /结果为1bxa=b;/结果为1b1,哈尔滨工业大学微电子中心,39,Verilog HDL基础知识,逻辑移位运算符: 空位填0 移位寄存器 : 逻辑右移 EX: a=4b1010a=a1 =4b0101a=a4 =4b0000a=a0 =4b1010,哈尔滨工业大学微电子中心,40,Verilog HDL基础知识,连接运算符 :
20、 将多个信号拼接为一组新信号 EX:a,b,c均为1位标量a,b,c,4b0011 /结果为7位矢量3a a,a,a /结果为3位矢量 常用于数据、状态或控制寄存器生成,哈尔滨工业大学微电子中心,41,Verilog HDL基础知识,条件运算符 ?:EX:tri_data=en? data_out:32bz;/三态门out=condition? a: b; /2选1选择器 注意:如果条件结果为x,则位与位比较后按位输出结果(不同位输出x) 如a=4b10xz, b=4b10xz, 当condition为x时,out结果为4b10xx;,哈尔滨工业大学微电子中心,42,Verilog HDL基础
21、知识,关于运算结果位宽 短操作数高位扩展:高位扩展全0,如果最高位为x,则扩展为全x 赋值表达式中,左端位宽需慎重考虑 如:a,b同为8位矢量,a+b可能为9位 饱和计数器:a+8b1,结果取8位当结果为8b11111111下次结果为8b00000000,哈尔滨工业大学微电子中心,43,Verilog HDL基础知识,参数(parameter):常量定义,用文字参数代替一个数字量。 格式:parameter ; 如:parameter msb=7, delay=10; 参数化设计:增强重用性 不同位宽的设计,结构相同将位宽定义为参数 不同延迟,哈尔滨工业大学微电子中心,44,Verilog H
22、DL基础知识,EX: module var_mux (out, a, b, sel);parameter width = 8, delay = 3;output width-1:0 out;input width-1:0 a, b;input sel;assign #delay out = sel ? a : b; endmodule,哈尔滨工业大学微电子中心,45,Verilog HDL基础知识,宏替换:definedefine 宏替换在编译时,用macro_text代替文件中的name 定义在module外部 范围从定义开始到源文件结束如:define msb 8define and1 a
23、nd 1modulewiremsb:1 a;a = b and1; / b and 1;,哈尔滨工业大学微电子中心,46,Verilog HDL基础知识,模拟时间定标timescale 对模拟器的时间单位及时间精度进行定标timescale / 合法整数:1、10、100 合法时间单位:s、ms、us、ns、ps、fs 如timescale 1ns/100ps 注意: 定标是个相对概念,不会影响模拟器工作状态 计时单位必须大于精度单位 timescale定义必须在模块描述的外部进行 允许对不同模块定义不同时标,以最小精度进行模拟 计时单位和计时精度之差影响模拟速度,哈尔滨工业大学微电子中心,4
24、7,Verilog行为描述,在作Behavior modeling时要知道几件事: 1.要先知道电路的行为如果电路有多种行为,我们也要知道如何分开描述它们。 2.时间控制所谓时间控制包括:(a)什么时间做什么事,例如:经过多少个clock就要做什么事。(b)什么状况做什么事,例如:某一控制信号进来就要做什么事。,哈尔滨工业大学微电子中心,48,Verilog行为描述,电路描述 行为描述:侧重对模块行为功能的抽象描述 结构描述:侧重对模块内部结构实现的具体描述 行为模块描述 由多个并行运行的过程块组成 过程块由过程语句(initial与always)和块语句(串行块begin-end与并行块fo
25、rk-join)组成 块语句由过程赋值语句和高级程序语句构成 过程赋值语句:阻塞与非阻塞式赋值 高级程序语句:if-else、case、while、wait,哈尔滨工业大学微电子中心,49,Verilog行为描述,模块行为描述的构成框架例:上升沿D触发器module dff_pos(data,clk,q);/模块定义input data,clk; /端口声明output q; /端口声明reg q; /数据类型声明always (posedge clk) q=data;/描述体,过程块endmodule /结束行,哈尔滨工业大学微电子中心,50,Verilog行为描述,过程块( Procedu
26、ral block ) “initial” 和 “always” procedural block,condition,过程语句:initial和always,哈尔滨工业大学微电子中心,51,Verilog行为描述,过程块的形式 过程语句 (事件控制敏感表)块语句开始标识符:块名块内局部变量说明过程赋值语句或高级程序语句块语句结束标识符,哈尔滨工业大学微电子中心,52,Verilog行为描述,过程块说明 过程语句:initial和always 事件控制敏感表:只在always语句中,用于激活过程语句执行 块语句开始/结束标识符:begin-end和fork-join两类 块名:可选 局部变量说
27、明:可选,哈尔滨工业大学微电子中心,53,EX1:initial过程块 module monitor_test; reg in; wire out1;not #1 U0(out1, in);initial$monitor($time, “out1 = % in = %b“, out1, in);initial beginin = 0;# 10 in = 1;# 10 in = 0; endendmodule,哈尔滨工业大学微电子中心,54,EX2:always过程块 时钟同步电路module shift(data_out,data_in,clr,clk); /移位寄存器output7:0 da
28、ta_out;input data_in,clr,clk;reg7:0 data_out;always (posedge clk)beginif(!clr) data_out = 8b0;elsebegindata_out = data_out1;data_out0 = data_in;endendendmodule,哈尔滨工业大学微电子中心,55,EX3:always过程块module dff(q, d, clear, preset, clock);output q;input d, clear, preset, clock;reg q; always (posedge clock or c
29、lear or preset)beginif (!clear)q = 0; else if (!preset)q=1; elseq = d; /procedural assignmentend endmodule /synthesizable,哈尔滨工业大学微电子中心,56,Verilog行为描述,一个module中,可以有多个initial与always语句,相互独立,并发执行 initial和always的区别: 二者皆从模拟的零时刻开始执行,但initial只执行一次;而always可能循环执行 initial无触发条件;而always通常带触发条件,如果没有,则认为永远触发 initi
30、al主要用于模拟;always可用于设计和模拟,哈尔滨工业大学微电子中心,57,哈尔滨工业大学微电子中心,58,块语句:“串行块” and “并行块”,哈尔滨工业大学微电子中心,59,Verilog行为描述,begin-end串行块顺序执行 fork-join 并行块同时执行,begin# 10 a = h35;# 10 b = hE2;# 10 c = h00;end,fork# 10 a = h35;# 20 b = hE2;# 30 c = h00;join,哈尔滨工业大学微电子中心,60,Verilog行为描述,块名有名块(Named-block) 便于对块语句的执行过程进行控制: 有
31、时在执行过程中,根据执行状态判断是否继续执行可通过disable语句终止有名块 允许在块语句内部引入局部变量 由于块名的不同,内部局部变量可以与块外同名的变量较容易区分开来;该变量只能为寄存器型,哈尔滨工业大学微电子中心,61,Verilog行为描述,过程赋值语句: 位于过程块中的赋值语句 只能对寄存器类变量赋值 左端必须为寄存器类变量:reg, integer, real, time 可以对矢量整体赋值,也可对其中某几位赋值 对存储器类,只能通过选定地址单元,对某个字赋值 可对连接符拼接后变量整体赋值,哈尔滨工业大学微电子中心,62,Verilog行为描述,EX:reg_a = 8b1011
32、_1100;reg_a2=1b1;reg_a7:4 = 4he;memory4 = 8h1a;carry,sum = reg_a +reg_b;,哈尔滨工业大学微电子中心,63,Verilog行为描述,过程赋值语句的两种延时模式:外部模式和内部模式 外部模式:; 延时控制:delay ab;/延时到期再对表达式求值 事件控制:(事件控制敏感表) ab; 内部模式: ;如:a delay b;/先对表达式求值,条件满足赋值,哈尔滨工业大学微电子中心,64,Verilog行为描述,(事件控制敏感表): 1. (信号名) 信号名:一位(标量),或几位(矢量);类型不限 EX:(clock) reg_
33、a = reg_b; 2. (posedge 信号名)、 (negedge 信号名) 上升沿、下降沿跳变触发 EX: (posedge clock) reg_a = reg_b;(negedge clock) reg_a = reg_b;,哈尔滨工业大学微电子中心,65,Verilog行为描述,3. (敏感事件1 or 敏感事件2 or 敏感事件3 or ) 敏感事件:指上述1、2事件控制中的任何一种 只有or(或)的关系 EX: (posedge clock or negedge reset_) reg_a= reg_b;(reg_b or reg_c) reg_a = reg_b 事件:当
34、括弧內的值有任何改变时,就称发生了一个事件(Event),哈尔滨工业大学微电子中心,66,哈尔滨工业大学微电子中心,67,Verilog行为描述,内部模式和外部模式延时赋值的区别:赋值时刻不同 EX: Data Swapforka = #5 b;b = #5 a;join注意:若是fork#5 a = b;#5 b = a;join则 a, b 会有 race 的现象。,哈尔滨工业大学微电子中心,68,Verilog行为描述,阻塞型赋值:用“”赋值,前一条语句的执行阻塞了后面语句的执行 非阻塞型赋值:用“”赋值,一条语句的执行不影响其他语句的执行 一个块语句中不许同时使用上述2种赋值方式,be
35、gina=#10 1;b=#5 0;c=#1 1; end,begin /相当于fork-join块a=#10 1;b=#5 0;c=#1 1; end,注意:如果没有延时模式控制,阻塞式赋值均为立即赋值,哈尔滨工业大学微电子中心,69,练习题,试采用Verilog行为描述方法描述以下四位移位寄存器,哈尔滨工业大学微电子中心,70,答案: module shifter4(a,b,clk);input a,clk;output b;reg z1,z2,z3,b;always (posedge clk)beginz1=a; z2=z1; z3=z2; b=z3;end endmodule Ques
36、tion:将上述非阻塞赋值改为阻塞赋值,对不对?,哈尔滨工业大学微电子中心,71,module shifter4(a,b,clk);input a,clk;output b;reg z1,z2,z3,b;always (posedge clk) z1=a; always (posedge clk) z2=z1; always (posedge clk) z3=z2; always (posedge clk) b=z3; Endmodule Question:将上述非阻塞赋值改为阻塞赋值,对不对?,哈尔滨工业大学微电子中心,72,注意:敏感表,(posedge 控制信号)、 (negedge控制
37、信号) 如果if-else或case语句不完整? flipflop (控制信号名) 如果if-else或case语句不完整? 组合电路 (敏感事件1 or 敏感事件2 or 敏感事件3 or ) 如果if-else或case语句不完整? 否则组合电路 如果是简单赋值呢?,哈尔滨工业大学微电子中心,73,思考题: always (b) a = b; always (posedge clk) a = b; always (clk) if(clk) a = b; always (a or b or clk) if(clk)q = b;else q=a; always (b) a = b,哈尔滨工业大
38、学微电子中心,74,思考题: 连线 FF FF 2选1 always (posedge b) temp1=c;always (negedge b) temp2=c;always (b) if(b)a = b ?,哈尔滨工业大学微电子中心,75,注意:过程赋值,在同一个always/initial块内,对同一个变量只能采用一种赋值方式(或=) 避免在多个always/initial块中,对同一个变量赋值(多驱动) 仿真时不会错,综合时报错 module always (posedge clk) a = b; always (posedge clk) a = c; endmodule,哈尔滨工业大学微电子中心,76,用Verilog行为描述方法描述以下电路,