伦敦国王学院EEM笔记:Digital Integrated Circuits Design 集成电路设计分析

Preface

今年学期都过半了,3月才开始记笔记。之前记了3周左右,但是电脑被偷了,我还没有及时上传到 gitbook 里,凉凉。

由于明天有实验,所以决定先从这门课开始补吧。

介绍

摩尔定律:芯片上的晶体管数量每18~24个月翻一番。但是增长速度现在已经逐渐放缓了,芯片的功耗是一个主要问题,晶体管太密了,power density is too high,导致芯片难以保持低温。

而且芯片上的晶体管数量增加,设计难度也在增加,可以通过抽象层次来提升设计效率。

image-20250303224841029

Digital design 的设计指标

芯片的设计指标有很多,诸如:成本,良率,性能等。

Yield: 芯片制作时,是用一块圆形晶圆切割得到的。晶圆上可能有瑕疵,所以芯片体积越小,不仅产量越高,良率也会越高,因为没有瑕疵的小芯片更多。

image-20250303231126005

Cost: 随着摩尔定律的发展,晶体管体积逐渐减小,成本也大致随着体积减小而下降。不过晶体管体积小于28nm后成本下降速度减慢。

Reliability: 现实世界的真实信号是模拟的 analog,不像数字有准确的数值。比如对于下面这个反相器 CMOS,理想状态下我们希望输入电压一旦超过 VDD/2,输出就降为0. 但是真实情况下的输出电压做不到骤降的。

image-20250303231735291

image-20250303231746762

那么我们就要制定一系列的规范,到底什么值的电压输出视作“高电平”,什么值视作“低电平”?什么值范围内的输入电平有效,什么值范围内算作 noise?

如下图。输出电压的 VOH VOL 是输出高/低电平,只有大于 VOH 或者小于 VOL 的输出电压才视作有效。

VIH VIL 则是电压曲线中变化斜率=-1的两个点,输入电压小于 VIL 视作“令输出电压为高电平”的输入值,大于 VIH 视作“令输出电压为低电平”的输入值。

Negative gain 点,或者说 VM 点,是图像与 Vout=Vin 直线的交点。

image-20250303231907797

制定了这些标准后,就可以用一个指标来衡量此电路的可靠性:noise margin 噪声边界。

计算方法反正只要记住 noise margin high 和 noise margin low 都是 >0 的就行。

Regenerative Property 再生性:再生性质指的是信号通过每个级别的处理后,逐渐稳定并恢复到标准的逻辑电平的能力。

多个反相器串联,可以让输入信号切换更明显,高低电平界线更分明。

image-20250303232933221

下图是再生和非再生电路的电压曲线对比,再生电路在中间的不确定区域下降速度更快,停留更短。

image-20250303233029193

Delay

输入信号到输出的延迟。注意下图中的命名,tpHL 指的是反相器输出电压 High to Low 的时延,而不是输入电压 High to Low.

image-20250304163824314

下面是一个一阶导 RC 电路,输入电压阶跃升高给电容充电,tp 是电压达到一半的时间:

image-20250304164426086

对于一阶 RC 电路,其 $$t_{pHL}=0.69RC.$$

Power and Energy

电压计算公式简单说就是 VI 求积分:

