集成电路设计课件:第3章 Verilog基本语法_第1页
集成电路设计课件:第3章 Verilog基本语法_第2页
集成电路设计课件:第3章 Verilog基本语法_第3页
集成电路设计课件:第3章 Verilog基本语法_第4页
集成电路设计课件:第3章 Verilog基本语法_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 第3周 Verilog 基本语法集成电路设计基础主要内容:23.1 Verilog HDL基本模块说明3.2 Verilog HDL中的词汇约定3.3 Verilog HDL 数据类型3.4 Verilog HDL 运算符3module能够表示:物理块,如IC或ASIC单元逻辑块,如一个CPU设计的ALU部分整个系统每一个模块的描述从关键词module开始,有一个名称(如SN74LS74,DFF,ALU等等),由关键词endmodule结束。3.1 Verilog HDL基本模块说明module是层次化设计的基本构件逻辑描述放在module内部 Verilog 模块(module)结构基本要

2、素4知识点:3.1.1 端口信息3.1.2 输入/输出说明3.1.3 逻辑功能描述3.1.1 端口信息5模块通过端口与外部通信1,端口在模块名字后的括号中列出3,端口可以说明为input, output及inout2,端口等价于硬件的引脚(pin)3.1.2 端口说明6Verilog 模块的结构由在module和endmodule 关键词之间的四个主要部分组成: - 1. 端口信息: module combination(a, b, c, d ); - 2. 输入/输出说明 : input a, b, c ; output d ; -/ 输入/输出端口信号类型声明,缺省为wire型 : - 3

3、. 内部信号: wire x; - 4. 功能定义: assign d = a | x ; assign x = ( b & c ); endmodule 3.1.3 逻辑功能描述7module mux2to1 (out, a, b, sel); input a, b, sel; output out; wire out; assign out=(sel)?b:a;endmodule两路选择器的RTL级描述1:两路选择器的RTL级描述2:8module mux2to1 (out, a, b, sel); input a, b, sel; output out; reg out;always (

4、 sel or a or b) if (! sel) out = a; else out = b;endmodule91. 端口信息2. 输入/输出说明3. 逻辑功能描述(实例化实现功能描述)实例化(module instances):10module mux2to1 (out, a, b, sl); input a, b, sl; output out; not u1 (nsl, sl ); and u2 (sela, a, nsl); and u3 (selb, b, sl); or u4 (out, sela, selb);endmodule两路选择器的门级描述-实例化:练习:编写Ver

5、ilog HDL模块11请在下面的空格中填入适当的符号 使其成为右图的Verilog 模块 : module block1(a, b, , , ); input , , ; d, ; assign d = a | ( b & c) ; assign e = ( b & c ); _abcde 练习答案:编写Verilog HDL模块12 module block1(a, b, c, d, e ); input a, b, c; output d, e ; assign d = a | ( b & c) ; assign e = ( b & c ); endmoduleabcde3.2 Veri

6、log HDL中的词汇约定13知识点:3.2.1 术语及定义3.2.2 空白符和注释3.2.3 Verilog采用的四值逻辑系统3.2.4 整数常量和实数常量3.2.5 字符串3.2.6 标识符3.2.7 系统任务及函数3.2.8 编译指导 3.2.9 文本包含3.2.10 文本替换3.2.1 术语及定义141.空白符:空格、tabs及换行2. 标志符(Identifier):Verilog中对象(如模块或信号)的名字3.LSB:最低有效位(Lease significant bit)4.MSB:最高有效位(Most significant bit)3.2.2 空白符和注释15module M

7、UX2_1 (out, a, b, sel); / Port declarations output out; input sel; / control input input b, a; /* data inputs */ wire sel_, a1, b1; /*The netlist logic selects input ”a” when sel = 0 and it selects ”b” when sel = 1. */ not not1 (sel_, sel); and and1 (a1, a, sel_); and and2 (b1, b, sel); or or1 (out,

8、 a1, b1);endmodule格式自由使用空白符提高可读性及代码组织。Verilog忽略空白符除非用于分开其它的语言标记。多行注释,在/* */内单行注释到行末结束3.2.3 Verilog采用的四值逻辑系统160, Low, False, Logic Low, Ground,VSS, Negative Assertion1, High, True, Logic High, Power,VDD, VCC, Positive AssertionX Unknown: Occurs at Logical Which Cannot be Resolved ConflictZ, High Impe

