笔记_小结

一.     跨时钟域控制信号传输

  1. 两级寄存器同步器

该同步器只能减少亚稳态向下传输的概率,或者说是阻止亚稳态的向下传播,因为寄存器脱离亚稳态的时间比时钟周期小的多,但是不能阻止亚稳态的发生,亚稳态恢复之后(第二级触发器的输出)不一定是正确的电平,但是由于是控制信号,不影响数据的正确传输(参考跨时钟域的握手解决方案)。强调一点,快时钟域到慢时钟域传播时,有可能导致信号的丢失,需要拉长控制信号处理,但是存在的风险是覆盖控制信号的变化。

  1. 同频同相位

时序通过约束解决,信号正常传输,不会发生亚稳态。

  1. 同频不同相位

处理方法和同频同相位一样,后期可以修复初始的相位差,不会发生亚稳态。

  1. 同源不同频,存在整数倍关系

快时钟域向慢时钟域传播:时序通过约束解决,信号拉长慢时钟周期1.5倍,不会发生亚稳态。

慢时钟域向快时钟域传播:时序通过约束解决,需要一个cycle的控制信号采用边沿检测电路,如无此要求可直接采样,不会发生亚稳态。

  1. 时钟同源,周期之间非整数倍

DC做静态时序分析时候,会按照最小公倍数展开时钟,寻找两个时钟的最小相位差。

最小相位差大于LIB提供的Setup:时序可通过约束解决,不会发生亚稳态,慢到快与快到慢的信号处理同4。

最小相位差小于LIB提供的Setup:时序必然违例,会发生亚稳态,采用双D触发器解决。慢到快与快到慢的信号处理同4。

两个时钟频率接近,但是非整数倍:最小相位差小于LIB提供Setup的极限情况,时序必然违例,处理方法同上(10M与11M的同源时钟)。

  1. 异步时钟,相位每次上电无固定关系

set false path(set logic_exclusily)

二.     跨时钟域数据信号传输

  1. 数据变化率比采样时钟域频率低

采用握手协议的方法实现数据安全传输,接收端可以采用对第二级触发器进行边沿检测,然后接收此时稳定的数据。相当于做了等待一个周期的数据脱离亚稳态的时间。

  1. 数据变化率比采样时钟域频率高

如果采用控制信号和数据信号的拉长方案,则会导致数据信号的覆盖丢失。此时采用异步fifo,或者双口RAM的方案。fifo的核心是通过地址在两个时钟域之间传递数据;空满标志是控制读写的主要控制信号,是通过地址之间的比较产生的。由于读写地址处于不同的时钟域,所以需要对地址进行同步处理,所以地址需要使用格雷编码和解码(组合逻辑可使用function实现)。为什么不把数据也直接进行格雷编解码传递呢?因为数据每个cycle的变化没有相邻性,也就是每次不一定只差1,但是读写地址都是具有相邻性,每次读写的地址都是加1,转换成格雷码才存在每次地址编码后只有一位发生变化。

  1. fifo深度的计算

写时钟100M,读时钟为200M,写速度为100个cycle写入60个数据,读速度为100个cycle读出30个数据。求fifo的最小深度:

    首先验证读写的数据吞吐率是否相等,否则必然会写满溢出或者读空。100M*(60/100) = 200M*(30/100)

   计算最危险情况:连续写入2*60个数据,所用的最短时间为120/100M,这段时间内读出来的数据个数为(120/100M)*(200M*30/100)= 72,所以深度最低位120 – 72 = 48个。

三.     CMOS晶体管结构到触发器

晶体管在数字电路中的主要作用就是一个电子开关,通过电压或者电流控制开关的打开和闭合。

CMOS工艺的优点:电压摆幅高VDD-GND,噪声容限很高;静态功耗很低;rise和fall time几乎相同;

  1. 阈值电压

栅极的电压达到一定的数值时,沟道才会形成,沟道形成时的电压称为是阈值电压Vth。

  1. CMOS门电路

