62
Verilog HDL Verilog HDL 基基基基基基 基基基基基基

Verilog HDL 基础语法入门

  • Upload
    raleigh

  • View
    246

  • Download
    0

Embed Size (px)

DESCRIPTION

Verilog HDL 基础语法入门. 第一讲 课程简介. 目的: 简单介绍 Verilog HDL 语言和仿真工具 介绍讲课计划 介绍如何不断地学习新的有关知识. 讲座中关于 Verilog HDL 的主要内容. 讲课内容主要包括: Verilog 的应用 Verilog 语言的组成部件 结构级的建模与仿真 行为级的建模与仿真 延迟参数的表示 Verilog 的测试平台: 怎样产生激励信号和控制信号 输出响应的产生、记录和验证 任务和函数 用户定义的元器件( primitives ) 可综合风格的 Verilog 建模. - PowerPoint PPT Presentation

Citation preview

Page 1: Verilog HDL  基础语法入门

Verilog HDL Verilog HDL

基础语法入门基础语法入门

Verilog HDL Verilog HDL

基础语法入门基础语法入门

Page 2: Verilog HDL  基础语法入门

第一讲 课程简介

目的: 简单介绍 Verilog HDL 语言和仿真工具 介绍讲课计划 介绍如何不断地学习新的有关知识

Page 3: Verilog HDL  基础语法入门

讲座中关于 Verilog HDL 的主要内容

讲课内容主要包括:Verilog 的应用Verilog 语言的组成部件 结构级的建模与仿真行为级的建模与仿真延迟参数的表示Verilog 的测试平台: 怎样产生激励信号和控制信号 输出响应的产生、记录和验证

任务和函数用户定义的元器件( primitives )可综合风格的 Verilog 建模

Page 4: Verilog HDL  基础语法入门

讲座中关于 Verilog 仿真工具的主要内容

讲课内容主要包括:

如何对所做的设计进行编译和仿真如何使用元器件库如何用 Verilog-XL 命令行界面调试代码如何用图形用户界面( GUI )延迟的计算和标记仿真性能建模循环多次仿真

Page 5: Verilog HDL  基础语法入门

目的 : 了解用 HDL 语言设计数字逻辑的优点 了解 Verilog 主要应用领域 了解 Verilog 的发展历史 了解电路系统的不同层次的 Verilog 抽象

第二讲: Verilog 的应用

Page 6: Verilog HDL  基础语法入门

Verilog HDL 是一种用于数字逻辑电路设计的语言 :

- 用 Verilog HDL 描述的电路设计就是该电路 的 Verilog HDL 模型。- Verilog HDL 既是一种行为描述的语言也 是一种结构描述的语言。这也就是说,既可以用电路的功能描述也可以用元器件和它们之间的连接来建立所设计电路的 Ve

rilog HDL 模型。 Verilog 模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下五种:

Verilog 的应用

Page 7: Verilog HDL  基础语法入门

Verilog 的应用

• 系统级 (system): 用高级语言结构实现设计模块的外部性能的模

• 算法级 (algorithmic): 用高级语言结构实现设计算法的模型。

• RTL 级 (Register Transfer Level): 描述数据在寄存器之间流动和如何处理这些数据的模型。

• 门级 (gate-level): 描述逻辑门以及逻辑门之间的连接的模型。

• 开关级 (switch-level): 描述器件中三极管和储存节点以及它们之间连接的模型。

Page 8: Verilog HDL  基础语法入门

Verilog 的应用

一个复杂电路的完整 Verilog HDL 模型是由若个 Verilog HDL 模块构成的,每一个模块又可以由若干个子模块构成。

利用 Verilog HDL 语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计。

Verilog HDL 行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和 RTL 级的模型设计。这种行为描述语言具有以下八项功能:

Page 9: Verilog HDL  基础语法入门

Verilog 的应用

• 可描述顺序执行或并行执行的程序结构。• 用延迟表达式或事件表达式来明确地控制过程的启动

时间。• 通过命名的事件来触发其它过程里的激活行为或停止