9、dance, Tri- Stated,Disabled Driver (Unknown)3.2.4 整数常量和实数常量17 Verilog中,常量(literals)可是整数也可以是实数。1.整数的大小可以定义也可以不定义。整数表示为: 其中 size :位数大小,由十进制数表示的位数(bit) 表示。缺省为32位 base:数基,可为2(b)、8(o)、10(d)、 16(h)进制。缺省为10进制 value:是所选数基内任意有效数字,包括 X、Z。2.实数常量可以用十进制或科学表示法表示。12 unsized decimal (zero- extended to 32 bits)h83a

10、unsized hexadecimal (zero- extended to 32 bits)8b1100 0001 8-bit binary16hff01 16-bit hexadecimal 32bz01x Z-extended to 32 bits3b1010 1101 3-bit number, truncated to 3b1016.3 decimal notation32e- 4 scientific notation for 0.00324.1E3 scientific notation for 410018整数与实数常量例子整数和实数常量小结19整数的大小可以定义也可以不定义。

11、整数表示为:数字中(_ )忽略,便于查看没有定义大小(size)整数缺省为32位 /*特别注意*/缺省数基为十进制数基(base)和数字(16进制)中的字母无大小写之分当数值value大于指定的大小时,截去高位。如 2b1101表示的是2b01实数常量实数可用科学表示法或十进制表示科学表示法表示方式: , 表示: 尾数10指数3.2.5 字符串(string)(了解)20字符串要在一行中用双引号括起来,也就是不能跨行。字符串中可以使用一些转义(escape)符,如t n 可以使用一些格式符(如%b)在仿真时产生格式化输出: “This is a normal string” “This str

12、ing has a t tab and ends with a new linen” “This string formats a value: val = %b”Verilog中,字符串大多用于显示信息的命令中。(只用在测试中!)21 格式符%h%o%d%b%c%s%thexoctdecbinACSIIstringtime转义符tn”tab换行反斜杠双引号ASCII representation of above格式符%0d表示没有前导0的十进制数3.2.6 标识符(identifiers) (重点)22标识符是用户在描述时给Verilog对象(电路模块、信号等)起的名字标识符必须以字母(a

13、-z, A-Z)或( _ )开头,后面可以是字母、数字、( $ )或( _ )。最长可以是1023个字符标识符区分大小写,sel和SEL是不同的标识符例如:module MUX2_1 (out, a, b, sel);output out;input a, b, sel; wire sel_, a1, b1; not not1 (sel_, sel); and and1 (a1, a, sel_); and and2 (b1, b, sel); or or1 (out, a1, b1);endmoduleVerilog标识符23有效标识符举例: shift_reg_a busa_index _

14、bus3无效标识符举例: 34net / 开头不是字母或“_” a*b_net / 包含了非字母或数字, “$” “_” n238 /包含了非字母或数字, “$” “_”Verilog区分大小写,所有Verilog关键词如module、endmodule等都使用小写字母。3.2.7 系统任务及函数(了解)24使用方式:$符号指示这是系统任务和函数系统函数有很多,如:返回当前仿真时间$time显示/监视信号值($display, $monitor)停止仿真$stop结束仿真$finish 如: $monitor($time, “a = %b, b = %h”, a, b); 当信号a或b的值发生

15、变化时,系统任务$monitor显示当前仿真时间,信号a值(二进制格式), 信号b值(16进制格式)。3.2.8 编译指导 (了解)25( )符号说明一个编译指导这些编译指导使仿真编译器进行一些特殊的操作编译指导一直保持有效直到被覆盖或解除3.2.9 文本包含include (了解)26编译指导include在当前内容中插入一个文件 格式: include “”如include global.vinclude parts/count. vinclude ././library/mux. v”include可用于:include保存在文件中的全局的或经常用到的一些定义,如文本宏在模块内部incl

16、ude一些任务(tasks),提高代码的可维护性。可以是相对路径或绝对路径3.2.10 文本替换define (了解)27define not_delay #1define and_delay #2define or_delay #1module MUX2_1 (out, a, b, sel);output out;input a, b, sel;wire sel_, a1, b1;not not_delay not1( sel_, sel);and and_delay and1( a1, a, sel_);and and_delay and2( b1, b, sel);or or_delay

