数字IC设计知识点

欢迎各位想来 瑞晟微电子的将简历,带上以下信息:
姓名-学校-岗位
身份证号+邮箱
发到以下邮箱:
436090083@qq.com
我会在瑞晟微电子开始招聘的第一时间进行内推


数字IC设计知识点

目录

一、异步电路设计的优缺点

在这里插入图片描述

二、同步电路设计的优缺点

1.优点:
(1)在同步设计中,EDA工具可以保证电路系统的时序收敛,有效避免了电路设计中竞争冒险现象。
(2)由于触发器只有在时钟边缘才改变取值,很大限度地减少了整个电路受毛刺和噪声影响的可能。
2.缺点:
(1)触发器距离时钟源点的距离不同,会产生时钟偏斜(clock Skew)、时钟抖动(clock jitter)。
(2)时钟树综合,需要加入大量的延迟单元,使得电路的面积和功耗大大增加。

三、亚稳态

1.定义:亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态时,无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。
解决方法:
1 降低系统时钟频率
2 用反应更快的FF
3 引入同步机制,防止亚稳态传播(可以采用前面说的加两级触发器)。
4 改善时钟质量,用边沿变化快速的时钟信号
2、单bit信号亚稳态的应对措施:
(1)亚稳态不能从根本上消除,但可以通过采取一定的措施使其对电路造成的影响降低;
(3)慢到快:双锁存器电平同步器(多级寄存器):一个信号在过渡到另一个时钟域时,如果仅仅用一个触发器将其锁存,那么时钟采样的结果将可能是亚稳态,这时用双寄存器锁存数据,将会降低亚稳态出现的概率。优点:结构简单、易于实现;缺点:增加了触发器延迟、当快时钟域转到慢时钟域时,容易造成慢时钟采样丢失。所以该方法常用于慢时钟域转到快时钟域。
(4)快到慢:采用同步器:
○1边沿检测同步器检测一个单bit信号的边沿。适用于慢时钟采样快时钟:输入数据的宽度必须比一个接受时钟周期加上一个同步触发器的hold时间要长,最安全的就是两个同步周期宽度。
○2脉冲检测同步器:从某个时钟域去除一个单时钟宽度脉冲,然后再新的时钟域中建立另一个单时钟宽度的脉冲。适用于快时钟采样慢时钟:
在这里插入图片描述
在这里插入图片描述
PS:(1)信号从快时钟域到慢时钟域过渡时,慢时钟将可能无法对变化太快的信号实现正确采样;
(2)同步器对两个时钟之间的关系要求很严格,而“结绳法”适合任何时钟域的过渡。
结绳法:将快时钟信号的脉冲周期延长,等到慢时钟同步采样后再“结绳”,还原为原来的脉冲周期宽度。如下图。
结绳法优缺点:结绳法可以解决快时钟域向慢时钟域过渡的问题,且其适用的范围很广,但结绳法的实现较为复杂,且效率不高,在对设计性能要求较高的场合应该慎用。
在这里插入图片描述
在这里插入图片描述

四、跨时钟域的时候,“快时钟到慢时钟”与“慢时钟到快时钟”之间的区别

(1)慢到块:只需要考虑亚稳态的问题。
(2)快到慢:除了亚稳态,还需要考虑慢时钟的采样速率问题,因为采样的条件需要满足奈奎斯特采样定律,即采样频率低于信号最高频率的2倍时,是无法完整采样的。

五、多比特指示信号跨时钟域的传输

(1)多个控制信号跨时钟域仅仅通过简单额同步器同步可能不安全,因为信号可能会有skew,导致多信号可能不会再同一时刻起作用。解决方法:让多个信号合成一个信号,同步到另一个时钟域中;如果遇到不能合并的情况,需要加入采样控制信号,确保另一个时钟域能够正确采样。
(2)使用格雷码传输也能很好地降低亚稳态出现的概率
二进制数据转换为格雷码:从最右边第一位开始,依次将每一位与左邻一位进行异或,作为对应格雷码该位的值,最左边的一位不变。
格雷码转二进制码:从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值,最左边一位不变。

六、多比特数据流跨时钟域的传输

(1)数据流与指示信号的区别:数据流大多具有连续性(背靠背传输),数据流要求信号具有较快的传输速度。
(2)数据流的跨时钟域传输:通常采用SRAM和异步FIFO进行传输。

七、FIFO

1.定义:FIFO(first in first out)是一种先入先出的存储结构,与普通存储器(RAM)的区别在于它没有外部读写地址线。使用非常简单
2、使用方式:顺序写入数据,顺序读出数据,数据地址由内部读写指针自动加1完成,不能像RAM那样可以有地址线决定读取或写入某个指定的地址。
3、异步FIFO:在IC设计的过程中,模块与模块之间的多时钟情况已经不可避免,数据在不同时钟域之间的传输很容易引起亚稳态,此时需要使用异步FIFO来跨时钟域。
在这里插入图片描述

4、用途
(1)异步FIFO的读写可以采用相互异步的不同时钟(即跨时钟域)
(2)对于不同宽度的数据接口也可以使用FIFO。例如单片机的8位数据输出,DSP是16位数据输入,在单片机和DSP连接时,可以用FIFO来进行数据匹配。
5、FIFO的参数
(1)宽度:FIFO一次读写的数据位;
(2)深度:FIFO可以存储多少个N位的数据,深度是一个重要的参数,太深会导致资源浪费,太浅会导致数据量不够深;
(3)满标志:FIFO已满或者将要满时由FIFO的状态电路送出的一个信号,来阻止FIFO继续执行写操作,防止数据溢出(overflow)。
(4)空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,来阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。
(5)读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。
(6)写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。
6、异步FIFO电路结构
在这里插入图片描述

a. 双端口RAM
b. 读地址模块
c. 写地址模块
d. 跨时钟模块,产生空/满信号

7、FIFO的设计
(1)空满标志是任何FIFO 设计的关键,遵循的原则是“写满而不溢出,能读空而不多读”
(2)空满状态的判断:读写指针相等
(3)区分空状态还是满状态:
在这里插入图片描述
在这里插入图片描述

(4)FIFO深度的设计:
写时钟频率(wclk)、读时钟频率rclk、写数据时每B个时钟周期内会有A个数据写入FIFO、读时每Y个时钟周期会有X个数据读出FIFO:此时FIFO的最小深度是(要考虑重载时的情况,即写数据背靠背)

在这里插入图片描述

例题:假设FIFO的写时钟为100MHz,读时钟为80MHz。在FIFO输入侧,每100个写时钟,写入80个数据;读数据侧,假定每个时钟读走一个数据,问FIFO深度设置多少可以保证FIFO不会上溢出和下溢出?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

异步FIFO的测试点
一个异步FIFO,rdata和wdata均为8位数据,FIFO深度为16,当rst_n输入为低时,FIFO被复位,当wclk的上升沿采样到wr为高时,数据被写入FIFO,当rclk的上升沿采样到rd为高时,FIFO输出数据。此外,当FIFO为空时,empty信号输出为高,当FIFO满时,full信号输出为高。
解析:根据题目,主要有两个一级测试点:1. FIFO基本功能 2. 异步处理

对于FIFO基本功能,基本可以使用黑盒用例进行端到端测试,通过注入特定序列的输入检测输出是否符合预期,有以下二级测试点:

1.写端口时序行为与描述一致,检查数据在wr被采样时刻正确写入

2.读端口时序行为与描述一致,检查数据在rd被采样时刻正确读出

3.FIFO能保证先进先出

4.空信号能正确生成

5.满信号能正确生成

6.检查在写满读空之后是否有做读写保护防止数据覆盖(白盒可检查memory数据)

7.检查在写满读空之后是否有做读写保护防止空满信号错乱(白盒可检查指针,内部计数器)

8.检查是否能被正常复位,解复位后各输出信号初始状态(复位值)是否正常

