Verilog HDL 基础语法入门.

Slides:



Advertisements
Similar presentations
Introduction to Verilog
Advertisements

Tool Command Language --11级ACM班 金天行.
实验四 利用中规模芯片设计时序电路(二).
Oracle数据库 Oracle 子程序.
C语言实验 第一课 标题:学号+姓名.
Verilog HDL 及Modelsim仿真
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
全国计算机等级考试 二级基础知识 第二章 程序设计基础.
在PHP和MYSQL中实现完美的中文显示
Hadoop I/O By ShiChaojie.
Chapter 5 Verilog 硬體描述語言
Chapter 5 Verilog硬體描述語言
Ch01-2 Verilog語法 資料流(DataFlow)設計 行為(Behavior)設計
EDA技术 廖义奎.
管理信息结构SMI.
走进编程 程序的顺序结构(二).
辅导课程六.
第四阶段实验 Verilog HDL简介 1 Verilog描述的一般结构 2 Verilog HDL基础知识 3 设计举例
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
以ISI平台为例,为您演示一下如何在Endnote文献中查看该文献的References
Verilog HDL 基础语法入门.
实验四 组合逻辑电路的设计与测试 一.实验目的 1.掌握组合逻辑电路的设计 方法 2.学会对组合逻辑电路的测 试方法.
语法进阶.
时序逻辑电路实验 一、 实验目的 1.熟悉集成计数器的功能和使用方法; 2.利用集成计数器设计任意进制计数器。 二、实验原理
第二章 Java语言基础.
数字集成电路设计入门 --从HDL到版图 于敦山 北大微电子学系.
CPU结构和功能.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
SOA – Experiment 2: Query Classification Web Service
第一章 函数与极限.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
学习目标 1、什么是字符集 2、字符集四个级别 3、如何选择字符集.
$9 泛型基础.
第14章 对验证的支持 学习内容 理解Verilog文本输出 理解不同的读取仿真时间的系统函数 理解 Verilog文件I/O功能.
计算机EDA设计 教 程 北航计算机学院 艾明晶.
VB与Access数据库的连接.
姚金宇 MIT SCHEME 使用说明 姚金宇
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
设计示例一 用门级结构描述D触发器:.
项目二:HTML语言基础.
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
第4章 Excel电子表格制作软件 4.4 函数(一).
实验三 16位算术逻辑运算实验 不带进位控制的算术运算 置AR=1: 设置开关CN 1 不带进位 0 带进位运算;
第九节 赋值运算符和赋值表达式.
iSIGHT 基本培训 使用 Excel的栅栏问题
Chapter 18 使用GRASP的对象设计示例.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
ASP.NET实用教程 清华大学出版社 第4章 C#编程语言 教学目标 教学重点 教学过程 2019年5月5日.
Visual Basic程序设计 第13章 访问数据库
魏新宇 MATLAB/Simulink 与控制系统仿真 魏新宇
第七、八次实验要求.
GIS基本功能 数据存储 与管理 数据采集 数据处理 与编辑 空间查询 空间查询 GIS能做什么? 与分析 叠加分析 缓冲区分析 网络分析
第二章 Java基本语法 讲师:复凡.
第二节 函数的极限 一、函数极限的定义 二、函数极限的性质 三、小结 思考题.
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
FPGA组合逻辑 王安然.
Verilog HDL 基本语法 STEP 2016/12/3.
数据表示 第 2 讲.
第四章 UNIX文件系统.
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
顺序结构程序设计 ——关于“字符串”和数值.
学习目标 1、什么是列类型 2、列类型之数值类型.
Presentation transcript:

Verilog HDL 基础语法入门

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

讲座中关于Verilog HDL的主要内容 讲课内容主要包括: Verilog 的应用 Verilog 语言的组成部件 结构级的建模与仿真 行为级的建模与仿真 延迟参数的表示 Verilog 的测试平台: 怎样产生激励信号和控制信号 输出响应的产生、记录和验证 任务和函数 用户定义的元器件(primitives) 可综合风格的Verilog 建模