17、 or1( out, a1, b1);endmodule编译指导define提供了一种简单的文本替换的功能 define 在编译时替换。可提高描述的可读性。定义not_delay使用not_delay 文本替换 (了解)28解除定义的宏,使用 undef macro_name使用编译指导define,可以提高描述的可读性定义全局设计参数,如延时和矢量的位数。这些参数可以定义在同一位置。这样,当要修改设计配置时,只需要在一个地方修改。定义Verilog命令的简写形式 define vectors_ file /usr1/chrisz/library/vectors define results_

18、 file / usr1/chrisz/library/results可以将define放在一个文件中,与其它文件一起编译。3.3 Verilog HDL 数据类型29知识点:3.3.1 线网类型3.3.2 寄存器类型3.3.3 参数3.3.4 位选择3.3.5 总结3.3 Verilog HDL 数据类型30Verilog HDL 有两大类数据类型。1. 线网类型(net type): 表示Verilog结构化元件间的物理连线。它的值由驱动元件的值决定,例如连续赋值或门的输出。如果没有驱动元件连接到线网,线网的缺省值为z。2. 寄存器类型(register type):表示一个抽象的数据存储

19、单元,它只能在always语句和initial语句等过程语句中被赋值,并且它的值从一个赋值到另一个赋值被保存下来。寄存器类型的变量具有x的缺省值。3.3.1 net(线网)型31net需要被持续的驱动,驱动它的可以是门和模块。当net驱动器的值发生变化时, 新值被传送到net上。在下例中,线网out由or门驱动。当or门的输入信号置位时将传输到线网net上。net类的类型(线网)32有多种net类型用于设计(design-specific)建模和工艺(technology-specific)建模没有声明的net的缺省类型为 1 位(标量)wire类型。但这个缺省类型可由下面的编译指导改变: d

20、efault_nettype net类型功 能wire, trisupply1, supply0wor, triorwand, triandtriregtri1, tri0标准内部连接线(缺省)电源和地多驱动源线或多驱动源线与能保存电荷的net无驱动时上拉/下拉综合编译器不支持的net类型 线网数据类型33可综合的线网数据类型包含下述: wire Wor wand tri supply0 supply1 最常用的是wire! 线网数据类型-使用语法34简单的线网类型说明语法为: net_kind msb : lsb net1, . . , netN; 解释:1. net_kind 是上述线网类

21、型的一种; 2. msb和lsb 是用于定义线网范围的常量 表达式,如果没有定义,缺省为1位。例1:wire rst, data; /1位的复位线和数据线。例2: wire 2:0 Addr1 ; /Addr1是3位地址线 wire 3:1 Addr2; /Addr2是3位地址线 线网型变量使用举例35module mux2to1 (out, a, b, sel); input a, b, sel; output out; wire out; assign out=(sel)?b:a;/input a, b, sel没声明信号类型,缺省为wire型endmodule例如:两路选择器的RTL级描

22、述3.3.2 寄存器的类型36寄存器类有四种数据类型寄存器类型 功能reg 是最常用的寄存器类型 ,无符号型。integer 32位有符号整数变量,算术操作产生二进制补码形式 。 的结果。通常用作不会由硬件实现的的数据处理。real 双精度的带符号浮点变量,用法与integer相同。time 64位无符号整数变量,用于仿真时间的保存与处理。realtime 与real内容一致,但可以用作实数仿真时间的保存 与处理。 寄存器类型reg-使用语法37 reg是寄存器数据类型最常见的数据类型。 使用语法形式如下: reg msb: lsb reg1,. . . ,regN; msb和lsb 定义了范

23、围,并且均为常数值表达式;如果没有定义范围,缺省值为1位寄存器。 例1: reg 3:0 counter1 ; /4 位寄存器。 例2: reg counter2 ; / 1位寄存器。 例3: reg 31:0 data_buffer1 ; reg 32:1 data_buffer2 ; 常见的寄存器类型: Integer38 integer A, B, C ; /三个整数型寄存器。 说明: 1. 与reg不同,integer可以表示有符号数,并且算术操作符提供2的补码运算结果。 2. 同时,如上例定义的A,B,C变量它们分别是32位( 32-bit )的寄存器变量。 寄存器型变量使用举例39