行为。• 提供了条件、 if-else 、 case 、循环程序结构。• 提供了可带参数且非零延续时间的任务 (task) 程序

结构。• 提供了可定义新的操作符的函数结构 (function) 。

Page 10: Verilog HDL  基础语法入门

Verilog 的应用

提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。

Verilog HDL 语言作为一种结构化的语言也非常适合于门级和开关级的模型设计。

Verilog HDL 的构造性语句可以精确地建立信号的模型。这是因为在 Verilog HDL 中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响。

Page 11: Verilog HDL  基础语法入门

Verilog 的应用

Verilog HDL 作为一种高级的硬件描述编程语言,有着类似 C 语言的风格。其中有许多语句如: if 语句、 case 语句等和 C 语言中的对应语句十分相似。如果读者已经掌握 C 语言编程的基础,那么学习 Verilog HDL并不困难,我们只要对 Verilog HDL某些语句的特殊方面着重理解,并加强上机练习就能很好地掌握它,利用它的强大功能来设计复杂的数字逻辑电路。下面我们将对 Verilog HDL 中的基本语法逐一加以介绍。

Page 12: Verilog HDL  基础语法入门

模块的抽象

技术指标:用文字表示用算法表示用高级行为的 Verilog 模块表示

RTL/功能级:用可综合的 Verilog 模块表示

门级 /结构级:用实例引用的 Verilog 模块表示

版图布局 /物理级:用几何形状来表示

行为综合

逻辑综合

综合前仿真

综合后仿真

布局布线

Page 13: Verilog HDL  基础语法入门

第三讲 .简单的 Verilog HDL 模块

目的 :

通过简单的例子了解 Verilog 模块的基本构成 了解 Verilog 模块的层次结构和行为模块 了解 Verilog 模块的测试

Page 14: Verilog HDL  基础语法入门

简单的 Verilog HDL 模块

下面先介绍几个简单的 Verilog HDL 程序 , 然后从中分析 Verilog HDL 程序的特性。

例 [2.1.1]: module adder ( count,sum,a,b,cin ); input [2:0] a,b; input cin; output count; output [2:0] sum; assign {count,sum}=a+b+cin; endmodule 这个例子描述了一个三位的加法器。从例子中可以看

出整个 Verilog HDL 程序是嵌套在 module 和 endmodule声明语句里的。

Page 15: Verilog HDL  基础语法入门

简单的 Verilog HDL 模块

例 [2.1.2]:module compare ( equal,a,b ); output equal; // 声明输出信号 equal input [1:0] a,b; // 声明输入信号 a,b assign equal= ( a==b )? 1 : 0; /* 如果两个输入信号相等 , 输出为 1 。否则为 0*/endmodule

这个程序描述了一个比较器 .在这个程序中 ,/*........*/和 //.........表示注释部分 , 注释只是为了方便程序员理解程序 ,对编译是不起作用的。

Page 16: Verilog HDL  基础语法入门

简单的 Verilog HDL 模块

例 [2.1.3]:

module trist2(out,in,enable); output out; input in, enable; bufif1 mybuf(out,in,enable);endmodule

这个程序描述了一个三态驱动器。程序通过调用一个实例元件 bufif1来实现其功能。

Page 17: Verilog HDL  基础语法入门

简单的 Verilog HDL 模块

例 [2.1.4]: module trist1(out,in,enable); output out; input in, enable; mytri tri_inst(out,in,enable); endmodule

module mytri(out,in,enable); output out; input in, enable; assign out = enable? In : 'bz; endmodule

Page 18: Verilog HDL  基础语法入门

简单的 Verilog HDL 模块

上述程序例子通过另一种方法描述了一个三态门。

在这个例子中存在着两个模块:模块 trist1 调用模块 mytri 的实例元件 tri_inst 。

模块 trist1 是上层模块。模块 mytri 则被称为子模块。

通过这种结构性模块构造可构成特大型模块。

Page 19: Verilog HDL  基础语法入门

简单的 Verilog HDL 模块

通过上面的例子可以看到 :• Verilog HDL 程序是由模块构成的。模块是可以进行层次嵌套的。正