讲座中关于Verilog仿真工具的主要内容 讲课内容主要包括: 如何对所做的设计进行编译和仿真 如何使用元器件库 如何用Verilog-XL命令行界面调试代码 如何用图形用户界面(GUI) 延迟的计算和标记 仿真性能建模 循环多次仿真

第二讲:Verilog 的应用 目的: 了解用HDL语言设计数字逻辑的优点 了解Verilog 主要应用领域 了解Verilog 的发展历史

Verilog 的应用 的 Verilog HDL模型。 是一种结构描述的语言。 Verilog HDL是一种用于数字逻辑电路设计的语言:

Verilog 的应用 系统级(system): 用高级语言结构实现设计模块的外部性能的模 算法级(algorithmic): 用高级语言结构实现设计算法的模型。 RTL级(Register Transfer Level): 描述数据在寄存器之间流动和如何处理这些数据的模型。 门级(gate-level): 描述逻辑门以及逻辑门之间的连接的模型。 开关级(switch-level): 描述器件中三极管和储存节点以及它们之间连接的模型。

Verilog 的应用 一个复杂电路的完整Verilog HDL模型是由若个 Verilog HDL 模块构成的,每一个模块又可以由若干个子模块构成。 利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计。 Verilog HDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。这种行为描述语言具有以下八项功能:

Verilog 的应用 可描述顺序执行或并行执行的程序结构。 用延迟表达式或事件表达式来明确地控制过程的启动时间。 通过命名的事件来触发其它过程里的激活行为或停止行为。 提供了条件、if-else、case、循环程序结构。 提供了可带参数且非零延续时间的任务(task)程序结构。 提供了可定义新的操作符的函数结构(function)。

Verilog 的应用 提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。 Verilog HDL语言作为一种结构化的语言也非常适合于门级和开关级的模型设计。 Verilog HDL的构造性语句可以精确地建立信号的模型。这是因为在Verilog HDL中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响。

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

模块的抽象 技术指标: RTL/功能级: 门级/结构级: 版图布局/物理级: 行为综合 综合前仿真 逻辑综合 综合后仿真 布局布线 用文字表示 用算法表示 用高级行为的Verilog模块表示 RTL/功能级: 用可综合的Verilog模块表示 门级/结构级: 用实例引用的Verilog模块表示 版图布局/物理级: 用几何形状来表示

第三讲.简单的 Verilog HDL 模块 目的: 通过简单的例子了解Verilog模块的基本构成

下面先介绍几个简单的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声明语句里的。

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

简单的 Verilog HDL 模块 例[2.1.3]: module trist2(out,in,enable); output out; input in, enable; bufif1 mybuf(out,in,enable); endmodule 这个程序描述了一个三态驱动器。程序通过调用一个实例元件bufif1来实现其功能。

简单的 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); assign out = enable? In : 'bz;

简单的 Verilog HDL 模块 上述程序例子通过另一种方法描述了一个三态门。 在这个例子中存在着两个模块:模块trist1 调用模块 mytri 的实例元件 tri_inst。 模块 trist1 是上层模块。模块 mytri 则被称为子模块。 通过这种结构性模块构造可构成特大型模块。

简单的 Verilog HDL 模块 通过上面的例子可以看到: 每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。 Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。 除了endmodule语句外,每个语句和数据定义的最后必须有分号 可以用/*.....*/和//...对Verilog HDL程序的任何部分作注释。一个好的,有使用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。

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

模块的结构 从上面的例子可以看出: - Verilog模块结构完全嵌在module和endmodule声明语句之间; - 每个Verilog程序包括四个主要部分:端口定义、I/O说明、内部信号声明、功能定义。

第四讲 模块的测试 如何检查上述例子其功能是否正确? 需要有测试激励信号输入到被测模块 需要记录被测模块的输出信号 需要把用功能和行为描述的Verilog模块 转换为门级电路互连的电路结构(综合)。 需要对已经转换为门级电路结构的逻辑 进行测试(门级电路仿真)。 需要对布局布线后的电路结构进行测试。 (布局布线后仿真)。

