当前课程知识点:IC设计与方法 > 6、Quartus工具 > d)Quartus综合及分析(1) > 讲课视频
可编程器件的设计流程基本上都是相类似的
虽然我们学习的是Quartus II的流程
针对Xilinx公司的ISE这样的设计工具
它的设计流程也基本上是相似的
这门课的课件主要是基于Altera公司提供的
培训教程摘取得到的
我们首先来看一下PLD的设计流程
设计的起点是我们的设计规范
设计需求(Design Specification)
或者简称Spec
根据Spec我们设计出
在RTL结构上
完成电路的设计
也就是初始的RTL代码
或者说一段Verilog代码
我们对于这段Verilog代码
进行RTL级的电路仿真
仿真既可以用Altera公司提供的
Quartus II内嵌仿真工具
也可以用我们这门课所建议的
Modelsim仿真工具来进行验证
验证的目的是验证电路的
功能是不是符合我们的设计需求
在验证阶段还没有时序相关的信息
也就是说
没有器件的延时
验证完了以后
前两个小节
我们讲过怎么用ASIC工具
例如Synopsys公司的
Design Complier完成电路的综合
我们讲ASIC综合完了以后
还要去完成ASIC流程的后端的布局布线
在可编程器件的设计流程里面
通常物理实现的
综合及布局布线这两个(步骤)都由Altera公司提供的
Quartus II工具
可以一步完成
在这个工具里面
全部集成在这里面了
但是流程还是分为两个流程
第一个是综合
把我们的RTL电路映射成具体的器件来实现
也就是说用门级网单来完成我们的电路映射
门级网单映射完了以后
是进行布局布线
把这些元器件
综合后的元器件具体的用Altera公司的
器件替换下来
以及在电路内进行布线
完成电路的连接
这就是一个物理实现的过程
布局布线完了以后
我们要进行时序分析
时序分析证明我们的电路性能满足要求以后
然后我们再来做门级仿真
大家注意
我们在PLD的设计流程里面是先做时序分析
再做门级仿真
其实在ASIC的设计流程里边
也是要先做时序分析的
考虑到设计工具的原因
我们跳过了时序分析这个过程
直接进行门级仿真
在PLD的设计流程里面
应该先做时序分析
再做门级仿真
因为工具已经集成了时序分析的功能
所以时序分析是可以很方便进行的
所以我们就一定要先做时序分析
为什么先做时序分析呢
因为在我们的一个设计里面
如果说时序满足不了要求
简单来说
举个简单的例子
我们做的一个计数器
本来希望能跑到100MHz
结果我们现在做的计数器只能跑到10MHz
那说明我们的设计思路有问题
我们的设计方法有问题
我们需要重头去改电路的RTL代码
即使我们电路的门级仿真功能是对的
那也没有任何意义了
所以只要时序满足不了要求
我们就得返工重来
直到时序满足了我们的设计要求以后
我们才有必要再去验证电路的
功能是不是满足我们的要求
所以通过时序分析以后
然后再去做门级仿真
验证经过综合以后的
经过布局布线以后的最终电路
是不是还跟我们初期的
设计需求和供应需求是一致的
当门级仿真也验证完了以后
时序也是正确的
门级仿真的结果也是正确的
证明我们这个电路在这两方面
都达到了我们的需求
然后就把电路
在最终的ASIC和最终的实现上
再往下走一步
也就是把设计所综合出来的数据流文件
下载到可编程的芯片里面去
并且上到实际的PC板上去
在实际的系统里面进行测试
测试的话有相关的编程工具 测试工具
调试工具
我们在后面有机会再给大家介绍
具体到物理实现的综合和布局布线
在工具里边
一般给它起的名字叫Compile(编译)
ASIC器件
或者说可编程器件的编译和软件的编译
是不一样的
软件的编译
C语言的编译是把C代码
转变成在计算机上可以执行的二进制文件
可编程器件的编译是把RTL代码
变成物理器件上可以实现的电路
刚才已经讲了
具体的编译过程分为几个方面
一个是前端的综合
后端的布局布线以及产生相关的输出
相关的输出大致有几类
一类是时序分析相关的输出网单
用于做时序分析
第二个
是用于仿真的网单
也有用于仿真的网单
这是跟ASIC设计稍微有点不同的
第三个
是产生编程用的
对器件编程的配置文件
输出文件
这个文件可以把一个没有任何功能的
可编程器件变成一个能够实现我们功能的
专用器件
具体到编译这个过程
这个工具提供了很多的详细的操作
细节的操作
也就是说
在编译过程里面
它分为很多细的过程
包括我们前面所说的综合、布局布线
时序分析
IO的分析等等
在Quartus II工具里面
提供了一个工具条
在右上角的工具条
既可以傻瓜似的按一下这个按钮
完成整个编译过程
也可以一步一步只完成中间的某一个细节的过程
我们来稍微仔细看一下
这个傻瓜式按钮表示full compilation
完成所有的编译过程
对于初始设计
或者说简单设计
我们就可以一步完成所有过程
对于复杂设计
综合布局布线
时序分析等等这个可能都需要花数个小时
甚至是数天的时间来完成
我们如果每次都是只按这个按钮的话
就会浪费很多时间
所以我们尽可能的一步一步来做
大致有几个
我们稍微看一下
一个是Elaboration
表示只对我们的设计进行初步的
语法检查和可综合性检查
检查一下我们的设计里面有没有语法错误
以及我们的RTL级代码
是不是可以映射出具体的电路
和我们的ASIC的综合相类似
这个过程有点像我们的File Read
就是把设计读进来的过程
在Elaboration过程
回想一下ASIC设计流程
我们其实在读入设计过程
就会去分析设计里面
有哪些电路会被映射成D触发器
这样的话呢
我们就可以去检查
我们是不是有一些原则性的错误
比如由于代码书写风格的问题
把组合逻辑电路变成了时序逻辑电路
在这一步就可以检查出来
再下一步是去进行综合
把RTL级的代码变成了具体的电路
变成了具体的门级网单
综合了以后
就可以初步去估计一下时序的信息了
综合完了以后
再就是Fitter
把具体的RTL级的电路
映射到我们选择的Altera公司的
某一款型号芯片上去
然后就是Assembler
这两个基本上都是后端的布局布线的工作
把它合在一起就可以了
做完以后
到这一步为止
我们说综合、布局布线就已经基本完成了
下面要做
分析工作
一个是时序分析Timing Analysis
分析一下我们电路的
时序性能是不是满足要求
时序分析完了以后
理论上就可以用第三方的工具
Modelsim去做功能分析了
在功能分析之前
通常我们还可以去做一下IO管腿的分析
因为对于一个物理器件
可能会用到几百个
上千个
如果是高端的可编程器件的话
可能会有上千个管腿
我们还可以去分析一下这些管腿的安排
是不是合适
具体要分析哪些问题
我们后面会去讲
完成这些分析以后
设计流程就基本上是做完了
在做的过程中
和我们用专业的ASIC软件综合是相类似的
我们要时刻的关注每一步所给出来的
报告
关注这些信息是否正确
在左边的这个窗口里边
会报告我们的过程是不是百分之百的正确
如果有错误的话
在中间的任何一个过程可能都会停下来
然后我们再去检查相应的
某一步是不是有错误
在下面的窗口里面
会给我们报告每一步里面相关的信息
我们要关注是不是有Error和Warning
对于一个复杂的设计
这个信息可能会翻好几屏
我们把这个窗口放大了
仔细的一屏一屏去翻
确保没有任何一个Warning或者是Error
对于这个集成工具而言
有些Warning或者是Error
可能很难看出它是什么意思
需要及时去查帮助
查找相应的帮助信息
或者从网上搜索相关的资源
确定这个Warning信息是可以忽略的
有一些Warning信息是可以忽略的
但自己一定要能够明确是什么原因
在这个窗口
会给我们报告出设计的相关信息
例如我们用的是什么器件
资源的占用情况等等信息
我们把刚才这个信息窗口适当的放大
我们可以看到
在设计的每一步都可以给出相关的报告
比如综合
例如前面的综合
可以给出综合的相关的详细报告
例如综合的设置
以及综合完了以后相关的结果
都是什么结果
Fitter相关的信息
Assembler相关的信息
以及Timing Analysis 信息
时序分析相关信息
例如我们仔细看一下这个设计
在这个设计里边呢
我们选择的是这款芯片
总的资源占用率的情况
总的设计一共有1万多个LUT
1万多个查找表
我们的资源占用只有92
占了1%
总共芯片有300多个管腿
我们使用了22个
资源的占用率大概是6%
总共芯片里边有400多K的Memory
Memory
我们的设计并没有使用Memory
后面是PLL的占用情况
DLL的占用情况
所以在这个报告里边
可以看出这个设计在可编程器件里面的
占用情况
包括资源的占用情况
时序的分析结果
Pin的输出情况等等这些信息
一般来说
对于一个可编程器件
我们要保证设计对各类资源的
占用情况
尽可能不要超过80%
这样的话
我们还留出了一定的余量
这个余量通常有两大类作用
一个是我们设计时不时会去修改
如果有错误的话
可能就需要去修改
有时候修改会导致设计的规模会
有所增加
这样
我们保证修改以后的
设计还能够在这个芯片里面放下
第二
留了一定余量以后
我们设计在使用过程中
有可能还会增加新的功能
有了这些余量
使我们的设计还具备升级的潜力
而不致于将来就不能增加任何新的功能了
我们来稍微详细的看一下资源的使用情况
资源的使用率
比如说
我们看输入管腿
这里面详细的报告出我们的输入管腿都有哪些
每一个输入管腿的信号
以及它的Pin的名字
在每个器件里面的物理名字
在Pin的某一个IO的Bank等等
还有Pin相关的一些属性
比如这个管腿是不是一些具有特殊功能的管腿
是不是PCI相关的管腿
是不是在上电的时候
需不需要把管腿做特殊的设定
比如说高电平
或者是低电平
等等一些详细的信息
都可以看到
对于有一些特殊功能的管腿
例如clock
我们要指定到芯片的全局时钟端
这样的话能够保证这些clock信号
能够用到芯片的全局时钟网络
使clock信号的延时(最小)
这些都是和可编程器件的特性相关的
在我们这门课里边会详细的介绍
大家在其它课程里面去学习
可编程器件使用的一些特殊要求
在综合的过程里边去看相关的
设置是不是符合器件的要求
首先我们来看一下综合的设置
这有点像ASIC的综合里边的约束
第一部分是关于器件和相关的
语法环境的一些设置
大概包含几方面
一个是顶层设计的名字
通常我们的设计是树状的设计
工具一般来说会帮助我们自动分析
设计的树状结构
作为设计人员
还要去检查一下树状设计的顶层
顶底单元是不是正确
第二个是我们的目标器件
目标器件的类型和种类
目标器件的类型以及具体的
器件的型号是不是选择错误了
第三个是我们的设计文件
我们设计里面都包含哪些设计文件
以及可能用到的一些库文件
例如用到了一些IP库等等
对于我们的RTL代码
不管是VHDL
还是Verilog
因为VHDL和Verilog都有很多语法标准
不同年代的标准
到底你的代码是使用的哪个年代的标准
比如说我们是Verilog的95标准
还是2001的标准等等
这个要设置好
再往下是EDA工具的设计
综合的话
既可以用Quartus II自带的内部综合工具
也可以调用第三方综合工具
仿真的时候也是一样
既可以用Quartus II自带的仿真工具
也可以用第三方的仿真工具
这些都是要设置
再往下就是Timing分析的一些设置
以及综合的设置和仿真工具设置
后面我们会详细的去讲
我们来看一下综合的过程
前面讲过具体在综合的时候
只是一个简单的Compile按钮
在综合的时候
软件会提供很多综合的策略和方法
例如它可以提供智能综合的方式
采用智能综合
它主要是用于增量综合
后面我们会讲增量综合
采用增量这种综合技术
可以节约我们的综合时间
并且能够节省磁盘的空间
通过类似这些手段
可以让我们综合的速度更快
刚才我们已经讲了
传统的设计
或者是稍微复杂一点的设计
可能会花几个小时
甚至是几天的时间来综合一遍
通过这种智能综合的方法
可以给我们节省很多时间
我们来看一下什么是Incremental Synthesis
假设我们的设计
我们一个顶层设计TOP里面包含了两个小的设计
一个设计A
一个设计B
这两个小的设计
设计A和设计B
在我们的顶层设计里面可以例化
是这样的层次结构
对于一个这样的设计
我们不管采用什么手段去进行综合
它花的时间是差不多的
我们来分析一下设计结构
通常我们对于RTL级的设计A
和RTL级的设计B
我们分别综合完了以后
或者说即使是在RTL级
它们在顶层设计的层次
A和B以及顶层之间
通常只存在一些物理的连线
而不存在复杂的逻辑结构
这是我们RTL设计的
设计规范的要求
也就是说
所有的逻辑功能
我们应该在每一个底层设计里面实现
在顶层设计里边只是进行相关的连接
这样
综合或者是说布局及相关的优化工作
其实都是体现在底层的A和底层的B里边的
我们想象一下
假设我们做完了这个设计
通常我们设计不会一次正确
通过在设计流程里边
我们会发现
在A或者说B里边
有一个BUG
有这样一个BUG以后呢
我们就要回过头来去修改我们的B里面的BUG
然后重复这个设计流程
也就是说要对设计重新去做综合
在这次综合的时候呢
A电路其实没有必要再去综合了
因为A并没有做修改
假设对电路综合的时候
如果A综合要5个小时
B综合要5个小时
顶层综合呢
因为只有连线
它几乎不用花时间
所以
在做第二次综合的时候
如果我们不对A去重新综合的话
我们就可以节约出对A综合的5个小时了
所以这就是Incremental增量综合的
概念的由来
如果我们对设计采用增量综合的方式
把A B分开以后
这样在第二遍
也就是修正我们电路BUG的时候
我们综合的时候
只对电路有修改的部分去进行综合
进行重新的布局布线
这样的话就能节约大量的时间
这就是增量综合
我们来看一下怎么进行增量综合
做的过程中
这是我们设计的树状描述
我们需要告诉软件
我们设计的层次划分以及对哪些电路
可能要采用增量综合技术
哪些小电路
可能就不用采用增量综合技术了
所以我们需要把采用增量综合技术去考虑的电路
把它mark出来
把它作为增量综合的单元
这样的话呢
在我们设置成
如果说综合的时候采用增量综合这种技术的话
增量综合这种手段的话
那么将来在综合的过程中
这个单元
设计工具就知道了
碰到这样的单元
我们就只综合它改变的部分
如果是没有发生改变的话
相关的电路就不再进行综合了
具体操作非常简单
我们做好相关的设置以后
所有的操作过程跟普通的操作是相类似的
按照标准的操作流程做就可以了
软件会自动帮我们采用相关的
增量综合的方式来进行综合
在综合的选项设置里边
我们可以让EDA工具去采用适合的
手段去进行约束
进行优化
这个选项有点像我们ASIC过程里面的约束
关于速度和面积方面的约束
在第一部分
可以让软件帮我们去考虑速度优先
还是面积优先
还是在两者之间去做平衡
在具体优化的方法里边
可以选择一些逻辑优化的方式
包括就是说
用这种方式来进行逻辑优化
等效的宏单元来替代我们自己所描述的
逻辑功能
或者逻辑函数
因为在可编程器件里边
厂家已经替我们设计好了一些功能固定的
宏单元
比如说加法器、乘法器
滤波器等等这些电路
这些电路的实现效率
这些宏单元的实现效率
比我们自己用RTL代码实现的效率要高
所以
工具会自动提炼出相关的宏单元
来替代掉我们所设计的代码
对于有限状态机的状态编码
可以采用这三种方式One-Hot
或者是MinimalBit这种方式
以及自动选择方式
来进行状态编码
换句话说
如果我们代码里边的有限状态机采用的
不是明确表示的状态编码方式
而是用枚举类型
或者是抽象类型来表示的话
工具会帮我们自动去选择相关的
状态机编码方式
提高我们的编码的效率
在布局布线的时候
也是类似
那么可以采用几种不同的方式
选择快速的布局布线方式
在初期的设计的时候
比如说我们设计刚刚完成
第一遍去验证我们设计功能是不是正确
这时候呢
我们并不过多的去考虑我们实现的效率
这时可以采用快速的一些方法来完成
用一个小时就可以完成布局的线
当我们设计工作已经调整好了
最终我们希望用紧凑的设计
实现更好的性能的时候
我们就选择标准的布线方式
来使我们的设计达到最好的布局布线的
一个效果
在IO管腿指定方面也有很多需要注意的
一些细节
如何指导IO管腿?
通常我们从板级或者系统级的需求
我们对芯片的每一个信号管腿的
指定会有一些要求
比如说我们可能会把数据总线的八位
或者十六位
通常我们在布局布线的时候希望它们在一起
或者说在同一个方向
或者说在同一个Bank里边
那么这样的话呢
我们在指定管腿位置的时候
我们可以指定
这一系列的管腿全部放在芯片的左边
我们并不给某一个管腿指定具体的名字
比如说必须放在左边的第一个管腿
还是第二个管腿
这样就给布局布线工具
留出了一定的灵活性
只要它固在芯片的左边就可以了
这样它可以采用更灵活的布线方式
使最终布完了的线最短
芯片的性能最好
这是一种方式
第二个
在我们的复杂芯片里面
IO可能会有好多Bank
好多Bank是指什么意思呢
通常每一个Bank的IO里边的
供电电压是相同的
我们的一个芯片可能会接有2.5V的输入输出信号
3.3V的输入输出信号
1.8V的输入输出信号
我们可以把相关的
信号指定在同一个Bank里
这样的话
它们的电压域是一样的
它们的驱动方式都是相同的
这样就为我们灵活的这种布局布线的
这种约束方式
指定完IO管腿以后
通常我们还要做一个IO管腿的指定分析
为什么要这么做
因为可编程器件的很多IO管腿有特殊的功能
比如有时钟专用的管腿
复位信号专用的管腿
PCIE相关的管腿
存储器相关的管腿
串形接口相关的管腿等等
我们要去分析这些特殊功能的管腿
和我们的指定是不是有冲突
这是IO管腿分析的一个结果
我们可以看到
在分析结果里面
可以给出我们详细的IO分配表
这个表可以用于后续的PCB的布线工具去进行分析
相关的分析文件
以及相关的输出管腿的负载等等这些信息
都可以在相关的信息窗口里边
汇总窗口里面都可以给出来
下面我们来总结一下
可编程器件的编译过程包含几个方面
一个是编译
包含了综合和布局布线两个过程
是需要我们去关注的
需要我们去做设置和约束
第二个是编译的结果
包含了详细的信息
包括管腿的信息
包含时序的信息
资源占用率的信息
第三个是我们的设置
各种设置和约束
IO管腿的设置
Timing方面的约束
这个综合策略的约束
这些都可以控制我们
或者说改变我们的综合过程
在某些方面调整
微调综合的结果
-软件下载说明
-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)--作业