非门(反相器),上PMOS下NMOS,输入共连栅极,输出共连漏极(NMOS源极接地);与非门,或非门很常见的两种电路。

  1. 双稳态器件

交叉耦合反相器结构是双稳态电路的一种电路结构,是存储器件的基本模块。

  1. 锁存器

SR锁存器:由一对交叉耦合的或非门构成。S称为置位端,R称为复位端;问题是当S,R同时有效的时候输出会发生错误,使用不够方便,优点是结构简单。

D锁存器:由前级门电路(两个与门和一个非门)和后级SR锁存器组成(非门2个,与门2*6,或非门2*4,所以一个D锁存器有22个管子)。常见的是后级采用一对反相器结构。

  1. D触发器

两个D锁存器级联,主锁存器使能pin加一个反相器构成主从触发器(22*2+2=46个管子);

建立时间tSetup:时钟有效沿到来之前,数据保持稳定的最小提前量;

保持时间tHold:时钟有效沿到来之后,数据保证稳定的最短时间;

四.     数字设计中的时钟与约束

  1. 同步电路和异步电路

狭义同步电路:每一个电路元件是寄存器或者组合电路,至少有一个电路元件是寄存器,所有寄存器都接收同一个时钟电路,如有环路,环路至少包含一个寄存器。

广义同步电路:所有触发器的时钟pin都来自同一个时钟源;分频电路如果周期是整数倍则一般认为是同步电路,非整数倍则视情况而定。

  1. 时钟树的属性

除了频率,周期,相位,边沿,电平属性之外还有如下属性

时钟的偏移skew:时钟树的分支信号到达各个触发器clk pin的延时不同导致的相位差异;主要与时钟树的线长,被时钟线驱动的时序单元负载电容和个数有关。CTS之前为估计值,CTS之后为计算值;

时钟的抖动jitter:时钟源本身的固有特性,分为随机抖动和固有抖动,随机抖动来自于热噪声,时钟源的工艺有关;例如晶振和RC震荡电路,ECL工艺的PLL和CMOS工艺的PLL,前者的随机抖动比较小。固有抖动的来源为开关电源噪声,串扰以及电磁干扰等,可以通过合理的电源滤波方案,合理的PCB布局布线解决。无论是CTS之前还是之后都要估计,工具无法计算;

时钟的转换时间transition:0->1,1->0的转换时间,与负载电容和器件的特性有关;CTS之前需要估计值,CTS之后工具计算值。

时钟的延时latency:分为source latency和network latency,时钟源延时指:从时钟源(晶振或者PLL)到达芯片的CLK Port的传输时间;网络延时指:从芯片的CLK port到达内部寄存器CLK Pin的传输时间。CTS之前时钟源延时需要估计值,CTS之后仍然为估计值。网络延时属于芯片内部的传输时间,CTS之前需要估计值,CTS之后工具计算值。

  1. FPGA内部时钟

使用一个信号充当另外一个always块的时钟边沿敏感列表,这种方法不建议使用;因为延时导致的亚稳态问题,和触发器生成的时钟驱动能力问题。

  1. 门控时钟

与门组成的门控时钟:容易会产生时钟毛刺。与门加锁存器结构的门控时钟:当涉及毛刺的问题时,锁存器可以起到很大的作用。一般情况下,门控时钟不需要我们自己进行设计;标准单元库中一般包括专门的时钟门控单元。加入时钟门控的方法一般有:逻辑综合后,在CTS阶段自动的将一部分逻辑转变为使用门控的逻辑电路。此外是rtl设计时直接加入门控时钟。

  1. 双边沿时钟、行波时钟;
  2. DC时钟约束

set_clock_uncertainty:CTS之前,包含skew,jitter,以及噪声裕度margin;CTS之后,包含jitter和噪声裕度margin;

set_clock_transition:对时钟转换时间进行建模,CTS之前为估计值,CTS之后取消对该属性建模;

set_clock_latency –source:对时钟源延时进行建模,CTS之前和CTS之后都需要估计值;