You can't use 'macro parameter character #' in math modeE=P_{av}t$$,Energy 也叫 Power-Delay Product Energy-Delay Product (EDP) 能量延迟积 =Et,是一个能同时衡量功耗和时延的指标。 一阶 RC 电路电压从0到最大值 Vdd 的过程中,整个电路消耗的能量和电容器消耗的能量计算方式如下: ![image-20250305111829667](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503051118768.png) ## Layouts and Design rules 设计原则 以一个 CMOS 举例,设计原则中主要考虑俯视图的 xy 维度,也就是 CMOS 的宽度和长度。厚度不作为考虑因素: ![image-20250305112331112](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503051123186.png) 图中可以看出,W 是源极,漏极,栅极共有的宽度值,L 则是三者的长度相加。一个反相器 CMOS 的图像大致如下,注意层级关系: ![image-20250305112511552](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503051125601.png) 对于不同材质,可能设计原则的长度宽度范围,以及和其他材料之间的间距范围都不同。 晶体管 transistor:一个理想的,忽略 MOS 非理想二阶导的“开关”,一样是通过 Gate 控制源极和漏极的联通。 NMOS 晶体管 Gate 高电平(达到一定值)时导通;PMOS 晶体管 Gate 低电平时导通。合而为之可以制作出如下图所示的反相器,PMOS 相较 NMOS 多一个圆圈代表取反: ![image-20250305113059636](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503051130675.png) 如果给定一个有 CL 的电容,在其前面串联多少个反相器可以最小化 delay?以及,每个 inverter 的 size 应该是多少? ![image-20250305114222053](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503051142105.png) 对于 inverter,其延迟计算公式如下:

t_{pHL}=(ln2)R_NC_L\
t_{pLH}=(ln2)R_PC_L

使

\begin{aligned}
t_p&=kR_W(C_{int}+C_L)\
&=kR_WC_{in}(\frac{C_{int}}{C_{in}}+\frac{C_{L}}{C_{in}})\
&=t_{inv}(\gamma+f)
\end{aligned}

You can't use 'macro parameter character #' in math mode其中,$$C_{in}$$ 指的是单位面积 MOS 的电容(输入电容),所以 $$t_{inv}$$ 和栅极的 size 无关。 γ 是内部电容相对于输入电容的比例,而对于一个 CMOS inverter 的电路来说,$$C_{int}=C_{in},\ \gamma=1$$。 f 是扇入扇出因子,负载电容相对于输入电容的比例。 ## Delay Optimization and Combinational Logic ### 给定反相器数量,调整反相器 size 和负载电容求最小时延 如果给定了 inverter 的数量,第一个 inverter 的 size,以及负载电压,如何最小化时延?

t_p=t_{p1}+t_{p2}+…+t_{pN}

t_p=t_{p0}\sum^N_{i=1}(1+\frac{C_{gin,j+1}}{\gamma C_{gin,j}}),\ C_{gin, N+1}=C_L

f^N=F=\frac{C_L}{c_{in,1}}

t_p=Nt_{inv}(\gamma + \sqrt[N]{F})

You can't use 'macro parameter character #' in math mode例:如下,F=8(整个电路的 fanout),每个 inverter 如果 f 相同,应该等于2. ![image-20250312223921206](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503122239289.png) ### 给定反相器 size 和负载电容,调整反相器数量求最小时延 也就是说要解答的公式变成了:

t_p=Nt_{inv}(\gamma + \sqrt[N]{C_L/C_{in}})

N=\frac{ln(C_L/C_{in})}{lnf}\
f=e^{1+\gamma /f}

