本篇主要参考了
1、新芯设计
(3条消息) 新芯设计的博客_CSDN博客-如何成为一名高级数字 IC 设计工程师,数字 IC 技能拓展,基于 SoC 的卷积神经网络车牌识别系统设计领域博主
2、小汪的IC自习室
(3条消息) 小汪的IC自习室的博客_CSDN博客-数字IC设计,SystemVerilog & IC验证,RISC-V领域博主
3、自己总结的一些知识点
(1)ASIC设计流程
一、确定项目需求
1、确定芯片的具体指标:
1)物理实现:
制作工艺(代工厂及尺寸要求)
裸片面积
封装(封装越大,散热越好,成本越高)
2)性能指标:
速度(时钟频率)
功耗
3)功能指标:
功能描述
接口定义
2、系统及设计:
用系统建模语言(高级语言 如matlab,c等)对各个模块描述,为了对方案的可行性进行验证。
二、IC前端设计流程(RTL to Gate-Netlist)
1、算法或硬件架构设计与分析:完成芯片中数字部分的高层次算法或架构的分析与建模,为硬件提供一个正确的软件 功能模型,为 RTL 实现提供总体性的设计指导。
2、RTL实现:依据第一步的结果,完成由高层次描述到 Verilog HDL 实现的过程。
3、功能验证:在无延迟的理想情况在,通过大量的仿真,发现电路设计过程中的人为或者非人为引起的bug。
工具:Modelsim、VCS、NC-Verilog等
4、逻辑综合:将 RTL 代码映射为与工艺库相关的网表。逻辑综合要指定基于的库、工艺,设定约束条件。综合之前的仿真为前仿真,综合之后的仿真为后仿真,所以这里还需要一个后仿真。
5、静态时序分析(STA) :来计算所有的路径,有没有满足时序要求;主要是检查建立时间(Setup Time)和保持时间(Hold Time)是否违例(violation)
工具:PrimeTime、Tempus。
6、DFT(design for test)可测性设计:为了在芯片生产之后,测试芯片的良率,看制作有无缺陷,一般是在电路中插入扫描连(scan chain)
DFT是在得到Netlist之后,布局布线(Place and Route)之前进行设计
三、IC后端设计流程
数字后端设计又称物理设计,将网标格式的文本转化成-个个有物理大小和位置的单元、连线。并且在实现过程中要满足面积、功耗、性能等要求。业界主流的后端工具来自synopsys、cadence两家公司,虽然两家公司工具不同但是基本流程相似。
1、布局布线(Place and Route):
保证没有太多的内部交互,避免布线上的拥堵和困扰。
包括时钟树插入(布局时钟线),用到Synopsys的IC Compiler(ICC)在布线(普通信号线)之前先布局时钟线,即时钟树综合CTS(Clock Tree Synthesis),用到Synopsys的Physical Compiler。均匀地分配时钟,减少设计中不同部分间的时钟偏移。
2、寄生参数提取(Extrat RC):
提取延迟信息
3、静态时序分析(STA):
加入了布局布线延迟,更真实的时序分析。
时钟树插入之后,每一个单元的位置都确定下来了,工具可以提出Global Route形式的连线寄生参数,此时对延时参数的提取就比较准确了;然后通过EDA工具指定提取模式如RC提取模式、指定延时计算模式等等来进行建立时间与保持时间分析:如果发生时序违例,那么则返回上一层设计,通过修改设计等等使其满足时序要求,从而达到时序收敛。
4、版图物理验证:
对完成布线的物理版图进行功能和时序上的验证,验证项目很多,如:
- LVS(Layout Vs Schematic)验证:简单说,就是版图与逻辑综合后的门级电路图的对比验证;(GDSII文件里面包含版图)
- DRC(Design Rule Checking):设计规则检查,检查连线间距,连线宽度等是否满足工艺要求;
- ERC(Electrical Rule Checking):电气规则检查,检查短路和开路等电气 规则违例;等等。
实际的后端流程还包括电路功耗分析,以及随着制造工艺不断进步产生的DFM(可制造性设计)问题。物理版图验证完成也就是整个芯片设计阶段完成,下面的就是芯片制造了。
DRC(设计规则检查);LVS(版图一致性检查)布线图和原理图进行比较
5、生成GDSII文件,Tap_off 流片
物理版图以GDSII的文件格式交给芯片代工厂(称为Foundry)在晶圆硅片上做出实际的电路,再进行封装和测试,就得到了实际的芯片。
这整个流程称为RTL2GDSII,利用GDSII来生产芯片的过程称作流片(Tapeout),以上是一个Fabless公司的简易设计流程,最后将GDSII送至Foundry生产芯片。
(注:整个IC设计流程都是一个迭代的过程,每一步如果不能满足要求,都要重复之前的过程,直至满足要求为止,才能进行下一步。)
四、IC设计流程相关名词(含各流程EDA工具梳理)
数字IC设计流程相关名词梳理及各流程EDA工具总结正在上传…重新上传取消https://blog.csdn.net/weixin_42294124/article/details/123534569https://blog.csdn.net/weixin_42294124/article/details/123534569
五、IC设计流程整理(图片)
(2)基本概念
1、亚稳态
亚稳态:是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态引时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。
2、同步和异步
异步:指的是输入信号和时钟无关;
同步:是指的输入信号和时钟信号有关;
实际上就是输入信号和时钟信号进行了与运算或者与非运算。实际开发中,经常有同步清零、异步清零、同步复位、异步复位等概念,下面就给与相关代码演示。
同步清零
module dff(d, clk, clr, q);
input d, clk, clr;
output q;
reg q;
always@(posedge clk)
if(!clr) q<=0;
else q<=d;
endmodule
异步清零
module(d, clk, clr, q);
input d, clk, clr;
output q;
reg q;
always@(posedge clk or negedge clr)
if(!clr) q <= 0;
else q <= d;
endmodule
3、同步电路和异步电路概念
同步电路:同步电路是指电路中的所有时钟都来自于同一个时钟源;
异步电路:是指电路的时钟来自于不同的时钟源,它们之间没有固定的相位关系;
4、FSM状态机、三段式状态机、moore/mealy状态机
(1)一段式:**一个always块**,既描述状态转移,又描述状态的输入输出,当前状态用寄存器输出;
(2)二段式:**两个always块**,时序逻辑与组合逻辑分开,一个always块采用**同步时序描述状态转移**;另一个always块采用**组合逻辑**判断**状态转移条件,描述状态转移规律以及输出**,当前状态用组合逻辑输出,可能出现竞争冒险,产生毛刺,而且不利于约束,不利于综合器和布局布线器实现高性能的设计。
(3)三段式:**三个always块**,一个always模块采用**同步时序**描述状态转移;一个always采用**组合逻辑**判断状态转移条件,描述状态转移规律;第三个always块使用**同步时序**描述状态输出,寄存器输出。
**三段式与二段式相比,关键在于根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出。**
** Moore**:输出信号只与当前输入有关。
**mealy:**输出信号不仅取决于当前状态,还取决与输入。
5、建立时间和保持时间概念
建立时间:是指触发器在时钟沿到来之前,数据输入端的数据必须保持不变的时间;
保持时间:是指触发器在时钟沿到来之后,数据输入端的数据必须保持不变的时间;
6、提升电路工作频率方法
电路的工作频率主要与寄存器与寄存器之间的**信号传播延时**和**clock_skew**相关;
信号的**传输时延**主要包括:寄存器的开关延时,走线延时,经过组合逻辑的延时;
开关延时是由器件物理属性决定的,可以通过提升电压的方法来减少开关延时,走线延时可以通过给综合器添加适当的约束,一般添加的约束为5%~10%;组合逻辑的延迟可以通过将较大的组合逻辑分解为较小的多块,通过适当的方法将组合逻辑进行平均,并在中间插入寄存器,这样就可以避免在两个寄存器之间出现过大的延迟,消除速度的瓶颈,以达到提升工作频率的目的,也就是所谓的**流水线**的设计思想;
7、时序约束的基本概念和基本策略
时序约束:设计者需要告诉软件(Quartus、Vivado、ISE等工具)应该从哪个引脚输入信号、输入信号需要延迟多长时间、时钟周期是多少。**主要包括**:周期约束、偏移约束、静态时序路径约束。
8、RAM的分类
FPGA上的RAM一般分为三类:单口RAM、简单双口RAM、真双口RAM。
单口RAM:一条数据线和一条地址线,不能同时读写;
简单双口RAM:一条地址线和一条数据线,能够同时读写不同地址的数据,读写同一个地址的数据时会冲突;
真双口RAM:两条地址线和两条数据线,能够同时对同一地址的数据进行读写。
9、竞争冒险
信号由于经由不同路径传输达到某一汇合点的时间有先有后的现象,就称之为**竞争**,由于竞争现象所引起的电路输出发生瞬间错误的现象,就称之为**冒险**。
(3)跨时钟域
1、跨时钟域分类
a.跨同步时钟域(clk1与clk2是同步时钟,即同源时钟,但是频率等不同);
b.跨异步时钟域(异步时钟,即不同源时钟,没有固定的相位关系,时钟来自不同的晶振);
2、对时钟域的理解
跨时钟域通俗地讲,就是模块之间有数据交互,但是模块用的不是同一个时钟进行驱动(这些时钟也又可能是起源于同一个时钟源)。
3、跨时钟域处理办法
a、**单比特信号**
针对单Bit控制信号跨越两个时钟域传输,可以使用多级的寄存器进行打拍。将信号打两拍,采第二拍的数据(两级并不能完全消除亚稳态危害,但是提高了可靠性减少其发生概率。)可以消除亚稳态,但是传输的数据只是稳定为0或者1,数据还是不一定正确。
** ** · 信号从慢时钟域到快时钟域(B到A)
经验设计最小寄存两拍,第一拍将输入信号同步化,同步后的信号可能会存在建立/保持时间的违例,产生亚稳态的情况。因此需要再进行寄存一拍,减少亚稳态带来的影响,一般的话寄存两拍是最少的要求,如果是高频设计的话,需要增加寄存器的计数来降低系统的不稳定性。如果采取多级触发器来采样来自异步时钟域的信号,寄存的拍数越多,同步过来的信号越稳定;
** ** · 信号从快时钟域到慢时钟域(A到B)
处理方法:握手信号,加宽pulse的信号脉宽,异步FIFO。
b、**多比特信号:**
** · **使用握手信号的方式
(所谓握手,是指通信双方使用了专用控制信号进行数据收发的状态指示。这个控制信号既有发送域给接收域的,也有接收域给发送域的,有别于前面的单向控制信号检测方式。类似于DMA与外设模块的通信,会用到dma_req,dma_ack 具体方法:硬件架构的艺术P63)。
** · **格雷码转换
(格雷码:相邻的两个编码之间只有一位是不一样的。由于格雷码相邻数据只有一个bit不同,因此,在进行跨时钟域传输时,只有发生变化的那个bit有可能处于亚稳态,而其余bit由于保持不变,因此是稳定的,故多比特格雷码的跨时钟域传输相当于单比特信号的跨时钟域传输,我们采用打两拍的方法即可处理。)
** · **异步双口RAM
** · **使用异步FIFO
(异步FIFO融合了寄存器同步,格雷码编码,握手控制等处理方式,是处理跨时钟域数据传输最常用的方式)。
(4)异步FIFO实现
1、FIFO最小深度计算
** · **求FIFO深度需要考虑最坏的情形,读写的速率应该相差最大,也就是说需要找出最大的写速率和最小的读速率;
** · 不管什么场景,要确定FIFO的深度,关键在于计算出在突发读写这段时间内有多少个数据没有被读走;即FIFO的最小深度就等于没有被读走的数据个数。**
** · **由于FIFO空满标志位的判断延迟,在实际应用中需要预留一些余量。
图例 背靠背情况
** 推导FIFO深度的求解公式:**
写时钟周期为clkw,读时钟周期为clkr,在读时钟周期内,每x个周期内可以有y个数据读出FIFO,即读数据的读数率 在写时钟周期内,每m个周期内就有n个数据写入FIFO,背靠背“的情形下是FIFO读写的最坏情形,burst长度 B = 2*n。
**由上得到:FIFO的最小深度为 B - B * (clkr/clkw) * (y/x) 。**
2、异步FIFO原理与代码实现
FIFO分类:
同步FIFO:是指的读时钟和写时钟是同一个时钟,在时钟沿到来时同时发生读写操作;
异步FIFO:是指的读写时钟不一致,读写时钟之间是相互独立的;
FIFO的空满检测:
当读写地址相等时,表示FIFO为空,这种情况发生在复位操作时,或者当读指针读出FIFO中最后一个字后,追赶上了写指针时,表示FIFO为空;
当读写指针再次相等时,表示FIFO为满,这种情况发生在,当写指针转了一圈,折回来又追上了读指针时;
如果指针的最高位不同,其余位相同表示写满,如果所有位相同就表示读空。
由于异步FIFO的设计,读写时钟不一样,在产生读空信号和写满信号时,会涉及到跨时钟域的问题。需要将读指针和写指针进行比较,需要在进行同步处理之后再进行比较。
解决方法:格雷码+两级寄存器同步;
** 异步FIFO代码实现:**
- 各自时钟域内的二进制地址自增控制
- 二进制地址转格雷码地址
- 格雷码地址跨时钟域
- 对同步后的格雷码地址解码
- “写满” 与 “读空” 标志的产生
多为二进制码转化为格雷码:
verilog代码实现如下:
在格雷码中检测空满状态
使用格雷码解决了计数器值同步的问题,但需要在格雷码中判断空与满状态;
判断空满信号:如果指针的最高位不同,其余位相同表示写满, 如果所有位相同就表示读空。
总结:
/* 异步FIFO
1.控制读写指针增加:增加的是二进制码,并将二进制码转换成格雷码,用于同步。 (同时输出二进制码和格雷码)
2.包括sram存储器,对数据进行读写(送入的地址为二进制指针)
3.同步:通过将格雷码打两拍,同步读写指针信号
4.将同步后的格雷码指针,转换成二进制码,送入比较模块
5.判断空满信号:如果指针的最高位不同,其余位相同表示写满, 如果所有位相同就表示读空。
注意:判断写满时,写指针(二进制)读指针(格雷码转二进制)
判断读满时,写指针(格雷码转二进制)读指针(二进制)
*/
(9条消息) 【原创】异步FIFO设计原理详解 (含RTL代码和Testbench代码)_锤王马加爵的博客-CSDN博客_异步fifo原理图
(5)异步复位、同步释放
(以复位信号低电平有效为例)
复位恢复时间(recovery time):撤销复位时,复位信号无效到时钟有效沿来临之间需要维持的最小时间。
复位清除时间(removal time):复位时,在时钟有效沿来临之后复位信号还需要保持复位状态的时间。
1、同步复位
*同步复位:*指的是加到所有功能触发器上的复位信号完全同步于时钟信号源。复位信号只有在时钟上升沿到来时,才能有效,否则,无法完成对系统的复位工作。
同步复位特点:
- 所设计系统为100%同步时序,有利于时序分析;
- 抗干扰性能好,能有效剔除信号中短于时钟周期的毛刺; 当毛刺特别靠近时钟的上升沿时,可能导致时序违规,而使得电路产生亚稳态,但是这种几率很低,可以近似忽略。确保复位只发生在有效时钟沿,可以作为过滤掉毛刺的手段。
- 复位信号的有效时长必须大于时钟周期,才能真正能被系统识别完成复位操作,同时还要考虑诸如组合逻辑路径延迟、系统快慢时钟等问题,很难保证复位信号到达各个寄存器的时序;
- 由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。
2、异步复位
异步复位: 复位信号直接接到功能触发器的异步复位引脚,复位只与复位信号有关,与时钟无关。无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
异步复位特点:
- 无需额外的逻辑资源,实现简单,可以保证复位信号到达各个寄存器的时钟偏斜最小;
- 复位信号易受外界干扰,对电路内的毛刺敏感;
- 复位信号释放具有随机性,如果复位释放信号刚好在时钟有效沿附近,可能存在时序违规(recovery time不满足要求),导致亚稳态。
3、异步复位,同步释放
异步复位,同步释放:利用同步复位和异步复位优点的折中。复位电路通过异步复位使得全部功能寄存器同时复位,同时使用同步释放很好克服了异步复位在信号释放时导致亚稳态的问题。
异步复位,同步释放代码实现:异步复位,同步释放就是指在复位信号到来的时候不受时钟信号的同步,而是在复位信号释放的时候受到时钟信号的同步。
module Sync_rst(
input sys_clk,
input async_rst_n,
input din,
output reg dout
);
reg rst_reg;
reg sync_rst_n;
always@(posedge sys_clk,negedge async_rst_n)begin
if(!async_rst_n)begin
rst_reg <= 1'b0;
sync_rst_n <= 1'b0;
end
else begin
rst_reg <= 1'b1;
sync_rst_n <= rst_reg;
end
end
always@(posedge sys_clk,negedge sync_rst_n) begin
if(!sync_rst_n)
dout <= 1'b0;
else
dout <= din;
end
endmodule
异步复位,同步释放原理:
异步复位:
当async_rst_n有效时,第一个D触发器的输出是低电平,第二个D触发器的输出rst_sync_n也是低电平,方框2中的异步复位端口有效,输出被复位。
同步释放:
如果async_rst_n撤除时发生在clk上升沿附近,则可能发生亚稳态事件,使用两级触发器尽可能消除亚稳态。假设第一级D触发器clk上升沿时async_rst_n正好撤除,则D触发器1可能输出高电平“1”,也可能输出亚稳态,也可能输出低电平。但此时第二级触发器不会立刻更新输出,第二级触发器输出值为前一级触发器Q1的输出状态。显然Q1之前为低电平,故第二级触发器输出保持复位低电平。直到下一个时钟有效沿到来之后,前一级亚稳态大概率输出稳定(可能为低电平也可能为高电平),使得第二级触发器能够稳定输出,若此时第二级触发器输出高电平,即实现同步释放,若输出为低电平且此时复位信号仍然保持无效状态,则在第三个时钟输出高电平,实现同步释放。
上述时序图是在第二个触发沿到来时,前一级亚稳态输出已经稳定且稳定为高电平情况下的时序,如果在第二个触发沿到来时,前一级输出的亚稳态还未达到稳定,则电路还是处于亚稳态状态(概率不大),所以两级触发器电路并不能完全消除亚稳态问题,但是可以极大改善亚稳态。
(6)建立时间、保持时间及其相关计算
建立时间(Setup Time):
是指触发器在时钟沿到来之前,数据输入端的数据必须保持不变的时间;
如果数据信号在时钟沿触发前的持续时间超过了建立时间Tsu,那么这个时间间隔就叫做建立时间裕量。
SDC约束命令为set_max_delay。
保持时间(Hold Time):
是指触发器在时钟沿到来之后,数据输入端的数据必须保持不变的时间;
如果数据信号在时钟沿触发后的持续时间超过了保持时间Th,那么这个时间间隔就叫做保持时间裕量。
SDC约束命令为set_min_delay。
总结:
恢复时间(Recovery Time):是指异步控制信号(如寄存器的异步清除和置位控制信号)在“下个时钟沿”来临之前变无效的最小时间长度。这个时间的意义是,如果保证不了这个最小恢复时间,也就是说这个异步控制信号的解除与“下个时钟沿”离得太近(但在这个时钟沿之前),没有给寄存器留有足够时间来恢复至正常状态,那么就不能保证“下个时钟沿”能正常作用,也就是说这个“时钟沿”可能会失效。
去除时间(Removal Time)是指异步控制信号(如寄存器的异步清除和置位控制信号)在“有效时钟沿”之后变无效的最小时间长度。这个时间的意义是,如果保证不了这个去除时间,也就是说这个异步控制信号的解除与“有效时钟沿”离得太近(但在这个时钟沿之后),那么就不能保证有效地屏蔽这个“时钟沿”,也就是说这个“时钟沿”可能会起作用。
传播时间(Propagation Delay):是指一个数字信号从器件(一般是DFF,符号表示为Tcq)的输入端到输出端所需的时间。通常在FPGA中是指时钟上升沿之后延时Tcq的时间,数据才到达寄存器Q端。
组合逻辑延时(Combinational Logic Delay):是指两级寄存器之间的输出端Q到输入端之间的组合逻辑延时。符号表示为Tlogic。
时序分析:
加油站| FPGA时序分析看这篇就够了(大疆逻辑岗)在FPGA设计中,时序分析是最基础的,如何掌握呢?通过一道题分析给你看。https://mp.weixin.qq.com/s/HdyXJmoaTlpKIm7i8at18A
笔试题:
求职攻略| 错综复杂的建立保持时间路径你能搞明白吗达尔闻求职笔试经,这不仅仅是题,而是你所不知的知识。本期笔试经解析题目来源紫光展锐IC笔试题,共3道问答题。https://mp.weixin.qq.com/s?__biz=Mzg5MDIwNjIwMA==&mid=2247489561&idx=1&sn=721fd65c7c8b30b82691df6624951b02&chksm=cfe17a8ef896f39869d1f79ec5957accee4be4a55435cbdd0caa5790da2f294ab3d02c8495ce&cur_album_id=1857263589108023300&scene=189#wechat_redirect12.1
时序分析:
时序分析的方法主要有两种,一种是静态时序分析,另一种是动态时序分析。
- 静态时序分析是通过设计好电路中的已知参数,利用EDA工具提供的模型分析出时钟和数据的关系。
- 而动态时序分析是把设计好电路中的所有延时都考虑进来,在EDA仿真工具中把延时参数都加上,然后观察仿真的波形并测量Ts(建立时间:采样时钟的上升沿到达数据起始位置的时间,本题为Tsetup)、Th(保持时间:采样时钟的上升沿到达数据结束位置的时间)是否满足时序的要求,需要电路模拟跑起来。
T_setup:时钟沿来到之前数据必须保持稳定的最小时间,芯片选定即决定,和制作工艺有关。T_hold:时钟沿来到之后数据必须保持稳定的最小时间,芯片选定即决定,和制作工艺有关。
(7)设计模块的输入输出端口类型
设计中,输入信号一般来说不能判断出上一级是寄存器输出还是组合逻辑输出,对于本级来说,就当成一根导线,即wire型。
而输出信号则由自己来决定是reg还是组合逻辑输出,wire和reg型都可以。但一般的,整个设计的外部输出(即最顶层模块的输出),要求是reg输出,这比较稳定、扇出能力好(驱动负载能力比较强)。
reg和wire的区别:
wire表示线网型数据,常用来表示以assign关键字指定的组合逻辑信号。模块的输入输出端口类型都默认为wire型。默认初始值是。(在SV中,除了wire,其他四值逻辑的默认值是x)。
reg型表示的寄存器类型。always模块内被赋值的信号,必须定义为reg型,代表触发器。默认初始值是x。reg类型不一定是寄存器变量,例如组合逻辑中reg类型变量。
reg相当于存储单元,wire相当于物理连线。
两者的区别是:寄存器型数据保持最后一次的赋值,而线型数据需要持续的驱动。
*过程赋值语句*always@和连续赋值语句assign*的区别:*
wire型用于assign的赋值,always@块下的信号用reg型。这里的reg并不是真正的触发器,只有敏感列表内的为上升沿或下降沿触发时才综合为触发器。
另一个区别,举例:
wire a;
reg b;
assign a = 1'b0;
always@(*)
b = 1'b0; //输入信号是1'b0
上面例子仿真时a将会是0,但是b的状态是不确定的(也就是仿真时只有当always@()块内的输入信号产生变化,该块内描述的信号才会产生变化。)。因为Verilog规定,always@()中的指的是该always块内的所有输入信号的变化为敏感列表,就是说只有当always@()块内输入信号发生变化,该块内描述的信号才会发生变化。像always@() b= 1'b0; 中由于1'b0是个常数,一直没有变化,由于b的组合逻辑输出,所有复位时没有明确的值--即不确定状态,又因为always@()块内没有敏感信号变化,此时b信号一直保持不变,即不确定是啥,取决于b的初始状态。
(8)组合逻辑电路和时序逻辑电路
1、组合逻辑电路分析设计
组合逻辑电路:在逻辑功能上的特点是任意时刻的输出仅仅取决于该时刻的输入(而且是瞬时变化),与电路原来的状态无关,它类似于电阻性电路,加法器、编码器、译码器、选择器、分配器等等都属于此类。
组合逻辑电路的分析方法:
输入到输出,逐级写出函数式,并且将之化简,最后转换为真值表的形式。
组合逻辑电路的设计方法:
根据给出的实际逻辑问题,求出实现这一逻辑功能的最简单逻辑电路。“最简”:是指电路所用的器件数最少,器件的种类最少,而且器件之间的连线最少,这在芯片设计中也称之为优化 Optimization。
2、时序逻辑电路分析设计
分为两类:
a、同步时序逻辑电路:有一个公共的时钟信号(共享的系统时钟信号 Sys_Clk)(从一到多,可以理解为时钟树 Clock Tree),电路中各记忆元件受它严格的统一控制,只有在该时钟信号有效沿(上升沿或者下降沿)到来时,记忆元件的状态才会统一发生变化,从而使得时序电路的输出发生变化,并且一个时钟信号有效沿只对应一次记忆元件的状态和电路输出状态的改变。
同步时序逻辑中最基本的储存元件是触发器。同步时序逻辑的核心逻辑用触发器实现,电路的主要信号、输出信号都由时钟信号驱动产生,可以很好的避免毛刺、有利于器件移植、有利于 STA 等等。
异步时序逻辑电路的分析方法:
b、异步时序逻辑电路:不存在单一的主控时钟,工作节奏不一致。由于异步电路没有统一的时钟,所以状态变化的时刻不稳定,因为电路状态的改变除了可以由部分时钟控制,还可以由外部输入的变化直接引起。而通常输入信号只在电路处于稳定状态时才发生变化,也就是说一个时刻允许一个输入发生变化,以避免输入信号之间造成的竞争 - 冒险现象。
异步时序逻辑中最基本的元件是锁存器。异步逻辑是时钟之间没有固定的因果关系。异步时序逻辑的核心逻辑使用组合电路实现,电路的主要信号、输出信号不依赖于任何一个时钟信号。容易产生毛刺、不利于器件移植、不利于 STA 等等。
异步时序逻辑电路的分析方法:
与同步时序逻辑电路的分析方法不同的是,在异步时序逻辑电路中,每次电路状态发生转换时并不是所有的触发器都有时钟信号(你需要找出每次电路状态转换时哪些触发器被触发哪些不被触发),而只有那些有 “时钟信号” 的触发器才需要用特性方程去计算次态,没有 “时钟信号” 的触发器将保持原来的状态不变。
(9)Cache-主存-辅存结构的存储器系统
5、以下是对Cache-主存-辅存三级存储系统中各级存储器的作用,速度,容量的描述,其中完全正确的是(B)。(大疆FPGA逻辑岗B卷)
A、主存用于存放CPU正在执行的程序,速度慢,容量极大
B、Cache用于存放CPU****当前访问频繁的程序和数据,速度快,容量小
C、加大Cache的容量可以使主存储能够存放更多的程序和数据
D、辅存用存放需要联机保存但暂不执行的程序和数据,速度快,容量极大
解析:本题目主要考察了计算机系统中Cache的认识
- 当前计算机一般都采用高速缓存-主存-辅存三级存储器结构。高速缓存也称为Cache,它是位于CPU与主存之间的一种高速存储器,Cache分为片内Cache和片外Cache,片内Cache速度已接近CPU的速度,Cache由SRAM组成,存储量最小,速度最快,所以B选项正确。
- 常用有一级缓存(L1)、二级缓存(L2)、三级缓存(L3)。设置Cache的目的在于将当前程序运行中快速将使用的一组数据或即将执行的一组指令由主存复制到Cache中,使CPU可以从 Cache中快速地获取所需要的指令和数据,当CPU访问存储器时,首先检查 Cache,如果要访问的信息已经在Cache中则CPU可以快速地获取信息,若不在,CPU必须访问主存,同时把包含所访问的信息的数块复制到Cache中更新,即Cache用来改善主存与CPU的速度匹配回题。
- 所以主存是电脑中主要部件,是CPU能直接寻址的存储空间,计算机中的主存储器主要由存储体、控制线路、地址寄存器、数据寄存器和地址译码电路五部分组成,它与辅助存储器相比有容量小、读写速度快;与Cache相比容量大、读写速度慢,所以总的来说容量适中,速度适中,所以A选项错误。主存一般采用半导体存储单元,包括随机存储器(RAM)、只读存储器(ROM)。
- 辅存为外部存储器,如硬盘、U盘、光盘等,它不能直接被CPU直接访问,一般用于存放暂时不用或主存放不下的程序和数据。当CPU处理信息时,首先查看所需要的数据是否在内存,若已经在则直接访问,此时称Cache命中。若不在,由辅助软硬件将有关信息从辅存上分段或分页调入内存,再由CPU访问。辅助存储器用于扩大存储空间,所以D选项错误。
- 使用 Cache-主存-辅存结构的存储器系统,提高了存储器的速度,同时总存储量又相当于辅存容量,有效解决了对存储器高速度,大容量,低成本的矛盾。而C选项中提到的方法与之矛盾,所以C选项也错误。Cache-主存和主存-辅存的相同点:都是在CPU的控制下进行信息交换Cache-主存和主-存辅存的不同点:前者是主机内部进行信息交换;后者是主机与外部设备之间进行信息交换。
(10)逻辑综合三个步骤
逻辑综合(Logic Synthesis):利用工具将RTL代码转换为门级网表的过程。常见的逻辑综合工具是synopsys的design compile(DC);
综合一个设计的过程从读取RTL代码开始,通过施加时序约束关系,映射 产生一个门级网表文件;它可以分为三步:
- 翻译:读入电路的RTL级描述,并将语言描述翻译成相应的功能块以及功能块之间的拓扑结构。这一过程的结果是在综合器内部生成电路的布尔函数表达式,不做任何逻辑重组和优化。
- 优化:根据所施加的时序和面积约束,按照一定的算法对翻译结果进行逻辑重组和优化。
- 映射:根据所施加的时序和面积约束,从目标工艺库中搜索符合条件的单元来构成实际电路的逻辑网表。
如下图所示:逻辑综合=翻译+优化+映射
** 流程介绍:**
(1)用RTL代码进行设计
即用可综合的RTL代码进行设计的编写;
(2****)指定工艺库
在根据约束条件进行逻辑综合时,对于选择的流片工艺,工艺库会提供综合工具所需要的标准逻辑单元的全部信息,即工艺库含有特定工艺条件下的标准逻辑单元的逻辑功能、单元面积、输入到输出的时序关系、输出的扇出限制以及对逻辑单元进行时序检查所需要的信息等.综合工具将根据工艺库提供的这些信息,对器件进行选择和电路结构调整,使其达到时序收敛;主要包括以下几个库:
- link_library:链接库,它是DC在解释综合后网表时用来参考的库;一般情况下,它和目标库相同;当使用综合库时,需要将该综合库加入链接库列表中;
- target_library:综合的目标库,它一般是由生产线提供的工艺相关的库;
- symbol_library:指定的符号库;
- synthetic_library:综合库,它包含了一些可综合的与工艺无关的IP;
(3)读入RTL代码文件
将RTL代码输入给综合工具,由综合工具进行编译;
(4)定义环境的约束条件,主要包括:
- 设置环境条件 set_operating_conditions
- 设置线负载模型 set_wire_load_model
- 设置驱动强度 set_drive set_driving_cell
- 设置电容负载 set_load
- 设置扇出负载 set_fanout_load
(5****)定义设计的约束条件,主要包括:
时钟定义的命令
- creat_clock
- set_colck_latency
- set_clock_uncertainty
- creat_generated_clock
设计规则约束
- set_max_transition 最大跳变时间
- set_max_fanout 最大扇出
- set_max_capacitance 最大电容
输入输出端口的延时
- set_input_delay
- set_output_delay
设置最大面积set_max_area
设置伪路径set_false_path
设置多周期路径set_multicycle_path
*(6***)设定综合策略 **
- 对于一些规模较小的设计,一般采用自顶向下的策略,该方法的缺点是编译时间太长,一旦改变其中的某一个模块就必须重新编译;该方法的优点是仅需要对顶层进行约束,将整个设计作为整体来进行优化,可以得到较好的优化效果;
- 自底向上的综合策略是指先将各个单独的子模块进行综合和优化,然后将它们整合到上一层模块中进行综合,重复这一过程直至顶层模块;这种方法的优点是对各个模块的管理很方便,缺点是需要很多脚本来维护综合后的设计;
(11)系统最高速度计算(最快时钟频率)和流水线设计思想
同步电路的速度是指同步系统时钟的速度,同步时钟愈快,电路处理数据的时间间隔越短,电路在单位时间内处理的数据量就愈大。假设 Tco 是触发器的输入数据被时钟打入到触发器到数据到达触发器输出端的延时时间;Tdelay 是组合逻辑的延时;Tsetup 是 D触发器的建立时间。假设数据已被时钟打入 D 触发器,那么数据到达第一个触发器的Q输出端需要的延时时间是 Tco,经过组合逻辑的延时时间为Tdelay,然后到达第二个触发器的D端,要希望时钟能在第二个触发器再次被稳定地打入触发器,则时钟的延 迟必须大于 Tco+Tdelay+Tsetup,也就是说最小的时钟周期 Tmin =Tco+Tdelay+ Tsetup,即最快的时钟频率 Fmax=1/Tmin。FPGA 开发软件也是通过这种方法来计算系 统最高运行速度 Fmax。因为 Tco 和Tsetup 是由具体的器件工艺决定的,故设计电路 时只能改变组合逻辑的延迟时间 Tdelay,所以说缩短触发器间组合逻辑的延时时间是提高同步电路速度的关键所在。
由于一般同步电路都大于一级锁存,而要使电路稳定工作,时钟周期必须满足最大延时要求。故只有缩短最长延时路径,才能提高电路的工作频率。可以将较大的组合逻辑分解为较小的 N 块,通过适当的方法平均分配组合逻辑,然后在中间插入触发器,并和原触发器使用相同的时钟,就可以避免在两个触发器之间出现过大的延时,消除速度瓶颈,这样可以提高电路的工作频率。这就是所谓**"流水线"技术**的基本设计思想,即原设计速度受限部分用一个时钟周期实现,采用流水线技术插入触发器后,可用N个时钟周期实现,因此系统的工作速度可以加快,吞吐量加大。注意,流水线设计会在原数据通路上加入延时,另外硬件面积也会稍有增加。
(12)FPGA和MCU的本质区别,MCU和ASIC的关系
本质区别是FPGA是半定制电路,MCU是定制电路。也可以说:单片机是成型的芯片;FPGA是用来设计芯片的芯片。单片机设计属软件范畴,它的硬件(单片机芯片)是固定的,通过软件编程语言描述软件指令在硬件芯片上的执行;而FPGA设计属硬件范畴,它的硬件(FPGA)是可编程的,是一个通过硬件描述语言在FPGA芯片上自定义集成电路的过程。
简单来说也还是定制和半定制的区别。从这一角度来讲,MCU属于一种ASIC。采用FPGA设计ASIC电路(专用集成电路),用户不需要投片生产,就能得到合用的芯片。FPGA可做其它全定制或半定制ASIC电路的中试样片。 FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。
一文看懂fpga和单片机的区别-电子发烧友网 (elecfans.com)
MCU和ASIC区别:
微控制单元(Microcontroller Unit;MCU) ,又称单片微型计算机(Single Chip Microcomputer )或者单片机,是把中央处理器(Central Process Unit;CPU)的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。
ASIC芯片是用于供专门应用的集成电路(ASIC,Application Specific Integrated Circuit)芯片技术,在集成电路界被认为是一种为专门目的而设计的集成电路。
(13)锁存器(latch)和触发器(filp-flop)
1、锁存器
从概念上来讲,锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值。简单而言,锁存器的输入有数据信号和使能信号,当处于使能状态时,输出随着输入变化而变化,当不处于使能状态时,输入信号怎么变化都不会影响输出。
锁存器:是一种对电平(也就是0或者1)敏感的存储单元电路;
2、触发器
触发器是对脉冲边沿敏感的器件,它的变化只会在时钟的上升沿或者下降沿到来的瞬间改变。
触发器:是一种对脉冲边沿(即上升沿或者下降沿)敏感的存储电路。
3、区别
锁存器是电平触发的,触发器是边沿触发的。如果是电平触发的,当使能的时候,如果输入信号不稳定, 那么输出就会出现毛刺。而触发器就不会出现这种问题,他的变化只会在边沿的时候触发。
4、为什么少用latch?
首先,latch是电平触发的,这样就容易产生毛刺;
其次,latch将静态时序分析变得极其复杂;
再者latch会浪费硬件资源(对FPGA而言)。因为在FPGA当中,是没有latch单元的,要生成latch单元需要耗费其他资源。
由于if或者case语句的逻辑表达不完全会产生latch。
5、register是什么?
register是寄存器,用于暂时存放参与运算的数据和运算结果。在实际的数字系统中,通常把能够用来存储一组二进制代码的同步时序逻辑电路称为寄存器。由于触发器内有记忆功能,因此利用触发器可以方便地构成寄存器。由于一个触发器能够存储一位二进制码,所以把n个触发器的时钟端口连接起来就能构成一个存储n位二进制码的寄存器。
6、latch是如何产生的?
always(*)里面的所谓“reg”,其实和wire没有区别,为了方便称呼,我把wire和这类“reg”统称作“类wire”。
①类wire型的数据“自己等于自己”的情况下会产生latch;
②类wire型的数据,由于if或者case语句的逻辑表达不完全,会产生latch。
(14)时序设计与时序约束
1、时序设计(Timing Design)
电路设计的难点在时序设计,时序设计的实质就是满足每一个触发器的建立时间、保持时间的要求,从而达到时序收敛的过程,扩大一点地说,就是使得数据能够在正确的时间到达从而正确地被处理。
2、时序收敛(Timing Closure)
时序收敛是现场可编程逻辑门阵列、专用集成电路的电路设计过程中,通过调整、修改设计,从而使得所设计的电路满足时序要求的过程。
3、时序约束(Timing Constraint)
时序约束是规范设计的时序行为,主要包括周期约束,偏移约束,静态时序路径约束三种,通过附加时序约束,可以指导综合工具和布局布线工具,使设计达到时序要求。
时序约束的作用:
1:提高设计的工作频率(减少了逻辑和布线延时);
2:获得正确的时序分析报告;(静态时序分析工具以约束作为判断时序是否满足设计要求的标准,因此要求设计者正确输入约束,以便静态时序分析工具可以正确的输出时序报告)
3:指定 FPGA/CPLD 的电气标准和引脚位置。
4、时钟设计(Clock Design)
a、在通常的 FPGA 设计中对时钟偏差的控制主要有以下几种方法:
- 控制时钟信号尽量走可编程器件的的全局时钟网络。在可编程器件中一般都有专门的时钟驱动器及全局时钟网络,不同种类、型号的可编程器件,它们中的全局时钟网络数量不同,因此要根据不同的设计需要选择含有合适数量全局时钟网络的可编程器件。通常来说,走全局时钟网络的时钟信号到各使用端的延时小,时钟偏差很小,基本可以忽略不计。
- 若设计中时钟信号数量很多,无法让所有的信号都走全局时钟网络,那么可以通过在设计中加约束的方法,控制不能走全局时钟网络的时钟信号的时钟偏差。
b、FPGA 设计中对时钟的正确操作(例如分频等等)如下:
- FPGA 芯片有固定的时钟路由,这些路由能够有效地减少时钟抖动和时钟偏差。需要对时钟进行相移或变频的时候,一般不允许对时钟进行逻辑操作(即使是最基本的与或非也要避免),因为这样不仅会增加时钟的偏差和抖动,还会使时钟带上毛刺。
- 一般的处理方法是采用 FPGA 芯片自带的时钟管理器如 PLL、DLL 或 DCM,或者把逻辑转换到触发器的 D 输入(这些也是对时钟逻辑操作的替代方案)
(14)时钟抖动和时钟偏移的概念及产生原因,如何避免?
时钟抖动jitter:指芯片的某一个给定点上时钟周期发生暂时性变化,也就是说时钟周期在不同的周期上可能加长或缩短。它是一个平均值为0的平均变量。
时钟偏移Skew:指全局时钟产生的各个子时钟信号到达不同触发器的时间点不同,是时钟相位的不一致。时钟偏移有两种类型:负偏斜和正偏斜。当时钟到达接收寄存器比到达发送寄存器晚时,会发生正偏移;负偏斜是相反的,即接收寄存器比发送寄存器更早地获得时钟触发。
jitter主要受外界干扰引起,通过各种抗干扰手段可以避免。而skew由数字电路内部各路径布局布线长度和负载不同导致,利用全局时钟网络可尽量将其消除。
(15)什么是竞争与冒险现象?怎样判断?如何消除?
竞争:在组合逻辑电路中,信号经过多条路径到达输出端,每条路径经过的逻辑门不同存在时差,在信号变化的瞬间存在先后顺序。这种现象叫竞争。
冒险:由于竞争而引起电路输出信号中出现了非预期信号,产生瞬间错误的现象称为冒险。表现为输出端出现了原设计中没有的窄脉冲,即毛刺。
- 常见的逻辑代数法判断是否有竞争冒险存在:只要输出逻辑表达式中含有某个信号的原变量A和反变量/A之间的“与”或者“或”关系,且A和/A经过不同的传播路径,则存在竞争。解决办法一是修改逻辑表达式避免以上情况,二是采样时序逻辑,仅在时钟边沿采样,三十在芯片外部并联电容消除窄脉冲。
- 如果布尔式中有相反的信号则可能产生竞争和冒险现象。解决方法:一是添加布尔式的消去项,二是在芯片外部加电容。
(16)时钟偏差以及时钟抖动
时钟偏差(Clock Skew),是指同一个时钟域内的时钟信号,到达各个模块(如寄存器)所用的时间偏差;
时钟偏差主要分为两类,正偏差和负偏差:
- 当信号传输的目标寄存器在接收寄存器之前捕获正确的时钟信号,电路发生正偏差(也就是时钟布线方向与数据流水方向一致);
- 当信号传输的目标寄存器在接收寄存器之后捕获正确的时钟信号,电路发生负偏差(也就是时钟布线方向与数据流水方向相反)。
时钟抖动(Clock Jitter):是相对于理想时钟沿而言,实际时钟所存在的不随时间积累的、时而超前、时而滞后的偏移(时钟脉冲宽度发生了暂时的变化,也就是 Tcycle 或大或小);
- 时钟偏差 Skew 通常是指时钟相位上的不确定,时钟抖动 Jitter 通常是指时钟频率上的不确定;相位为整体移动,频率为单个时钟变动;
- 时钟偏差和时钟抖动都要求系统时钟宽度增加,以满足建立时间和保持时间的要求,从而降低了系统时钟频率,导致了系统的性能变差;
- 所有的时钟网络布线都应该使用由 FPGA 提供的专用时钟资源(如全局时钟资源、局部时钟资源和 I/O 时钟资源),否则时钟偏差会非常严重;
- 源时钟,指发送数据的时钟;目的时钟,指接收数据的时钟;
- 发送沿,指发送数据的源时钟活动边沿;接收沿,指接收数据的目的时钟活动边沿。
- 在超大规模集成电路中,存在大量需要时钟信号进行同步的寄存器,这就需要构建一个时钟信号的分布传输网络,来提供时钟偏移尽可能小的同步时序;在集成电路的物理设计阶段,需要设计一个良好的时钟树结构,通过在时钟信号传输电路上插入不同参数的缓冲器,可以尽可能地使时钟偏移接近零,即时钟信号近乎同步到达各个寄存器。
(17)Verilog代码覆盖率检查有哪几类?
包括语句覆盖率、路径覆盖率、状态机覆盖率、触发覆盖率、表达式覆盖率。对于复杂的设计来说,Verilog代码覆盖率检查是检查验证工作是否完全的重要方法
(18)低功耗设计实现方法
数字电路的功耗有2部分构成,其一是静态功耗,在CMOS电路中静态功耗主要是由漏电流引起的功耗,控制这部分功耗主要决定于生产工艺和所用的材料;其二是动态功耗,动态功耗是由翻转电流和短路电流引起的功耗,其中翻转电流引起的功耗称为翻转功耗,短路电流引起的功耗称为短路功耗。而影响这部分功耗的因素很多,如电路设计的方式,线路的复杂程度,工作时时钟频率等。
1、静态低功耗技术
- 多阈值工艺(Multi-Vt Design)方法。 低阈值的标准逻辑单元:速度快、漏电流大;高阈值的标准逻辑单元:速度慢、漏电流小。总结:在设计中可以在关键路径上使用低阈值的标准逻辑单元来优化时序,在非关键路径上使用高阈值的标准逻辑单元来优化漏电流。优点:A可以大大减少系统的静态功耗;B没有任何面积开销,工艺库设计是将两种阈值库中的相应单元的面积设计成一样,这样可以方便替换。
- ** 电源门控(Power Gating)方法。 **如上图所示,电源开关单元(Power Switch Cell)中的高阈值MOS管作为电源闸门,用来将低阈值电源和地隔离开。 在正常工作状态,Sleep信号为低电平,高阈值MOS管处于导通状态;当处于睡眠状态时,Sleep信号为高电平,切断电源,并且由于采用了高阈值MOS管作为开关,可以有效地减少漏电流。
- ** 体偏置(Body Bias)**晶体管阈值电压随体偏置而变化。在工作模式下,MOS管的体偏置为0,MOS管处于低阈值状态,翻转速度快。在等待模式下,MOS管的体偏置为反向偏置,处于高阈值状态,漏电小。
2、动态低功耗设计
- ** 多电压域(Multi-Voltage Domain)** 对于多电压域设计,要在不同的电压域之间使用一些电平转换单元(Level Shifter),将输入电压范围转换成输出需要的不同电压范围。如果不同电压与之间的驱动信号与接受信号之间的距离很长,需要插入特殊的驱动单元(Repenter)来增强信号的驱动能力;如果不同的电压域可以单独断电(MV with Power Gating),还要考虑添加保持寄存器(Retention Register)和电压隔离单元(Isolation Cell)。
- ** 预计算** 预计算是指通过判断输入向量在满足一些特定条件时将输入释放或屏蔽。在遇到不需要计算的指令的时候,译码逻辑单元就会使输出EN_B信号为0,时钟将会被关闭,寄存器的值保持不变,ALU不需要进行无用的计算,因而减少了系统的功耗。
- 门控时钟(Clock Gating)
3、RTL级的一些低功耗设计方法
- 并行结构:一定程度可以减低某一区域的频率,从而可能降低功耗。
- 流水结构:路径长度缩短为原始路径长度的1/M。这样,一个时钟周期内充电/放电电容变为C/M。如果在加入流水线之后,时钟速度不变,则在一个时钟周期之内,只需要对C/M进行充放电,而不是原来对C进行充/放电。因此,在相同的速度要求下,可以采用较低的电源电压来驱动系统。
- 优化编码:通过优化编码来降低开关活动,如对于一些状态转移固定的状态机,比如序列生成之类的,可以采用格雷码代替二进制编码。
- 操作数隔离:原来:在某一段时间内,数据通路的时钟是无用的,则将它的输入置成某个固定值,这样数据通路部分没有翻转,功耗会降低。例如APB总线在下一次传输来临之前,地址/控制信号可以不变,以此来降低功耗。
(3条消息) 数字IC(SoC)低功耗设计方法总结_wangkai_2019的博客-CSDN博客_低功耗设计方法有哪些
(19)亚稳态
亚稳态:是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态引时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。
亚稳态产生的原因:触发器输入数据信号违反了触发器建立时间和保持时间的要求,或者复位过程中复位信号的释放相对于有效时钟沿的恢复时间(recovery time)不满足,就可能产生亚稳态,此时触发器输出端Q在有效时钟沿之后比较长的一段时间处于不确定的状态,在这段时间里Q端在0和1之间处于振荡状态,而不是等于数据输入端D的值。这段时间称为决断时间(resolution time)。经过resolution time之后Q端将稳定到0或1上,但是稳定到0或者1,是随机的,与输入没有必然的关系。
亚稳态的解决办法:
- 使用同步器(不能阻止亚稳态传播,只能减小亚稳态发生概率)。使用两级以上寄存器采样可以有效地减少亚稳态继续传播的概率。原理是使第一个触发器的输出端存在亚稳态,经过一个Clk周期后,第二个触发器D端的电平仍未稳定的概率非常小,因此第二个触发器Q端基本不会产生亚稳态。理论上如果再添加一级寄存器,使同步采样达到3级,则末级输出为亚稳态的概率几乎为0。
- 采用响应更快的触发器(缩短亚稳态窗口Tw,与工艺有关,受硬件制约)。
- 确保时钟周期足够长/减少采样速率,长于准稳态的解析时间,长于到下一级触发器的路径上的任何组合逻辑延迟;
- 改善时钟质量,用边沿变化快速的时钟信号。
(20)流水线设计方法
1、概念:
把规模较大、层次较多的组合逻辑电路分为几级,在每一级插入寄存器组并暂存中间数据。K级流水线就是从组合逻辑的输入到输出恰好有K个寄存器组,上一级的输出是下一级的输入而又无反馈的电路。
2、流水线作用
- 流水线可以提高电路的吞吐率
- 流水线提高了电路的频率 假设通过原多级组合逻辑的最长路径的时间为Tmax,则工作频率为 f1 = 1 / Tmax。如果用寄存器可以将该路径从中间切开,创建两个逻辑块,每个都具有最大时间长度 Tmax / 2,那么流水线型电路将可以工作在 f2 = 2 / Tmax = 2f1 的频率上。
3、流水线缺点
- 产生了输入-输出延迟:由于插入了流水线寄存器,会导致第一个输出必须在K个clk之后才能得到。而之后每个clk都能得到一个输出。
- 流水线技术是用空间(硬件)的复杂度来换取时间(性能)的复杂度
** 流水线深度并不是越大越好。在提高电路速度和吞吐的同时,电路的面积也随之加大。所以必须根据具体的需求来对流水深度进行择优选择。**
版权归原作者 大雄大熊a 所有, 如有侵权,请联系我们删除。