对于异步处理,必须要进行白盒测试,假设内部实现是经典的异步FIFO实现,则有以下二级测试点:

1.格雷码转换逻辑的正确性

2.跨时钟域是否进行同步器打拍处理,以及指针信号经过同步器打拍延时对功能带来的影响(理论上不应该有任何影响)

3.频率不同对FIFO读写的影响,覆盖读快写慢和读慢写快(理论上不该有任何影响)

八、同步复位异步释放电路

1、复位电路是每个数字逻辑电路中最重要的组成部分之一,逻辑电路中的任何一个寄存器、存储器结构和其他逻辑单元都必须要附加复位逻辑电路,以保证电路能够从错误状态中恢复,可靠地工作。时序电路需要有复位信号,组合电路不需要。
复位电路的功能:
(1) 仿真的时候使电路进入初始状态或者其他预知状态;
(2) 对于综合实现的真实电路,通过复位使电路进入初始状态或者其他预知状态
2、同步复位
(1)定义:当复位信号发生变化时,并不立即生效,只有当有效时钟沿采样到已变化的复位信号后,才对所有的寄存器进行复位。
(2)优点:有利于仿真器的仿真;可以使所涉及的系统成为100%的同步时序电路,有利于时序分析,综合出来的fmax一般较高;由于同步复位信号只在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。
(3)缺点:复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务,同时还要考虑,诸如clk skew,组合逻辑路径延时,复位延时等因素;由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。
在这里插入图片描述
3、异步复位
(1)定义:异步复位是指当复位信号有效沿到达时,无论时钟沿是否有效,都会立即对目标(如寄存器、RAM等)复位。
(2)优点:大多数目标器件库的DFF都有异步复位端口,因此采用异步复位可以节省资源;设计相对简单;异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。
(3)缺点:在复位信号释放的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态;复位信号容易受到毛刺的影响
4、异步复位,同步释放
(1)定义:
异步复位:复位信号可以直接不受时钟信号影响,在任意时刻只要是有效电平就可以复位(复位信号不需要和时钟同步);
同步释放:让复位信号取消的时候,必须跟时钟信号同步(正好和时钟同沿)
(2)优点:只要复位信号一有效,电路就处于复位状态;即使是端脉宽复位也不会丢失;复位的撤离是同步信号,因此有良好的撤离时序和足够的恢复时间。
(3)电路设计:如图所示,当复位信号到来时,直接进行复位,但是复位信号释放输出时,会通过两级寄存器缓存,然后同步释放。代码设计、电路图与仿真波形如下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

九、状态机FSM

(1)概述:对具有逻辑顺序或时序规律事件的一种描述方法,状态机的目的都是要控制某部分电路,完成某种具有逻辑顺序或时序规律的电路设计。
(2)应用思路:如果一个电路具有时序规律或者逻辑顺序,我们就可以自然而然地规划处状态,从这些状态入手,分析每个状态的输入,状态转移和输出,从而完成电路功能;明确电路的输出关系,这些输出相当于状态的输出。
(3)状态机(FSM)正确描述方式:FSM要安全,稳定性高,速度快,面积小,设计需要清晰易懂、易维护。
在这里插入图片描述
(4)两段式状态机:
一个always模块采用同步时序描述状态转移
另一个always模块采用组合逻辑判断状态转移条件,描述状态转移规律
在这里插入图片描述
两段式状态机的缺点:其输出一般使用组合逻辑描述,而组合逻辑易产生毛刺等不稳定因素。解决方法:如果在时序允许的情况下插入一个额外的时钟节拍来寄存FSM的组合逻辑输出,可以有效地消除毛刺。但有时设计并不允许插入额外的节拍。所以只能采用三段式FSM的描述方法(使用同步时序逻辑寄存FSM的输出)。
(5)三段式FSM
第一段(时序逻辑)是格式化描述次态寄存器迁移到现态寄存器(CS<=NS)
第二段(组合逻辑)是描述状态转移条件判断(case(CS));
第三段(时序逻辑)是格式化描述次态的寄存器输出(case(NS))
在这里插入图片描述
(6)三段式与两段式FSM的区别
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十、静态时序分析(STA)

在这里插入图片描述
(1) 静态时序分析是一种验证数字集成电路时序是否合格的验证方法;

(2) 静态时序分析的前提是同步逻辑设计(重要!),不能分析异步电路;

(3) 静态时序分析工具计算路径延迟的总和,并比较相对于预定义时钟的延迟;

(4) 静态时序分析仅关注时序间的相对关系,而不是评估逻辑功能;

(5) 静态时序分析对所有的时序路径进行错误分析,不需要使用测试向量激活某个路径(与时序仿真的不同点),分析速度比时序仿真工具快几个数量级,克服了动态时序验证的缺陷,适合大规模的电路设计验证,在同步逻辑情况下,能够达到100%的时序路径覆盖;

(6) 静态时序分析的目的是找到隐藏的时序问题,根据时序分析结果优化逻辑或者约束条件,使设计达到时序闭合(Timing Closure);

(7) 静态时序分析能够识别的时序故障:建立时间(Setup)/保持时间(Hold)/恢复时间(Recovery)/移除时间(Removal)检查;最小跳变和最大跳变;时钟脉冲宽度、时钟畸变(Skew、Jitter);总线竞争;不受约束的逻辑通道;关键路径;约束冲突等;

Setup time:建立时间,在时钟沿到来之前,数据必须稳定的时间,如果建立时间不满足,无法将值打入寄存器。
Hold time:保持时间,在时钟沿到来之后,数据必须稳定的时间,如何保持时间不满足,无法将值打入寄存器。
recovery time:撤销复位时,恢复到非复位状态的电平必须在时钟有效沿来临之前的一段时间到来,才能保证时钟能有效恢复到非复位状态,此段时间为recovery time。类似于同步时钟的setup time。
removal time:复位时,在时钟有效沿来临之后复位信号还需要保持的时间为去除时间 (去除时间)。类似同步时钟hold time
异步复位信号同样需要和时钟满足recovery time和removal time 才能有效进行复位操作和复位释放操作,防止输出亚稳态。

setup violation和hold violation会受哪些因素影响?

setup:clk2Q、组合路径延时、时钟周期、clock skew,clock jitter
hold:clk2Q、组合路径延时、clock skew

STA分析的专属名词:
时钟周期:Tpd、Tclk
建立时间:Tsetup、Tsu
保持时间:Thold、Thd
两个寄存器之间的组合逻辑延迟:Tlogic、Tcomb
寄存器传输延时(时钟—>输出):Tco、Tcko
时钟抖动jitter:Tjitter,对时钟有害。指芯片的某一个给定点上时钟周期发生暂时性变化,使得时钟周期在不同的周期上可能加长或缩短。
时钟偏移skew:Tskew,对时钟有益。是由于布线长度及负载不同引起的,导致同一个时钟信号到达相邻两个时序单元的时间不一致。
区别:Jitter是在时钟发生器内部产生的,和晶振或者PLL内部电路有关,布线对其没有影响。Skew是由不同布线长度导致的不同路径的时钟上升沿到来的延时不同。
静态时序分析黄金公式:
在这里插入图片描述

关于这两个公式的正确理解:
(1)在一个时钟周期以内,数据的传输延时(经过寄存器的传输延迟,组合逻辑延迟,建立时间)不能太大,超过一个时钟周期将会导致数据无法不能及时到达下一个寄存器;
(2)图中其实简略了setup time,当两边加上setup time以后,则会发现规律,即数据传输延时(Tsetup+tcko+Tlogic)不能太小,Thold+Tsetup被称为数据采样窗口期,即数据传输延时不能小于数据采样窗口期,即此窗口期传输的数据应该保持不变,否则会进入亚稳态。

例题