因为如此 , 才可以将大型的数字电路设计分割成不同的小模块来实现特定的功能 , 最后通过顶层模块调用子模块来实现整体功能。

• 每个模块要进行端口定义 , 并说明输入输出口 , 然后对模块的功能进行行为逻辑描述。

• Verilog HDL 程序的书写格式自由 , 一行可以写几个语句 , 一个语句也可以分写多行。

• 除了 endmodule 语句外 , 每个语句和数据定义的最后必须有分号

• 可以用 /*.....*/ 和 //... 对 Verilog HDL 程序的任何部分作注释。一个好的 , 有使用价值的源程序都应当加上必要的注释 , 以增强程序的可读性和可维护性。

Page 20: Verilog HDL  基础语法入门

模块的结构

Verilog 的基本设计单元是“模块” (block)。一个模块是由两部分组成的:一)描述接口;二)描述逻辑功能,即定义输入是如何影响输出的。下面举例说明:

module block (a,b,c,d);input a,b;output c,d;

assign c= a | b ;assign d= a & b;endmodule

a

b

c

d

Page 21: Verilog HDL  基础语法入门

模块的结构

从上面的例子可以看出:

- Verilog 模块结构完全嵌在 module 和endmodule声明语句之间;

- 每个 Verilog 程序包括四个主要部分:端口定义、 I/O 说明、内部信号声明、功能定义。

Page 22: Verilog HDL  基础语法入门

第四讲 模块的测试

如何检查上述例子其功能是否正确?

需要有测试激励信号输入到被测模块 需要记录被测模块的输出信号 需要把用功能和行为描述的 Verilog 模块 转换为门级电路互连的电路结构(综合)。 需要对已经转换为门级电路结构的逻辑 进行测试(门级电路仿真)。 需要对布局布线后的电路结构进行测试。 (布局布线后仿真)。

Page 23: Verilog HDL  基础语法入门

模块的测试

被测模块

激励和 控制信号

输出响应和验证

Page 24: Verilog HDL  基础语法入门

模块的测试

测试模块常见的形式:module t;reg …; //被测模块输入 / 输出变量类型定义wire…; //被测模块输入 / 输出变量类型定义initial begin …; …; …; end … …// 产生测试信号always #delay begin …; end … …// 产生测试信号

Testedmd m(.in1(ina), .in2(inb), .out1(outa), .out2(outb) );//被测模块的实例引用

initial begin ….; ….; …. end // 记录输出和响应endmodule

Page 25: Verilog HDL  基础语法入门

模块的测试

测试模块中常用的过程块:

initial always

所有的过程块都在 0 时刻同时启动;它们是并行的,在模块中不分前后。 initial 块 只执行一次。 always 块 只要符合触发条件可以循环执行。

Page 26: Verilog HDL  基础语法入门

模块的测试

如何描述激励信号:module t;reg a, b, sel;wire out;// 引用多路器实例 mux2_m (out, a, b, sel);//加入激励信号initial begin a=0; b=1; sel=0; #10 b=0; #10 b=1; sel=1; #10 a=1; #10 $stop; end

Page 27: Verilog HDL  基础语法入门

模块的测试

如何观察被测模块的响应: 在 initial 块中,用系统任务 $time 和 $monitor $time 返回当前的仿真时刻 $monitor 只要在其变量列表中有某一个或某几个变 量值发生变化,便在仿真单位时间结束时显示其变 量列表中所有变量的值。

例: initial begin $monitor ($time, , “out=%b a=%b sel=%b”, out,a,b,sel); end

Page 28: Verilog HDL  基础语法入门

模块的测试

如何把被测模块的输出变化记录到数据库文件中?(文件格式为 VCD, 大多数的波形显示工具都能读取该格式)可用以下七个系统任务:

1) $dumpfile(“file.dump”); //打开记录数据变化的数据文件2) $dumpvars(); //选择需要记录的变量3) $dumpflush; //把记录在数据文件中的资料转送到硬盘保存4) $dumpoff; //停止记录数据变化5) $dumpon; //重新开始记录数据变化6) $dumplimit(<file_size>); //规定数据文件的大小(字节)7) $dumpall; // 记录所有指定信号的变化值到数据文件中