24、module mux2to1 (out, a, b, sel); input a, b, sel; output out; reg out;always ( sel or a or b) if (! sel) out = a; else out = b;/input a, b, sel没声明信号类型,缺省为wire型endmodule例如:两路选择器的RTL级描述 如何给模块端口信号选择正确的数据类型?40module top(A,B,Y );input A,B; output Y; reg A1,B1;/wire? wire Y1; /reg? /对于信号Y,A,B呢? DUT u1 (Y1

25、, A1, B1) ; DUT u2 (Y, A, B) ;endmodulemodule DUT (O, in1, in2); output O; input in1, in2; wire in1, in2; reg O; always (in1 or in2) O=in1+in2; endmodule输入端口(如右图in1、in2信号)只能是net;但输入端口可以由net/register驱动输出端口( 如O )可以是net/register类型,但输出端口只能驱动net若in1、in2说明为reg则会产生错误。in1in2OABY或者:wire O;assign O=in1+in2; 练

26、习-选择数据类型时常犯的错误41修改前:module example(o1, o2, a, b,c,d); input a, b,c,d; output o1, o2; reg c, d; reg o2; and u1(o2, c, d); always (a or b) if (a) o1 = b; else o1 = 0;endmodule修改后:module example(o1, o2, a, b, c, d); input a, b, c, d; output o1, o2;/ reg c, d;/ reg o2 reg o1; and u1(o2, c, d); always (a

27、 or b) if (a) o1 = b; else o1 = 0;endmoduleexample.v或者换成:always (c or d)o2=c&d; 或者换成:assign o2=c&d; 3.3.3 参数42 参数是一个常量。 参数定义的语法: parameter ;如: parameter WIDTH = 8h20; parameter BYTE =4h8; 参数(parameters)-使用举例43例: module mod1( out, in1, in2); . . . . . . parameter WORD_WIDTH = 8; . . . . . . wire WORD

28、_WIDTH-1: 0 in1; / A wire declaration using parameter . . . . . .endmodule 参数(parameters)使用注意事项441. 推荐:一般定义参数等常量名称用大写,变量名称用小写!2. 可一次定义多个参数,用逗号隔开。 如: parameter WORD_WIDTH = 32, ADDR_WIDTH = 8; 等同于: parameter WORD_WIDTH = 32; parameter ADDR_WIDTH = 8; (parameters)使用注意事项(cont.)45 3. 参数的定义是局部的,只在当前模块中有效

29、。 如:在工程Multi-CPU中一个文件a.v中定义 parameter WORD_WIDTH = 32; 在同一工程另一个文件b.v中定义 parameter WORD_WIDTH = 8; 是可以的。/但是如果这样,项目比较复杂时,容易混淆WORD_WIDTH的值,不建议这样使用,可以声明成两个不同名称的参数来处理这种情况。 参数(parameters)使用注意事项(cont.)46!注意与define 的异同 如在文件sram_control.v中,定义有: define ADDR_WIDTH 12 define DATA_WIDTH 32 module example2( clk,r

30、st,addr_in,data_in,data_out); input DATA_WIDTH-1: 0 data_in; input ADDR_WIDTH -1: 0 addr_in; output DATA_WIDTH-1: 0 data_out; wire DATA_WIDTH-1: 0 data_in; wire ADDR_WIDTH -1: 0 addr_in; reg DATA_WIDTH-1: 0 data_out; parameter MEMORY_DEPTH = 1024; . . .endmodule47或在文件cpu_param.v中定义: define ADDR_WIDT

31、H 12 define DATA_WIDTH 32 然后在文件sram_control.v中如下使用: include cpu_param.v module example2( clk,rst,addr_in,data_in,data_out); input DATA_WIDTH-1: 0 data_in; input ADDR_WIDTH -1: 0 addr_in; output DATA_WIDTH-1: 0 data_out; wire DATA_WIDTH-1: 0 data_in; wire ADDR_WIDTH -1: 0 addr_in; reg DATA_WIDTH-1: 0