下图中的电路,器件延时如图标注,将框内电路作为一个寄存器,其有效建立时间(setup time)和保持时间(hold time)分别是多少?
在这里插入图片描述
解析:时钟信号早于数据到达,对于setup time有害,而对于hold time是有益的。根据setup time和hold time的定义,在时钟到达整个寄存器时,应该这样分析:
Setup time:内部寄存器的setup time为2ns,由于有数据路径延迟和时钟延迟,我们以时钟到达外部寄存器的端口为时间终点,则数据在此之前需要保持的时间为Tsetup +datadelay-clkdelay=2+2-1=3ns;
Holdup time:内部寄存器的hold time 为2ns,由于有数据路径延迟和时钟延迟,我们以时钟到达外部寄存器的端口为时间起点,则数据在此之后需要保持的时间为Tsetup -datadelay+clkdelay=2-2+1=1ns;

建立时间和保持时间违例的解决方法

建立时间违例

时钟路径插入缓冲器;
更换延迟小的触发器;
增加时钟周期;

保持时间违例

优化时钟,让时钟更早到来;
触发器插入缓冲器;
更换延迟大的触发器;

十一、有符号数和无符号数运算总结

1、位宽截断:无论是有符号数还是无符号数,位宽大的数赋值给位宽小的数,数据就会被截断,截断的规则就是从低位开始取,被截断的是高位。
2、位宽展宽:对于无符号数来说,将原位宽赋给低位,高位补0;对于有符号数来说,将原位宽赋给低位,高位补符号位。
3、数值运算:数值运算包含下列三种情况
(1)两个有符号数运算:有符号数运算按照补码运算
(2)两个无符号数运算:直接运算
(3)有符号数和无符号数进行运算:把有符号数看做无符号数,直接按照无符号数进行运算。
4、赋值:
将一个数或计算结果A(有符号或者无符号)赋值给另一个数B,根据位宽不同有以下三种情况:
(1)当位宽相同的时候直接赋值,无论B是有符号或者无符号,对赋值结果没有影响,只是把二进制位完全不变的赋值进来。
(2)当B的位宽比A小的时候,位宽截断如前面所说,从低位开始截取
(3)当B的位宽比A大的时候,A的二进制码先填充在B的低位;高位填充分三种情况:
若A,B都是有符号数,B的高位用A的最高位填充。
若A,B都是无符号数,B的高位用0填充
若A是有符号数,B是无符号数,B的高位用A的最高位填充
若A是无符号数,B是有符号数,B的高位用0填充
总结:若A是有符号数,则B高位空余用A的最高位填充,若A是无符号数,B的高位用0填充
PS:负数用二进制数表示时一般用补码形式表示。如-5用四位有符号数表示为4’b1011。

十二、乒乓buffer

  1. 其本质是两个同样大小的单口SRAM背靠背组成的一种电路结构,其工作方式就是一乒一乓,即一个在读的时候另一个在写,然后互换读写状态。该buffer放在数据通路的中间,在大部分时候都能保证一块RAM收上游的数据,一块往下游发数据,一读一写并行操作。
    在这里插入图片描述

工作过程如下:
第一段乒乓缓冲周期:将数据流缓存到数据缓冲模块1。
第二段乒乓缓冲周期:将数据流缓存到数据缓冲模块2,并从数据缓冲模块1读取数据送入数据流运算处理模块。
第三段乒乓缓冲周期:将数据流缓存到数据缓冲模块1,并从数据缓冲模块2读取数据送入数据流运算处理模块。
接下来就是上面描述的第二段、第三段乒乓缓冲周期的循环往复。
2. 优缺点:该方法是利用加倍存储资源的方法来提高读写速度的方法。当然最大的代价就是面积和功耗的开销。下图是一个buffer的读写方式和Ping-Pong buffer的读写方法,可以看出,乒乓buffer可以很高地提高数据读写效率。
在这里插入图片描述

十三、串并转换电路

1、 串行输入、并行输出(SIPO):
输入是单bit数据,输出是N bit数据,设置一个N bit寄存器,只需在每个时钟周期内将输入数据放入低位,然后进行移位。最后设定一个计数器,在计数到N-1时,将N bit数据进行输出。
2、 并行输入、串行输出(PISO):
输入是N bit并行数据,将N为并行数据暂时寄存在一个N位的寄存器中,然后通过移位寄存器的移位,依次输出到一位输出端口既可以实现并串转化。
3、串并转换的核心思想是面积与速度之间的相互转换,在设计中常根据具体的设计指标来实现串并转换。

十四、逻辑综合

1、 概述
(1) 综合是前端模块设计中的重要步骤之一,综合的过程是将行为描述的电路、RTL级的电路转换到门级的过程。
(2) Design Compiler是Synopsys公司用于做电路综合的核心工具,它可以方便地将HDL语言描述的电路转换到基于工艺库的门级网表。
(3) 逻辑综合的目的:决定电路门级结构、寻求时序和面积的平衡、寻求功耗与时序的平衡、增强电路的测试性。
2、 逻辑综合的三个阶段:
在这里插入图片描述
3、 设计对象
指的是待综合的对象
在这里插入图片描述
4、 DC流程
在这里插入图片描述

十五、逻辑运算优先级

在这里插入图片描述

十六、浮点数转化为定点数

(1) 浮点数:小数的位置不确定,理解为小数点的位置在浮动;定点数
(2) 浮点数量化为定点数的格式为:m位定数数,n个小数位,无符号位,那么n被称为量化系数;
(3) 对于小数位而言,如果小数位所占的位数越多,则精度就越高,小数点后有n位,那么其表示的最大精度为1/(2^n);而对于整数位而言,整数位所占的位数越多,则能表示的值越大。
(4) 无损定点化:无论有多少小数位,2进制编码的精度都是以5结尾的,因此2进制编码并不能完全无损的表示任意小数,但是根据数学上误差的概念,只要误差小于精度的一半,就可以认为是“无损”的了。
在这里插入图片描述
分析:12.918用二进制数表示,整数部分需要4位,假如用8位来表示小数,则量化精度是1/256=0.00390625,如果小数位用8位表示,则0.9182^8=235.008,用整数235表示,量化误差为.008/256=0.00003125,明显量化误差小于量化精度的一半,所以12位能够满足无损定点化;如果使用7位来表示小数(11位表示数据),则量化精度是1/128=0.0078125,0.918128=117.504,四舍五入用118表示,量化误差为0.496/128=0.003875,不满足无损定点化。

十七、系统任务和系统函数

1.系统函数和系统任务不可以在综合工具或者布线工具中运行。实际上,它们智能在Verilog仿真器中运行,仅仅对代码仿真有意义,综合工具和布线工具将忽略所有的系统任务和函数。
2.函数不能调用任务,但是任务可以调用函数。
3.Verilog中的预先定义的函数与任务类型:
(1) 显示任务;
d i s p l a y 是显示任务,通常用来显示变量值、字符串和仿真时间等信息。如: display是显示任务,通常用来显示变量值、字符串和仿真时间等信息。 如: display是显示任务,通常用来显示变量值、字符串和仿真时间等信息。如:display (“The value of ABC is %d”, ABC)//该语句显示当前ABC变量的值。
(2) 文件输入/输出任务;
系统函数 f o p e n 用于打开一个文件,并返回一个整数的文件指针。然后, fopen用于打开一个文件,并返回一个整数的文件指针。然后, fopen用于打开一个文件,并返回一个整数的文件指针。然后,fdisplay就可以使用这个文件指针在文件中写入信息。写完会后,则可以使用$fclose系统关闭这个文件。
例如:
Integer Write_Out_File;//定义一个文件指针
Write_Out_File = $fopen (“Write_Out_File.txt”);
$fdisplay (Write_Out_File, “@%h \n %h”, Mpi_addr, Data_in);
$fclose (Write_Out_File);
(3) 时间标度任务:
(4) 模拟(仿真)控制任务:
$finish 表示使仿真器退出;
$stop 表示使仿真器挂起。
(5) 时序验证任务:
$setup系统任务用来检查建立时间;
$hold 系统任务用来检查保持时间;
$time系统函数用来返回一个64位的模拟时间。
(6) PLA建模任务:
(7) 随机建模任务:
(8) 实数变换函数:
(9) 概率分布函数:
$random系统函数可以用来返回一个32位的有符号整型随机数。

