收藏 分享(赏)

Verilog基本语法.ppt

上传人:weiwoduzun 文档编号:3758516 上传时间:2018-11-18 格式:PPT 页数:71 大小:550KB
下载 相关 举报
Verilog基本语法.ppt_第1页
第1页 / 共71页
Verilog基本语法.ppt_第2页
第2页 / 共71页
Verilog基本语法.ppt_第3页
第3页 / 共71页
Verilog基本语法.ppt_第4页
第4页 / 共71页
Verilog基本语法.ppt_第5页
第5页 / 共71页
点击查看更多>>
资源描述

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

2、le)结构基本要素,知识点:3.1.1 端口信息 3.1.2 输入/输出说明 3.1.3 逻辑功能描述,5,3.1.1 端口信息,1,端口在模块名字后的括号中列出,3,端口可以说明为input, output及inout,2,端口等价于硬件的引脚(pin),模块通过端口与外部通信,6,Verilog 模块的结构由在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 endmodule,3.1.2 端口说明,7,3.1.3 逻辑功能描述,module mux2to1 (out, a, b, sel);input a, b, sel;output out; wire out;assign out=(sel)?b:a; endmodule,两路选择器的RTL级描述1:,8,两路选择器的RTL级描述2:,module mux2to1 (out, a, b, sel);input a, b, sel;output out; reg out;a

4、lways ( sel or a or b)if (! sel) out = a;else out = b; endmodule,9,1. 端口信息 2. 输入/输出说明 3. 逻辑功能描述(实例化实现功能描述),实例化(module instances):,10,module 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,两路选择器的门级描述-实例化

