本章目录:
1. 时序约束
1.1 什么是时序约束?
时序约束主要包括周期约束,偏移约束,静态时序路径约束三种。通过附加时序约束可以综合布线工具调整映射和布局布线,使设计达到时序要求。附加时序约束的一般策略是先附加全局约束,然后对快速和慢速例外路径附加专门约束。附加全局约束时,首先定义设计的所有时钟,对各时钟域内的同步元件进行分组,对分组附加周期约束,然后对 FPGA/CPLD 输入输出 PAD 附加偏移约束、对全组合逻辑的PAD TO PAD 路径附加约束。
附加专门约束时,首先约束分组之间的路径,然后约束快、慢速例外路径和多周期路径,以及其他特殊路径。
1.2 约束的作用
1:提高设计的工作频率(减少了逻辑和布线延时);
2:获得正确的时序分析报告;静态时序分析工具以约束作为判断时序是否满足设计要求的标准,因此要求设计者正确输入约束,以便静态时序分析工具可以正确的输出时序报告;
3:指定 FPGA/CPLD 的电气标准和引脚位置。
2. 静态/动态时序分析
2.1 静态时序分析
静态时序分析(static timing analysis,STA)是遍历电路存在的所有时序路径,根据给定工作条件(PVT)下的时序库.lib 文件计算信号在这些路径上的传播延时,检查信号的建立和保持时间是否满足约束要求,根据最大路径延时和最小路径延时找出违背时序约束的错误。
2.1.1 静态时序分析的优点
- 不需要给输入激励;
- 几乎能找到所有的关键路径(critical path);
- 运行速度快;
2.1.2 静态时序分析的缺点
- 只适用同步电路;
- 无法验证电路的功能;
- 需要比较贵的工具支持;
- 对于新工艺可能还需要建立一套特征库,建库的代价可能要几百万。
2.1.3 静态时序分析的工具
Synopsys 的 prime time,
Cadence 的 Encounter Timing System 等
2.2 动态时序分析
动态时序分析(dynamic timing analysis,DTA)通常是所有的输入信号都会给一个不同时刻的激励,在 testbech(.sp 或者.v)中设置一段仿真时间,最后对仿真结果进行时序和功能分析。 这里的仿真可以是门级或者晶体管级,包括 spice 格式和 RTL 格式的网表。
2.2.1 动态时序分析的优点
- 晶体管级的仿真比较精确,直接基于工厂提供的 spice 工艺库计算得到;
- 适用于任何电路,包括同步、异步、latch 等等;
- 不需要额外搞一套特征库;
- 不需要很贵的时序分析工具。
2.2.2 动态时序分析的缺点:
- 需要给不同的测试激励;
- 关键路径无法检查全 (致命性的);
- 规模大的电路 spice 仿真特别慢 (致命性的)。
2.2.3 动态时序的工具
spice 仿真器: hspice, finesim, hsim, spectre 等;
verilog 仿真器: ModelSim,VCS,NC-Verilog,Verilog-XL 等。
3. 直接存储器访问(DMA)
3.1 了解DMA
DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。
3.2 DMA工作过程
DMA 传输将数据从一个地址空间复制到另外一个地址空间。当 CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA 传输对于高效能 嵌入式系统算法和网络是很重要的。
3.3 DMA总线控制权转移问题
在实现 DMA 传输时,是由 DMA 控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即 DMA 传输前,CPU 要把总线控制权交给 DMA 控制器,而在结束 DMA 传输后,DMA 控制器应立即把总线控制权再交回给 CPU。
3.4 DMA传输的步骤
一个完整的 DMA 传输过程必须经过 DMA请求、DMA 响应、DMA 传输、DMA 结束 4 个步骤。
4. 逻辑电平
常用逻辑电平:12V,5V,3.3V。
TTL 和 CMOS 不可以直接互连,由于 TTL 是在 0.3-3.6V 之间,而 CMOS 则是有在 12V 的有在 5V 的。CMOS 输出接到 TTL 是可以直接互连。TTL 接到 CMOS 需要在输出端口加一上拉电阻接到 5V 或者 12V。 用 CMOS 可直接驱动 TTL;加上拉电阻后,TTL 可驱动 CMOS.
5. 逻辑最小项
5.1 什么是最小项
在一个有 n 个变量的逻辑函数中,包括全部 n 个变量的乘积项(每个变量必须而且只能以原变量或反变量的形式出现一次)称为最小项。n 个变量有 2^n 个最小项。
比如当 n = 3 时,此逻辑函数应有 2^3 = 8 个最小项。,分别是:A’B’C’, A’B’C, A’BC’, A’BC, AB’C’, AB’C, ABC’, ABC 最大项就是全部 n 个变量的加和了。
5.2 性质
- 对于任意一个最小项,输入变量只有一组取值使得它的值为 1,而在变量取其他各组值的时候,这个最小项的值都为 0。
- 不同的最小项,使得它的值为 1 的那一组输入变量取值也不同。
- 对于输入变量的任何一组取值,任意两个最小项的乘积为 0。
- 对于输入变量的任何一组取值,全体最小项的和为 1。
6. 乒乓 buffer
6.1 定义
乒乓 buffer 是由两个单口 sram 背靠背组成的一种电路结构。
6.2 如何工作的呢?
假设我们称其为 s1 和 s2。则乒乓 buffer 的工作方式如下:
- 首先向 s1 中写入数据,此时 s2 是空的,因此没有操作。
- 当向 s1 写入完毕,通过逻辑操作,使得接下来向 s2 中写入数据,于此同时其他模块可以从 s1 中读出已经写入的数据;
- 待 s2 中写完,再次转换,重新向 s1 中写入数据,同时其他模块从 s2 中读出数据。
- 由于这个过程中两个 buffer 总是一个读一个写,并且互相交换读/写角色,因此称其为乒乓 buffer。
6.3 应用场景
当后面的处理单元在工作期间,前面的 buffer 的内容不能被释放。或者,在处理单元工作期间,buffer 的特定地址的内容不止被访问一次。
注意:对于 buffer 的内容用一次就可以被释放的应用场景(如处理图像数据)直接用 FIFO 结构,或者移位寄存器 即可实现。
7. 门控时钟
7.1 什么是门控时钟?为什么要门控时钟?
芯片功耗组成中,有高达 40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观,因为这些时钟树在系统中具有最高的切换频率,而且有很多时钟 buffer,而且为了最小化时钟延时,它们通常具有很高的驱动强度。此外,即使输入和输出保持不变,接收时钟的触发器也会消耗一定的功耗。而且这些功耗主要是动态功耗。那么减少时钟网络的功耗消耗,最直接的办法就是如果不需要时钟的时候,就把时钟关掉。这种方法就是大家熟悉的门控时钟:clock gating。(电路图中看到的 CG cell 就是门控时钟了)。
注意要点:通常情况下,不建议使用门控时钟,因为门控时钟由组合逻辑产生,那么它本身就潜伏了组合逻辑的最大隐患——竞争和险象,所以门控时钟信号很容易产生毛刺,而寄存器等存储单元对时钟信号的边沿都非常敏感,因此具有毛刺的时钟会造成时序逻辑的不稳定。
but,上面建议尽量避免使用门控时钟,但是并不是一定不要使用门控时钟,对于某些功耗很大的系统而言,需要使用门控时钟来降低功耗。
7.2 门控时钟的结构
7.2.1 与门门控
如果让我们设计一个门控时钟的电路,我们会怎么设计呢?最直接的方法,不需要时钟的时候关掉时钟,这就是与操作,我们只需要把 enable 和 CLK 进行“与”操作不就行了么,电路图如下:
这种直接将控制 EN 信号和时钟 CLK 进行与操作完成门控的方式,可以完成 EN 为 0 时,时钟被关掉。但是同时带来另外一个很大的问题:毛刺
如上图所示,EN 是不受控制的,随时可能跳变,这样纯组合输出 GCLK 就完全可能会有毛刺产生。时钟信号上产生毛刺是很危险的。实际中,这种直接与门的方式基本不会被采用。
所以我们需要改进电路,为了使门控时钟不产生毛刺,我们必须对 EN 信号进行处理,使其在 CLK 的高低电平期间保持不变,或者说 EN 的变化就是以 CLK 为基准的。
1 很自然的我们会想到触发器,只要把 EN 用 CLK 寄存一下,那么输出就是以 CLK 为基准的;
2 其实还有一种办法是锁存器,把 EN 用锁存器锁存的输出,也是以 CLK 为基准的。
7.2.2 锁存门控
我们先看一下第二种电路,增加锁存器的电路如下:
对应的时序如下:
可以看到,只有在 CLK 为高的时候,GCLK 才可能会输出高,这样就能消除 EN 带来的毛刺。这是因为 D 锁存器是电平触发,在 clk=1 时,数据通过 D 锁存器流到了 Q;在 Clk=0 时,Q 保持原来的值不变。
虽然达到了我们消除毛刺的目的,但是这个电路还有两个缺点:
1 如果在电路中,锁存器与与门相隔很远,到达锁存器的时钟与到达与门的时钟有较大的延迟差别,则仍会出现毛刺。
2 如果在电路中,时钟使能信号距离锁存器很近,可能会不满足锁存器的建立时间,会造成锁存器输出出现亚稳态。
如下图分析所示:
上述的右上图中,B 点的时钟比 A 时钟迟到,并且 Skew > delay,这种情况下,产生了毛刺。为了消除毛刺,要控制 Clock Skew,使它满足 Skew < Latch delay(也就是锁存器的 clk-q 的延时)。
上述的右下图中,B 点的时钟比 A 时钟早到,并且|Skew| > ENsetup 一 (D->Q),这种情况下,也产生了毛刺。为了消除毛刺,要控制 Clock Skew,使它满足|Skew|< ENsetup一(D->Q)。
7.2.3 寄存门控
我们还有另外的解决办法,就是用寄存器来寄存 EN 信号再与上 CLK 得到GCLK,电路图如下所示:
7.2.4 RTL级实现门控时钟电路
在Verilog中if语句没有写else,产生锁存器,case语句中没有default同样会产生锁存器。
对应的电路如下图所示:
注意的是,平时我们写代码的时候不是为了降低功耗,我们就要写全,if后边要写else,case后边要写default。
7.2.5 总结
SOC 芯片设计中使用最多的是锁存结构的门控时钟。为什么呢?
原因是:
在实际的 SOC 芯片中,要使用大量的门控时钟单元。所以通常会把门控时钟做出一个标准单元,有工艺厂商提供。那么锁存器结构中线延时带来的问题就不存在了,因为是做成一个单元,线延时是可控和不变的。而且也可以通过挑选锁存器和增加延时,总是能满足锁存器的建立时间,这样通过工艺厂预先把门控时钟做出标准单元,这些问题都解决了。
那么用寄存器结构也可以达到这种效果,为什么不用寄存器结构呢?
那是因为面积!一个DFF 是由两个 D 锁存器组成的,采样 D 锁存器组成门控时钟单元,可以节省一个锁存器的面积。当大量的门控时钟插入到 SOC 芯片中时,这个节省的面积就相当可观了。
所谓门控时钟就是指连接触发器时钟端来自于组合逻辑,凡是组合逻辑在布局布线之后肯定会产生毛刺,而如果采用这种有毛刺的信号来作为时钟使用的话将会出现功能上的错误。
8. BRAM/DRAM
8.1 Block RAM(BRAM)
Block ram 由一定数量固定大小的存储块构成的,使用 BLOCK RAM 资源不占用额外的逻辑资源,并且速度快。但是使用的时候消耗的 BLOCK RAM 资源是其块大小的整数倍。如 Xilinx公司的结构中每个 BRAM 有 36Kbit 的容量,既可以作为一个 36Kbit 的存储器使用,也可以拆分为两个独立的 18Kbit 存储器使用。反过来相邻两个 BRAM 可以结合起来实现72Kbit 存储器,而且不消耗额外的逻辑资源。Block RAM 都有两套访问存储器所需的地址总线、数据总线及控制信号灯信号,因此其既可以作为单端口存储器,也可以作为双端口存储器。需要注意的时访问 BRAM 需要和时钟同步,异步访问不支持的。
8.2 查找表存储器——分布式 RAM(DRAM)
只有成为 SLICEM 的逻辑块里的查找表才可以用做分布式 RAM。利用查找表为电路实现存储器,既可以实现芯片内部存储,又能提高资源利用率。分布式RAM 的特点是可以实现 BRAM 不能实现的异步访问。不过使用分布式 RAM 实现大规模的存储器会占用大量的 LUT,可用来实现逻辑的查找表就会减少。因此建议仅在需要小规模存储器时,使用这种分布式 RAM。
9. 功耗问题
一般分为静态功耗和动态功耗。
9.1 动态功耗
动态功耗:发生在门开关(或状态翻转)的瞬间。是由于对 电容充电和 电源和地之间短暂电流通路造成的。它正比于开关频率。
9.2 静态功耗
静态功耗:总是存在,是由电源和地之间的静态导通电流(或漏电流)引起的。
9.3 降低功耗
9.3.1 降低动态功耗
1、降低内核供电电压。降低供电电压会影响到时序性能。为了弥补这个影响,一般采用流水线(pipelining)和并行(parallelism)设计方法来提高设计性能。当然,这样同时也会增加设计面积。
2、降低电容负载和逻辑开关频率。
10. 波形 X、Z 问题
10.1 什么是 X、Z ?
X表示不定态
Z表示高阻态
10.2 波形 X 问题
看波形首先先看 X 和 Z。
任何一个波形,无论是验证的前期、中期、后期,到手之后,先刷屏,找 X 和 Z,确认。某些 Z 和 X 是可以存在的,例如某些 IP 模型,或者未初始化的寄存器和 RAM,但芯片开始正常后,Z 和 X,都不应当存在。
10.3 X 和 Z所对应的 Bug
1、IP(包括 Memory、PLL、Serdes 等等)例化时,某些信号悬空未接。也许某些模型允许Power 信号悬空,或者某些信号是悬空给 DFT 处理(当下给 DFT 处理的信号是接零),但大多数 IP,输入信号是不可悬空的;
2、信号位宽不匹配、信号多驱动、声明的信号名称写错、TB 级互联错误或 TB 中遗漏的 Force(额外小心隐藏的 Force);
3、后仿真时序不满足时的 X 态传递;
4、功能错误,某些模拟 IP 未能正确操作;
5、功能错误,导致管脚冲突;
6、功能错误,未能合理使用无复位端的寄存器和未初始化的 Memory。
11. 设计描述方式
11.1 概述
verilog 通常可以使用三种不同的方式描述模块实现的逻辑功能:结构化、数据流、行为描述方式。
11.2 结构化描述方式
是使用实例化低层次模块的方法,即调用其他已经定义过的低层次模块对整个电路的功能进行描述,或者直接调用 Verilog 内部预先定义的基本门级元件描述电路的结构。
11.3 数据流描述方式
是使用连续赋值语句(assign)对电路的逻辑功能进行描述,该方式特别便于对组合逻辑电路建模。
11.4 行为级描述方式
是使用过程块语句结构(always)和比较抽象的高级程序语句对电路的逻辑功能进行描述。
12. 延迟设计
异步电路一般是通过加 buffer、两级与非门等来实现延时,但这是不适合同步电路实现延时的。
在同步电路中,对于比较大的和特殊要求的延时,一般通过高速时钟产生计数器,通过计数器来控制延时;对于比较小的延时,可以通过触发器打一拍,不过这样只能延迟一个时钟周期。
13. DDR 带宽计算
基本公式:带宽=内存核心频率×内存总线位数×倍增系数
DDR 倍增系数为 2,DDR2 倍增系数为 4,DDR3 倍增系数为 8。
如果直接标为 DDR3-800,其中内存的核心频率只有 100MHz,有效数据传输频率则为800MHz。如果内存总线位宽为 64bits,此时带宽= 100 * 64*8=51200Mbit=51200/8=6400MByte (1Byte = 8bits).
如果内存工作在标称频率的时候,计算时就不管什么核心频率了,如果内存总线位宽为 64bits,直接 (800x64/8)MByte,要注意的是,这里除以 8 是为了将 bit 位转为 Byte 字节,而不是因为倍增系数。
参考文献
声明
本人所有系列的文章,仅供学习,不可商用,如有侵权,请告知,立删!!!
本人主要是记录学习过程,以供自己回头复习,再就是提供给后人参考,不喜勿喷!!!
如果觉得对你有用的话,记得收藏+评论!!!