You can't use 'macro parameter character #' in math modeγ 我们之前提到过,是内部电容相对于输入电容的比例,对于 CMOS 电路 γ=1. 当 γ=0, f=e 时,$$N=ln(C_L/C_{in})$$ 让时延最小。 当 γ=1 时,f 根据图像可以得出大致 3.6 能取得最小时延。这就是为什么一般扇出采用 4. ![](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503122256483.png) *从图像大致可以看出,3.6大致处于 elbow 点* ![image-20250312225619782](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503122256856.png) 如何计算 energy 损耗?如下图。注意,从 Cin 到 C_L 的总电容应该是 $$(1+f+f^2+f^3+f^4)$$,其中 $$(f+f^2+f^3)$$ 这部分被称作 overhead,也就是不包括 C_in 和 C_L 的部分,下面的能量计算公式也是计算这中间部分的。 因为一般题目都是给出了头尾电容,我们要设计中间串联几个 inverter,衡量时延和能量损耗嘛。 ![image-20250312231841581](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503122318656.png) 从下图中大概可以看出,一味增加 inverter 会导致时延和能量损耗都增加,所以也并不是一直增加 inverter 的数量就是好的。 ![image-20250312232118205](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503122321325.png) ### Combinational Logic 组合逻辑电路 组合逻辑电路和时序逻辑电路的区别如下: ![image-20250312232331061](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503122323150.png) 静态逻辑电路 static logic circuit 除了开关切换的一瞬间(transient),其他时候电路输出都是连到 VDD 或 VSS(高/低电平)的,可以根据逻辑电路确定输出。*而动态电路可能利用电容存储信号。* 下图是两个 NMOS 组成的逻辑电路: ![image-20250312232954115](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503122329192.png) 下面是两个 PMOS 的逻辑电路: ![image-20250312233034153](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503122330228.png) 可以看出有些情况也许 NMOS PMOS 可以相互取代逻辑功能的。那么什么时候用 NMOS 什么时候用 PMOS 呢? 一般来说,NMOS 用于“拉低” pulling low,PMOS 用于“拉高” pulling high。 下表是逻辑电路常见计算公式: ![image-20250312233128672](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503122331775.png) 我们为什么要引入逻辑运算?也是为了设计 PMOS NMOS 组成的电路。比如从 inverter 案例中我们可以得知,一般 inverter 的源极和漏极是相反互补的两个电路,所以我们可以根据逻辑电路取反设计另一端的电路。 ![image-20250312233505001](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503122335164.png) ![image-20250312233513167](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503122335261.png) 进一步的问题:现在我们可以设计出逻辑电路了,怎么设计晶体管尺寸从而减小延迟? ![image-20250312235435916](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503122354998.png) 首先 PMOS 宽度应当是 NMOS 两倍。 然后根据时延公式我们知道时延和电阻成正相关。而电阻和晶体管 size 成反相关(Sizing-up side effect)。所以,应当尽量保持并联电路电阻相同。 ![image-20250312235602180](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503122356291.png) 例题1:好像是右上角的时延大,能量消耗小;下面两个时延小,能量消耗大一些,能承担的 C_L 更大了。 ![image-20250313003402560](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503130034658.png) 例题2:加两个逆变器有助于分担 big C_L,因为之前我们了解过可以通过多个 inverter fanout 逐级分配负载电容,大 NOT AND 门就不需要自己完全承担了。 ![image-20250313003441583](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503130034737.png) 例题3:用 inverter 时延表示 NAND 时延。 ![image-20250313003639037](https://raw.githubusercontent.com/Jingqing3948/FigureBed/main/mdImages/202503152146637.png) 首先我们假设 NAND 门的电容是 1C,求出整个电路的所有 MOS 的电容。求出来全是2. 接下来求源极漏极的电容,我的理解: 漏极电容只看 OUT 和 GND 这一段的连接。$$(2C+(2C+2C))=6C

image-20250510003154624

源极则是分开看两个输入的电容,A B 都是 2C+2C=4C.

而 inverter 只有一个输入,对应 PMOS 是2C,NMOS 是1C,总的Cginv=3C. 由此获得比例关系。

然后就是代入公式了。

Logical Effort and the Wire Interconnects

对于 delay,之前我们总结了三个公式:

image-20250314022658235

image-20250314031449872

总之,我们可以把 CMOS 互补静态电路归纳成如下的式子:

image-20250314055413965

其中,LE 这一部分(也就是扇出的系数)被称为 Logical Effort。这部分计算也很简单,就是 CMOS 电路的 Cg / inverter 的 Cg.

如果以 tinv 为衡量单位,Delay=EF+p,EF=LE*f, p 是电路内部 delay。

例题:

image-20250314060346985

想求 LE,我们一步步来。

  1. 画出互补电路。
  2. 求出电容关系。

image-20250315220858922

  1. 可知 LE=(6/3).

注意,A 和 A 取反输入要一起合并计算(都作为 A 的输入,比如下图 XOR 的输入,AB 都视作12)。

image-20250315221027768

image-20250315221057012