模块的测试 被测模块 激励和控制信号 输出响应和验证

模块的测试 测试模块常见的形式: 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

模块的测试 测试模块中常用的过程块: 所有的过程块都在0时刻同时启动;它们是并行的,在模块中不分前后。 initial always

模块的测试 如何描述激励信号: 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

模块的测试 如何观察被测模块的响应: 在initial 块中,用系统任务$time 和 $monitor $time 返回当前的仿真时刻 量值发生变化,便在仿真单位时间结束时显示其变 量列表中所有变量的值。 例: initial begin $monitor ($time, , “out=%b a=%b sel=%b”, out,a,b,sel); end

模块的测试 如何把被测模块的输出变化记录到数据库文件中? 可用以下七个系统任务: (文件格式为VCD,大多数的波形显示工具都能读取该格式) 可用以下七个系统任务: $dumpfile(“file.dump”); //打开记录数据变化的数据文件 $dumpvars(); //选择需要记录的变量 $dumpflush; //把记录在数据文件中的资料转送到硬盘保存 $dumpoff; //停止记录数据变化 $dumpon; //重新开始记录数据变化 $dumplimit(<file_size>); //规定数据文件的大小(字节) $dumpall; //记录所有指定信号的变化值到数据文件中

模块的测试 如何把被测模块的响应变化记录到数据库文件中? 举例说明: $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所有信号的变化(包括其两层以下子模块的信号变化)。

模块的测试 如何把被测模块的响应变化记录到数据库文件中? 举例说明: 下面的 Verilog 代码段可以代替测试文件中的系统任务$monitor initial begin $dumpfile(“vlog.dump”); $dumpvars(0,top); end

语法详细讲解 第五讲. Verilog 语法要点 目标: 理解Verilog 语言的一些重要规定. 学会认识一些有关的重要语言符号. 掌握Verilog 中如何规定时间单位

语法详细讲解 Verilog 与 C 的主要不同点 - 并行性 - 块的含义: initial 块 和 always块 两种赋值语句: 阻塞 赋值 “ = ” 非阻塞赋值 “〈= ”

多行注释符用 /* ------------------------- */ 语法详细讲解 空格和注释 Verilog 是一种格式很自由的语言。 空格在文本中起一个分离符的作用, 别的没有其他用处。 单行注释符用 //********* 与C 语言一致 多行注释符用 /* ------------------------- */

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

Verilog 语言中,字符串常常用于表示命令内需要显示的信息。 语法详细讲解 字符串 Verilog 语言中,字符串常常用于表示命令内需要显示的信息。 用“ ”括起来的一行字符串,换新一行用 “\n” 字符,与 C 语言一致。 在字符串中可以用 C 语言中的各种格式控制符,如\t, \”, \\… 在字符串中可以用 C 语言中的各种数值型式控制符(有些不同),如: %b(二进制), %o(八进制), %d(十进制), %h(十六进制), %t(时间类型),%s (字符串类型)…

所谓标识别符就是用户为程序描述中的Verilog 对象所起的名字。 语法详细讲解 标识符 所谓标识别符就是用户为程序描述中的Verilog 对象所起的名字。 标识符必须以英语字母(a-z, A-Z)起头,或者用下横线符( _ )起头。其中可以包含数字、$符和下横线符。 标识符最长可以达到1023个字符。 模块名、端口名和实例名都是标识符。 Verilog语言是大小写敏感的,因此sel 和 SEL 是两个不同的标识符。

Verilog 是大小写敏感的。所有的Verilog 关键词都是小写的。 语法详细讲解 合法和非法标识符 非法的: 34net //不能用数字开头 a*b_net //不能含有非字母符号* n@263 //不能含有非字母符号@ 合法的: shift_reg_a busa_index bus263 Verilog 是大小写敏感的。所有的Verilog 关键词都是小写的。