Page 29: Verilog HDL  基础语法入门

模块的测试

如何把被测模块的响应变化记录到数据库文件中?举例说明:$dumpvars; // 记录各层次模块中所有信号的变化$dumpvars(1,top); //只记录模块 top中所有信号的变化$dumpvars(2,top.u1); // 记录 top模块中实例 u1 和它以下一层子模块所有信号的变化$dumpvars(0,top.u2,top.u1.u13.q); // 记录 top模块中实例 u2和它本层所有信号的变化 ,还有 top.u1.u13.q信号的变化。$dumpvars(3,top.u2,top.u1); // 记录 top模块中 u2和 u1 所有信号的变化(包括其两层以下子模块的

信号变化)。

Page 30: Verilog HDL  基础语法入门

模块的测试

如何把被测模块的响应变化记录到数据库文件中?

举例说明:下面的 Verilog 代码段可以代替测试文件中的系统任

务 $monitor initial begin $dumpfile(“vlog.dump”); $dumpvars(0,top); end

Page 31: Verilog HDL  基础语法入门

语法详细讲解第五讲 . Verilog 语法要点

目标 : 理解 Verilog 语言的一些重要规定 .

学会认识一些有关的重要语言符号 .

掌握 Verilog 中如何规定时间单位

Page 32: Verilog HDL  基础语法入门

语法详细讲解Verilog 与 C 的主要不同点

Verilog 有许多语法规则与 C 语言一致。 但与 C 语言有根本的区别:

- 并行性

- 块的含义: initial 块 和 always 块- 两种赋值语句: 阻塞 赋值 “ = ”

非阻塞赋值 “〈 = ”

Page 33: Verilog HDL  基础语法入门

语法详细讲解空格和注释

Verilog 是一种格式很自由的语言。 空格在文本中起一个分离符的作用,

别的没有其他用处。 单行注释符用 //*********

与 C 语言一致 多行注释符用 /* ------------------------- */

与 C 语言一致

Page 34: Verilog HDL  基础语法入门

语法详细讲解整数和实常数

Verilog 语言中常数可以是整数或实数: 整数可以标明位数也可以不标明位数,表示方法: 《位数》‘《基数》《值》 其中《位数》表明该数用二进制的几位来表示 《基数》可以是二( b)、八( O)、十( d )或 十六( h)进制 《数值》可以是所选基数的任何合法的值包括 不定值 x 位和高阻值 z。如 :64‘hff01 8’b1101_0001 ‘h83a

实常数可以用十进制表示也可以用科学浮点数表示,如: 32e-4 (表示 0.0032) 4.1E3( 表示 4100 )

Page 35: Verilog HDL  基础语法入门

语法详细讲解字符串

Verilog 语言中,字符串常常用于表示命令内需要显示的信息。

用“ ”括起来的一行字符串,换新一行用 “ \n” 字符 , 与 C 语言一致。

在字符串中可以用 C 语言中的各种格式控制符,如 \t, \”, \\…

在字符串中可以用 C 语言中的各种数值型式控制符 ( 有些不同 ) ,如:

%b( 二进制 ), %o( 八进制 ) , %d( 十进制 ), %h(十六进制 ), %t( 时间类型 ) ,%s ( 字符串类型 )…

Page 36: Verilog HDL  基础语法入门

语法详细讲解标识符

所谓标识别符就是用户为程序描述中的 Verilog 对象所起的名字。

标识符必须以英语字母( a-z, A-Z )起头,或者用下横线符( _ )起头。其中可以包含数字、 $符和下横线符。

标识符最长可以达到 1023个字符。

模块名、端口名和实例名都是标识符。

Verilog 语言是大小写敏感的,因此 sel 和 SEL 是两个不同的标识符。

Page 37: Verilog HDL  基础语法入门

语法详细讲解合法和非法标识符

合法的:shift_reg_a busa_index

bus263

非法的:34net // 不能用数字开头

a*b_net // 不能含有非字母符号 *