以及,本课程中:gate size=2 的意思是这个 gate 相对于 inverter 的 size 是2. 比如2输入的 NAND gate size=4/3.

N-gates in sequence optimization

如果 N 个 gate 串联,每一个 size 多大,多少个串联能获得最优时延?

这个问题有些类似之前的反相器串联让时延最小问题,只不过换成其他 gate 串联了。

首先引入多分支并联的概念:

image-20250316195553308

然后:

image-20250316195628536

例题:给定反相器种类和负载,求每个反相器 size 使得时延最小。

image-20250316201103439

The ‘Best Effective Fanout’ $$EF=PE^{1/N}$$ is still around 4. (3.6 when γ=1)

下图是另一个计算传播延迟的例子,注意多输入并联最后汇总成一个输出的话,相同电路不影响传播延迟。

image-20250321100041828

但是如果是输入分支成多个输出并联,就会影响传播延迟了。

image-20250321100315019

例题:对于分支处的 f 要按 branching effort 计算,然后再逐步往后推导。

image-20250321101554934

Wire

导线其实也是一个不可忽视的,影响电路设计的因素。比如影响成本,可靠性,性能等。

主要有两个因素:interconnect 互联,parasitics 寄生。

interconnect

local wire:连接门与门。随着工艺尺寸缩小,local wire 也在变短。

global wire:比如连接 VCC,CLK,总线等。随着芯片尺寸变大,global wire 长度在增加。

电容计算:实际上会产生两种电容,一种是平行板间的互联电容(金属线和基底之间的电容)Parallel Plate Capacitance,

image-20250321105613585

  • :互连的电容。
  • :介电常数(Permittivity)。
  • :金属层之间的氧化硅厚度(Dielectric thickness)。
  • :互连宽度。
  • :互连长度。

表明互连电容的缩放依赖于互连长度的缩放比例

而另一种则是电场线溢出效应形成的扩散电容 Fringing Capacitance,

image-20250321105735033

因为边缘电容的存在,导线靠得太近信号会互相影响;以及存在噪声。

MOS Transistor

图像

MOS 管结构大致如下:

image-20250321112851848

上图所示的是一个 NMOS。

  • 最下面是 p substrate p型衬底。
  • 上面有两个重掺杂的 n 区形成的源极和漏极。一般 S 是提供 charger 的源极,D 是接地的漏极。
  • 中间的是多晶硅制作的 gate,gate 与 MOS 管之间还有一层绝缘用的二氧化硅。tox 是氧化层的厚度。
  • n 掺杂侧 N-doped side 中有自由电子 free electrons,p 掺杂侧 N-doped side 中是空穴 holes。

高低电势差会驱动电子往反方向移动,如果从 N 到 P 就会填补 P 中的空穴,填补完成就形成通路,自由电子可以沿着通路产生电流。

反转 PN 可以获得 PMOS,但是制作 CMOS (包含这两者)的时候这两者都要放在 p-substrate 上,PMOS 那一部分的 n 衬底被称作 well 井。

image-20250322215204730

导通原理

只拿出一个 PN 结构来看,如下:

image-20250322215341176

N 型掺杂区是往半导体原子结构中掺入了少量杂质磷元素,磷外层有5个多余电子,所以和半导体原子形成共价键时会有一个电子多出来,形成自由电子,导致 N 掺杂区中就会有大量自由电子。

而 P 型半导体则是往半导体原子结构中掺入了硼原子,硼原子外层有3个自由电子,所以和半导体结合的时候是欠一个的,也就是余下了一个没有电子的“空穴”。空穴相对自由电子来说就是带正电的。

在图中最上面一部分我们可以看到,PN 掺杂区的交界处的状态是“反转”的。这部分叫做空间电荷区 space charge region,因为两侧电势差(一开始刚接触的电势差是 P 高 N 低)导致产生电荷扩散现象,让 N 区域的自由电子往 P 区域移动。自由电子与空穴结合,两侧载流子减少,所以中间的部分被称作耗尽区 depletion region。

