当前课程知识点:IC设计与方法 > 6、Quartus工具 > b)综合及优化 > Video
下面我们来看一下基本的综合过程
基本的综合过程包含以下几步
如果是简单的软件操作
可能你只需要按一下软件上的某一个按钮
就可以完成所有的综合过程了
但实际上一个专业的综合工程师
他所要干的事有好几步
主要包括综合的环境的设置
以及对综合结果的优化和综合结果的分析
对于一个资深的综合的工程师而言
他们的价值是非常高的
可以打个比方
如果我们聘请synopsys公司的
一个综合工程师来做一个设计的话
他平均每年的收费大概在1500美元这个量级
如果是一个刚毕业的学生
他可能一文不值
他们俩的差异在什么地方
在于综合过程里边
对于综合前的约束怎么设置
以及对于综合的结果怎么进行分析
以及怎么进行优化
首先我们是准备RTL代码
第二步我们是描述综合的库
刚才已经说了
我们是用了UMC公司的ARM公司提供的0.18微米的
标准单元库
所以我们要描述这些库的一些基本信息
这些准备工作做好了以后
我们下面就要把这个设计读进来
去分析这个设计有没有什么问题
前面我们在仿真的时候已经讲过了
我们仿真是验证这段RTL代码的功能是不是正确
但不去检查RTL代码是不是可以变成具体的电路
以及在变成电路的过程中
有没有什么问题
在读入设计这个环节
软件就会去做刚才所说的这两方面的检查
再往下就是我们所说的
一个工程师的1500美元价值的体现程度了
体现的地方了
那么我们需要定义设计的环境
也就是这个设计它工作在什么样的环境
它的外部连接的是哪些芯片给它提供信号
以及我们的这个电路
我们这颗芯片需要去驱动哪些芯片
提供哪些信号
再往下就是一些设计的约束
设置这个设计的约束
包括对我们芯片的时钟频率的描述
时钟的描述
我们输入接口的一些信号的时序的描述
输出接口的时序的描述
对面积的要求
对功耗的要求等等
对所有设计的描述主要都体现于在设计环境的约束
以及设计本身约束这两方面
具体的综合从操作来说非常简单
只需要按一个按钮
或者说输入compile这样一个命令就可以了
软件实际综合的过程呢
可能会非常短
如果说一个计数器的话
可能就是几秒钟的时间
也可能会非常长
例如一个处理器
可能会花一个星期
甚至半个月的时间才能够综合完
如果说我们综合的约束做得不是很好的话
会花很长时间才能综合完
综合完了以后
软件会吐出一些综合后的网单
也就是我们具体的电路
以及相关的结果
包括功耗 时序等等这方面的结果
我们作为设计人员
去分析这些结果是不是符合我们的要求
设计的功耗
设计的面积
设计的timing是不是符合我们的要求
如果不符合要求
我们回过头去
如果只是轻微的不符合要求
例如在10% 20%以内的余量的话
我们可以回过去尝试重新定义设计环境
重新定义约束
然后重新定义优化的策略
让ED软件去做进一步的优化
也许就能够满足我们的要求了
这是对于比较小的差异而言
如果出入比较大
或者说综合完了结果
跟我们的预期差异比较大的话
通常来说
是我们的RTL代码设计的结构上有问题
满足不了我们的要求
这时候我们只能返回去
要求设计人员重新修改RTL代码
用一种更好的结构来实现我们所预期的目标
当所有的目标都满足了以后
我们可以说
综合出来的这个网单已经符合我们的要求了
这时候我们就把综合的结果保存下来
包括两方面的数据需要保存
一个是设计的网单
也就是电路的拓扑结构
第二个是跟设计相关的时序信息
我们把这两者都保存下来
用于去做后续的集成电路后端的
设计以及仿真等工作
第一步是读入设计
具体的操作我们就不说了
需要把相关的VHDL
或者verilog代码读到里面去
在读的过程
也就是我们刚才所说的分析过程
软件会分析设计有没有问题
以我们的计数器为例
我们要去观测
这个软件的命令窗口给我们的信息
注意
我们不能只是
按一下读的这个OK按钮就完了
我们需要去详细的检查软件给出来的这些报告
最后工具会报告给我们一些waring
例如我们所说的
进程的敏感表里面漏掉一些信号的话
这时候软件就会给出一个warning
告诉我们RTL级电路综合出来的
网单和具体RTL级仿真的结果有可能会不一致
这是我们一定要特别关注的
另外
我们还要关注的就是
在综合工具读入电路以后
它会给出分析
我们这个电路具体产生了哪些D触发器
具体我们来看一下
以这个例子为例
我们给的是一个计数器
一个counter
这个counter在读进去以后
软件就会分析出来
counter的第14行代码所对应的
赋值语句会产生触发器
触发器名字通常会在原始的
信号后面加一个reg
这个触发器是一个四位的触发器
所以称之为总线类型的触发器
并且它有一个异步复位端reset端
我们根据这些分析结果
回过头去
对照着看一下RTL级代码
当时我们写的时候
是不是预期的要产生一个四位的Q触发器
并且是有异步复位端的
如果这两者不致
就说明我们的代码写的有问题
我们在RTL级电路设计的时候
也举过例子
当我们在进程描述的时候
描述方式不正确的时候
例如把输出逻辑跟状态计算逻辑写到一起去了
这样的话就会产生出额外的触发器
在这个报告窗口里面
我们发现后续这个地方可能会产生额外的触发器
我们就知道我们的电路设计有问题了
所以读入设计的过程是非常重要的
你要去详细的分析
综合工具,我们讲的是synopsys公司的DC综合工具
对读进去的设计以后
它通常对设计里面的
一些对象和属性有这些描述
我们的TOP是顶层设计
我们术语上称之为design
对于clock信号
注意我们这里面设计上出现了好多clock
在这个地方clock是一个port端
是一个端口信号
在这呢
CLK又是一个时钟信号
这里面的bus1是一个net
是电路里面的一个网络信号
对于元器件
元器件的名字
反向器是一个reference
反向器类型是一个reference
反向器具体例化到我们的电路里面以后
给它起的名字我们称为cell
在这里边
cell它可能是某一个pin
所以对同样一个信号
同样一个名字
CLK这个名字
它在不同的位置
可能会有不同的含义
有可能会叫Clock
有可能会叫port
有可能会叫pin
需要我们去区分出到底是什么意思
我们电路的时序路径
一共有四种类型的时序路径
前面我们讲的时候
主要讲了电路的内部特性
内部的时序路径
是从一个D触发器的输出端
或者说Clock端到Q端
然后经过云图传递到一个D触发器的输入端
这是电路的内部时序路径
另外还有几条不完整的时序路径
包括从输入信号传递到D触发器的输入端
从末端输出电路里边的
D触发器的时钟端传递到输出管脚
这三种时钟路径都是跟时钟信号相关的
另外还一条路径
有可能是一条组合路径
直接从输入端输入
然后穿过一个组合逻辑电路就送到了输出端
这样的路径是另一种形式的路径
它是跟时钟信号没有关系的
不管哪一类路径
它的起点一定是这两者之一
要么是某一个输入管脚
要么是某一个flipflop的输入
或者是触发器的时钟端
这是两者之一
对于输出点的话呢
时序路径的输出点
一般也是两者之一
要么是输出端口
要么是某一个触发器
或者是时序器件的数据输入端
下面我们来看一下怎么进行约束
对于我们设计的约束通常包含两类
一类是时序方面的约束
timing的约束
另一类是面积上的约束
通常时序约束的优先权更高一点
我们来看一下紫色部分
就是我们所要描述的电路的内部特性
约束的时候呢
按照原理上来说
我们是要求EDA工具
或者说要求软件
让这块组合逻辑电路X
这块介入两个触发器之间的X
让X的路径越短越好
但是我们在做约束的时候呢
通常我们只需要
约束这两个触发器时钟周期就够了
因为我们一旦约束好了
时钟周期是多少
因为软件从库里边
可以提取出D触发器的clock to q的时间
以及建立时间
所以软件就可以自动的算出对所有的路径的延时
所以对于设计人员而言
我们的工作就比较简单了
我们只要告诉人家
我们这个电路工作的时钟周期是多少
他就能够自动的
建立起对所有的路径X的约束了
对于输入路径N和输出路径S而言
相对来说要麻烦一点
这涉及到电路工作的时候
它的外特性是一个什么样的特性
以这张图为例
假设我们设计完的这颗芯片它在工作的时候
送给N的数据是来自于另一块集成电路
另一个集成电路在工作的时候呢
它用的时钟信号跟我们的
时钟信号是同一个时钟信号
我们不妨假设那个电路它的工作模型
或者说它的数据也是由一个D触发器
经过一系列的组合逻辑电路的
延时送到我们的路径N上的
所以的话呢
我们对它的约束就变成了
因为大家用的是同一个时钟信号
所以时钟信号用的是同一个时钟
我们就只需要约束
或者说告诉EDA软件
外部的这个电路在产生数据给我们的时候
用了多长时间
换句话说
我们要告诉我们这个软件
从这个时钟信号到来以后
数据给我们的时候
相对于时钟信号落后了多长时间就可以了
同理
在约束输出路径S的时候
我们也可以假设
我们的数据S送给外部电路的时候
也是送给外部电路的某一个D触发器
它跟我们用的是同一个时钟信号
它也是需要去锁存
或者是装载我们输出的数据的
那么我们也要告诉我们的软件
外部电路在装载数据的时候
需要花额外的多长时间才能够把数据装下来
这样的话就知道了对路径S有什么样的要求
所以对时序路径的约束
我们就可以总结为
我们需要用3个方面来约束
一个是create_clock
可能有相应的菜单命令
可以完成描述
时钟信号是什么样的信号
周期是多少
以及输入路径的延时是多少
输出路径的延时是多少
这样就对路径N X和S做完整的约束
在描述时序约束的时候呢
我们还要关注一下电路里面的
线是怎么进行描述的
或者说它的模型是什么样的模型
互联线的模型相对来说比较复杂
因为我们说互联线连接的时候呢
一根线进来以后
可能会分为若干个节点
分成若干个叉连接不同的元器件
我们对连线模型大概可以用这样一张图
叫连线模型进行描述
一个驱动器经过一堆线路以后
一个树状网络以后
送到另一堆元器件的输入端
这些连线长度可能有所不同
所以
我们对连线要给它描述成连线的电阻有多少
电容有多少
面积有多少
这三个参数都是跟长度有关的
所以
我们对互联线模型
可以用这个公式来进行描述
在互连线模型里边
我们描述了这个线的
负载跟线的长度之间的一个关系
用一个表格
用一个查找表
及一个查找表之外的
一个扩展参数来统一的表示出来
假设我们的元器件它的fanout是6的话
也就是说它带了123456负载的情况
这时候它在实际上互连线的长度是多少呢
我们用一个估计模型
或者是预测模型可以算出来
首先查出来
如果长度最大到四的时候
它的负载参数是3.9
然后超过4
因为我们带了6个负载
所以要用一个扩展的斜率来进行表述
这个斜率就是0.5
然后超过4的负载有两个
用2乘0.5来表示超出刚才
我们这个查找表范围的连线长度
算完了以后
等效的连线长度就是4.9
我们再从查找表就可以查出
如果一个长度4.9的连线
它所对应的等效电阻
电容和面积就可以用这个公式
用查找表把这些数找出来
用公式就可以算出来
用这种方式
就可以估算出当我们一颗芯片内部的负载
内部的元器件
驱动若干个负载的时候
它的连线所对应的
负载的电阻电容和面积各是多少
为什么要进行这样的估算
是因为在综合阶段
我们这时候还没有具体版图里边的
物理连线的信息
所以我们只能用这种方式来猜测我们的
连线它的这些参数到底是多少
第二个需要关注的就是时钟信号
或者说时钟网络
在我们的复杂电路里边
输入的时钟信号可能会连接了数百个
上千个D触发器
我们都知道
一个器件
或者说一根信号线
是没办法直接连接这么多D触发器的
所以怎么办呢
我们一般的做法是插进去一个树状网络
经过好多分叉以后
每一个分叉只连接有限个D触发器
为了保证原始的时钟信号
到达每一个D触发器的时候
时钟信号几乎是同时到达的
我们就要尽可能的让这个网络能够均匀
或者说规则
每一个器件和导线的不同长度的分配
使时钟信号有效沿到达各个D触发器
它的时刻都是均匀的
但再怎么做
也不可能是完全相同的
对吧
所以我们就要用几个参数
一般来说是两个参数来描述时钟信号
首先由于插进去的
这些buffer和这些物理的连线
会导致原始的时钟信号
经过一个clock_latency延时以后
才能到达目标D触发器
第二个呢
一些网络的不一致
导致时钟信号有效沿达到目标D触发器后的具体时刻
会有一个微小的差异
我们把它描述成Clock_uncertainty
所以我们用这两个参数
就可以描述出具体的时钟网络的参数了
以这个例子为例
我们来看一下对时钟信号的描述
我们怎么描述
一个是时钟的周期
我们可以用这样一条语句来描述
对时钟信号而言它的周期是10个纳秒
时钟的不确定度
或者说由于时钟网络
会导致第二个D触发器它的不确定度
大概有0.5个纳秒
这两句话就描述出了一个实际的物理时钟
在这里面我们还没有描述时钟的物理延时
物理延时这个参数因为跟具体的
设计有比较大的关系
跟具体的版图也有很大的关系
所以在综合阶段可以不去考虑描述物理延时
这是实际的示意图
根据上面的一句话
我们知道实际的时钟时期
第一个上升沿到第二个上升沿
它的延时是10个纳秒
时钟的不确定度是0.5纳秒
表示第二个时钟沿有0.5纳秒的不确定度
也就是说它有可能会往前
提前0.5纳秒
也有可能往后落后0.5纳秒
那么按照最坏的情况来算
我们假设时钟信号有可能会往前提0.5纳秒
也就是说
我们的数据信号必须在这之前就准备好
另外从库里边
我们可以查出库的
建立时间大约是0.2纳秒左右
也就要求我们还要在这个沿
再提前0.2纳秒setup时间的检查
这样我们就知道了
对于组合逻辑电路
它要求数据必须在9.3纳秒之前就必须是稳定的
也就是说
通过这种对时钟的约束
我们就建立了对路径X的延时要求
对输入路径的延时要求
或者说约束也是相类似的
我们用的是这条语句来对输入路径进行约束
那么约束的方式呢
我们也是一样
我们要描述这个clock-q的延时
以及路径M的延时的参数
我们把这两个参数描述清楚以后
软件就可以建立出对N的这个路径的约束
对输出路径的约束也是相类似
我们需要描述出对外输出的路径T的延时
以及外部接收数据的D触发器它的建立时间
这样
软件就能够建立起
内部输出路径S这个组合逻辑的约束
具体怎么约束
一方面我们可以通过命令行操作的
方式去用一条命令来描述约束
也可以用软件去描述这个路径的约束
软件的图形界面描述出对时钟信号的约束
这里面我们可以选择好电路里面的Clock信号
然后描述出它的周期
描述出它的上升沿和下降沿的位置
就可以对时钟信号进行约束了
在综合的时候
通常我们还要选择Don’t touch network
这样的话
综合软件不会尝试在综合过程插入时钟树
我们可以把插入时钟树这个过程
留到后端布局布线的过程去进行了
除了约束时钟之外
另一个约束就是面积了
软件通常会优先尝试
去满足时序
或者说时钟上的要求
然后再尝试满足面积的要求
面积约束的话呢
通常我们(可以)约束一个任意的数值
有时候我们直接输入0就可以
让软件尝试用最小的面积去把芯片实现出来
具体面积单位是什么
或者说怎么评价一个电路的面积
我们通常有三种单位
一种方式用2输入的与非门对电路进行评价
也就是说
最终评价是我们的电路等效有多少个门
第二种方式是用等效多少个晶体管的方式来去描述
对于非专业人员更倾向于用前面这两种方式
也就是说
我们电路等效多少个门
或者说等效多少个晶体管
在媒体上我们经常会看新闻
现在的集成电路已经达到了几千万门
甚至上亿门这样的一个规模
就是用这两种方式去进行描述
第三种方式是用比较直观的
物理的面积
也就是说
这个电路等效的面积是多少个平方微米
或者多少个平方毫米来描述
因为电路的每一个门都非常小
通常单位是平方微米
在我们EDA软件里面
应该说大多数EDA软件的交互性
或者说用户界面都做得不是很好
人机接口做得不是很好
在EDA软件里面
通常只有一个数值
我们这时候就要靠自己的
经验来判断这个数值到底代表的是多少个门
多少个晶体管
还是多少个平方微米
如果这个数值后面有一个小数点0.5的话
那么通常代表的是多少个门
因为我们都知道
一个非门大概等效于0.5个与非门
如果是整数的话
很可能是晶体管
如果小数点位之后有很多位的话
通常就是等效多少个平方微米
约束完了以后就是综合了
具体综合的软件操作非常简单
调出相应的菜单
然后选择开始综合就可以了
软件会花几分钟 几个小时
甚至更长时间
得到一个综合的结果
在综合的窗口里边
也会不断的报告出优化的面积是多少
面积的数量通常会从一个比较大的
数值逐渐的往下减少
直到最终稳定下来
最终稳定的结果
就是我们芯片综合完的面积结果
我们再来看一下
综合过程中有哪些优化措施可以去使用
或者说软件会做哪些优化
我们来看一下左边这个例子
举个例子
我们这个电路根据输入的ABCDE产生三个输出结果
那么根据这个表达式
我们可以直接映射出右边这样一张图出来
产生由A加B
再加上C
产生SUM1
同样的方法再产生SUM2
以及产生SUM3
我们从这张图里边
我们可以看出来
在这里边
这三个加法器
左上角的这三个加法器其实干的是同样的事情
对吧
所以右边的这两个加法器就可以被优化掉
把右边的这张电路图换成左下角的电路图
A加B只做一次
然后把它的
加法结果共享给对SUM2和SUM3的求和这个电路上
用这种方式优化以后
我们得到的电路只用四个加法器
用的资源会更省一点
这种优化方式
我们称为共享表达式的优化方式
第二种优化方式是资源共享
什么是资源呢
在电路里面的运算资源包括加减乘除比较等等
这都是资源
以我们右上角这段代码为例
我们根据选择信号来决定到底是做A加B
还是做C加D
直接映射完结果就是左边这张图
电路的最右端是一个多路选择器
然后根据选择信号决定
是把A加B的结果送给多路选择器
或者是C加D的结果送给多路选择器
在这个电路里边呢
一共用到了两个加法器和一个多路选择器
通常来说
加法器的资源会比多路选择器大
特别是当加法器的位宽
位宽非常宽的时候
这个资源就变得非常大了
所以的话呢
我们要想用更少的资源
或者说更小的规模去实现这个电路的话
我们可以用右边这张电路来实现
我们改变加法器和多路选择器的连接关系
先用两个多路选择器
为加法器去选择不同时刻的不同要求
不同SEL信号下的输入信号
那么当sel信号有效的时候
把A和B送给加法器
否则是把下面的C和D送到加法器的两个输入端
通过这种方式
就能够只用一个加法器就实现了这个电路
这就是资源共享
这是软件能够做的优化工作
第三种优化工作是操作数重排
假设我们电路要做这个复杂的运算
A乘以B
加上C乘D
再加E
再加F
再加G
做这个复杂的运算才能产生出SUM
我们把电路直接映射完了以后
就是上面这张电路图
AB相乘
CD相乘
乘完了以后
再把这两个数相加
最终产生了这个SUM
看起来这个电路已经是规模最小了
也没有什么可优化的
在这张图里边我们可以想象一下
如果ABCDEFG这些信号不是同时到达的
那这张图是不是最优的呢
就不一定了
我们可以想象一下
如果ABCD信号到的最早的话
它要花这么长的时间才能够算出SUM
对吧
所以上面这张图是和ABCD到的比较早的这种情况
如果我们上一级电路给出ABCD这个操作数的时候
比如说给出AB操作数给的相对来说比较晚
它会先给出E和F
这时候我们可以看到
如果我们换成下面这张图的话
那么从B传递SUM的时候
它只需要一个乘法器加上一个加法器的延时
显然比上面这张图所用的延时更少
对吧
所以也就是说
下面这张图
比较适合不同操作数到达时间不同的这种情况
这就是操作数重排
在某些特定的情况下是有它的优势的
完成综合以后
利用刚才所说的一些优化手段
完成综合以后
综合软件会给出相关的电路图
包括顶层电路
以及包括底层电路
作为初学者而言
我们可以去看看实际的电路长成什么样子
当然对于复杂电路去看这些电路图意义就不大了
因为你想象一下
如果这个电路里面有几千个
几万个门在一起的话
我们什么都看不出来
所以只是具有一些参考意义
最后我们来检查一下结果
看看综合的结果是不是符合我们的要求
首先我们来看一下面积结果
那么在这个报告里边
我们可以看到
我们电路的组合逻辑电路是113.xxxxxx
后边好长一串数
所以我们就可以猜测出这个给出的
面积是平方微米的面积
不可能说一个113多个晶体管
非组合逻辑
或者说时序逻辑电路是279个
279个平方微米
然后是互连线的面积
在我们这里面综合的时候
由于没有定义互连线的模型
所以它算不出互连线占多少面积
对于实际的商业产品
商业芯片设计
我们一定要去定义互连线的模型
这样的话
软件在综合阶段就可以把互连线的
面积也估计进去
能够算出一个比较准确的值出来
最后我们关注一下timing
实际上我们应该先关注timing
再关注面积
因为timing满足要求
我们的面积才有意义
否则的话我们就需要去返工
重新综合
在这里面我们看一下一个timing报告
通常timing报告包含几部分
我们看一下第一部分是数据到达的时间
所谓的数据到达时间就是指从上一级触发器开始
上一级触发器的clock开始
从零时刻开始
每经过一个期间会增加一点点时间
增加的列
右边这个列是指总的路径的时间
从上一级触发器开始经过了一个触发器Q
然后从Q的clock端传到Q的输出端Q
传到这个触发器的输出端Q
然后再经过一个与非门
经过一个或门
经过一个异或门传递到输出端
一共用了0.61个纳秒的时间
第二部分是描述库的时间
时钟周期是100个纳秒
然后建立时间是0.24个纳秒
刨掉0.24纳秒
也就是说
要求数据到达时间
相对于第二个时钟周期而言
到达时间必须是99.76个纳秒
这是data required time
然后软件来算一下这两者之差有没有余量
算完以后
我们这个电路还有99纳秒的余量
换句话说
工作时间远高于我们所要求的工作频率
根据时序分析的结果
我们其实可以重建关键路径
我们来看一下这张图
在这张图里边
我们给出了一个经过关键路径的所有信号
所有的元器件
以及经过每一个元器件时间增加了多少
以及整个关键路径所耗费的时间
我们可以看到从时钟开始
首先经过了时钟网络以后
然后送到一个D触发器
D触发器的输出
先经过一个反相器
用了大概0.12纳秒的时间
经过一个反相器
然后经过了一个或门
再经过了一个多路选择器MUX
最终送到了一个D触发器
所以的话我们就可以把这些元器件的名字
把这条关键路径建立起来
以及每一个元器件都花费了多长时间
我们也都可以建立起来
在这里边我们就可以分析
关键路径
如果设计的关键路径
不满足我们的timing方面约束的话
它的问题所在
通常会有几种类型的问题
一个就是关键路径上经过的元器件数量太多
造成延时太长
第二的话呢
关键路径穿过的设计的层次比较多
这个例子里面没有给出来
因为有可能我们的设计是一个分层的
含有多层的一个设计
那么通常EDA软件
在跨层次的时候并不做优化
如果我们发现在关键路径里边
元器件的信号的名字有一个多层的结构
那么
我们就可以认定出关键路径穿过元器件的层次
穿过设计的层次太多造成路径太长
或者说优化的不够充分
我们就可以用一些比较高层的
打散的操作去优化层次
把设计的层次减少
让软件可以做更充分的优化
这也是给出的设计data required time的报告
从时钟网络开始
时钟的周期是两个纳秒
由于网络的延时是0.5纳秒
clock uncertinty是0.27个纳秒
触发器的建立时间是0.06纳秒
最终算出来我们这个data required time是2.17个纳秒
我们再来看另外一个例子
怎么算出时序是不是满足我们的要求
假设我们的时期周期是20个纳秒
经过刚才的设计
经过刚才的时钟网络的参数计算进去以后
以及建立时间的参数计算进去以后
我们知道data required time就在这个地方
是19.2纳秒
如果我们的data arrival time是5.99
中间这个差就是slack
可以算出slack是13.21
所以就能够满足我们的设计要求
如果slack小于0的话
就是violated
就是设计不满足要求
就需要我们重新去修改约束
重新去修改RTL的代码
timing
或者说面积都满足要求以后
这个设计就认为满足了我们的constraint
满足了我们的约束
我们综合出来的网表就是正确的
下面我们就需要把网表以及网表所对映的
时序方面的参数分别保存成verilog文件
或者是vhdl文件
以及相应的反标数据文件
去反标到我们的网单上去
用于我们电路的门级仿真
或者说后续的参数提取
我们下面看几个具体的电路
具体的电路综合完了以后都是什么样子
第一个是最常用的多路选择器
在这张图里边
左边是一段代码
是一个多路选择器的代码
当选择信号满足的时候
我们把A送给Q 否则的话把B送给Q 我们都知道
在RTL设计的时候讲过
如果是一个条件判断分支
对应的是2选1的多路选择器
所以我们看一下
右边就是我们直接映射完以后的电路
是一个2选1的多路选择器
第二个例子是一个加法器
左边的RTL代码
我们只用了一个A加B赋给Q这样一句话
我们这句话映射完了以后就是右边这张图
是一个加法器的图
我们知道加法器是一个宏单元
EDA工具
通常已经把八位的 十六位的 三十二位的
等等不同位宽的加法器都做好了
是一个可参数化的单元
另外加法器在实现的时候
也有不同算法的不同结构加法器
EDA库里面也都有
软件会根据我们所设置的
约束来选择合适的加法器
比如特别快的
或者面积特别小的
加法器来满足我们的不同要求
刚才是直接综合
或者是直接映射后出来的
一个加法器的宏单元
把这样的加法器的
宏单元经过具体的综合以后
这是得到综合后的结果
在这张图里面
我们大致可以看出来
这个从输入端到输出端传递
是由一系列的电路所构成的
有一些是与非门
有一些是与门
有一个是或非门或者是异或门
还有一些我们也不太确定是什么样的
门电路
构成了整个加法器的这样的图
所以说直接看电路的单元
最终的电路图意义不是很大
我们再来看一下D触发器
左边是一个D触发器的,标准D触发器代码
右边是这个D触发器所映射出来的
D触发器的元器件
我们可以看到这个D触发器只有数据端
时钟端和输出信号Q端
再来看稍微复杂一点的D触发器
在这个D触发器里边
我们增加了相应的异步复位信号
注意
这里边异步复位信号选的是
高电平有效的异步复位信号
右边是它映射出来的D触发器
我们可以看到由于库里边的D触发器
通常来说都是低电平有效的D触发器
所以对于左边这段代码在实现的时候
最终是用两个器件构成了一个电路
才能满足我们的要求
在异步复位信号上
连接了一个非门
才能够满足我们的要求
所以这也就反映了我们对于电路设计的时候
对于异步复位信号
异步置位信号
这些信号
我们尽可能要用低电平有效的信号
如果用高电平有效的信号
有可能会造成我们电路里面面积会适当的增加
最后是相对复杂一点的电路
一个计数器
这边是一个计数器的标准的代码
把Q加1赋给Q
在时钟有效沿到来的时候
右边是映射完的电路
我们可以看到
基本和我们预期是一致的
由于有一个Q加1操作
所以映射出了一个加法器
完成一个加的动作
我们这个计数器是一个四位的计数器
所以在这个电路里边大致有四个触发器
当然这里面我们只是刚刚映射出来的电路
所以还不知道
这个触发器最终是用D触发器还是JK触发器好
所以是用一个宏单元来表示的
具有通用功能的触发器
我们知道
一个四位触发器的值
加1完成这个计数器的功能
然后我们把刚才这个电路重新综合一遍
这是最终综合出来的电路
我们大致可以看出来
在这个电路里边有四个D触发器
还有三个门电路
完成了计数器功能的这样的电路
这就是软件综合的一个过程和例子
-软件下载说明
-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)--作业