set_clock_latency:对时钟网络延时进行建模,CTS之前为估计值,CTS之后为工具计算值取消对该属性建模;

set_propagated_clock:版图后的电路工具计算出时钟网络延时和时钟的偏差以及转换时间;

五.     Verilog易错点汇总

  1. 阻塞赋值与非阻塞赋值可以从verilog的仿真事件队列的角度进行理解。for,while,forever,repeat

四类语句,只有for语句具备可综合性,其余均为测试验证所准备;

  1. reg [7:0] mem[255:0]在ASIC设计中,这种描述方式只会被识别为一系列的寄存器堆,并不会被识别为

RAM;ASIC中应当利用RAM单元库(IP)例化的方法描述RAM。而在FPGA中,综合器首先会将这种描述识别为RAM的声明,并通过识别对象的行为认为是RAM还是寄存器堆。如果后续的行为满足RAM的特征,就自动替换为FPGA内部内置的RAM单元库,否则将会识别为寄存器堆。同样的乘法器单元,a*b这种行为,如果是ASIC综合的时候就是使用与或非等标准单元组成的,工具会使用移位相加的原理,不需要人为的优化,当然流水线的话要人为设计。如果是FPGA则会自动识别乘法操作,然后调用FPGA上的乘法器单元,来提高速度和减少资源。

  1. 数据的截位与扩位

扩位操作:无论是有符号数还是无符号数扩位用0补齐,不会自动扩展符号位;但是算术移位运算符则具有自动扩展符号位的能力,但是位宽不对应发生的扩位用0补齐。

总之,无论是有符号数还是无符号数,高位宽的变量赋值给低位宽的变量,低位宽只会接受高位宽的低位数值。

截位操作:注意自动扩展符号位。

  1. ‘ifdef …’elsif…’elsif…’else…’endif:可以使用一个def变量于多个模块的编译选择;

C语言的指针:*代表定义指针变量和取指针变量中的对象,&表示取变量的指针;

  1. Verilog处理有符号数

定义为signed变量时,变量具备自动扩展符号位的能力,扩展最高位。定义为unsigned时,变量自动扩展则是补0实现。总而言之:计算机以补码的形式存储数值,正数的补码完全一样,负数的补码需要符号位不变,其余的取反加一。在涉及到负数的运算时,建议使用verilog2005的规范,定义为有符号数。如果用无符号数则建议进行负数数值的转换,也就是负数对应的正数全部取反再加一,减法就可以转换为加法实现。

  1. parameter语法的使用

parameter可以强制定义参数的数据类型。如果缺省则默认是无符号数,该数据类型具备自动识别的能力,所以写状态机的时候不必对parameter进行reg变量类型的定义。会自动匹配给State(reg)变量。

六.     电路常识性概念

  1. TTL与COMS电平

TTL是电流控制器件,大部分采用5V电源。输出高电平>=2.4V,输出低电平<=0.4V;输入高电平>=2.4V,输入低电平<=0.8V。

transistor-transistor logic gate。

    CMOS电路是压控器件,输入电阻极大。输出高电平=Vcc(1),输出低电平=GND(0);输入高电平>=0.7Vcc,输入低电平<=0.2Vcc.

    由此可知,CMOS可以直接驱动TTL。TTL输出高电平如果在2.4-3.5V之间则CMOS无法检测到高电平,因此TTL电路驱动CMOS电路需要加上拉电阻。3.3V的CMOS电路驱动5V的CMOS电路时,可以把IO设为开漏,然后加上拉电阻到5V,或者修改为驱动5V TTL电路。TTL和CMOS电路互相连接时需要考虑是否需要电平转换,采用电阻分压便可以实现。

    常见的逻辑电平有:5V系列(5V TTL和5V CMOS)、3.3V系列,2.5V系列,1.8V系列(上面三个统称LV TTL)。

  1. TTL的集电极开路门OC门,MOS管有漏极开路门OD门。