并且由于载流子移动,耗尽区产生内建电场,和电荷扩散力相反方向,,最终达到一个动态平衡。

阈值电压

拿 NMOS 举例,如果我们给栅极施加一个足够大的正电压,就会吸引 P 衬底中的少数自由电子靠近栅极,形成一个 channel。这个 channel 的形成的阈值电压就是 VT threshold Voltage.

让 MOS 管状态切换的阈值电压计算公式如下,我觉得了解就行:

image-20250321171341023

经验公式如下:

源极-衬底电压 substrate voltage 降低时,阈值电压升高 ,需要更高的电压才能达到反转效果。

image-20250321171916324

漏极电流 Drain Circuit

漏极电流计算公式:$$I=Q_d \cdot v$$,Q_d 是每单位长度中的电荷数,v 是电荷运动速度。

进一步地:

COX 是单位面积的氧化物电容,乘 W 是单位长度的氧化物电容。

VGS-VTH 是栅极电压超出阈值电压的部分,电势差越大表示能驱动的电荷越多。

在下图中 x 点处的电荷密度 Q 计算公式如下:

漏极电流计算公式如下:

image-20250321173654052

如果进一步将速度 v 转换为电场:$$v=\mu E, E= \frac{dV(x)}{dx}$$。

image-20250323001619099

晶体管工作模式

1. 截止区 Cut off

当 VGS-VTH<0 时漏极电流=0,没通。

2. 线性区 Linear

VDS≪2(VGS−VTH) 漏极电压远远小于2倍的栅极电压-阈值电压时。

此时漏极电流基本和漏极电压呈现线性关系。

image-20250323001112512

根据漏极电流的计算公式可知,如果 VGS 太小,那么 x 没有达到 L 的时候可能 drain current 就等于0了。这就叫 pinch off 截止。

image-20250323001009403

3. 饱和区 Saturation

VGS-VT<VDS 时,漏极电压电流公式可以近似视作与 VDS 无关:

image-20250323001859850

总体而言,漏极电流随着 VGS VDS 变化而改变的图像如下:

image-20250323002319659

虽然栅极电压增加,最终能达到更大的漏极电流,但是漏极电流达到饱和所需要的源漏电压也更大。

Velocity Saturation 饱和速度

载流子可能会碰到一些障碍,杂质等,所以运动速度会受到影响。

电场强度增加,载流子速度会逐渐增加,但是由于如上种种散射效应,速度有一定的上限。达到上限就被称为速度饱和。

如下图,达到速度饱和点之后,再提升源漏电压,速度也不会增加太多。速度饱和点和 channel 长度,源漏电压都有关。短 channel 更快达到饱和。

image-20250323005227611

我们可以大致将速度简化为如下的速度饱和模型(红色部分)。

image-20250323125303570

Wire Resistance 导线电阻

如下图。rou 是材料电阻率。

image-20250323130957439

为了减小电阻,可以选择其他材料,导线加工工艺,以及增加互联厚度等。

Elmore Delay, Wire Model, Adder

Elmore Delay 爱尔摩延迟

绝大多数电路都可以简化为 RC 树电路。

爱尔摩延迟是使用 RC 电路的延迟来近似模拟所有电路的延迟的模型。

image-20250323131434748

例子:下面是一个 NAND 电路的等效爱尔摩延迟转换。我们要计算这个 NAND 电路 falling delay 就是 out 从与上拉电路连接切换到与下拉电路连接的时延。

左边是原始的 NAND 电路图。

第一步我们要把电路初步转换为 RC 电路,转换方式是给每个 MOS 用两端有电容的电阻来替换(MOS 开关等效为 Cgs 和 Cds 两个寄生电容和电阻)。电容值和 MOS 的 size 一致,电阻值(我的理解)PUN 和 PDN 的一条通路都是 R,来确保时延一致(?)。

然后我们再进一步简化。首先,PUN 上拉电路中的 R 和 Cgs 不参与 delay 计算,因为这部分电路在切换的时候开关断开了,不影响时延,可以忽略。