32、 data_out; parameter MEMORY_DEPTH = 1024; . . .endmodule3.3.4 位选择48位选择从向量中抽取特定的位。 reg 31:0 Breg; wire 31:0 Bwire; . . . Breg=Bwire; 或者 . . . Breg31:16= Bwire15:0; Breg15:0= Bwire31:16; 位选择注意事项49 整数不能作为位向量访问。 例如定义了:integer B; 对于上面的整数B的说明,B6和B20:10是非法的。 解决办法: 一种截取位值的方法是将整数赋值给一般的reg类型变量,然后从中选取相应的位,如: i

33、nteger Bint; reg 31:0 Breg; / /由于Bint6和Bint20:10是不允许的。 Breg = Bint; / 或 Breg = Bint; /*现在,Breg6和Breg20:10是允许的,并且所取具体值,是整数Bint 相应的位值。*/3.3.5 Verilog模块中常见信号类型-总结50两种主要的信号类型: - 寄存器类型:代表 reg 在always 等过程块中被赋值的信号,往往代表触发器,但不一定是触发器。(时序逻辑电路中常常被综合为D触发器 ; 纯组合逻辑电路中被综合为连线) - 连线类型:代表 wire 用 assign 关键词指定连续/持续赋值所描述

34、的组合逻辑的信号或连线。 Verilog中reg与wire的不同点51用寄存器 (reg)类型变量生成组合逻辑举例: module rw1( a, b, out1, out2 ) ; input a, b; output out1, out2; reg out1; wire out2; assign out2 = a ; always (b) out1 = b;endmodule aout2BUFFbINVout1 Verilog中reg与wire的不同点52用寄存器 ( reg )类型变量生成触发器的例子:module rw2( clk, d, out1, out2 ) ; input cl

35、k, d; output out1, out2; reg out1; wire out2; assign out2 =d & out1; always (posedge clk) out1 (大于) =(不小于)=(不大于)关系操作符的结果为真( 1 b1)或假( 1 b0)或1 bx。3.4.5 相等操作符(掌握)61 逻辑等 逻辑不等=! =module equalities_test; reg 3: 0 rega, regb, regc; reg val; initial begin rega = 4b0011; regb = 4b1010; regc = 4b1x10; #10 val

36、 = (rega = regb); / val = 0 #20 val = (rega != regc); / val = 1 #30 val =(regb != regc); / val = x #50 $finish; endendmodule 其结果是1b1、1b0或1bx。 如果左边及右边为确定值,并且相等,则结果为1。 如果左边及右边为确定值,并且不相等,则结果为0。 如果左边及右边有值不能确定的位,但值确定的位相等,则结果为x。!=的结果与= =相反值确定是指所有的位为0或1。不确定值是有值为x或z的位。=! = 相等操作符(了解)62 相同(case等) 不相同(case不等)=

37、!=module equalities2_test; reg 3: 0 rega, regb, regc; reg val; initial begin rega = 4b0011; regb = 4b1010; regc = 4b1x10; #10 val = (rega = regb) ; / val = 0 #20 val =( rega != regc); / val = 1 #30 val =(regb = regc); / val = 0 #50 $finish; end endmodule 其结果是1b1、1b0或1bx。 如果左边及右边的值相同(包括x、z),则结果为1。如果左

38、边及右边的值不相同,则结果为0。!=的结果与 = 相反综合工具不支持!,也就是说没有相应的电路来对应这种操作符。=!=3.4.6 条件操作符63 条件操作符的语法为: = ? :;其意思是:if condition is TRUE, then LHS=true_expression, else LHS = false_expression每个条件操作符必须有三个参数,缺少任何一个都会产生错误。最后一个操作数作为缺省值。例如:assign out = (sel = 0) ? a : b;若sel为0则out =a;若sel为1则out = b;如果sel为x或z,则结果可能为x或z。 条件操作符

39、-使用实例64module likebufif( in, en, out); input in; input en; output out; assign out = (en = 1) ? in : bz;endmodulemodule like4to1( a, b, c, d, sel, out); input a, b, c, d; input 1: 0 sel; output out; assign out = sel = 2b00 ? a : sel = 2b01 ? b : sel = 2b10 ? c : d;endmodule如果条件值为x或z,则结果可能为x或z3.4.7 移位操作符65移位操作符有: (右移) 如 rega

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论