当前课程知识点:IC设计与方法 > 3、Verilog语法 > j) 面向测试的Verilog语法(1) > 3-3-1面向测试的Verilog语法(1)
大家好
上节课我们讲了面向设计的
或者说面向RTL级的Verilog语法
这节课
我们来讲面向测试的Verilog语法
在讲面向测试的Verilog语法之前
我们先回顾一下上节课讲的
面向RTL设计的Verilog语法
应该说
在这门课里
我们只讲最基本的
必需的RTL级的Verilog语法
总的来说只有几个关键字
一方面是面向代码结构的
包括电路外特性所描述的module
描述电路输入和输出信号
所需要的input和output信号
以及描述线的类型wire和reg这些信号的属性
第二方面是面向电路实现的
包括用于组合逻辑电路设计的assign语句
用于简单组合逻辑电路设计
所需要的always语句块
以及阻塞赋值语句
面向时序逻辑设计的always语句块以及
非阻塞赋值语句
以及相应的if语句和case语句
这些语句就可以用于设计
极其简单的组合逻辑电路
简单的时序逻辑电路以及复杂的时序逻辑电路
应该说
不管电路有多复杂
我们都可以用我们前面所讲的
大概十来个关键字设计出来
如果要设计更复杂的时序逻辑电路
我们可以用复杂的Verilog语法知识
也可以只用我们上课讲的Verilog语法知识
就可以做到
如果作为一个设计人员
或者初学者觉得仅仅用
我们讲过的Verilog语法知识还没办法设计出来
一般来说就是我们的设计思路出了问题
我们上课所没有讲过的
更复杂的一点
或者说更高深的Verilog语法知识
它的主要作用是让我们设计电路的效率
或者说描述电路的效率能够提高
而不是说缺了那部分Verilog语法知识
就设计不出电路来了
所以我们作为设计人员一定要注意的是
尽可能用最简洁的语法能够
把我们电路设计出来
那么Verilog语言呢
除了能够设计电路之外
还能够对我们所做的电路进行测试和验证
这就是我们今天所要讲的
面向测试的Verilog语法子集
我们如果设计完了电路
或者说我们做出了一个真实的电路的实体
一个电路板
我们怎么对它进行测试
大家回想一下
在本科
或者说在课外实践所遇到的情况
假设我们有一个电路板
电路板上有一些芯片
有一些电子元器件
我们在测试的时候
通常首先要为电路板增加一个电源
然后要用一些信号发生器之类的设备
为电路板产生测试所需要的信号
然后我们要用一些工具探测电路板上的信号
就好像在我们电路板上
我们可以用一些小夹子
把所需要观测的信号连接起来
然后用一台仪器去进行测试
到底会用到什么样的仪器呢
我们看一下
通常我们会用到电源为板子加电
需要用到万用表去测板子的连接状况
连接状态是否有短路
或者是否有开路
是否有虚焊等等
在加电以后
还可以用万用表去测一下板子的
某些专用节点的电平是不是处于高电平
处于低电平
完成静态测试以后
我们就要让板子加电正常的工作
工作的时候呢
要为我们的电路板提供输入信号
通常输入信号包括时钟信号
以及一些特殊的数据信号
或者是控制信号
这些信号我们可以由实际的电子系统产生
也可以用一些仪器
比如波形发生器去产生这些控制信号
产生完控制信号以后
我们就要对电路板的输出进行测试
输出测试通常有两类手段
一个就是用示波器
示波器通常有两到四路模拟输入量
可以测两到四路模拟信号
好一点的示波器还会有一些数字测试端口
可以完成八路 十六路
甚至三十二路数字量的测试
对于专业的数字系统测试
我们可能会用到逻辑分析仪
逻辑分析仪可以测试三十二路 六十四路
甚至二百五十六路以上的数字信号
测试的频率可以达到几十兆
甚至几百兆
甚至上G
所以对于一个复杂数字系统
我们通常会用一个比较高档的
逻辑分析仪去完成更完整的功能的测试
对于逻辑分析仪
我们可以看到
逻辑分析仪要去测信号的时候
会用到这样一个有多个夹头的
多个探头的夹具去测试不同的信号
如果我们的电路所要测试的探测点非常多
连接这些信号点也是一个非常麻烦的工作
你可以想象一下
假设你的电路有上百路的输出
需要我们手工地把这些小夹子一个一个地
夹到这些电路的输出点去
一方面夹的工作量非常的大
另一方面
如果我们电路的
内部的某些状态处于芯片的内部
或者说电路的某一管腿被压在芯片之下
比如说是BGA封装的芯片
那有可能我们根本就没有办法测试
那这时候电路的设计和测试就很麻烦
可能导致有些信号
根本没有任何手段可以对它进行测试
那如果我们用可编程芯片FPGA
或者CPLD来实现这样电路的时候
相对来说就容易一些
我们可以用一种叫内嵌逻辑分析仪的
方式去测试电路的内部信号
如果我们刚刚做完的RTL级、寄存器级的设计
我们这时候还仅仅是用Verilog语言
或者是VHDL语言这样的语言去描述电路
那么我们可以有更好的手段
也就是用仿真器去测试电路的内部状态
这张图是一个逻辑分析仪的
界面所看到波形
我们可以看一下
前两行是我们用逻辑分析仪
或者说内嵌的信号发生器可以产生的输入信号
后面几行是我们所观测到的
电路的内部节点
例如第三行和第四行是观测的I2C的信号
第三行是I2C的数据信号
第四行是I2C的时钟信号
这个逻辑分析仪的功能相对来说比较强
它可以对观测到的
信号去进行详细的协议层的分析
可以分析信号的工作协议是什么样的
具体代表的数据是什么样的数据
和测试一个实际的物理的电路相类似
当我们用硬件描述语言Verilog语言
描述完一个电路以后
我们也要对这样的电路进行验证
仿真或者是验证,以检查它的功能是不是正确
那对这样的代码
一小段代码
或者说一个小的module来说
我们怎么进行测试
或者怎么进行验证呢
过程跟刚才的过程是一样的
我们也要为这段代码提供激励信号
产生它所需要的输入信号
也要用某些技术手段
去观测这段电路的输出
具体的结构就和我们幻灯片上的
这样的结构类似
例如我们所做的电路是一个计数器
我们给它起个名字叫作counter
描述这段计数器的代码
对应的代码是counter.v
这么一段Verilog代码
通常Verilog代码的后缀是用.v这样
的后缀来描述
对这样一段代码进行测试的时候
我们要为它搭一个测试平台
我们把它称之为testbench
这样的testbench
我们可以给它起个名字叫tb.v
是另外一段Verilog代码
描述了整个testbench
这个testbench的名字呢
我们可以给它起个名字叫作top
在testbench里
我们首先要把计数器counter用一种手段
把它放在电路板上
有点像刚才我们电路板上插了一个芯片
所以我们也要把counter放到
我们的测试平台里来
具体放的手段
我们称之为元件例化
把counter放到我们电路板上以后呢
我们通常要给它起个名字
叫UUT
或者是DUT
UUT和DUT是Unit Under Test或者
是Device Under Test的缩写
把这个器件例化完了以后
我们还要给它产生所需要的复位信号
时钟信号
对于时钟信号
它通常是一个周期信号
我们通常可以用initial
或者是always语句来产生这样的
周期性的信号
对于复位信号
它通常是一个脉冲信号
我们简称为非周期信号
这时候我们一般用initial块
来产生这样的非周期信号
对于电路的输出
例如counter产生一个四位的计数器的值
输出out信号
我们有两大类手段来进行观测
一个是用Verilog提供的monitor
或者display语句来观测输出信号
通常是用文本的方式来显示信号值
另一类是用专用的工具
例如仿真工具所自带的波形浏览器
或者是更高层次的
分析工具来检查输出信号
是不是满足我们的要求
我们首先来看一下元件例化
元件例化除了可以
用在我们所说的测试平台里
也可以用在RTL级代码里
当我们的设计是一个多层次的复杂的设计
我们设计里面通常会分为多个模块
对于我们已经完成的
底层模块在上层电路里使用的时候
有时候我们也会把它称之为IP单元
去用在上层电路里的时候
这时候我们也会用到元件例化这种方式
我们看一下幻灯片
元件例化在Verilog和
VHDL里都有相应的语句
VHDL里定义的是PORT MAP语句
Verilog我们简称为元件例化
我们看两个例子
我们给出了Verilog以及
VHDL两种语言里的例化
元件例化的时候
通常有两种方式
一种方式我们称之为位置关联
另一种方式称之为名字关联
我们先看一下Verilog语句
例化一个AND这样的
与门的时候,它的例化方式
上面是它的语法规则
我就不再一一的念了
与门例化到我们的电路的时候
给它起个名字u1
然后把与门的三个输入和输出端
分别连到了我们电路板上的a、b以及
输出的and_out信号上
在这种方式里
a、b和and_out出现的次序
是要跟我们前面所设计的与门的
三个信号的出现次序是完全一致的
这种方式我们称之为位置关联的方式
或者叫位置映射的方式
第二种方式
我们是把与门的
每一个输入端和电路板上的每一个信号
直接关联起来
用.a加上一个a的方式
这样进行直接关联
这种方式也是我们大多数在工程情况下
推荐的方式
保证了我们的信号连接不会出现错误
在上一种方式里边
一旦a、b的次序写反了
就会导致电路的连接出错
下面是VHDL语言的映射方式
我就不再一一的多说了
我们再来看一个比较详细的实际的例子
在这个例子里
我们设计了一个小的模块
把它称之为comp
这个模块
它有两个输出端以及两个输入端
当我们在test测试平台里面例化元器件的时候
我们给了几种常见的方式
在电路里
我们把comp元器件例化了四次
相当于是在我们的
同一个电路板上插了四个这样的元器件
这四个元器件的名字分别叫c1、c2、c3和c4
第一个C1元器件的例化方式
就是我们刚才所说的位置映射的方式
Q、R、J、K的出现次序
Q、R、J、K分别连接到了元器件的o1、o2
i1、i2四个引脚上
第二种映射方式是用我们刚才所说的
名称映射的方式
(用c2表示的)comp元器件的
i2输入端连接到了电路板上的K信号上
其它的信号依次是怎么连接的
我们就不再一一的念了
第三种方式大家看一下
在Q信号后面
用了连续两个逗号
中间没有连任何的信号
表示comp元器件的某一个管腿
也就是o2这个管腿它是悬空的
没有连到任何一个信号端上
第四个跟第三个方式相类似
只是把i1和o1这两个信号连接到了J和Q上
另外两个没有提到
也就是说
另外两个管腿悬空
对应第三和第四这两种方式
在没有任何连接的这种情况下
通常软件或者仿真工具也好
或者说综合工具会给我们一个警告
告诉我们
某两个管腿悬空了
作为设计人员
我们通常要去检查这些警告信号
去看它是由于我们的设计失误导致没有连接
还是我们作为设计人员故意让它悬空的
这是我们作为设计人员需要去详细检查的
下面我们再来看一下
一个完整的testbench的结构
通常testbench包含两大部分
一个完整的Verilog代码
包含两大部分
第一部分是一些参数定义
与定义相关的语句
描述了代码段需要包含哪些其它的代码段
包含哪些定义信号
以及仿真的一些时间特征
第二段是我们完整的模块
以testbench为例
前面我们用一个`timescale语句
描述在仿真我们这段代码的时候
或者说测试的时候它的时间特征
左边的1ns表示仿真的时间单位是1ns
右边的1ps表示仿真时间的精度是1ps
我们可以理解为
我们仿真的步长是1个ps、1个ps的去走
然后整个显示的单位是以ns为单位
注意左边的单引号是一个反单引号
跟我们通常其它语言里面用的
单引号是不太一样的
是个反单引号
在顶层testbench里
通常testbench是没有任何输入信号
和输出信号的
在testbench内部大致有四大类语句
一个是信号定义
描述了testbench顶层的信号
例如在上一张图里的复位信号
时钟信号以及输出信号
第二类语句是元件例化
需要例化被测的电路
例化counter
例化成DUT或者是UUT
第三类是用来产生我们的激励向量
例如复位信号和时钟信号
最后是一些语句
用来观测我们的电路的输出
-软件下载说明
-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)--作业