1、Verilog硬件描述语言数字逻辑与处理器基础实验HDL的特点和优势2 基于文本的方式,具有可重用性和设计灵活性 高层次实现,与具体细节无关,例如 MOS、 BJT 设计开发容易,能够在设计初期发现问题 自动将高层次描述转换到具体的工艺实现 大量的自动化工具辅助完成设计验证和实现 形成了芯片设计验证的统一标准,是芯片行业飞速发展的重要基础 大量的 HDL语言 ABEL、 ISPS、 VHDL、 Verilog、 SystemC、 SystemVerilog Verilog语言的发展历史3Verilog XL诞生Synopsys公司支持Verilog输入Cadence购买Verilog版权Ver
2、ilog HDL公开发表有关 Verilog的全部权利都移交OVIVerilogIEEE1364-1995标准发布使用模拟和数字的 Verilog标准发布Verilog IEEE1364-2001标准发布Verilog IEEE1364-2005标准发布1987198919951980,s1990 19992001 2005并入SystemVerilog标准 IEEE 18002009“Verilog”= “Verification” + “Logic”Verilog is a HDL4 软件编程语言最终被转换为机器指令,可以在一台计算机上运行 硬件描述语言,其语法和结构用于描述硬件电路的行为
3、和结构module MUX4x1(Z, D0, D1, D2, D3, S0, S1);output Z;input D0, D1, D2, D3, S0, S1;and u0 (T0, D0, S0bar, S1bar) ,u1 (T1, D1, S0bar, S1),u2 (T2, D2, S0, S1bar),u3 (T3, D3, S0, S1) ;not u4 (S0bar, S0),u5 (S1bar, S1);or u6 (Z, T0, T1, T2, T3);endmodulemodule adder (input 3:0 a,b,output 3:0 sum,output c
4、out);endmoduleVerilog层次化建模5module adder (a,b,sum,cout);input 3:0 a,b;output 3:0 sum;output cout;endmodulemodule FA (input a,b,cin,output c,cout);endmodulemodule adder (input 3:0 a,b,output 3:0 sum,output cout);wire 2:0 c;FA fa0(.a(a0),.b(b0),.cin(1b0),.c(sum0),.cout(c0);FA fa1(.a(a1),.b(b1),.cin(c0)
5、,.c(sum1),.cout(c1);FA fa2(.a(a2),.b(b2),.cin(c1),.c(sum2),.cout(c2);FA fa3(.a(a3),.b(b3),.cin(c2),.c(sum3),.cout(cout);endmodulemodule adder (input 3:0 a,b,output 3:0 sum,output cout);wire 2:0 c;FA fa0(a0,b0,1b0,sum0,c0);FA fa1(a1,b1,c0,sum1,c1);FA fa2(a2,b2,c1,sum2,c2);FA fa3(a3,b3,c2,sum3,cout);e
6、ndmoduleVerilog层次化建模6基于位置基于名字fa0fa1fa2fa3语法规范与注释7 标志符 由 数字、字母、符号 ($)和下划线构成,但是必须以字母或者下划线作为首字符 标志 符区分大小写 语句遵循自由格式,可以每一条语句占用一行或者多条语句共用一行 基本语句以“ ; ”结束 注释有两种形式“ /”和“ /* */”if (a b) begin c=a; endif (a b) beginc=a;end/单行注释/*多行注释可以单行也可以跨行*/常量88b0100_1011十进制,表示位宽( b,o,d,h)基数表示下划线被忽略,用于增强可读性X表示不定值(电路中不存在), Z
7、表示高阻值数字之间可以采用下划线分开,以增强可读性常量的位数不说明,则缺省为 32位4b00_11; 8hA7; 6o76; 5d31Logic Value description0 Zero、 Low or false1 One、 high or trueX or x Unknown or uninitializedZ or z High Impedance实数: 1.34, 1.3e2( 130)字符串:“ FourValue”整数型:常量9parameter 定义标志符,可重载实现参数化模块localparam 定义本地标志符 ,不可重载参数型常量 : parameter, localp
8、aramparameter time_delay=5,time_count=10;localparam PERIOD_VALUE=20;变量10 Net型变量 Reg型变量Net型变量11KeywordFunctionalityDescriptionwire or tri Simple interconnecting wirewor or trior Wired outputs OR togetherwand or triand Wired outputs AND togethertri0 Pulls down when tri-statedtri1 Pulls up when tri-sta
9、tedsupply0 Constant logic 0 (supply strength)supply1 Constant logic 1 (supply strength)trireg Stores last value when tri-stated (capacitance strength)Net型变量一般用来表示电路中的连线逻辑或者组合逻辑wire a; /1比特线网变量wire 7:0 b; /8比特线网变量Reg型变量12 Reg型变量需要被明确地赋值,在设计中变量必须放在过程块语句中(如 initial或 always), 通过过程赋值语句赋值 ,而且在过程块内被赋值的每一个
10、变量 必须定义成该类型 reg: 常用寄存器型变量 integer: 32位带符号整数型变量 real: 64位带符号实数型变量(不可综合) time: 无符号时间变量(不可综合)Reg型变量不一定对应寄存器,仅代表可以在过程语句中被赋值的变量reg a,b; /定义了两个一位宽 reg变量 a,b;reg 7:0 data; /定义 8位宽 reg向量reg a=0; /初始化操作数组13 若干个相同宽度向量构成数组,通过数组可以定义存储器类型变量 多维数组parameter wordwidth=8,memsize=1024;reg wordwidth-1:0 mymemorymemsize
11、-1:0; /定义存储变量mymemory8 =1; /给存储变量某一个单元赋值reg 7:0 array2 0:2550:16;驱动能力14Strength Level Strength Name Keyword Display7 Supply Drive supply0 supply1 Su0 Su16 Strong Drive strong0 Strong1 St0 St15 Pull Drive pull0 Pull1 Pu0 Pu14 Large Capacitive Large La0 La13 Weak Drive weak0 Weak1 We0 We12 Med. Capaci
12、tive Medium Me0 Me11 Small Capacitive Small Sm0 Sm10 High Impedance highz0 highz1 HiZ0 HiZ1如果两个具有不同强度的信号驱动同一个线网,则竞争结果值为高强度信号的值。如果两个强度相同的信号之间发生竞争,则结果为不确定值。算术运算符15 , *:加、减、乘运算 /:除法运算,整数类型的除法运算结果是通过截去小数位得到的 :取模运算,对于 integer型有符号数,结果的符号与取模运算中第一个操作数的符号相同 在 除法运算中, 被零 除结果 为 不确定 在算术运算操作中, 任何一个操作数的任何位不确定,将导致运
13、算结果的不确定逻辑运算符16 /Logic 0b=4b1101; /Logic 1c=4b000x; /x位运算符17 按位进行运算,结果的位数与操作数的位数相同;对于两个具有不同长度的操作数,则采取右对齐并对短操作数左边补 0的方式进行处理,运算结果的长度与长操作数长度相同 :按位取反(单目运算), x的取反仍然是 x /A取值B=4b11x0; /B取值A=B ?A=B ?移位和拼接运算符22 :逻辑左移和逻辑右移左移和右移产生的空位将由 0来填补 :将两个或多个信号的某些位连接起来,可以嵌套使用,可以定义重复操作数目 . o1=b,a,b,a,b,a,b;o2=b,3a,b;条件运算符2
14、3 condition?true_expression:false_expression 根据 condition的取值决定最终表达式的取值,如果 condition为真则表达式取值 true_expression,否则为 false_expression。 如果 condition的取值为不定态,则结果以位运算的方式产生;对于每一位来说,如果 true_expression和false_expression的对应位都为 1 / 0,则结果中对应位为 1 / 0,否则为不定态b=1;c=0;a=(cond2)?b:c;运算符优先级24运算符 优先级! 端口说明内部数据说明功能定义语句endmo
15、dule模块端口说明可以与端口定义集成在一起,也可以分别进行说明默认情况下,输出端口被定为 wire类型;如果输出端口在过程语句中被赋值,那么需要显式的对输出端口的数据类型进行说明模块实例化时,如果不需要从外部引用模块内部的标识符,那么可以省略模块的例化标识符模块实例化时,可以采用基于名称的端口映射方式,也可以采用基于位置的端口映射方式模块名 (端口映射 );module test(a,b,c);input a,b;output c;reg c;always *c=aendmodulealways (sensitive exp)begin/过程赋值语句、 if语句、 case语句、循环语句、/
16、task、 functionend过程语句26对于时序电路事件是由时钟的边沿触发的,采用posedge和 negedge两个关键字来实现敏感表达式:当表达式的值改变时,就会执行一遍块内语句,所以敏感表达式应该列出所有影响块内取值的 变量 ,多个变量之间用“ or”或者“ ,”连接起来对于描述纯组合逻辑的 always语句可以使用 “ *”或者“ (*)”描述敏感表。always语句 initial语句在仿真时刻 0启动,只执行一次,主要用于编写测试向量和对某些变量赋初值Initialbeginclause 1;clause 2;.endinitial beginclk1=0;forever#5
17、 clk1=clk1;endalways#50 clk2=clk2;过程语句27always语句和 initial语句的区别always语句一般可用于测试模块中的时钟描述,以及硬件功能模块的功能描述两者都是从模拟 0时刻开始执行,但 initial过程语句后面的块语句沿时间轴只执行一次,而 always则循环地重复执行其后的块语句initial过程语句不带触发条件,因而必定从模拟 0时刻开始执行它后面地块语句,而 always过程语句通常带有敏感条件,只有条件被激活才执行,如果执行条件缺省,则认为始终满足一个模块的行为描述中可以有多个 initial与 always语句,代表多个进程块的存在,
18、他们之间相互独立,并行运行initial语句最经常应用于测试模块中对激励向量的描述,而在对硬件功能模块的行为描述中,仅在必要时给寄存器变量赋以初值。这是一条主要面向仿真的过程语句,通常不为综合器所接受initial beginclk1=0;clk2=0;end块语句28begin-end包含的块内语句按照串行方式顺序执行,块中每条语句给出的延时都是相对于前一条语句执行结束的相对时间fork-join包含的块内语句按照并行方式执行,他们同时开始执行,与排列顺序无关,块中每条语句给出的延时都是相对于并行块开始执行的时间而言的;并行块结束的时间是所有语句中最后执行完的语句的结束时间有名块块语句是由块
19、标识符 begin-end或 fork-join界定的一组行为描述语句。块内的语句按照既定次序顺序或并行执行begin#10 b=a;#10 c=a;endfork#10 b=a;#10 c=a;joinbegin:topfor(i=0;in;i=i+1) begin:innerif (a=0) disable inner;if (a=b) disable top;endend赋值语句29持续赋值语句 net型变量赋值 ,输入变量变化将随时引起输出的变化若右边长度 大于 左边,则丢弃右边的高位;若右边长度小于左边,则补零过程赋值语句 对 reg型变量赋值,包括两类:阻塞赋值和非阻塞赋值非阻塞赋
20、值方式 =,只有当块结束时才完成赋值,即赋值不是立即完成的阻塞赋值方式 ,赋值语句结束则赋值完成。如果在一个块内有多条阻塞赋值语句,则在前面的赋值语句没有完成之前,后面的语句不能被执行初学尽量只使用一种 ,建议采用非阻塞赋值,以体会 Verilog的并行建模思想module non_block(c,b,a,clk);output c,b;input clk,a;reg c,b;always (posedge clk)beginb=a;c=b;endendmodulemodule block(c,b,a,clk);output c,b;input clk,a;reg c,b;always (posedge clk)beginb=a;c=b;endendmoduleassign a=b赋值语句30 持续赋值语句ca b物理连接关系,描述组合逻辑assign b=a;assign c=b;