当前课程知识点:IC设计与方法 >  6、Quartus工具 >  b)综合及优化 >  Video

返回《IC设计与方法》慕课在线视频课程列表

Video在线视频

Video

下一节:门级仿真

返回《IC设计与方法》慕课在线视频列表

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触发器

还有三个门电路

完成了计数器功能的这样的电路

这就是软件综合的一个过程和例子

IC设计与方法课程列表:

课程准备:Quartus II软件的下载

-软件下载说明

--Quartus II软件下载教程

1、集成电路的发展

-a) 集成电路的应用及市场

--1-1集成电路应用及市场

-a) 集成电路的应用及市场--作业

-b)集成电路的制造过程

--1-2 集成电路的制造过程

-b)集成电路的制造过程--作业

-c)从CPU的发展看IC的进展

--1-3从CPU的发展看IC的进展

-c)从CPU的发展看IC的进展--作业

-d)从行业的发展看IC的进展

--Video

-d)从行业的发展看IC的进展--作业

-e)从ISSCC看IC的发展方向

--讲课视频

-e)从ISSCC看IC的发展方向--作业

2、数字集成电路设计方法

-a)数字系统的实现方法 (ASSP/FPGA/ASIC的对比)

--讲课视频

-a)数字系统的实现方法 (ASSP/FPGA/ASIC的对比)

-b)组合逻辑电路

--Video

-2、数字集成电路设计方法--b)组合逻辑电路

-c)时序逻辑电路(1)

--2-3时序逻辑电路的设计方法 (一)

-d)时序逻辑电路(2)

--2-3时序逻辑电路的设计方法 (二)

-2、数字集成电路设计方法--d)时序逻辑电路(2)

3、Verilog语法

-a)Verilog的历史和学习要点

--讲课视频

-b)端口、信号及数据类型

--讲课视频

-b)端口、信号及数据类型--作业

-c)逻辑电平及数据操作

--讲课视频

-3、Verilog语法--c)逻辑电平及数据操作

-d)Assign 语句

--3-1-4assign语句

-e)Assign 举例

--3-1-5 Assign 举例

-f)Always

--3-1-6 Always

-f)Always--作业

-g)阻塞与非阻塞赋值

--Video

-3、Verilog语法--g)阻塞与非阻塞赋值

-h)D触发器的描述

--Video

-i)时序电路的设计

--Video

-i)时序电路的设计--作业

-j) 面向测试的Verilog语法(1)

--3-3-1面向测试的Verilog语法(1)

-k) 面向测试的Verilog语法(2)

--3-3-2 面向测试的Verilog语法(2)

-k) 面向测试的Verilog语法(2)--作业

4、电路设计实例

-a)电路设计实例1

--Video

-b)电路设计实例2

--讲课视频

-b)电路设计实例2--作业

-c)电路设计实例3

--讲课视频

5、Modelsim仿真工具

-Modelsim仿真

--Modelsim仿真

6、Quartus工具

-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)--作业

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。