特别标识符是用 “\” 符开始,以空格符结束的标 识符。它可以包含任何可打印的ASCII字符。 但“\”符和空格并不算是标识符的一部分。 语法详细讲解 特别的标识符 特别标识符是用 “\” 符开始,以空格符结束的标 识符。它可以包含任何可打印的ASCII字符。 但“\”符和空格并不算是标识符的一部分。 特别标识符往往是由RTL级源代码或电路图类型的 设计输入经过综合器自动综合生成的网表结构型 Verilog 语句中的标识符。 举例说明: \~#@sel , \bus+index , \{A,B} , Top.\3inst .net1 , //在层次模块中的标识名

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

例:initial begin #10 rst=1; #50 rst=0; end 在门级实例引用时表示延迟。 语法详细讲解 特殊符号 “#” 特殊符号 “#” 常用来表示延迟: 在过程赋值语句时表示延迟。 例:initial begin #10 rst=1; #50 rst=0; end 在门级实例引用时表示延迟。 例:not #1 not1(nsel, sel); and #2 and2(a1, a, nsel); 在模块实例引用时表示参数传递 介绍参数类型变量时再讲。。。。

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

使用`define 编译引导能提供简单的文本替代功能 `define <宏名> <宏文本> 语法详细讲解 编译引导语句 使用`define 编译引导能提供简单的文本替代功能 `define <宏名> <宏文本> 在编译时会用宏文本来替代源代码中的宏名。 合理地使用`define可以提高程序的可读性 举例说明: `define on 1’b1 `define off 1’b0 `define and_delay #3 在程序中可以用有含义的文字来表示没有意思的数码提高了程序 的可读性,在程序中可以用 `on, `off, `and_delay 分别表 示 1,0,和 #3 。

`include “parts/counter.v” `include “../../library/mux.v” 语法详细讲解 编译引导语句 使用`include 编译引导,在编译时能把其指定的整个文件包括进来一起处理 举例说明: `include “global.v” `include “parts/counter.v” `include “../../library/mux.v” 合理地使用`include 可以使程序简洁、清晰、条理清楚、易于查错。

`timescale 用于说明程序中的时间单位和仿真精度 举例说明: `timescale 1ns/100ps 语法详细讲解 编译引导语句 `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的整数倍

