当前课程知识点:IC设计与方法 > 3、Verilog语法 > b)端口、信号及数据类型 > 讲课视频
具体到语言来说
它有很多用处
首先我们来看一下
怎么用语言去描述电路的结构
这是一段Verilog代码
我们来看一下实际的代码
对于一个电路而言
描述一个电路的话
大概我们要关注它的两方面
一个是它的外特性
具体到一个电路
它外面都有哪些输入信号和输出信号
每个信号起什么作用
这是电路的外特性
就好像在幻灯片的右上角
我们表述了一个rs触发器
这个触发器有复位端 置位端 输出端
和反向输出端
这是它的外特性
第二部分是电路的内特性
也就是说
电路内部是有哪些元器件构成的
他们是怎么连接成功的
在这里面的话就是
我们幻灯片的左下角这张图
表述了RS触发器发器
是由两个与非门互连形成的电路
对于这样一个电路
我们用图的方式的话
用右上角的图和左下角的图
能够描述出这个电路
如果用代码的话
对应的是左上角的这部分代码
首先电路的外特性这部分
我们从代码的第一行
第一 第二 第三行可以表示出来
这些代码看起来非常的直观
第一行表示了这个电路叫什么名字
叫rs触发器
然后他有4个输入和输出信号
第二行和第三行表述了这些信号
哪些是输入哪些是输出
这是描述外特性的这部分
中间第二层代码描述了电路的内部特性
从这个语句的话
看起来也非常的直观
比如说Q信号
它是由SET信号和QB信号相与以后
然后取一个非
大致就是表述了一个
类似与非门这样的一个功能
QB信号也是类似的
这就是一个典型的Verilog代码
前边这部分表述了电路的外特性
后面表述了电路的内部特性
我们可以把这段代码归结成一个模型
对于任何一个Verilog代码
都会用一个Module来表示一个电路单元
Module是一个Verilog表述电路单元的
最基本的一个模块
在每一个Module或者每一个电路单元
都分为三部分
一个是Module的名字和端口的列表
这部分表述了电路的外部特性
第二部分比刚才的例子稍微复杂一点
有一个数据定义
就好像刚才那张图里边
电路内部有一些连线
这些连线的话
要通过数据类型的定义及连线的定义
来表述电路内部的连线
那这部分有点像c语言里面的局部变量的定义
第三部分就是功能的描述
用来描述电路内部的功能
具体这部分代码有多复杂
取决于电路有多复杂
最简单的可能只有一行两行
最复杂的可能有100行200行
甚至1000行去描述一个复杂的电路
在这些幻灯片里边
左边是Verilog语言的表述方式
右边是VHDL的表述方式
为了方便对比
我把这两种方式都列在里面了
虽然我们这门课学的是Verilog
通过对比
大家也可以去看明白
如果是另一种描述语言
比如VHDL语言的话
它大致是一个什么样子
我们把刚才所说的Verilog代码的模型
和一个实际的Verilog代码片段
也列在了幻灯片的右部
我们一一对应看一下
第一部分是模块的名字和端口的名字
右边的话
是我们的一个测试电路
它有六个输入信号
然后这些输入信号里面有
我们看第一行
第一行的ab是单根的输入信号
然后第二行的c和d
是两个位宽各自是4位的输入信号
第三行和第四行表述的输出信号
分别都是单根信号和多位位宽的输出信号
从这里面我们就可以看到
描述电路的输入和输出信号的时候
我们不但可以用这种和实际的硬件连线
相对应的一根一根地线来表示这个信号
也可以用一些总线
比如说这种4位的总线sum
来表示这种多位信号
这样的话
在描述输入和输出信号的时候就比较方便
第二部分是数据类型定义
那在这部分里面
定义了电路里边的内部用的一个信号
在这里面的话
这个sum又被重新定义了一下
也就是说这个sum信号不但是输入
不但是我们电路的输出信号
其实也是我们电路的一个内部信号
在这里面的话
具体又用到了两个新的数据类型
我们在后面具体讲信号的属性的时候
会专门去讲是什么意思
第三部分用一些语句
去描述了电路的内部功能有多种描述方式
我们后面会结合具体的语法来讲
到底都是什么样的描述方式
我们下面来详细的看一下
端口的定义以及模块的定义
对于一个电路而言
我们通常电路的信号的话
有输入信号、输出信号以及双向信号3种
对于输入和输出
我们分别用input output来定义
对于双向信号
我们用inout属性来进行定义
信号的类型的话
又分为两种一个是wire类型
一个是reg类型
具体wire和reg是什么
我们到后面会详细的说
因为wire和reg
跟我们常规意义上的电路好像以前
如果大家没有学过硬件描述语言的话
这是一个新的概念
我们具体到电路的物理特性的话
就是它的一个方向特性
输入和输出
我们来看一下右边这个例子
比如说还是刚才这个例子
对于a、b、c、d
它就是输入信号
在定义信号的时候
我们不但可以用名字来表示这个信号
具体是指代是干什么用的
还可以用一个这样的一个形式
来表示它的位宽
是一个多位的位宽
对于电路内部的连线
通常我们从一个实际电路的角度来说的话
内部的连线就是跟互连线wire就行了
在Verilog语言里边
又定义了另一种特殊的连线
称之为叫reg
reg和wire的特性在很多课文里面都讲的
说实话讲的不是特别清楚
我们可以针对工程来说
给大家一个比较简单的一个定义
如果将来我们在Verilog代码里边
某一个信号
比如说sum信号
是由一个always语句块的输出产生的话
那我们在前面定义这个信号的时候
要用reg类型
其他的时候都用wire类型就可以了
其实根据我对Verilog语言的理解
那个reg类型和wire类型
它的定义其实是没有
从工程的角度来说
或者说从RTL级电路设计的角度来说
它是没有什么意义的
我们可以把所有的信号
都定义成wire类型就可以了
因为现在的EDA工具
它完全可以识别出
哪个信号是该是什么属性
只不过可能是由于当初
IEEE标准组织在定义的时候
从某种其它原因角度
去定义了这两种不同类型的这种属性
我们再来看一下主要的数据类型
Verilog定义了3种主要数据类型
net、Register和parameter三种类型
按照Verilog语法里面定义
net型表示了电路里边的
比如说右边这个电路里面的某些连线
这些连线都称之为叫net类型
net类型的话
下面又分了很多的类型
我就不再一一的去念了
在我们实际工程里边
我们基本上只会用到wire这种类型
第二种是register类型
按照Verilog语法定义
register类型
它表示一个信号的线能够保持其值
并且直到它被赋予新的值之前
它的值都能够保持不变
听起来很像寄存器
是吧
听起来很像我们所说的
D触发器这样的一个功能
但实际上
register这种数据类型跟触发器是两码事
完全两个不同的概念
在register里面又有好多种子类型
在我们的RTL级电路设计里面
通常我们只会用到reg这种类型
所以总结一下我们在定义一个信号
它的类型的时候
数据类型的时候
通常我们只会用到wire类型和reg类型
再结合刚才我提到的reg类型
只有在某个特殊情况的时候
我们才需要把一个信号定义成reg类型
其他所有的我们应该定义成wire类型就行
第三种属性是参数类型
parameter类型
这个数据类型主要是方便我们去定义一些
将来在编译的时候需要去改变的数据类型
我们来看一下刚才我们提到的
两种常用的数据类型
一个是wire
中文的话
在很多书籍里面把它翻成叫线网
有时候也称之为叫网络
第二种是reg类型
顾名思义
wire类型用来表示
电路里面的任何根物理连线
都可以用wire类型来去给它表述
reg型的话
按照语法的定义
它是某一个具备存储功能的某一根连线
实际上的话根据我们在RTL级的工程经验
当我们的一个信号是always
或者是initial过程的输出的时候
我们把它定义成是reg类型
其他无论什么其他情况
我们都是把它定义成wire类型
所以的话这里面我要强调的
就是这个reg类型
千万不要把它跟D触发器
或者什么Flip-flop给它混淆在一起
我们就记住
在写代码的时候只有一个代码
这是一个代码书写规范
从某个角度来说
可以把reg类型
看成是一个代码书写规范的要求
当我们的代码里边
有always块产生信号的时候
这个信号在前面定义的时候
就需要把它定义成reg类型
除了这种情况
其他所有的线都定义成是wire类型
我们再来看一下
实际的数据类型定义的一个例子
左边是一个电路
一个叫顶层模块的一个描述
这个顶层模块的名字是top
在这个顶层模块里面
内部有用到了几个信号
通常我们就会
把它需要在顶层模块的这个位置
要把它定义出我们所用的信号
比如说y、a和b
这3个信号
在讲这3个信号之前
我们先看一下右下角
右下角的一个底层电路模块
在我们这个电路里边相当于有两个模块
一个是小电路模块
称之为叫DUT
第二个是在大电路模块称之为叫top
这个DUT是用在top里面的一个小模块
在这个DUT电路里边
我们的电路有3个信号
两个输入信号a、b和一个输出信号y
在这个里边的话
y、a、b都是互连线这个wire类型
在顶层电路里边
我们把这个DUT
当做一个小电路
用某个Verilog语句给它映射进来
或者说放在我们的顶层电路里面
从物理的概念来说的话
就有点想把一个小的元器件
插在电路板上
插在电路板上一样
在这里边这个y、a、b信号就变成了
我们顶层电路的内部信号
那在这里面y、a、b
到底该定义成是wire还是reg类型呢
根据刚才所说的
要看这个a、b和y都是由什么东西产生的
根据我的经验
你可以一开始把他们都当做wire类型来对待
我们再往下接着看代码
在这个顶层电路里面有一个initial模块
initial模块它能够产生a b这些信号
a信号、b信号都是由这个模块产生的
所以回过头来
我们在再去检查a、b信号定义的时候
我们就需要把这个a、b
定义成是reg类型了
这就是我们对信号定义的
一种工程上的一种判断方法
我们总结一下
我们一开始可以把所有的信号
都定义成是wire类型
定义完了以后
当我们再去写具体电路的时候
发现有时候需要用一个initial模块
或者说always模块去产生这个信号的时候
我们回过头去
再把这个信号的定义
改成这个reg类型就可以了
我们刚才已经把
怎么用Verilog语言去描述一个电路的外特性
所用到的基本语法知识大概都讲了一下
我们回顾一下
我们讲怎么用Module语句去定义一个模块
然后用input
output和inout的表述信号的输入和输出
用wire和reg去定义信号的类型
可能有些同学会讲
这只是表述电路的一个外部特性
有这么重要吗
非常重要
我们来看一下
实际的一段电路的外部特性的一个描述
这是一个实际的一个
Pie编码器的电路模块的外特性描述
这个电路可能有
将近20个输入和输出信号
我们可以看一下在实际的工程里边
电路的端口定义的时候
一般都是非常规范的
大家会看到不同的风格
这只是我给大家建议的一种风格
在实际工程里面
我们所需要的就是你的电路描述非常规范
比如说像在这个代码里边
第一部分描述的是我们电路的名字
以及电路有什么信号
第二部分描述了这些信号的属性
它是输入还是输出
是wire类型
还是reg类型
信号的位宽是多宽
通过这样的一个很规整的方式
能够让大家看清楚这个信号的各个属性
非常清楚
在这里面
比如说是个input这3个信号
由于是wire类型是默认类型
所以这4个字就可以省略掉了
看起来会简单一些
再往下的下一部分是我们电路的内部信号
面是外部信号
这部分内部信号里面
同样
第一列是他的属性
是wire还是reg
第二列是它的宽度
最后一部分是一些parameter
我们定义的一些电路的一些常量
这就是一个规则的代码风格
在这我给大家用了很长时间去讲
怎么描述一个电路的一个外部特性
其实在做一个工程芯片设计的时候
描述电路的外部特性非常的重要
大家不知道有没有关注到
我这个嘴角好像已经上火了
是吧
上火是因为我这两天吃了一个特别大的亏
我们有一个工程项目
这个工程项目的话
前两天
应该不能说前两天
这个项目已经持续了将近一年了
在前几天
我们刚刚发现这个项目芯片流片回来以后
不成功的原因
这个原因是什么呢
就是某个工程师在定义电路的外部信号的时候
或者说定义电路的连线的时候
少连了一根线
少定义了一个信号
导致我们这个芯片流片回来以后
不能稳定的工作
造成多大损失
造成我们大概将近150万人民币的损失
150万是什么概念
差不多是一个工程师工作10年
10年的工资的这个损失
这是直接造成的经济损失
当然还有一些间接损失
为了找出这个问题
我们在拿到芯片以后
花了将近半年的时间
经过各种各样的排查才找到这个原因
所以
又是我要把我可能在第一节课就讲过的话
再重复一遍
对于一个集成电路设计工程师而言
你做事情必须异常的小心
每一步都需要仔细的去检查
任何一个小的错误
可能由于我们的种种原因
你忽视的这种小错误都可能造成巨大的影响
就像刚才说的这个项目一样
会给我们项目造成一种毁灭性的这种影响
都是有可能的
-软件下载说明
-a) 集成电路的应用及市场
-a) 集成电路的应用及市场--作业
-b)集成电路的制造过程
-b)集成电路的制造过程--作业
-c)从CPU的发展看IC的进展
-c)从CPU的发展看IC的进展--作业
-d)从行业的发展看IC的进展
--Video
-d)从行业的发展看IC的进展--作业
-e)从ISSCC看IC的发展方向
--讲课视频
-e)从ISSCC看IC的发展方向--作业
-a)数字系统的实现方法 (ASSP/FPGA/ASIC的对比)
--讲课视频
-a)数字系统的实现方法 (ASSP/FPGA/ASIC的对比)
-b)组合逻辑电路
--Video
-2、数字集成电路设计方法--b)组合逻辑电路
-c)时序逻辑电路(1)
-d)时序逻辑电路(2)
-2、数字集成电路设计方法--d)时序逻辑电路(2)
-a)Verilog的历史和学习要点
--讲课视频
-b)端口、信号及数据类型
--讲课视频
-b)端口、信号及数据类型--作业
-c)逻辑电平及数据操作
--讲课视频
-3、Verilog语法--c)逻辑电平及数据操作
-d)Assign 语句
-e)Assign 举例
-f)Always
-f)Always--作业
-g)阻塞与非阻塞赋值
--Video
-3、Verilog语法--g)阻塞与非阻塞赋值
-h)D触发器的描述
--Video
-i)时序电路的设计
--Video
-i)时序电路的设计--作业
-j) 面向测试的Verilog语法(1)
-k) 面向测试的Verilog语法(2)
-k) 面向测试的Verilog语法(2)--作业
-a)电路设计实例1
--Video
-b)电路设计实例2
--讲课视频
-b)电路设计实例2--作业
-c)电路设计实例3
--讲课视频
-Modelsim仿真
-a)综合及相关基本概念
--Video
-a)综合及相关基本概念--作业
-b)综合及优化
--Video
-c)门级仿真
--门级仿真
-d)Quartus综合及分析(1)
--讲课视频
-e)Quartus综合及分析(2)
--讲课视频
-e)Quartus综合及分析(2)--作业
-f)Quartus综合及分析(3)
--Video
-g)Quartus综合及分析(4)
--Video
-g)Quartus综合及分析(4)--作业