CSDN论坛收藏夹介绍的很清楚,结合电路图了解。

  1. 拉电流和灌电流

拉电流和灌电流是衡量电路驱动能力的模拟说法,数字一般称为驱动能力。

拉电流:高电平输出时,输出端对负载提供的电流;灌电流:低电平输出时,输出端要吸收负载的电流。灌电流和吸收电流都是输入电流,区别在于灌电流属于被动的,吸收电流属于主动的。

    为什么可以衡量驱动能力:当逻辑门输出端是低电平时,从三极管的输出特性曲线可知,灌电流越大饱和压降越大,低电平的越高,然而低电平有上限。当逻辑门输出端是高电平时,从三极管的输出特性曲线可知,拉电流越大则内阻上的压降就会越大,所以拉电流越大则输出端的高电平越低,然而高电平时有下限。

  1. 上拉电阻与下拉电阻

主要的作用:提高输出信号的驱动能力;确定输入信号的电平,防止干扰;改变电平的电位,常用在TTL-CMOS匹配;

七.     笔记中的易错点

  1. 优化关键路径的方法(较大组合逻辑的方法)

纵向解决:采用流水线,插入中间寄存器解决,采用乒乓buffer;横向解决:乘法转换为加法,串行转换为并行处理(增加位宽);

2.  Function只有一个输出,最常用于封装组合逻辑块,采用阻塞赋值;Task可以有多个输出,最常用于对带有延时语法的封装,采用阻塞赋值;两者的输入可以不定义数据类型,默认是reg型,一般只有input,output,reg三种数据定义;但是SV中,如果含有cb.data_in时钟块同步信号,则要使用非阻塞赋值,还多了一个ref接口方向声明;

3.  加载波形的两种方法,方法一:采用verilog语法,$dumpfile,$dumpvars;方法二:采用synopsys VCS语法,$vcdpluson(.vpd文件);关于$display和$monitor函数注意几点,不可以打印出中间变量的数值,需要打印的话采用的方案是将中间变量assign出来一个端口或者直接看波形;

4.  产生亚稳态的根源:CMOS反相器的电平传输特性曲线的不确定电平状态以及主从触发器的前后级锁存器的逻辑延时;

5.  PT汇总

group name = capture clock name;check_timing:检查所写的约束是否完备,是否存在没有约束到的路径。report_analysis_coverage:检查在当前的约束条件下,所有的时序是否有问题;clka分频产生是时钟generate clkb之间一定是整数倍关系,因为时钟的边沿一定是对齐的,generate clkc与clkb之间则不一定是严格意义的同步时钟关系了,周期不一定是整数倍;clka与clkb为异步时钟,clka分频产生的generate clkc与clkb之间工具不会默认是异步关系,需要设置告诉工具二者为异步时钟;工具的行为:1.按照最糟糕的情况进行计算/2.两个时钟为同源时钟但是频率不同,工具会按照二者的最小公倍数展开然后寻找最危险的边沿计算/3.先按照理想的没有uncertainty和latency的情况对准边沿/4.view report_timing增加一个小窗口显示。

  1. 数字与模拟的接口常用的方案:模拟一般是低速信号,对于单比特信号虽然是属于跨时钟域但是不使用同

步器不影响结果,但是一般会进行滤波处理,常用电压比较器并且必要的时候采用迟滞比较器消除毛刺。

  1. 单个的TTL(12V直流偏置)或CMOS(5V直流偏置)一般因为性能不好不常用在模拟中,但是在数字电路

中常常当作开关使用,模拟中常用性能很好的运算放大器。使用无反馈回路运算放大器做成的电压比较器常常用作数字和模拟的接口电路。

  1. 关于STA中report_timing –delay_type max/min的报告分析

Setup:slack=data_req - data_arrival >= 0;Hold:slack = data_arrival – data_req >= 0;所以对于setup,data_req会越小越好,减去库提供的tSetup,对于hold,data_req越大越好,加上库提供的tHold。

  1. DC提供的两个检查脚本工具