语法详细讲解 编译引导语句 仿真步长即仿真单位(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) `timescale 1ps/100fs module M3(….); not #1.23 not1(nsel, sel); //1.23 ps中共有12个STU(100fs)

ps (皮秒) picoseconds: 1.0E-12 秒 ns (纳秒) nonoseconds: 1.0E-9 秒 语法详细讲解 编译引导语句 时间单位 : 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 秒

如果该引导语句启动的话,它就一直有效 直到遇到另外一个`uselib的定义或`resetall语句 语法详细讲解 编译引导语句 `uselib 编译引导语句: 用于定义仿真器到哪里去找库元件 如果该引导语句启动的话,它就一直有效 直到遇到另外一个`uselib的定义或`resetall语句 比其他配置库搜索路径的命令选项作用大 如果仿真器在`uselib定义的地点找不到器件库,它不会转向由编译命令行-v 和-y选项指定的器件库去找。

`uselib 器件库1的地点 器件库2的地点 。。。 语法详细讲解 编译引导语句 使用 `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

语法详细讲解 第六讲 Verilog 的数据类型和逻辑值 目的: 掌握Verilog不同逻辑值的含义 学习Verilog不同的数据类型 理解如何使用和在什么场合下使用不同的数据类型 学习声明数据类型的语法

1 X Z buf bufif1 语法详细讲解 Verilog 的四种逻辑值 0、低、伪、逻辑低、地、VSS、负插入 1 X Z buf bufif1 0、低、伪、逻辑低、地、VSS、负插入 1、高、真、逻辑高、电源、VDD、正插入 X、不确定:逻辑冲突无法确定其逻辑值 HiZ、高阻抗、三态、无驱动源

表示抽象的储存单元,称为寄存器/变量类型 Parameter 表示运行时的常数,称为参数类型 语法详细讲解 主要的数据类型 Verilog 有三种主要的数据类型: Nets 表示器件之间的物理连接, 称为网络连接类型 Register 表示抽象的储存单元,称为寄存器/变量类型 Parameter 表示运行时的常数,称为参数类型

nets a b Nets(网络连线): 由模块或门驱动的连线。 驱动端信号的改变会立刻 sela 传递到输出的连线上。 语法详细讲解 主要的数据类型 Nets(网络连线): 由模块或门驱动的连线。 驱动端信号的改变会立刻 传递到输出的连线上。 例如:右图上,selb的改 变,会自动地立刻影响或 门的输出。 a b sl selb sela nsl out nets

连接(Nets) 类型变量的种类: 类型 功能 wire, tri 对应于标准的互连线(缺省) 语法详细讲解 主要的数据类型 连接(Nets) 类型变量的种类: 在为不同工艺的基本元件建立库模型的时候,常常需要用不同的 连接类型来与之对应,使其行为与实际器件一致。常见的有以下 几种。 类型 功能 wire, tri 对应于标准的互连线(缺省) supply1, supply2 对应于电源线或接地线 wor, trior 对应于有多个驱动源的线或逻辑连接 wand, triand 对应于有多个驱动源的线与逻辑连接 trireg 对应于有电容存在能暂时存储电平的连接 tri1, tri0 对应于需要上拉或下拉的连接 如果不明确地说明连接是何种类型,应该是指 wire 类型。

a sela sl nsl out selb b 语法详细讲解 主要的数据类型 寄存器(register)类型变量 常用行为语句结构来给寄存器类型的变量赋值。 a b sl selb sela nsl out reg_a reg_sel reg_b

寄存器(register)类型变量的数据类型 语法详细讲解 主要的数据类型 寄存器(register)类型变量的数据类型 寄存器类型变量共有四种数据类型: 类型 功能 . reg 无符号整数变量,可以选择不同的位宽。 integer 有符号整数变量,32位宽,算术运算可产生2的 补码。 real 有符号的浮点数,双精度。 time 无符号整数变量,64位宽(Verilog-XL仿真 工具用64位的正数来记录仿真时刻)

如何选择正确的数据类型? 输入口(input)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。 语法详细讲解 主要的数据类型 如何选择正确的数据类型? 输入口(input)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。 输出口 (output)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。 输入/输出口(inout)只可以由网络连接驱动,但它本身只能驱动网络连接。 如果信号变量是在过程块 (initial块 或 always块)中被赋值的,必须把它声明为寄存器类型变量

举例说明数据类型的选择 语法详细讲解 主要的数据类型 module top; wire y; reg a, b; DUT u1(y,a,b); initial begin a = 0; b = 0; #10 a =1; …. end endmodule 模块DUT的边界 输入口 输出口 输出/入口 net net/register inout module DUT(Y, A, B_); output Y; input A,B: wire Y, A, B; and (Y, A, B); endmodule

这是经常犯的三个错误!!! 选择数据类型时常犯的错误 在过程块中对变量赋值时,忘了把它定义为寄存器 语法详细讲解 主要的数据类型 选择数据类型时常犯的错误 在过程块中对变量赋值时,忘了把它定义为寄存器 类型(reg)或已把它定义为连接类型了(wire) 把实例的输出连接出去时,把它定义为寄存器类型了 把模块的输入信号定义为寄存器类型了。 这是经常犯的三个错误!!!

参数(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

参数值的改写(方法之一) 语法详细讲解 主要的数据类型 举例说明: 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”;

参数值的改写(方法之二) 举例说明: 语法详细讲解 主要的数据类型 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);

Verilog 语言支持寄存器阵列的声明: 语法详细讲解 寄存器阵列 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];