然后最下面的直接接地的电容也不影响时延,下拉电路接通时直接接地了。

再把下拉电路中的几个寄生电容合并一下,就得到了右侧的最终简化图。

image-20250323143554523

然后计算 falling-edge 的时延如下(实际上,6C 和 3C 也可以合并):

image-20250323145646974

Interconnect/Wire model

理想情况下导线的时延当然可以忽略。但是实际上导线会有一定的时延,我们也可以将其视作 RC 电路:

image-20250323173951118

假设线长 L,单位长度的导线电阻 r,电容 c,近似可以求出时间常数:

导线的 RC model 分为两种:π型和 T 型,按照形状命名的。计算结果倒是都一样。

image-20250323174937150

例题:

image-20250323175047617

Adder 加法器

加法器是计算机中的一个重要部分。

Half Adder 半加器

下面是一个 half-adder 半加器。C 是进位。半加器用处不大,因为没有 Carry-in 就是来自低一位的进位,所以做不了太多运算。

image-20250323175302152

Full Adder 全加器

下面的结构是一个全加器 full-adder,结合前一位进位就可以进行更多运算了。

image-20250323175456192

逻辑公式:

Ripple Carry Adder 传播进位加法器

传播进位加法器 Ripple-Carry Adder:可以做多级运算。传播延迟很好计算,O(N) 时间复杂度,等于一个 sum 半加器的延迟加上 N-1 个进位加法器的延迟。

image-20250323180748862

下图是一个互补的加法器设计:

image-20250323191622656

用了28个晶体管。

Mirror Adder 镜像加法器

因为每一个加法器计算都要依赖进位,所以每一个加法器都要等到前一个计算完了再计算给出结果。

那么能不能重新定义一下加法器的参数来解决这个问题?下面是另一种方案:

image-20250323201622104

如果 Generate =1:直接生成进位。

如果 Propagate =1:说明两个输入中有一个是1,不足以判断是否生成进位,所以还需要前一位的进位来判断是否进位。如果前一位有进位,就进位;如果前一位没有进位,就不进位。也就是说 Propagate 状态下后一位进位应当和前一位状态一致。

如果 Delete =1:阻止进位传递。因为两个输入都为0,仅靠一个进位肯定不可能生成下一位的进位。

这三个电路负责快速判断是否需要进位;再加上一个 A⊕B 来计算 S 位,实现更快速的计算。

下面的就是应用了如上计算方法的优化版的:镜像加法器 Mirror Adder。

image-20250323192119155

以及我们也可以利用反转性质制作 adder:如果把所有输入都取反,也会得到完全取反的输出。

image-20250323193552012

下图是利用反转特性减少关键路径上的反相器,从而减少时延。

image-20250323194625997

sizing the mirror adder:我没太看懂,感觉是下图蓝色圈圈部分。待定。

image-20250323214504759

Carry-Bypass Adder 进位旁边加法器

通过之前解释过的加速关键路径进位方法,快速传递进位。

image-20250323220844016

首先把 N 个 bit 位分为几个块,每个块有 M 个 bits(课件里写的文字注释是说 N bits 分成 M 个块,我感觉这里写错了),比如下图,0-15位被分为4个块。每个块如果不需要依靠之前块的进位,就可以加速计算其和后面的部分。

set up 过程预先计算了 P G,剩下的就是等待传递或者杀死进位;

计算总延时中,tsetup 是初始化所需时间;tcarry 是首尾两个块 M-1 位进位传递时间;N/M-1 是中间块旁路计算的时间;tsum 是最后求和所需时间。

进位旁路加法器更适合 N 更大的情况,根据统计数据 N>=4.8 的时候选 Carry Bypass Adder 优于 Ripple Carry Adder.

image-20250323221312198

Carry-Select Adder

Linear Carry Select

对于这种设计,每个加法块都被分成两个部分:

  1. 假定进位输入为0的加法器
  2. 假定进位输入为1的加法器