语法检查工具:syntax_check ..file.只检查脚本的语法,不执行命令;

上下文检查工具:context_check ..file.检查脚本的语法,并执行命令对读入的设计和库文件等进行检查;

  1. DC约束时,有些路径不太清晰的情况下建议关注两个点:launch clock和capture clock;然后就清晰路

径的情况以及需要添加怎样的约束了。

一些零碎的经验:stop_gui/55nm工艺clock uncertainty 0.3/dc_shell -64bit/fanout 20/cap 0.2/一个licence是最大可以设置2个core。

10. 设计思想之定时器。在设计的时候会遇到等待一个信号然后进行相应的动作。最不建议的做法就是直接使

用定时器然后继续后续的动作,除非特殊要求比如Vconn的提前供电。否则不建议这样做,一定要等待信号的完成信号然后进行后续的动作。

    11.仿真器进行功能仿真,也称为动态仿真,不可能仿真出亚稳态的问题,无论是前仿真还是后仿真。因为仿真是根据仿真事件队列默认的行为。静态时序分许STA是主要解决亚稳态问题的方法。二者目的完全不同,功能错误就肯定错误,功能正确的基础上进行静态时序分析才会有意义。

    12. 分类和分步的思想进行代码设计分析。从起点到终点,从终点到起点需要哪些中间变量,这样一步一步的分析设计是很有效率的代码实现方案。分析实现方案最重要,方案确定好之后代码的实现只是行云流水般的体力活。

    13. 如果不把always@(*)或者敏感列表写全,会生成锁存器,因为位于等号右边的变量变化时,输出没有变化则就是会生成透明锁存器,这种锁存器比较难发现。另外注意一下,FPGA是基于LUT的结构,他会列举出所有的输入和输出变化,然后转换为查找表。类似于写入RAM中,根据输入(地址)响应输出(数据),所以FPGA和ASIC是有很大很大的差异,回想一下如果FPGA的内部结构和ASIC一样,那么ASIC流片也不至于那么昂贵了吧。

    14. debug思想植入错误的方法:在tb中和DUT的接口处,插入一段控制逻辑,因为不需要综合所以就直接可以用发散的语句。

    15.PD项目中关于ALC和LDO的作用

LDO可以提供弱的5V电压,但是电流能力(100mA)很弱。插入设备时候会产生ALV欠压的现象。LDO在短时间内也不会被开关电源烧坏。ALC指的是电流很小,和LDO没有半毛钱关系。LDO的技术难度不高,但是ALC欠流的技术难度很高。基本的技术原理就是通过一个下电阻,测电阻两端的电压,但是由于该电阻很小则会造成功率的损耗。模拟是很难做的,100mv精度的电压比较器也是很难做的。

    16.关于复位的约束

同步复位或者异步复位同步释放:rst_n不能设置falsh path,因为是同步信号也需要检查复位信号的时序。只要设置为ideal network(驱动能力无限),don’t touch.不要对rst_n进行优化等动作。

异步复位:需要设置falsh path。因为属于异步路径,不需要检查rst_n信号的时序,设计中几乎不会采用异步复位和异步释放。

    17. 对仿真时间的控制方法:设置一个看门狗的全局计数器,当然在fork join中也会设计到局部的看门狗计数器。或者定义一个time型变量,把$time仿真时间赋值给该变量,然后就可以控制仿真时间。

    18. 对于设计中定时器的时间的控制范围的理解。如果是非交互性的时间,比如发送source cap的定时器,因为sink设备不care这个时间,则尽量取协议规定的中间值进行设计(100ms – 200ms,取150ms)。如果是交互性的时间,比如receive goodcrc timer,则尽量取鲁棒性最强的设计(0.9ms – 1.1ms,src取1.1ms,sink 取0.9ms)。

    19. 对于比较小型的计数器建议使用移位寄存器或者状态机进行设计,比较节约资源。

    20.Python中的method和function的区别。Method和property(属性)是class的两个元素,属性是class的变量集合,method是对这些属性的操作。Function是和class一个等级的程序体,当然method可以调用函数,但是函数和方法的范畴高度不同。同理可以理解属性variable和property的关系。

    21.奇偶分频电路