十八、面积优化和时序(速度)优化

1、 时序优化的常用方式,一般为了提高系统运行速度:
(1) 流水线设计:在关键路径中插入寄存器达到优化时序的目的;
(2) 寄存器配平(重定时retiming);
(3) 关键路径优化:一般减少关键路径上的延时;
(4) 迟滞信号后移:延时较大的信号放在后面,缩短这个信号的路径长度
(5) 消除代码的优先级
(6) 并行化处理:树形结构
2、 面积优化的常用方式,一般为了提高资源利用率同时降低功耗要求:
(1) 串行化:串行化可以有效减少资源的利用,相应的会牺牲一定的速度
(2) 资源共享:对于一些可以复用的资源,尽可能的进行复用
(3) 逻辑优化:消除冗余的逻辑

十九、毛刺的成因,无毛刺时钟切换

  1. 定义:
    a) 竞争:由于组合逻辑中存在的连线延迟和门延迟,导致每个信号高低电平转换需要的时间不同,导致同一个门的多个输入信号同时发生变化时,变化后的信号到达门电路输入端口的时间存在差别,这种现象叫做竞争。
    b) 冒险与毛刺:由于竞争会导致门电路输出一些错误的尖峰信号,这些尖峰信号被称为毛刺。若电路输出会产生毛刺,那电路中存在冒险。冒险可分为静态冒险和动态冒险,静态冒险指输入发生变化而输出不应该发生变化时却产生毛刺的冒险,动态冒险是输入发生变化,输出也发生变化时产生毛刺的冒险。冒险还可分为功能冒险和逻辑冒险,功能冒险指多个输入同时发生变化在输出端产生毛刺的冒险,逻辑冒险指一个输入发生变化在输出端产生毛刺的冒险。
  2. 冒险的判断方法:
    a) 卡诺图法:在卡诺图中如存在两个相切的素项圈,则电路存在冒险。
    在这里插入图片描述
  3. 毛刺的消除方法:
    a) 同步电路触发器对组合逻辑输出进行采用来消除毛刺对后级电路的影响;
    b) 对逻辑表达式添加冗余项来消除逻辑冒险;
    c) 用格雷码来代替普通二进制码变化从而消除功能冒险。

无毛刺门控时钟
一.不含锁存器的时钟门控电路

不含锁存器的时钟门控结构,使能信号周期的不确定,会使时钟过早的被截断或者产生时钟毛刺,产生多个时钟脉冲。为了产生正确的时钟信号,要求使能信号从时钟上升沿到时钟下降沿保证稳定的常量。
在这里插入图片描述
二.含有锁存器的时钟门控电路
在这里插入图片描述
含有锁存器的时钟门控电路,借助于锁存器,使得时钟信号在高电平期间保证稳定的值。
锁存器能够在时钟上升沿,捕捉使能信号,并保持完整的使能脉冲,所以使能信号只需要在时钟上升沿附近保持稳定。
大多数ASIC生成商都提供门控时钟单元作为标准单元的一部分。

无毛刺时钟切换
一. 组合逻辑时钟切换电路
使用纯组合逻辑来设计时钟切换电路,但是这种设计不可避免的产生毛刺:
在这里插入图片描述
在这里插入图片描述
二. 使用DFF时钟切换电路
用当前时钟的下降沿来采样(sel与反馈的输出相与的结果),可以简单地理解为采样sel信号。具体的设计如下:
在这里插入图片描述
在这里插入图片描述

二十、数字IC设计全流程

在这里插入图片描述

数字IC设计流程

芯片设计分为前端设计和后端设计,前端设计(也称逻辑设计)和后端设计(也称物理设计)并没有统一严格的界限,涉及到与工艺有关的设计就是后端设计。

  1. 规格制定
    芯片规格,也就像功能列表一样,是客户向芯片设计公司(称为Fabless,无晶圆设计公司)提出的设计要求,包括芯片需要达到的具体功能和性能方面的要求。

  2. 详细设计
    Fabless根据客户提出的规格要求,拿出设计解决方案和具体实现架构,划分模块功能。

  3. HDL编码
    使用硬件描述语言(VHDL,Verilog HDL,业界公司一般都是使用后者)将模块功能以代码来描述实现,也就是将实际的硬件电路功能通过HDL语言描述出来,形成RTL(寄存器传输级)代码。

  4. 仿真验证
    仿真验证就是检验编码设计的正确性,检验的标准就是第一步制定的规格。看设计是否精确地满足了规格中的所有要求。规格是设计正确与否的黄金标准,一切违反,不符合规格要求的,就需要重新修改设计和编码。 设计和仿真验证是反复迭代的过程,直到验证结果显示完全符合规格标准。
    仿真验证工具Synopsys的VCS,还有Cadence的NC-Verilog。

  5. 逻辑综合――Design Compiler
    仿真验证通过,进行逻辑综合。逻辑综合的结果就是把设计实现的HDL代码翻译成门级网表netlist。综合需要设定约束条件,就是你希望综合出来的电路在面积,时序等目标参数上达到的标准。逻辑综合需要基于特定的综合库,不同的库中,门电路基本标准单元(standard cell)的面积,时序参数是不一样的。所以,选用的综合库不一样,综合出来的电路在时序,面积上是有差异的。一般来说,综合完成后需要再次做仿真验证(这个也称为后仿真,之前的称为前仿真)。
    逻辑综合工具Synopsys的Design Compiler。

  6. STA
    Static Timing Analysis(STA),静态时序分析,这也属于验证范畴,它主要是在时序上对电路进行验证,检查电路是否存在建立时间(setup time)和保持时间(hold time)的违例(violation)。这个是数字电路基础知识,一个寄存器出现这两个时序违例时,是没有办法正确采样数据和输出数据的,所以以寄存器为基础的数字芯片功能肯定会出现问题。
    STA工具有Synopsys的Prime Time。

  7. 形式验证
    这也是验证范畴,它是从功能上(STA是时序上)对综合后的网表进行验证。常用的就是等价性检查方法,以功能验证后的HDL设计为参考,对比综合后的网表功能,他们是否在功能上存在等价性。这样做是为了保证在逻辑综合过程中没有改变原先HDL描述的电路功能。
    形式验证工具有Synopsys的Formality。

前端设计的流程暂时写到这里。从设计程度上来讲,前端设计的结果就是得到了芯片的门级网表电路。

Backend design flow :

  1. DFT
    Design For Test,可测性设计。芯片内部往往都自带测试电路,DFT的目的就是在设计的时候就考虑将来的测试。DFT的常见方法就是,在设计中插入扫描链,将非扫描单元(如寄存器)变为扫描单元。关于DFT,有些书上有详细介绍,对照图片就好理解一点。
    DFT工具Synopsys的DFT Compiler

  2. 布局规划(FloorPlan)
    布局规划就是放置芯片的宏单元模块,在总体上确定各种功能电路的摆放位置,如IP模块,RAM,I/O引脚等等。布局规划能直接影响芯片最终的面积。
    工具为Synopsys的Astro

  3. 时钟树综合CTS
    Clock Tree Synthesis,时钟树综合,简单点说就是时钟的布线。由于时钟信号在数字芯片的全局指挥作用,它的分布应该是对称式的连到各个寄存器单元,从而使时钟从同一个时钟源到达各个寄存器时,时钟延迟差异最小。这也是为什么时钟信号需要单独布线的原因。
    CTS工具,Synopsys的Physical Compiler

  4. 布线(Place & Route)
    这里的布线就是普通信号布线了,包括各种标准单元(基本逻辑门电路)之间的走线。比如我们平常听到的0.13um工艺,或者说90nm工艺,实际上就是这里金属布线可以达到的最小宽度,从微观上看就是MOS管的沟道长度。
    工具Synopsys的Astro

  5. 寄生参数提取
    由于导线本身存在的电阻,相邻导线之间的互感,耦合电容在芯片内部会产生信号噪声,串扰和反射。这些效应会产生信号完整性问题,导致信号电压波动和变化,如果严重就会导致信号失真错误。提取寄生参数进行再次的分析验证,分析信号完整性问题是非常重要的。
    工具Synopsys的Star-RCXT

  6. 版图物理验证
    对完成布线的物理版图进行功能和时序上的验证,验证项目很多,如LVS(Layout Vs Schematic)验证,简单说,就是版图与逻辑综合后的门级电路图的对比验证;DRC(Design Rule Checking):设计规则检查,检查连线间距,连线宽度等是否满足工艺要求, ERC(Electrical Rule Checking):电气规则检查,检查短路和开路等电气 规则违例;等等。
    工具为Synopsys的Hercules