也就是说,我们提前就把两种可能的进位输入情况穷举出来。然后,真正的进位输入确定好后,我们就从已经得到的结果中选择正确的结果。可以理解成一种分支预测。

【硬件算法笔记07】不同的高速加法器设计 - 知乎

下图中可以看出,当前一位进位输入时,我们直接挑出对应分支和前一位进位结果相乘就得到了该位 SC 结果。

image-20250323223500961

时间:

image-20250323224006730

Square Root Carry Select

上面的是 linear 的 carry select,这个是平方根式的,感觉就是分块方式不同。

image-20250323224028238

对比:

image-20250323224158843

Multiplier and Sequential Logic 乘法器,时序逻辑

Multiplier

做乘法的原理就是移位相加嘛。

image-20250323224408575

The Array Multiplier

电路结构如下。假设 Y 是乘数,X 是被乘数。首先拿出 X 的最低4位和 Y 的最低位 AND 运算得到被积数,被积数再等待与下一位被积数移位后作和运算,加法器会记录进位给下一位作 sum 运算。

image-20250323224914526

时间复杂度:

image-20250323225238188

Carry-Save Multiplier

这个计算方式比较慢的一个原因是最后一步我们才能得到所有位的计算结果。但是根据我们作乘法运算的经验,其实从最后一位开始我们得出低位结果后就可以直接忽略这一位的计算了,不需要把这一位再传递给下一波计算了。大致原理如下图:

(c) 版权所有 2016 Coert Vonk

使用逻辑门的 Carry-save 数组乘法器 - Coert Vonk

image-20250323230001895

其他逻辑电路

1’s and 0’s Detectors

检测电路是不是全0或者全1。

image-20250323230222092

Equality Comparator

检测所有位是不是都一样(XNOR)

image-20250323230318296

Sequential Logic 时序逻辑

开始引入时钟,或者状态存储等参数。

image-20250323230437874

时序电路的诞生主要有两个原因:

  1. 我们想知道什么时候输入状态“改变”了,比如上升下降沿。所以要存储旧输入信息与新输入作对比。
  2. 我们想知道电路是否过快或过慢,和其他电路配合。

锁存器:时钟信号为高电平时存储输入数据,低电平时保持原有数据。

寄存器:时钟信号上升沿的时候存储数据。

image-20250323230723466

有两种传播延迟:

  • C2Q:从时钟信号上升沿,到输出信号到稳定时的延迟。
  • D2Q:时钟 edge 信号发生后,数据被重新设置的延迟(CLK 设置之后,D 输入数据改变,Q 输出数据花多久才改变)。

下面这张图是寄存器的另外两个参数,set up and hold times:

tsu 是时钟信号改变前,数据输入信号维持稳定的最短时间。

thold 是时钟信号改变后,输入信号维持稳定的最短时间。

tc2q 就是时钟信号之后,输出信号稳定的时间。

image-20250323231158639

NMOS 实现

锁存器的两种结构原理图如下:

image-20250426122500975

左边的 MUX LATCH 当 CLK 是 low 的时候和 high 的时候,feedback loop 和数据输入源不会同时接通,no battling。

左边的电路设计得更好,因为右边电路会出现一系列问题。比如:race problem,数据输入和锁存环路里面的信号绕圈赛跑。

image-20250426171446744

所以下面的锁存器和寄存器设计基本都是左图这种,存储和数据输入回路不会同时接通的设计原则。

Negative Latch:时钟信号低时读取输入,高时输出存储数据。

Positive Latch 相反。

Master-Slave Register:利用两个锁存器实现的寄存器效果。

image-20250426143110358

CLK 输入1:主触发器未触发,输入信号无法传输到 QM. 但是从触发器触发,Q 会读取 QM 值进行输出。

CLK 输入0:主触发器触发,QM=D。从触发器不触发。

CLK 输入0-1的上升沿瞬间:主触发器关闭,从触发器打开,输出信号=QM=主触发器关闭前的输入信号 D。也就是在时钟信号上升沿的瞬间输出会更新为输入信号的寄存器效果。