n@263 // 不能含有非字母符号 @

Verilog 是大小写敏感的。所有的 Verilog 关键词都是小写的。

Page 38: Verilog HDL  基础语法入门

语法详细讲解特别的标识符

特别标识符是用 “ \” 符开始,以空格符结束的标 识符。它可以包含任何可打印的 ASCII字符。

但“ \”符和空格并不算是标识符的一部分。

特别标识符往往是由 RTL 级源代码或电路图类型的 设计输入经过综合器自动综合生成的网表结构型 Verilog 语句中的标识符。举例说明:\~#@sel , \bus+index , \{A,B} ,Top.\3inst .net1 , //在层次模块中的标识名

Page 39: Verilog HDL  基础语法入门

语法详细讲解系统任务和函数

$< 标识符 > ‘$’ 符号表示 Verilog 的系统任务和函数 常用的系统任务和函数有下面几种:1) $time //找到当前的仿真时间2) $display, $monitor //显示和监视信号值的变化3) $stop //暂停仿真4) $finish // 结束仿真-------------------------------------------------------例: initial $monitor($time,,”a=%b, b=%b”, a, b); // 每当 a 或 b值变化时该系统任务都显示当前的仿真时刻并分别用二进

制和十六进制显示信号 a和 b的值

Page 40: Verilog HDL  基础语法入门

语法详细讲解特殊符号 “#”

特殊符号 “ #” 常用来表示延迟:

在过程赋值语句时表示延迟。例: initial begin #10 rst=1; #50 rst=0; end

在门级实例引用时表示延迟。例: not #1 not1(nsel, sel); and #2 and2(a1, a, nsel);

在模块实例引用时表示参数传递 介绍参数类型变量时再讲。。。。

Page 41: Verilog HDL  基础语法入门

语法详细讲解编译引导语句

编译引导语句用主键盘左上角小写键 “ ` ” 起头 用于指导仿真编译器在编译时采取一些特殊处理 编译引导语句一直保持有效,直到被取消或重写 `resetall 编译引导语句把所有设置的编译引导恢复到缺省状态

常用的编译引导有:a) `defineb) `includec) `timescaled) `uselibe) `resetall

……..

Page 42: Verilog HDL  基础语法入门

语法详细讲解编译引导语句

使用 `define 编译引导能提供简单的文本替代功能 `define <宏名 > <宏文本 > 在编译时会用宏文本来替代源代码中的宏名。 合理地使用 `define 可以提高程序的可读性

举例说明:

`define on 1’b1`define off 1’b0`define and_delay #3在程序中可以用有含义的文字来表示没有意思的数码提高了程序的可读性,在程序中可以用 `on , `off , `and_delay 分别表示 1 , 0 ,和 #3 。

Page 43: Verilog HDL  基础语法入门

语法详细讲解编译引导语句

使用 `include 编译引导,在编译时能把其指定的整个文件包括进来一起处理

举例说明:`include “global.v”`include “parts/counter.v”`include “../../library/mux.v”

合理地使用 `include 可以使程序简洁、清晰、条理清楚、易于查错。

Page 44: Verilog HDL  基础语法入门

语法详细讲解编译引导语句

`timescale 用于说明程序中的时间单位和仿真精度举例说明: `timescale 1ns/100ps `timescale 语句必须放在模块边界前面举例说明: `timescale 1ns/100ps module MUX2_1(out,a,b,sel); … … not #1 not1(nsel, sel); and #2 and1(a1, a, nsel); … … endmodule 尽可能地使精度与时间单位接近,只要满足设计的实际需要就行。

举例说明:在上例中所有的时间单位都是 1ns 的整数倍

Page 45: Verilog HDL  基础语法入门

语法详细讲解编译引导语句

仿真步长即仿真单位( STU) 是所有参加仿真模块中由 `timescale 指定的精度中最高(即时间最短)的那个决定的: ( STU=100fs)

举例: `timescale 1ns/10ps module M1(….); not #1.23 not1(nsel, sel); //1.23 ns中共有 12300 个 STU ( 100fs) endmodule

`timescale 100ns/1ns module M2(….); not #1.23 not1(nsel, sel); //123 ns中共有 1230000 个 STU ( 100fs) endmodule