实际的后端流程还包括电路功耗分析,以及随着制造工艺不断进步产生的DFM(可制造性设计)问题,在此不说了。

物理版图验证完成也就是整个芯片设计阶段完成,下面的就是芯片制造了。物理版图以GDS II的文件格式交给芯片代工厂(称为Foundry)在晶圆硅片上做出实际的电路,再进行封装和测试,就得到了我们实际看见的芯片。

FPGA开发流程

  1. 系统功能设计
    在系统设计之前,首先要进行的是方案论证、系统设计和FPGA芯片选择等准备工作。

一般都采用自顶向下的设计方法,把系统分成若干个基本单元,然后再把每个基本单元划分为下一层次的基本单元。

  1. RTL级HDL设计
    RTL级(Register Transfer Level,寄存器传输级)指不关注寄存器和组合逻辑的细节(如使用了多少个逻辑门、逻辑门的连接拓扑结构等),通过描述数据在寄存器之间的流动和如何处理、控制这些数据流动的模型的HDL设计方法。

RTL级比门级更抽象,同时也更简单和高效。RTL级的最大特点是可以直接用综合工具将其综合成为门级网表,其中RTL级设计直接决定着系统的功能和效率。

  1. RTL级仿真
    也称为功能(行为)仿真,或是综合前仿真,是在编译之前对用户所设计的电路进行逻辑功能验证,此时的仿真没有延迟信息,仅对初步的功能进行检测。

仿真前,要先利用波形编辑器和HDL等建立波形文件和测试向量(即将所关心的输入信号组合成序列),仿真结果将会生成报告文件和输出信号波形,从中观察各个节点信号的变化。虽然仿真是非必需步骤,但却是系统设计中最关键的一步。为了提高功能仿真的效率,需要建立测试平台testbench,其测试激励一般使用行为级HDL语言描述。

  1. 综合
    所谓综合就是将较高级抽象层次的描述转化成较低层次的描述。综合优化根据目标与要求优化所生成的逻辑连接,使层次设计平面化,供FPGA布局布线软件进行实现。

就目前的层次来看,综合优化(Synthesis)是指将设计输入编译成由与门、或门、非门、RAM、触发器等基本逻辑单元组成的逻辑连接网表,而并非真实的门级电路。

真实具体的门级电路需要利用FPGA制造商的布局布线功能,根据综合后生成的标准门级结构网表来产生。

  1. 门级仿真
    也称为综合后仿真,综合后仿真检查综合结果是否和原设计一致。

在仿真时,把综合生成的标准延时文件反标注到综合仿真模型中去,可估计门延时带来的影响。但这一步骤不能估计线延时,因此和布线后的实际情况还有一定的差距,并不十分准确。目前的综合工具较为成熟,对于一般的设计可以省略这一步,但如果在布局布线后发现电路结构和设计意图不符,则需要回溯到综合后仿真来确认问题之所在。

  1. 布局布线
    实现是将综合生成的逻辑网表配置到具体的FPGA芯片上,将工程的逻辑和时序与器件的可用资源匹配。布局布线是其中最重要的过程,布局将逻辑网表中的硬件原语和底层单元合理地配置到芯片内部的固有硬件结构上,并且往往需要在速度最优和面积最优之间作出选择。布线根据布局的拓扑结构,利用芯片内部的各种连线资源,合理正确地连接各个元件。也可以简单地将布局布线理解为对FPGA内部查找表和寄存器资源的合理配置,布局可以被理解挑选可实现设计网表的最优的资源组合,而布线就是将这些查找表和寄存器资源以最优方式连接起来。

目前,FPGA的结构非常复杂,特别是在有时序约束条件时,需要利用时序驱动的引擎进行布局布线。布线结束后,软件工具会自动生成报告,提供有关设计中各部分资源的使用情况。由于只有FPGA芯片生产商对芯片结构最为了解,所以布局布线必须选择芯片开发商提供的工具。

  1. 时序仿真
    是指将布局布线的延时信息反标注到设计网表中来检测有无时序违规(即不满足时序约束条件或器件固有的时序规则,如建立时间、保持时间等)现象。时序仿真包含的延迟信息最全,也最精确,能较好地反映芯片的实际工作情况。由于不同芯片的内部延时不一样,不同的布局布线方案也给延时带来不同的影响。因此在布局布线后,通过对系统和各个模块进行时序仿真,分析其时序关系,估计系统性能,以及检查和消除竞争冒险是非常有必要的。

  2. FPGA板级调试
    通过编程器将布局布线后的配置文件下载至FPGA中,对其硬件进行编程。配置文件一般为.pof或.sof文件格式,下载的方式包括AS(主动)、PS(被动)、JTAG(边界扫描)等方式。

二十一、PHY芯片

从硬件上来说,一般PHY芯片为模数混合电路,负责接收电、光这类模拟信号,经过解调和A/D转换后通过MII接口将信号交给MAC芯片进行处理。一般MAC芯片为纯数字电路。
物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。

PCIe中的物理层主要完成编解码(8b/10b for Gen1&Gen2,128b/130b for Gen3 and later)、扰码与解扰码、串并转换、差分发送与接收、链路训练等功能。其中链路训练主要通过物理层包Ordered Sets来实现。

二十二、时序逻辑电路组合逻辑电路

Jk触发器

在这里插入图片描述

逻辑门电路图形符号

在这里插入图片描述

verilog中的可综合与不可综合语句

1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。