需要注意的是时钟信号的反相器时延不能太长,不然会出现更多的 CLK Overlap 现象,可能就不只是时钟信号上升沿会输出 D 值了。

Settle Up Time 和 C2Q 的关系:

image-20250426162622253

减少 D 数据输入提前启动的时间反而会让 CLK 上升沿后输出稳定变得更慢,甚至如果太小以至于小于 tsu,输出无法达到稳定。

上图中下部分是 set up 时间减小和 hold 时间减小对 C2Q 的影响:都会使其增大。

C2MOS 实现

image-20250426164632544

利用中间的电容存储数据。只要上升下降沿足够小,重叠就不敏感。

image-20250426170457861

TSPC 实现

image-20250426170532786

Pulse-Triggered Latches

将上升下降沿转化为很小的一段高电平或者低电平脉冲。

image-20250426170704533

image-20250426170715514

既然用这样的小宽度脉冲作为时钟信号,那为什么不直接保留这个处理后的小脉冲信号传播到电路其他地方,而是要用的时候才在锁存器之前处理一下时钟信号?因为这种窄脉冲没法传播太远,会严重变形。

image-20250426171143150

Timing, Clock Generation

Timing

image-20250426233727393

image-20250426234323104

Clock Generation - Ring Oscillator

串联多个反相器实现振荡器效果。

偶数个反相器可以吗?不可以因为类似锁存器回路,最终电路会达到一个稳定状态。所以需要奇数个。

VDD 增加,反相器延迟减小,振荡频率减小(和 VDD 成反比)。

而且振荡器具有 Supply sensitivity 电源敏感性,比如 VDD 受到噪声影响会直接在电路输出频率中体现出来。

功耗计算:如果每个反相器的负载电容是 CL,平均功率近似计算公式:

N 极环振荡器可以产生 N 个不同的相位,相位最小间隔是 π/N 弧度或者 tp

秒。tp 是一个反相器的传播延时。

振荡周期 T=2Ntp,乘2应该是因为包含一次0一次1两圈。

PhaseNoise

如下图,假设 ∅(t) 部分是随机电源噪声,右边图片大致呈现出频率受到的影响:能量从主峰分散开来。

image-20250427001919530

spilling some of the signals’ energy to vicinity of the impulse

一般用功率谱密度 Spectrum 衡量单位赫兹频率范围内的功率。

好的振荡器应当是随着 |f-f0| 增加(也就是波形往左右两边走)功率谱密度降低(也就是波形纵轴值接近0)。比如,900MHz GSM transmitter requires PN<-145dBc/Hz@25MHz offset.

作用于环振荡器:PN 正比于 N.

Jitter 抖动

抖动指的是时域上的噪声衡量。主要分为三种:

  • deterministic jitter 确定性抖动,由周期调制引起 periodic modulation。可以看出下图,这种抖动的频率固定。
  • absolute jitter 绝对抖动,由白噪声引起。白噪声好像指的是功率谱密度是常数的噪声,图像呈现的话好像是一条水平直线。GPT 的解释是:白噪声的功率谱密度在任何等带宽范围内都相等都是常数,这就好像你在走路的时候每一步都被同样的力推了一把,最终累积出来的行走轨迹和没有受到干扰的轨迹偏离了很远。所以图像上呈现出在 0 频率附近功率谱密度上升到无穷大。
  • cycle-to-cycle 周期到周期抖动,只观察当前周期和上一个周期之间的频率差距。所以这种抖动不是发散的而是有限的。

image-20250427003152350

Skew 时钟偏移

Skew 是除了 PN 之外的另一个不确定因素。即由导线长度,电阻,门电路负载等等……引起的时延。

tsk=deterministic + random 确定和不确定两部分。

image-20250427004105613

一种解决方案:H tree 构造。

image-20250427004138001

Contact Me
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2022-2025 Jingqing3948

星光不问,梦终有回

LinkedIn
公众号