偶数分频电路:如果是较低偶数的分频电路可以采用二分频率,四分频依次取反叠加产生;若果是六分频或者是较大的偶数分频电路则建议使用计数器实现;

奇数分频电路:占领比非50%的奇数分频电路设计同使用计数器的偶数分频电路相似;占空比为50%的奇数分频电路设计则必须使用下降沿触发,具体实现方案是先用上升沿产生占空比为1/3的奇数分频电路,同时使用下降沿产生占空比相同的1/3奇数分频电路,然后将这两个奇数分频时钟进行或运算产生占空比为1/2的奇数分频电路。

八.     数字集成电路设计实践小结

    1.当NMOS逻辑门的输入是1时,NMOS处于导通状态,静态电流由电阻值决定。为了降低这个状态下的功耗则要求电阻值必须大,但是另一方面当输入是0时,逻辑门的输出端的电位变化(高电平)的迟延也由电阻决定。为了减少迟延则电阻值必须小,所以NMOS容易在功耗和速度方面陷入两难的处境,所以CMOS应运而生。当输入为1时PMOS断开,电阻很大,当输入为0时,PMOS导通,电阻很小。

         2. D锁存器的使用局限在一些特殊的用途上,比如D锁存器比触发器在电路面积和功耗方面有优势,用于大容量数据记忆的静态存储器SRAM使用的时类似与D锁存器的技术。SRAM是异步存储器件,不需要外部提供时钟,给地址就给输出。使用触发器还是使用RAM的分界线一般是1kbit左右。

         3.建立时间和保持时间(都是针对捕获端寄存器而言)

建立时间:经过组合逻辑电路单元延迟稳定后的数据提前下一个时钟边沿到来的最小提前量;

Slack_setup = req_time – arrival_time = (Tclk+Tdelay_capture-Tun-Tsetup+(Tclk_delay_min)) – (Tdelay_launch + Tckq + Tcomb_max)

保持时间:捕获端寄存器读入数据后,数据最小保持稳定的时间;

Slack_hold = - (req_time – arrival_time) = -(Tdelay_capture + Tun + Thold + Tclk_delay_max) + (Tdelay_launch + Tckq + Tcomb_min)

保持时间有时候比较难以理解,但是工具DC的STA的时候会从是时钟起点,到数据终点进行计算考虑到时钟树的偏移会更容易理解。

You hear and you forget, you see and you remember, you do and you understand.

  1. 完备的Verilog 测试平台

DUT:例化的待测试设计。时钟:产生时钟单元模块。测试用例:initial 块给输入添加测试激励的模块。

Dump wave:Dump波形模块,便于调试;结果测试:随着仿真时间的进行,对输出结果进行比对测试。

记分板:使用计数器,对通过的测试激励进行统计。

  1. Verilog中x和z

X:代表是0或者1的其中一个,但是我们不care或者不知道这个信号的电平状态。

Z:代表的是高阻态,一个信号处于完全断路或者接近断路的状态,比如OC门。也称为浮接状态,floating;

  1. 阻塞赋值和非阻塞赋值

阻塞赋值:代入指令顺序执行,组合逻辑触发条件满足则直接顺序执行;

非阻塞赋值:时序逻辑边沿触发条件满足时,更新寄存器的值。其代入不按照顺序执行,满足触发条件同时执行;

  1. 逻辑综合后产生的逻辑网表有标准单元库的逻辑单元,以及其他的已完成后端设计的宏单元组成,存储器

是最常见的宏单元。

  1. 吞吐率 = 时钟频率 * 输入位宽 * 可利用率;
  2. 负数运算:把有符号的3bit数据变为6bit数据时,只要将最高位进行扩展就可以实现。负数的乘法除法

进行运算时,一种思路是符号进行单独的逻辑操作比如负负得正,数值部分进行正数的运算便可以实现。