(2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。

(3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。

二十三、分频电路(奇数分频,偶数分频)

偶分频:clk 计数到 N/2 -1时反转一次
奇分频:clk 上升沿计数到 (N-1)/2, clk反转一次,计数到N-1再反转一次,和计数到下降沿的结果相或就好了。
博主之前有写过,奇偶分频器。

二十四、竞争冒险现象

组合逻辑电路中,同一信号经不同的路径传输后,到达电路中某一会合点的时间有先有后,这种现象称为逻辑竞争,而因此产生输出干扰脉冲的现象称为冒险。
消除竞争冒险的方法:
(1)在输出端接入滤波电容,或RC滤波
(2)单独引入一个选通脉冲(在每次电平变化时刻之后产生,并且在下次电平变化时刻之前结束,在选通脉冲持续区间输出信号,这样就避开了可能出现的冒险“毛刺”)
(3)修改逻辑设计

二十五、低功耗设计方法

静态功耗:电路状态稳定时的漏电流导致的功耗,其数量级很小。
动态功耗:指电容充放电功耗和短路功耗,是由电路中信号的翻转造成的。

低功耗设计方法:
针对静态功耗:
(1)Power Gating(降低电路在空闲状态下的静态功耗);
(2)使用多电压供电Mutli-Vdd(不同模块使用不同供电电压);
(3)使用多阈值电压Mutli-Vth(阈值电压高:MOS的漏电电流小。阈值电压低:MOS的开关速度快);

针对动态功耗:
(1)Clock Gating(时钟门控,减少信号翻转次数);
(2)操作数分离(在某一段时间内,数据通路是无用的,就可以将它的输入置成某个固定值,这样数据通路部分没有翻转,功耗会降低。);
(3)DVFS(Dynamic Voltage Frequency Scale,动态控制电压和频率)

RTL级的一些低功耗设计方法
(1)并行结构:一定程度可以减低某一区域的频率,从而可能降低功耗。
(2)流水结构:路径长度缩短为原始路径长度的1/M。这样,一个时钟周期内充电/放电电容变为C/M。如果在加入流水线之后,时钟速度不变,则在一个时钟周期之内,只需要对C/M进行充放电,而不是原来对C进行充/放电。因此,在相同的速度要求下,可以采用较低的电源电压来驱动系统。

(3)优化编码:通过优化编码来降低开关活动,如对于一些状态转移固定的状态机,比如序列生成之类的,可以采用格雷码代替二进制编码。

(4)操作数隔离:原来:在某一段时间内,数据通路的时钟是无用的,则将它的输入置成某个固定值,这样数据通路部分没有翻转,功耗会降低。例如APB总线在下一次传输来临之前,地址/控制信号可以不变,以此来降低功耗。

二十六、覆盖率

  1. 代码覆盖率
    1.行覆盖率(line coverage):观察每一行代码的执行情况
    2.条件覆盖率(condition coverage):记录各个条件中的逻辑操作数被覆盖的情况
    3.翻转覆盖率(toggle coverage):记录单bit信号变量的值为0/1跳转情况,如从0到1,或者从1到0的跳转
    4.分支覆盖率(branch coverage):又称路径覆盖率(path coverage),指在if,case,for,forever,while等语句中各个分支的执行情况
    5.状态机覆盖率(FSM coverage):用来记录状态机的各种状态被进入的次数以及状态之间的跳转情况
  2. 功能覆盖率
    1.面向数据的覆盖率(Data-oriented Coverage):对已进行的数据组合检查,我们可以通过编写覆盖组(coverage groups)、覆盖点(coverage points)和交叉覆盖(cross coverage)获得面向数据的覆盖率
    2.面向控制的覆盖率(Control-oriented Coverage):检查行为序列(sequences of behaviors)是否已经发生,通过编写SVA来获得断言覆盖率(assertion coverage)。

二十七、任务、函数区别

在这里插入图片描述

二十八、VOH,VOL,VIH,VIL

电压容限是指驱动器的输出与接收端的输入在最坏的情况下的灵敏度之间的差值。
以高电平输出和输入关系来看,最小的输出值和最小允许输入值之间存在一个差值,这个值就是高电平的电压容限;低电平电压容限同理。
高电平电压容限 = VOHmin - VIHmin
低电平电压容限 = VILmin - V0Lmin
在这里插入图片描述
VOH > VIH > WIL >WOL

二十九、模拟通信和数字通信

无论何种通信系统,目的都是要完成一点到另一点的信息传递,这样可以吧通信系统概括为一个统一的模型

在这里插入图片描述

模拟通信系统:

模拟信号是指代表信息的信号及其参数(幅度、频率或相位)随着消息连续变化的信号,它在幅度上连续,但在时间上可以连续也可以不连续。连续的如语音信号、电视图像信号以及许多物理的遥测遥控信号;不连续的如脉冲幅度调制信号(PAM)、脉冲相位调制信号(PPM)和脉冲宽度调制信号(PWM)。

模拟通信系统的特点

优点:

信道的利用率较高
原理简单易于实现
缺点:

由于模拟通信系统传输的是模拟信号,因此叠加在信号中的噪声无法清除,信号只能放大而无法再生,系统的抗干扰能力差。
由于信号进行非线性变换易产生失真,且不易实现,因此模拟调制的方法极其有限,因此不易保密通信。
模拟通信系统中大都采用模拟电路,设备不易大规模集成。
不适应飞速发展的计算机通信的要求,模拟信号在进入计算机控制系统时必须进行模/数转换。

数字通信系统

数字通信系统就是利用数字信号传递消息的通信系统。而数字信号指的是不仅在时间上是离散的,而且在幅度上也是离散的信号。

模/数(A/D)、数/模(D/A)转换属于信道编码,A/D是为把消息转换成适合下一环节所需的数字信号而设置的。如果信源本身就已符合下一环节所要求的数字脉冲序列,这一环节可省去。D/A转换器的作用正好与A/D转换器相反,是把数字信号序列还原为原始信号。

加密与解密是为了实现保密通信,通过加密器可以产生密码,人为的把待传输的数字序列搅乱。这种编码可采用周期非常长的伪随机码序列等,在收端根据已知的解密方法,对接收序列进行解密。

抗干扰编码主要是为解决可靠性问题而设置的。由于信源编码后的数字信号是要通过信道来传输的,而信号不可避免地要受到各种噪声的干扰,因此可能会导致收端数字信号的判断错误,抗干扰编码就是采用一种对传输的原始信息按一定规则加入保护成分的办法,以达到自身发现和纠正误码的目的。抗干扰译码器的过程与抗干扰编码器的过程正相反。

一般抗干扰编码器输出的二元数字信号不适合在信道上直接传输,调制器的任务就是把数字信号变为适合于信道传输的信号,而解调器的过程正好相反。调制方式有ASK、FSK、和PSK等。调制与解调方式对通信质量的影响比较大,应合理选择。

同步系统

在上述数字通信系统中还有一个很重要的部分未列入,同步系统。在数字通信系统中,有异步通信系统和同步通信系统,在同步通信系统中,数字信号序列是按节拍一步一步工作的,因此收、发端的节拍一定要一致,否则将会出现混乱。另外发送的数字信号序列通常是编组的,收端必须知道这些编组的头尾,否则无法恢复原始信息。要保证收、发两端的节拍一致,必须有同步系统的控制。

数字通信系统的特点

优点:
抗干扰能力强
采用再生中继可实现高质量远距离传输
灵活性强适应各种业务要求
便于与计算机连接
易于加密
易于集成化、微型化

缺点:
传输带宽比模拟信号带宽宽

三十、易失性存储器就是和非易失性存储器

在这里插入图片描述
易失性存储器就是和非易失性存储器的唯一区别在于前者掉电数据会被清除。

三十一、DFF和latch的区别和联系

锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,尽当锁存器处于使能状态时输出才会随着数据输入发生变化。
触发器是边沿敏感的存储单元,数据存储的动作有某一信号的上升或者下降沿进行同步的。
寄存器用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。 触发器是在时钟的沿进行数据的锁存的,而锁存器是用电平使能来锁存数据的。所以触发器的Q输出端在每一个时钟沿都会被更新,而锁存器只能在使能电平有效器件才会被更新。 有一些教科书里的触发器实际是锁存器。在FPGA设计中建议如果不是必须那么应该尽量使用触发器而不是锁存器。

DFF和latch的区别

1、latch由电平触发,非同步控制。在使能信号有效时latch相当于通路,在使能信号无效时latch保持输出状态。DFF由时钟沿触发,同步控制。

2、latch容易产生毛刺(glitch),DFF则不易产生毛刺。

3、如果使用门电路来搭建latch和DFF,则latch消耗的门资源比DFF要少,这是latch比DFF优越的地方。所以,在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现。

4、latch将静态时序分析变得极为复杂。一般的设计规则是:在绝大多数设计中避免产生latch。它会让您设计的时序完蛋,并且它的隐蔽性很强,非老手不能查出。latch最大的危害在于不能过滤毛刺。这对于下一级电路是极其危险的。所以,只要能用D触发器的地方,就不用latch。有些地方没有时钟,也只能用latch了。比如现在用一个clk接到latch的使能端(假设是高电平使能),这样需要的setup时间,就是数据在时钟的下降沿之前需要的时间,但是如果是一个DFF,那么setup时间就是在时钟的上升沿需要的时间。这就说明如果数据晚于控制信号的情况下,只能用 latch,这种情况就是,前面所提到的latch timing borrow。基本上相当于借了一个高电平时间。也就是说,latch借的时间也是有限的。在if语句和case不全很容易产生latch,需要注意。

避免生成锁存器的方法:如果用到if语句,最好写上else项;如果用case语句,最好写上default项。遵循上面两条原则,就可以避免发生这种错误,使设计者更加明确设计目标,同时也增强了verilog程序的可读性。
为什么多用register:首先,latch是电平触发的,这样就容易产生毛刺;其次,latch将静态时序分析变得极其复杂;再者latch会浪费硬件资源(对FPGA而言)。因为在FPGA当中,是没有latch单元的,要生成latch单元需要耗费其他资源。

三十二、简单CMOS逻辑门电路原理图

1、MOS管 MOS管又分为两种类型:N型和P型。如下图所示:
在这里插入图片描述
CMOS逻辑电平

高速CMOS电路的电源电压VDD通常为+5V;Vss接地,是0V。

高电平视为逻辑“1”,电平值的范围为:VDD的65%~VDD(或者VDD-1.5V~VDD)

低电平视作逻辑“0”,要求不超过VDD的35%或0~1.5V。

+1.5V~+3.5V应看作不确定电平。在硬件设计中要避免出现不确定电平。

近年来,随着亚微米技术的发展,单片机的电源呈下降趋势。低电源电压有助于降低功耗。VDD为3.3V的CMOS器件已大量使用。在便携式应用中,VDD为2.7V,甚至1.8V的单片机也已经出现。将来电源电压还会继续下降,降到0.9V,但低于VDD的35%的电平视为逻辑“0”,高于VDD的65%的电平视为逻辑“1”的规律仍然是适用的。

非门

在这里插入图片描述
非门(反向器)是最简单的门电路,由一对CMOS管组成。其工作原理如下:
A端为高电平时,P型管截止,N型管导通,输出端C的电平与Vss保持一致,输出低电平;A端为低电平时,P型管导通,N型管截止,输出端C的电平与VDD一致,输出高电平。

与非门

在这里插入图片描述
与非门工作原理:
①、A、B输入均为低电平时,1、2管导通,3、4管截止,C端电压与VDD一致,输出高电平。
②、A输入高电平,B输入低电平时,1、3管导通,2、4管截止,C端电位与1管的漏极保持一致,输出高电平。
③、A输入低电平,B输入高电平时,情况与②类似,亦输出高电平。
④、A、B输入均为高电平时,1、2管截止,3、4管导通,C端电压与地一致,输出低电平。

或非门

在这里插入图片描述

或非门工作原理:
①、A、B输入均为低电平时,1、2管导通,3、4管截止,C端电压与VDD一致,输出高电平。
②、A输入高电平,B输入低电平时,1、4管导通,2、3管截止,C端输出低电平。
③、A输入低电平,B输入高电平时,情况与②类似,亦输出低电平。
④、A、B输入均为高电平时,1、2管截止,3、4管导通,C端电压与地一致,输出低电平。

注:

将上述“与非”门、“或非”门逻辑符号的输出端的小圆圈去掉,就成了“与”门、“或”门的逻辑符号。而实现“与”、“或”功能的电路图则必须在输出端加上一个反向器,即加上一对CMOS管,因此,“与”门实际上比“与非”门复杂,延迟时间也长些,这一点在电路设计中要注意。

三十三、仿真验证平台

  1. 验证平台的组成
    driver:给DUT施加各种激励
    scoreboard:根据DUT的输出来判断DUT的行为是否与预期相符合
    monitor:收集DUT的输出并把它们传递给scoreboard
    reference model:验证平台要模拟DUT行为给出预期结果

  2. UVM组件
    UVM组件(uvm component)包含有:uvm_driver, uvm_monitor, uvm_sequencer, uvm_agent, uvm_scoreboard, uvm_env, uvm_test。每个组件的作用如下:

    uvm_driver: 所有的driver都要派生自uvm_driver。driver的功能主要就是向sequencer索要sequence_item(transaction),并且将sequence_item里的信息驱动到DUT的端口上,这相当于完成了从transaction级别到DUT能够接受的端口级别信息的转换。

    uvm_monitor: 所有的的monitor都要派生自uvm_monitor。Monitor做的事情与driver相反,driver向DUT的端口上发送数据,而monitor则是从DUT的端口上接收数据,并且把接收到的数据转换成transaction级别的sequence_item,再把转换后的数据发送给scoreboard,供其比较。

    uvm_sequencer: 所有的sequencer都要派生自uvm_sequencer。sequencer的功能就是组织管理sequence,当driver要求数据时,它就把sequence生成的sequence_item转发给driver。

    uvm_agent: 所有的agent要派生自uvm_agent。agent只是把driver和monitor封装在一起,根据参数值来决定是只实例化monitor还是要同时实例化driver和monitor。agent的作用主要是从可重用性的角度考虑的。如果在做验证平台时不考虑可重用性,那么agent其实是可有可无的。

    uvm_scoreboard: 一般的scoreboard都要派生自uvm_scoreboard。scoreboard的功能就是比较reference model和monitor分别发送来的数据,根据比较结果判断DUT是否正确工作。

    uvm_env: 所有的env要派生自uvm_env。env将验证平台上用到的固定不变的component都封装在一起。这样,当要运行不同测试用例时,只要在测试用例中实例化此env即可。

    uvm_test: 所有的测试用例要派生自uvm_test或其派生类,不同的测试用例之间差异很大,所以从uvm_test派生出来的类各不相同。任何一个派生出的测试用例中,都要实例化env,只有这样,当测试用例在运行的时候,才能把数据正常地发给DUT,并正常地接收DUT的数据。

  3. 工厂模式
    UVM工厂的存在就是更方便地替代验证环境中的实例或者注册了的类型,同时工厂的注册机制也带来了配置的灵活性。这里的实例或者类型替代,在UVM中称作覆盖(override),而被用来替换的对象或者类型之间,应该满足注册(registration)和多态(polymorphism)的要求。
    UVM的验证环境构成可以分为两部分,一部分构成了环境的层次,这部分代码是通过uvm component完成,另外一部分构成了构成了环境的属性(例如配置)和数据传输,这一部分通过uvm object完成。这两种类也是进出工厂的主要模具和生产对象。
    之所以称之为模具,是因为通过在工厂注册,可以通过工厂完成对象的创建;而之所以有生产对象从工厂生产,也是利用了工厂生产模具可灵活替代的便捷性,提供了在不修改原有验证环境层次和验证包的同时,实现了对环境内部组件(uvm_component)和对象(uvm_object)的覆盖。

一般来说,正确打开factory的步骤分为:

1.将类注册到工厂
2.在例化前设置覆盖对象和类型
3.对象创建

三十四、DFT

在这里插入图片描述
在这里插入图片描述

三十五、DMA直接内存访问

在这里插入图片描述

三十六、时序约束和时序设计

时序设计(Timing Design):
电路设计的难点在时序设计,时序设计的实质就是满足每一个触发器的建立时间、保持时间的要求,从而达到时序收敛的过程,扩大一点地说,就是使得数据能够在正确的时间到达从而正确地被处理,这个就要对设计的电路非常的熟悉。

时序收敛(Timing Closure):
时序收敛是现场可编程逻辑门阵列、专用集成电路的电路设计过程中,通过调整、修改设计,从而使得所设计的电路满足时序要求的过程。

时序约束(Timing Constraint):
时序约束主要包括周期约束,偏移约束,静态时序路径约束三种。通过附加时序约束可以综合布线工具调整映射和布局布线,使设计达到时序要求。

周期约束:周期概念是FPGA/ASIC时序定义的基础,周期(PERIOD)约束附加在时钟网线上,时序分析工具根据PERIOD约束检查时钟域内所有同步元件(包括寄存器、锁存器、同步RAM/ROM等)的时序是否满足要求。
偏移约束:规定了外部时钟和数据输入输出引脚之间的时序关系,只用于与PAD相连的信号,不能用于内部信号。通过设置偏移约束,告诉综合工具输入信号到达的时间和输出信号需要保持稳定的时间,从而保证输入FPGA/CPLD的信号满足建立时间的要求,同时保证由FPGA/CPLD输出的信号满足下一级电路的时序要求。
附加时序约束的一般策略是先附加全局约束,然后对快速和慢速例外路径附加专门约束。附加全局约束时,首先定义设计的所有时钟,对各时钟域内的同步元件进行分组,对分组附加周期约束,然后对FPGA/CPLD输入输出PAD附加偏移约束、对全组合逻辑的PAD TO PAD路径附加约束。附加专门约束时,首先约束分组之间的路径,然后约束快、慢速例外路径和多周期路径,以及其他特殊路径。
静态时序路径约束:设计者提出一些特定的时序要求(或者说是添加特定的时序约束),套用特定的时序模型,针对特定的电路进行分析。分析的最终结果当然是要求系统时序满足设计者提出的要求。
附加约束的作用?
1:提高设计的工作频率(减少了逻辑和布线延时);2:获得正确的时序分析报告;(静态时序分析工具以约束作为判断时序是否满足设计要求的标准,因此要求设计者正确输入约束,以便静态时序分析工具可以正确的输出时序报告)3:指定FPGA/CPLD的电气标准和引脚位置。

三十七、IR压降

IR压降是指出现在集成电路中电源和地网络上电压下降或升高的一种现象。随着半导体工艺的演进金属互连线的宽度越来越窄,导致它的电阻值上升,所以在整个芯片范围内将存在一定的IR压降。IR压降的大小决定于从电源PAD到所计算的逻辑门单元之间的等效电阻的大小。
在这里插入图片描述

三十八、 工程改动要求(ECO)

ECO 指的是Engineering Change Order,即工程变更指令。目的是为了在设计的后期,快速灵活地做小范围修改,从而尽可能的保持已经验证的功能和时序。ECO 的叫法算是从IC 设计领域继承而来,其应用在FPGA设计上尚属首次,但这种做法其实在以往的FPGA 设计上已被广泛采用。简单来说,ECO 便相当于ISE 上的FPGA Editor。

但与FPGA Editor 不同,Vivado 中的ECO并不是一个独立的界面或是一些特定的命令,要实现不同的ECO 功能需要使用不同的方式。

ECO流程
在这里插入图片描述

三十九、FPGA内部资源

1. 可编程输入输出单元(IOB)
2. 可配置逻辑块(CLB)
3. 数字时钟管理模块(DCM)
4. 嵌入式块RAM(BRAM)
5. 丰富的布线资源
6. 底层内嵌功能单元 DLL(Delay Locked Loop)、PLL(Phase Locked Loop)、DSP

四十、FPGA和CPLD的异同

同:CPLD和FPGA都是可编程逻辑资源组成的
异:1.CPLD更适合完成各种算法和组合逻辑,FPGA更适合于完成 时序逻辑
2.CPLD的连续式布线结构决定了它的时序延迟是均匀的和可预测的,而FPGA的分段式布线结构决定了其延迟的不可预测性。
3. FPGA比CPLD具有更大的灵活性。CPLD通过修改具有固定内连电路的逻辑功能来编程,FPGA主要通过改变内部连线的布线来编程;FPGA可在 逻辑门 下编程,而CPLD是在逻辑块下编程。
4. FPGA的集成度比CPLD高,具有更复杂的布线结构和逻辑实现。
5. CPLD主要是基于E2PROM或 FLASH存储器 编程,FPGA大部分是基于 SRAM 编程,编程信息在系统断电时丢失,每次上电时,需从器件外部将编程数据重新写入SRAM中。
6. CPLD保密性好,FPGA保密性差。
7. CPLD的功耗要比FPGA大,且集成度越高越明显。

四十一、Dram和bram区别

1、bram 的输出需要时钟,dram在给出地址后就可输出数据。
2、bram有较大的存储空间,是fpga定制的ram资源;而dram是逻辑单元拼出来的,浪费LUT资源
3、dram使用更灵活方便些

四十二、三极管和mos管的区别

1、工作性质:三极管用电流控制,MOS管属于电压控制。
2、成本问题:三极管便宜,MOS管贵。
3、功耗问题:三极管损耗大,MOS管较小。
4、驱动能力:mos管常用来电源开关,以及大电流地方开关电路。

四十三、异步FIFO面试会问的问题

1.异步FIFO为什么要使用格雷码

gray码一次只有一位数据发生变化,这样在进行地址同步的时候,只有两种情况:1.地址同步正确;2.地址同步出错,但是只有1位出错;第一种是正确情况,而第二种,假设写地址从000->001,读时钟域同步出错,写地址为000->000,也就是地址没有跳变,但是用这个错误的写地址去做空判断不会出错,最多是让空标志在FIFO不是真正空的时候产生,而不会出现空读的情形。所以gray码保证的是同步后的读写地址即使在出错的情形下依然能够保证FIFO功能的正确性,当然同步后的读写地址出错总是存在的(因为时钟异步,采样点不确定)。

2.判断读空和写满

读空和写满时指针的比较方式是这样的
把读时钟域的读指针rd_ptr采集到写时钟(wr_clk)域,然后和写指针wr_ptr进行比较从而产生或撤消写满标志位wr_full;
把写时钟域的写指针wr_ptr采集到读时钟域,然后和读指针rd_ptr进行比较从而产生或撤消读空标志位rd_empty。

3.为什么指针中添加一个额外的位

为了区分到底是满状态还是空状态,在指针中添加一个额外的位
对于深度为2^n的FIFO,需要的读写指针位宽为(n+1)位。如对于深度为8的FIFO,需要采用4bit的计数器,0000~1000、1001~1111,MSB作为折回标志位,而低3位作为地址指针。

4.格雷码下怎么判断读空还是写满

当最高位和次高位相同,其余位相同认为是读空
当最高位和次高位不同,其余位相同认为是写满

5.二进制如何转化为格雷码

二进制数的最高位保持不变, 后续位依次与前一位进行异或运算
assign gray_code = (bin_code>>1) ^ bin_code;

6.指针延迟为什么不会产生影响?

指针延迟的产生是地址指针在同步化的时候,肯定会产生至少两个周期的延迟,如果是从快时钟域到慢时钟域,快时域的地址指针并不能都被慢时域的时钟捕获,同步后的指针比起实际的指针延迟会更大。
FIFO中的一个潜在的条件是write_ptr总是大于或者等于read_ptr;分为两种情况,写快读慢和写慢读快。
写快读慢:
产生fifo_empty信号,需要将write_ptr同步到读时钟域,写指针会有延时,可能比实际的写地址要小,如果不满足fifo_empty的产生条件,没问题。如果满足fifo_empty的触发条件,说明此时同步后的write_ptr = read_ptr,即实际的write_ptr >= read_ptr,最坏的情况就是write_ptr > read_ptr,像这种FIFO非空而产生空标志信号的情况称为“虚空”,但是也并不影响FIFO的功能。

产生fifo_full信号,需要将read_ptr同步到写时钟域,读指针会有延时,可能比实际的读地址要小,如果不满足fifo_full的产生条件,没问题。如果满足fifo_full的触发条件,说明此时同步后的read_ptr == write_ptr - fifo_depth,即实际的read_ptr >= read_ptr - fifo_depth,最坏的情况就是read_ptr > read_ptr - fifo_depth,像这种FIFO非满而产生满标志信号的情况称为“虚满”,但是也并不影响FIFO的功能。
写慢读快的情况也同上,并没有大的差异,不再分析。

  • 23
    点赞
  • 235
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离离离谱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值