`timescale 1ps/100fs module M3(….); not #1.23 not1(nsel, sel); //1.23 ps中共有 12 个 STU ( 100fs) endmodule

Page 46: Verilog HDL  基础语法入门

语法详细讲解编译引导语句

时间单位 :

fs (呼秒) femptoseconds: 1.0E-15 秒 ps (皮秒) picoseconds: 1.0E-12 秒 ns (纳秒) nonoseconds: 1.0E-9 秒 us (微秒) microseconds: 1.0E-6 秒 ms (毫秒) milliseconds: 1.0E-3 秒 s ( 秒) seconds: 1.0 秒

Page 47: Verilog HDL  基础语法入门

语法详细讲解编译引导语句

`uselib 编译引导语句: 用于定义仿真器到哪里去找库元件 如果该引导语句启动的话,它就一直有效 直到遇到另外一个 `uselib 的定义或 `resetall语句

比其他配置库搜索路径的命令选项作用大 如果仿真器在 `uselib定义的地点找不到器件库,

它不会转向由编译命令行 -v 和 -y 选项指定的器件库去找。

Page 48: Verilog HDL  基础语法入门

语法详细讲解编译引导语句

使用 `uselib 的语法: `uselib 器件库 1 的地点 器件库 2 的地点 。。。上面的器件库地点可用以下两种方法表示:1 ) file = 库文件名的路径2 ) dir = 库目录名的路径 libext = . 文件扩展例如:`uselib dir =/lib/FAST_lib/`uselib dir =/lib/TTL_lib/ libext=.v file = /libs/TTL_U/udp.lib

Page 49: Verilog HDL  基础语法入门

语法详细讲解第六讲 Verilog 的数据类型和逻辑值

目的:

掌握 Verilog 不同逻辑值的含义

学习 Verilog 不同的数据类型

理解如何使用和在什么场合下使用不同的数据类型

学习声明数据类型的语法

Page 50: Verilog HDL  基础语法入门

语法详细讲解Verilog 的四种逻辑值

0 、低、伪、逻辑低、地、 VSS 、负插入0

1

X

Z0

buf

buf

buf

bufif1

1 、高、真、逻辑高、电源、 VDD 、正插入

X 、不确定:逻辑冲突无法确定其逻辑值

HiZ、高阻抗、三态、无驱动源

Page 51: Verilog HDL  基础语法入门

语法详细讲解主要的数据类型

Verilog 有三种主要的数据类型:

Nets 表示器件之间的物理连接 , 称为网络连接类型

Register 表示抽象的储存单元,称为寄存器 /变量类型

Parameter 表示运行时的常数,称为参数类型

Page 52: Verilog HDL  基础语法入门

语法详细讲解主要的数据类型

Nets(网络连线):

由模块或门驱动的连线。

驱动端信号的改变会立刻传递到输出的连线上。

例如:右图上, selb 的改变,会自动地立刻影响或门的输出。

nets

a

bsl

selb

sela

nsl out

Page 53: Verilog HDL  基础语法入门

语法详细讲解主要的数据类型

连接( Nets) 类型变量的种类:

在为不同工艺的基本元件建立库模型的时候,常常需要用不同的连接类型来与之对应,使其行为与实际器件一致。常见的有以下几种。 类型 功能 wire, tri 对应于标准的互连线(缺省) supply1, supply2 对应于电源线或接地线 wor, trior 对应于有多个驱动源的线或逻辑连接 wand, triand 对应于有多个驱动源的线与逻辑连接 trireg 对应于有电容存在能暂时存储电平的连接 tri1, tri0 对应于需要上拉或下拉的连接

如果不明确地说明连接是何种类型,应该是指 wire 类型。

Page 54: Verilog HDL  基础语法入门

语法详细讲解主要的数据类型

寄存器( register)类型变量 register 型变量能保持其值,直到它被赋于新的值。 register 型变量常用于行为建模,产生测试的激励信号。 常用行为语句结构来给寄存器类型的变量赋值。

a

b

sl

selb

sela

nsl out

reg_a

reg_sel

reg_b

Page 55: Verilog HDL  基础语法入门

语法详细讲解主要的数据类型

寄存器( register)类型变量的数据类型

寄存器类型变量共有四种数据类型: 类型 功能 . reg 无符号整数变量,可以选择不同的位宽。 integer 有符号整数变量, 32位宽,算术运算可产生

2 的 补码。 real 有符号的浮点数,双精度。 time 无符号整数变量, 64位宽( Verilog-XL 仿真 工具用 64位的正数来记录仿真时刻)

Page 56: Verilog HDL  基础语法入门

语法详细讲解主要的数据类型

如何选择正确的数据类型?

输入口( input)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。

输出口 (output)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。

输入 / 输出口 (inout) 只可以由网络连接驱动,但它本身只能驱动网络连接。

如果信号变量是在过程块 (initial 块 或 always块 )中被赋值的,必须把它声明为寄存器类型变量

Page 57: Verilog HDL  基础语法入门

语法详细讲解主要的数据类型

举例说明数据类型的选择

module top;wire y; reg a, b; DUT u1(y,a,b); initial begin a = 0; b = 0; #10 a =1; …. endendmodule

模块 DUT 的边界

输入口 输出口

输出 / 入口

net

netnet/register

net

net/register

netinout

module DUT(Y, A, B_);

output Y;

input A,B:

wire Y, A, B;

and (Y, A, B);

endmodule

Page 58: Verilog HDL  基础语法入门

语法详细讲解主要的数据类型

选择数据类型时常犯的错误

在过程块中对变量赋值时,忘了把它定义为寄存器 类型( reg)或已把它定义为连接类型了(wire)

把实例的输出连接出去时,把它定义为寄存器类型了

把模块的输入信号定义为寄存器类型了。

这是经常犯的三个错误!!!

Page 59: Verilog HDL  基础语法入门

语法详细讲解主要的数据类型

参数( parameters)类型 常用参数来声明运行时的常数。 可用字符串表示的任何地方 ,都可以用定义的参数来代替。 参数是本地的,其定义只在本模块内有效。

举例说明:module md1(out,in1,in2);…..parameter cycle=20, prop_del=3, setup=cycle/2-prop_del, p1=8, x_word=16’bx, file = “/user1/jmdong/design/mem_file.dat”;

wire [p1:0] w1; // 用参数来说明 wire 的位宽 …. initial begin $open(file); ……. #20000 display(“%s”,file); $stop end ….endmodule

Page 60: Verilog HDL  基础语法入门

语法详细讲解主要的数据类型

参数值的改写 (方法之一 )

举例说明 :module mod ( out, ina, inb);…parameter cycle = 8, real_constant=2.039, file = “/user1/jmdong/design/mem_file.dat”;…endmodule

module test; … mod mk(out,ina,inb); defparam mk.cycle=6, mk.file=“../my_mem.dat”; …endmodule

Page 61: Verilog HDL  基础语法入门

语法详细讲解主要的数据类型

参数值的改写 (方法之二 )举例说明 :module mod ( out, ina, inb);…parameter cycle = 8, real_constant=2.039, file = “/user1/jmdong/design/mem_file.dat”;…endmodule

module test; … mod # (5, 3.20, “../my_mem.dat”) mk(out,ina,inb); …endmodule

Page 62: Verilog HDL  基础语法入门

语法详细讲解寄存器阵列

Verilog 语言支持寄存器阵列的声明:

举例说明:integer NUMS [7:0]; // 8 个整型变量的寄存器阵列time t_vals [3:0]; //4 个时间变量的寄存器阵列

数据类型为 reg 的阵列常称为存储器(即 memory ):reg [15:0] MEM [0:1023]; // 1K x 16 位的存储器reg [7:0] PREP [‘hfffe : ‘hffff]; // 2 x 8 位的存储器

可以用参数来表示存储器的大小:parameter wordsize = 16;parameter memsize = 1024;reg [wordsize-1:0] MEM3[memsize-1:0];