10. 流水线操作可以提高数据的吞吐率,因为组合逻辑变小,可以提高时钟频率。但是存在的问题是延滞时间

增加。流水线可以设计成不可暂停式和可暂停式两种,原理类似与门控时钟技术。随着超深亚微米工艺的普及,线延时所占的比重也变得很大,所以对与连线较长线延时较大的情况也可以采用多级流水的操作方式。

11. 握手协议的过程

首先发送端req和数据同时发送给接收端,接收端将req使用两级寄存器同步后检测req边沿,检测到边沿捕获数据的同时ack信号跳变,发送端将ack信号使用两级寄存器同步后检测ack边沿,检测到边沿的同时改变req电平和下一组数据。以此类推,握手协议的原理就是等一拍数据脱离亚稳态,然后进行捕获。

12. 时序逻辑的两大法宝:计数器和状态机(小型的计数器建议使用移位寄存器);

13. 状态机

状态编码的原则:延时和资源消耗最小的思想;状态多使用BCD编码(跳转频繁的状态编码时候有意图的使用bit变化最小的情况),状态少使用独热码;将数据路径和控制路径分离后,多位数的数据输入被从状态机中剥离出去,有效的减少了状态机验证的负担;状态机的设计原则,简洁和稳健性。常用的错误处理自我恢复设计方法是增加一个IDLE状态和Reset状态;防止未知值的扩散,状态机中的每个信号都要有确定的电平状态,所以全局的复位信号是常用的设计方法,复位动作只有异步复位同步释放和同步复位同步释放,为了确保不同的寄存器在同一个时钟边沿完成复位介绍动作,不发生复位结束时太靠近时钟边沿而导致寄存器进入亚稳态,所以没有异步释放的设计方案。异步复位存在的问题是复位信号的噪声和毛刺会十分敏感,而同步复位有自动过滤噪声和毛刺的功能,因为组合逻辑会容易收到毛刺和噪声的影响,而时序逻辑则受限于时钟边沿则有过滤噪声和毛刺的功能。另外,异步复位需要一个特殊的复位传播树,对后端的设计工作带来额外的工作。所以同步复位可以缩短项目的研发周期;防止未知值扩散的基本思路:防止模块外部的未知值扩散到模块内部,防止模块内部信号产生未知值,但是这并不是意味着所有的信号都要复位信号进行初始化,只需要对源头的信号进行复位初始化操作即可;

14. FIFO的功能和用途

直线型的FIFO空满标志直接用地址比较进行检测,环形的FIFO可以使用额外的一个计数器进行实现,计数器用来统计FIFO中存储的数据个数,以此来对FIFO的空满进行检测。同步FIFO无需对地址进行格雷码编码解码,异步FIFO需要对地址进行格雷码的编解码设计,另外由于地址编码解码之后跨时钟域的处理会导致实际的空满延迟检测,所以设计悲观的空满标志制造冗余量。

15. 存储器

和标准单元库一样,存储器的设计通常由专门的厂商提供。厂商一般会提供内置存储器的编译器(memory compiler)。逻辑设计者只需要指定存储器的类型和尺寸,编译器可产生用于逻辑仿真的行为模型和用于时序分析的数据,逻辑综合软件不负责生成存储器,存储器会被当作一个已经完成物理设计的宏单元(.db或者.lib的库文件,link library的时候把target library和该宏单元加入便可以,作为逻辑综合的基本构件)。SRAM的特点:静态随机访问存储器,基于双稳态电路存储,成本高,速度块,元件多集成度低,适用于较小容量的存储(1.5K-1M);DRAM的特点:动态随机访问存储器,电容存储,需要不断地刷新,至少64ms刷新一次,集成度高,元件少,成本低适用于大容量存储,速度慢,吞吐率低。SDRAM的特点:同步动态随机访问存储器,DDR(Double Data Rate)技术是现在SDRAM的主流;

原文地址:https://www.cnblogs.com/godlovepeng/p/9480810.html