5、:,11,请在下面的空格中填入适当的符号使其成为右图的Verilog 模块 :module block1(a, b, , , );input , , ; d, ;assign d = a | ( b _,练习:编写Verilog HDL模块,a,b,c,d,e,12,module block1(a, b, c, d, e );input a, b, c;output d, e ;assign d = a | ( b endmodule,练习答案:编写Verilog HDL模块,a,b,c,d,e,13,3.2 Verilog HDL中的词汇约定,知识点: 3.2.1 术语及定义 3.2.2 空

6、白符和注释 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 文本替换,14,3.2.1 术语及定义,1.空白符:空格、tabs及换行 2. 标志符(Identifier):Verilog中对象(如模块或信号)的名字 3.LSB:最低有效位(Lease significant bit) 4.MSB:最高有效位(Most significant bit),15,3.2.2 空白符和注释,module MUX2_1 (out, a, b, sel

7、);/ Port declarationsoutput out;input sel; / control inputinput b, a; /* data inputs */ wire sel_, a1, b1;/*The netlist logic selects input ”a” whensel = 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, a1, b1); endmodule,格式自由 使用空白符

8、提高可读性及代码组织。Verilog忽略空白符除非用于分开其它的语言标记。,多行注释,在/* */内,单行注释 到行末结束,16,3.2.3 Verilog采用的四值逻辑系统,0, 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 Impedance, Tri- Stated,

9、Disabled Driver (Unknown),17,3.2.4 整数常量和实数常量,Verilog中,常量(literals)可是整数也可以是实数。 1.整数的大小可以定义也可以不定义。整数表示为:其中 size :位数大小,由十进制数表示的位数(bit)表示。缺省为32位base:数基,可为2(b)、8(o)、10(d)、16(h)进制。缺省为10进制value:是所选数基内任意有效数字,包括 X、Z。 2.实数常量可以用十进制或科学表示法表示。,18,整数与实数常量例子,19,整数和实数常量小结,整数的大小可以定义也可以不定义。整数表示为: 数字中(_ )忽略,便于查看 没有定义大小

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

11、nds with a new linen”This string formats a value: val = %b”,Verilog中,字符串大多用于显示信息的命令中。(只用在测试中!),21,格式符,转义符,格式符%0d表示没有前导0的十进制数,22,3.2.6 标识符(identifiers) (重点),标识符是用户在描述时给Verilog对象(电路模块、信号等)起的名字 标识符必须以字母(a-z, A-Z)或( _ )开头,后面可以是字母、数字、( $ )或( _ )。 最长可以是1023个字符 标识符区分大小写,sel和SEL是不同的标识符 例如:module MUX2_1 (out

12、, 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);endmodule,Verilog标识符,23,有效标识符举例:shift_reg_abusa_index_bus3 无效标识符举例:34net / 开头不是字母或“_”a*b_net / 包含了非字母或数字, “$” “_”n238 /包含了非字母或数字, “$” “_” Verilog区分大小写,所有Ve

13、rilog关键词如module、endmodule等都使用小写字母。,24,3.2.7 系统任务及函数(了解),使用方式:$ $符号指示这是系统任务和函数 系统函数有很多,如: 返回当前仿真时间$time 显示/监视信号值($display, $monitor) 停止仿真$stop 结束仿真$finish如: $monitor($time, “a = %b, b = %h”, a, b);当信号a或b的值发生变化时,系统任务$monitor显示当前仿真时间,信号a值(二进制格式), 信号b值(16进制格式)。,25,3.2.8 编译指导 (了解),( )符号说明一个编译指导 这些编译指导使仿真

14、编译器进行一些特殊的操作 编译指导一直保持有效直到被覆盖或解除,26,3.2.9 文本包含include (了解),编译指导include在当前内容中插入一个文件格式: include “”如 include “global.v“include “parts/count. v“include “/library/mux. v” include可用于: include保存在文件中的全局的或经常用到的一些定义,如文本宏 在模块内部include一些任务(tasks),提高代码的可维护性。,可以是相对路径或绝对路径,27,3.2.10 文本替换define (了解),编译指导define提供了一种简

15、单的文本替换的功能 define 在编译时替换。可提高描述的可读性。,define not_delay #1 define and_delay #2 define or_delay #1 module 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 or1( out, a1, b1);

16、endmodule,定义not_delay,使用not_delay,28,文本替换 (了解),解除定义的宏,使用undef macro_name 使用编译指导define,可以 提高描述的可读性 定义全局设计参数,如延时和矢量的位数。这些参数可以定义在同一位置。这样,当要修改设计配置时,只需要在一个地方修改。 定义Verilog命令的简写形式define vectors_ file “/usr1/chrisz/library/vectors“define results_ file “/ usr1/chrisz/library/results“ 可以将define放在一个文件中,与其它文件一起

17、编译。,29,3.3 Verilog HDL 数据类型,知识点: 3.3.1 线网类型 3.3.2 寄存器类型 3.3.3 参数 3.3.4 位选择 3.3.5 总结,30,3.3 Verilog HDL 数据类型,Verilog HDL 有两大类数据类型。 1. 线网类型(net type): 表示Verilog结构化元件间的物理连线。它的值由驱动元件的值决定,例如连续赋值或门的输出。如果没有驱动元件连接到线网,线网的缺省值为z。 2. 寄存器类型(register type):表示一个抽象的数据存储单元,它只能在always语句和initial语句等过程语句中被赋值,并且它的值从一个赋值到

18、另一个赋值被保存下来。寄存器类型的变量具有x的缺省值。,31,3.3.1 net(线网)型,net需要被持续的驱动,驱动它的可以是门和模块。当net驱动器的值发生变化时, 新值被传送到net上。 在下例中,线网out由or门驱动。当or门的输入信号置位时将传输到线网net上。,32,net类的类型(线网),有多种net类型用于设计(design-specific)建模和工艺(technology-specific)建模没有声明的net的缺省类型为 1 位(标量)wire类型。但这个缺省类型可由下面的编译指导改变:default_nettype ,综合编译器不支持的net类型,33,线网数据类型

19、,可综合的线网数据类型包含下述:wire Wor wand tri supply0 supply1最常用的是wire!,34,简单的线网类型说明语法为:net_kind msb : lsb net1, . . , netN;解释:1. net_kind 是上述线网类型的一种;2. msb和lsb 是用于定义线网范围的常量表达式,如果没有定义,缺省为1位。 例1:wire rst, data; /1位的复位线和数据线。 例2: wire 2:0 Addr1 ; /Addr1是3位地址线wire 3:1 Addr2; /Addr2是3位地址线,线网数据类型-使用语法,35,线网型变量使用举例,mo

20、dule 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级描述,36,3.3.2 寄存器的类型,寄存器类有四种数据类型,37,寄存器类型reg-使用语法,reg是寄存器数据类型最常见的数据类型。使用语法形式如下:reg msb: lsb reg1,. . . ,regN;msb和lsb 定义了范围,并且均为常数值表达式;如果没有定义范围,缺省值为1位寄存器。例1: r

21、eg 3:0 counter1 ; /4 位寄存器。例2: reg counter2 ; / 1位寄存器。例3: reg 31:0 data_buffer1 ;reg 32:1 data_buffer2 ;,38,常见的寄存器类型: Integer,integer A, B, C ; /三个整数型寄存器。说明:1. 与reg不同,integer可以表示有符号数,并且算术操作符提供2的补码运算结果。2. 同时,如上例定义的A,B,C变量它们分别是32位( 32-bit )的寄存器变量。,39,寄存器型变量使用举例,module mux2to1 (out, a, b, sel);input a,

22、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级描述,40,如何给模块端口信号选择正确的数据类型?,module top(A,B,Y ); input A,B; output Y;reg A1,B1;/wire?wire Y1; /reg?/对于信号Y,A,B呢?DUT u1 (Y1, A1, B1) ;DUT u2 (Y, A, B) ;endmodule,modul

23、e 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则会产生错误。,in1,in2,O,A,B,Y,或者: wire O; assign O=in1+in2;,41,练习-选择数据类型时常犯的错误,修改前: module example(

24、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 o2reg o1;and u1(o2, c, d);always (a or b)if (a) o1 = b; else o1 = 0; endmodul

25、e,example.v,或者换成: always (c or d) o2=c,或者换成: assign o2=c,42,3.3.3 参数,参数是一个常量。参数定义的语法:parameter ; 如:parameter WIDTH = 8h20;parameter BYTE =4h8;,43,参数(parameters)-使用举例,module mod1( out, in1, in2);. . . . .parameter WORD_WIDTH = 8;. . . . .wire WORD_WIDTH-1: 0 in1;/ A wire declaration using parameter.

26、. . . . endmodule,例:,44,参数(parameters)使用注意事项,1. 推荐:一般定义参数等常量名称用大写,变量名称用小写! 2. 可一次定义多个参数,用逗号隔开。如:parameter WORD_WIDTH = 32, ADDR_WIDTH = 8;等同于:parameter WORD_WIDTH = 32;parameter ADDR_WIDTH = 8;,45,(parameters)使用注意事项(cont.),3. 参数的定义是局部的,只在当前模块中有效。如:在工程Multi-CPU中一个文件a.v中定义parameter WORD_WIDTH = 32;在同一

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

28、ut 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;. . . endmodule,47,或在文件cpu_param.v中定义:define ADDR_WIDTH 12define DATA_WIDTH 32然后在文件sram_control.v中如下使用:include cpu_param.

29、vmodule 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 data_out;parameter MEMORY_DEPTH = 1024;. . .endmodule,48,3.3.4 位选择,位选择从向量中抽

30、取特定的位。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类型变量,然后从中选取相应的位,如:integer Bint;reg 31:0 Breg;/ /由于Bint6和Bint20:10是不允许的。Breg = Bint; / 或 Breg = Bint; /*现在,Breg6和B

31、reg20:10是允许的,并且所取具体值,是整数Bint 相应的位值。*/,位选择注意事项,50,3.3.5 Verilog模块中常见信号类型-总结,两种主要的信号类型:- 寄存器类型:代表 reg 在always 等过程块中被赋值的信号,往往代表触发器,但不一定是触发器。 (时序逻辑电路中常常被综合为D触发器 ;纯组合逻辑电路中被综合为连线)- 连线类型:代表 wire用 assign 关键词指定连续/持续赋值所描述的组合逻辑的信号或连线。,51,Verilog中reg与wire的不同点,用寄存器 (reg)类型变量生成组合逻辑举例: module rw1( a, b, out1, out2

32、 ) ;input a, b;output out1, out2;reg out1;wire out2;assign out2 = a ;always (b) out1 = b; endmodule,a,out2,BUFF,b,INV,out1,52,Verilog中reg与wire的不同点,用寄存器 ( reg )类型变量生成触发器的例子: module rw2( clk, d, out1, out2 ) ;input clk, d;output out1, out2;reg out1;wire out2;assign out2 =d endmodule,d,out2,AND2i1,clk,

33、D,Q,out1,53,3.4 Verilog HDL 运算符,知识点: 3.4.1 算术操作符 3.4.2 逻辑运算符 3.4.3 按位操作符 3.4.4 关系运算符 3.4.5 相等操作符 3.4.6 条件操作符 3.4.7 移位操作符 3.4.8 连接操作 3.4.9 复制操作,54,3.4.1 算术操作符,module arithops_test;parameter FIVE = 5;integer ans, int;reg 3: 0 rega, regb;reg 3: 0 num;initial beginrega = 3;regb = 4b1010;int = -3; /int =

34、 11111111_1101#10 ans = FIVE * int; / ans = -15#20 ans = (int + 5)/ 2; / ans = 1#30 ans = FIVE/ int; / ans = -1#50 num = rega + 1; / num = 0100#60 num = int; / num = 1101#70 num = regb % rega; / num = 1#80 $finish;endendmodule,+ 加 - 减 * 乘 / 除 % 模,将负数赋值给reg或其它无符号变量,使用2的补码算术。如果操作数的某一位是x或z,则结果为x在整数除法中,

35、余数舍弃模运算中使用第一个操作数的符号,注意integer和reg类型在算术运算时的差别。integer是有符号数,而reg是无符号数。,55,3.4.2 逻辑运算符,逻辑操作符有:& (逻辑与)| (逻辑或) !(逻辑非) 这些操作符在逻辑值0或1上操作。逻辑操作的结构为0或1。,56,逻辑运算符例一,例如, 假定:Crd = 1b0; /0为假Dgs = 1b1; /1为真 那么:Crd & Dgs 结果为0 (假)Crd | Dgs 结果为1 (真)! Dgs 结果为0 (假),57,逻辑运算符例二,对于向量操作, 非0向量作为1处理。例如,假定:A = 4b0110;B = 4b010

36、0; 那么:A | B 结果为?A & B 结果为? 并且: ! A 与! B 的结果相同,为?。,58,3.4.3 按位操作符,按位操作符有: (一元非) &(二元与) |(二元或) (二元异或) , (二元异或非),59,按位操作符例一,例如,假定,A =4 b0110;B =4 b0100; 那么:A | B 结果为?, A | B结果为?A & B 结果为? ,A & B 结果为?A=? , !A=?,60,3.4.4 关系运算符,关系操作符有:(大于)=(不小于) =(不大于) 关系操作符的结果为真( 1 b1)或假( 1 b0)或1 bx。,61,3.4.5 相等操作符(掌握),逻

37、辑等逻辑不等,= ! =,module equalities_test;reg 3: 0 rega, regb, regc;reg val;initial beginrega = 4b0011;regb = 4b1010;regc = 4b1x10;#10 val = (rega = regb); / val = 0#20 val = (rega != regc); / val = 1#30 val =(regb != regc); / val = x#50 $finish;end endmodule,其结果是1b1、1b0或1bx。如果左边及右边为确定值,并且相等,则结果为1。如果左边及右边

38、为确定值,并且不相等,则结果为0。如果左边及右边有值不能确定的位,但值确定的位相等,则结果为x。 !=的结果与= =相反,值确定是指所有的位为0或1。不确定值是有值为x或z的位。,= ! =,62,相等操作符(了解),相同(case等)不相同(case不等),= !=,module equalities2_test;reg 3: 0 rega, regb, regc;reg val;initial beginrega = 4b0011;regb = 4b1010;regc = 4b1x10;#10 val = (rega = regb) ; / val = 0#20 val =( rega !

39、= regc); / val = 1#30 val =(regb = regc); / val = 0#50 $finish;end endmodule,其结果是1b1、1b0或1bx。如果左边及右边的值相同(包括x、z),则结果为1。 如果左边及右边的值不相同,则结果为0。 !=的结果与 = 相反,综合工具不支持!,也就是说没有相应的电路来对应这种操作符。,= !=,63,3.4.6 条件操作符,条件操作符的语法为:= ? :;,其意思是:if condition is TRUE, then LHS=true_expression, else LHS = false_expression,每

40、个条件操作符必须有三个参数,缺少任何一个都会产生错误。最后一个操作数作为缺省值。,例如:assign out = (sel = 0) ? a : b;,若sel为0则out =a;若sel为1则out = b;如果sel为x或z,则结果可能为x或z。,64,条件操作符-使用实例,module 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;in

41、put 1: 0 sel;output out;assign out = sel = 2b00 ? a :sel = 2b01 ? b :sel = 2b10 ? c : d; endmodule,如果条件值为x或z,则结果可能为x或z,65,3.4.7 移位操作符,移位操作符有: (右移)如 rega 3 意思是rega向右移3位;,移位操作符对其左边的操作数进行向左或向右的位移位操作。 第二个操作数(移位位数)是无符号数。,66,module shift_test;reg 9: 0 num, num1;reg 7: 0 rega, regb; /如果rega = 8b0000 1100;

42、num 3; / num1=10b00 0000 0001 endmodule,左移先补后移 右移先移后补,建议:移位操作最好表达式左右两边位数一致,如上面的 reg 7: 0 rega, regb;,67,3.4.8 连接操作,连接操作是将小表达式合并形成大表达式的操作。形式如下:expr1, expr2, . . .,exprN,68,连接操作实例,wire 9:0 d;wire 9:0 a;assign d9:5 = a0, a1, a2, a3, a4 ; /以反转的顺序将a的低端4位赋给d的高端4位。assign d= d4:0, d9:5 ;/高4位与低4位交换。,69,由于非定长

43、常数的长度未知, 不允许连接非定长常数。例如, 下列式子非法:reg 16:0 a;reg 31:0 d;d= a,5; /error!不允许连接操作非定长常数。d= a,16h0005; / error!右边33位,左边32位,位宽不匹配,一样会出错改为: d= a, 15h5;,连接操作注意事项,70,3.4.9 复制操作,复制通过指定重复次数来执行操作。语法形式如下:repetition_numberexpr1,expr2, .,exprn ,71,例一: wire 7:0 d; wire 11:0 a; assign d=24b1011; /d等于8b1011 1011 assign a= 4d7, d; /a为12b1111 1011 1011/注意: assign a= 4d7, d; /error,why? 例二:/*符号扩展*/ 31b1 结果为3b111 3Ack 结果与Ack, Ack, Ack相同,复制操作实例,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 语法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报