本文基于《破解数字VLSI验证面试》翻译计划——综述展开翻译的!
理解数字逻辑设计的基本原理是执行VLSI行业任何工作的基本技能。因此,无论面试是针对ASIC设计工作、验证工作还是任何后端设计或布局工作,测试逻辑设计技能的问题都是面试的重要部分。因此,这是在超大规模集成电路(VLSI)工业中获得工作的最基本和最重要的课题。本节列出了访谈中最常见的一些问题,并给出了答案和概念的详细解释。一旦你通过这些问题掌握了这些概念,同样的概念和逻辑方法也可以用于相关的问题。
数字系统是数字系统中传递和量化信息的基础。本节包括与十进制、二进制、八进制和十六进制(hex)等常用数制有关的问题,不同数制中的算术运算,不同表示法之间的转换等。
a) 17 b) -17
十进制数由十进制数字(0到9)组成,二进制数由二进制数字(0,1)组成,八进制数由八进制数字(0到7)组成,十六进制数由16位数字(0到9,A,B,C,D,E和F)组成。十进制数字可以通过以下三个简单步骤转换为任何其他基:
使用上述步骤,我们将得到十进制数17的二进制值10001、八进制值21和十六进制值0x11。
十进制数-17表示为:二进制=101111,八进制=57,十六进制=0x2f
0x3A=[0xA·160]+[0x3·161]=[10·1+3·16]=58
格雷码是一种二进制数系统,其中两个连续值只有一位不同。它也被称为反射二进制代码
在二进制代码中,两个值之间的转换可能会在两个以上的位上进行转换,如果不同的位需要不同的时间进行转换,这有时会导致歧义。例如:在二进制(011到100)中从3转换到4需要切换所有位。这可能导致一些中间值,如果说三位有不同的切换时间。
而在格雷码中,由于每次只有一个比特发生变化,因此不可能出现这种模糊。
使用格雷码的另一个优点是:由于格雷码切换的比特位较少,使用格雷码的设计将比使用二进制代码的设计消耗更少的能量。
奇偶校验位是加在二进制代码字符串末尾的位,它表示字符串中值为“1”的位数是偶数还是奇数。因此,奇偶校验码有两种变体-偶数奇偶校验和奇数奇偶校验。
为了计算奇偶校验位,计算二进制代码中具有值“1”的位的总数。如果“1”的数目是奇数,如果我们使用偶数奇偶校验,那么奇偶校验位被设置为1,这样包括奇偶校验位在内的“1”的总数就变成偶数。如果“1”的数目是奇数,并且如果我们使用奇数奇偶校验,那么奇偶校验位被设置为0,这样包括奇偶校验位在内的“1”的总数计数为奇数。
奇偶校验位是通过取二进制字符串中所有位的异或来计算的。奇偶校验位是检错码的最简单形式。
给定的二进制字符串:111001,有四个“1”。使用奇偶校验,二进制字符串中1的总数(包括奇偶校验位)必须是奇数。
因此,该字符串的奇偶校验位将为1。
If all bits in a binary number are inverted by changing each 1 to 0 and each 0 to 1, the resulting binary number is called the 1’s complement.
For example: The one’s complement of a binary number 110010 is 001101
The 2’s complement of a binary number is obtained by adding a 1 to the one’s complement of the number.
For example: The two’s complement of a binary number 110010 is 001101+1
The two’s complement of a number is used to represent signed binary numbers. It is also used for subtraction of binary numbers. The one’s complement is an intermediate step to get to two’s complement.
BCD是二进制编码的十进制,是一种四位二进制代码,可用于表示任何十进制数字(从0到9)。二进制代码是十进制数的二进制表示,二进制代码所需的位数取决于十进制数。对于十进制数字0到9,BCD和二进制代码都是相同的。
数字27可以用BCD表示,2和7都使用四位代码。
因此,27的BCD将是0010 0111,而27的二进制代码将是11011
BCD、Gray、EBCDIC code、ASCII code、Alphanumeric code
Alphanumeric code(字母数字代码)是字母和数字字符的组合,可用于表示数字以及字符/特殊字符
AND(与)、NAND(与非)、OR(或)、NOR(或非)、XOR(异或)
通用门是可以实现任何布尔函数而不需要使用任何其他门类型的门。
与非门和或非门是通用门。
如果A和B是与非门的两个输入端,那么与非门的输出方程是,Y=(A.B)’
NOR门用以下等式描述:Y=(A+B)’。
多路复用器是一种组合逻辑,可以使用选择线将两个输入多路复用到单个输出通道上。一个2:1的多路复用器将有一个单一的选择输入,并根据值(0或1),它将驱动输出与任何一个输入。
NOR门可以通过从上面使用OR门和NOT门的组合来实现
NAND门可以通过从上面使用AND门和NOT门的组合来实现
异或门用于奇偶校验、CRC和ECC等检错码的计算。它也用于伪随机数发生器。
只有当所有输入都为1时,与非门才能获得零输出。所以,d)是正确的答案。
用方程Y=AB’+A’B描述异或门。如果其中一个输入与1相连,如下图所示,那么我们得到:Y=A.1’+A’.1=0+A’=A’,这是非门或反相器。
传递门或缓冲区将输入按原样传递到输出。如果A是输入,Y是输出,这可以用Y=A来表示。因此,这可以使用异或门来实现,通过连接一个始终为零的输入,如下所示:Y=0·A’+0’·A。A=0+1·A=A
a)或门
b)与门
c)非门
d)异或门
a)或门:如果或门的一个输入是x,那么输出取决于另一个输入。如果其他输入为1,则“或”门的输出为1,对于任何其他值,输出为x。
b)与门:如果与门的一个输入是x,那么输出取决于另一个输入。如果其他输入为零,则与门的输出为零,对于任何其他值,输出为x。
c)非门:如果非门的输入为x,则输出也为x。
d)异或门:如果异或门的输入之一是x,那么输出也将是x。
让我们把S0和S1作为两个开关。如果已经有一个开关关闭(0),那么将另一个开关更改为1将给出ON=1。如果已经有一个开关处于ON(1)位置,则将另一个开关更改为1应关闭灯泡(off=1)。
S0 第0页 | S1 | ON | OFF | |
---|---|---|---|---|
0 | 0 | 0 | 1 | |
0 | 1 | 1 | 0 | (S0 was off, S1=1 causes bulb to turn on) |
1 | 0 | 1 | 0 | (S1 was off, S0=1 causes bulb to turn on) |
1 | 1 | 0 | 1 | (either S0/S1 was on and changing other switch to 1causes bulb to be off) |
因此,灯泡的开启行为类似于异或门。
组合电路:在任何时刻的输出只取决于当前时刻的输入的电路称为组合电路。 因此,这些电路不包含任何存储器元件。组合电路的一些例子有半加器、全加器、多路复用器、解码器等。
时序电路:任何时刻的输出既取决于当前时刻的输入,又取决于过去时刻的输出值的电路称为时序电路。因此,这些电路具有某种形式的记忆元件来记忆过去的值。时序电路的一些例子有触发器、寄存器、计数器等。
一个n对1的多路复用器,简称MUX,是一个设备,它允许您选择n个输入之一,并直接将其输出到一个单一的。
解复用器(简称DeMUX)基本上是输入和输出相反的多路复用器。对于1到n的解复用器,您有一个输入,可以选择n个输出来定向输入。
【思考】这不就是编码器与译码器吗?
可以使用2:1多路复用器设计4:1多路复用器,如下所示。下面是4:1多路复用器的真值表(S1、S0是选择线,I0-I3是4条输入线,Y是输出)。
所以你可以看到,S1可以用来选择一半的输入,在每一半中,S0可以用来选择其中两个输入中的一半。
module mux2_1(
input I0,
input I1,
input S0,
output Y
);
assign Y = S0 ? I1 : I0;
endmodule
module mux4_1(
input I0,
input I1,
input I2,
input I3,
input S0,
input S1,
output Y
);
wire Y0,Y1;
mux2_1 mux2_1_inst1(
.I0(I0),
.I1(I1),
.S0(S0),
.Y(Y0)
);
mux2_1 mux2_1_inst2(
.I0(I2),
.I1(I3),
.S0(S0),
.Y(Y1)
);
assign Y = S1 ? Y1 : Y0;
endmodule
module mux2_1(
input I0,
input I1,
input S0,
output Y
);
assign Y = S0 ? I1 : I0;
endmodule
正如我们在前面的问题中所看到的,4:1 MUX可以使用三个2:1 MUX来实现。这包括一个用于选择两半输入的MUX和两个用于在每一半输入的两个输入之间进行选择的MUX。
如果我们将这个概念扩展到8:1 MUX,我们将需要一个2:1 MUX在两个半部分(每个4个输入)之间进行选择,然后我们将需要两个4:1 MUX(每个需要三个2:1 MUX)。
因此,对于“2n:1”MUX,我们需要一个2:1 MUX和两个“n:1”MUX。如果我们对n:1mux应用相同的逻辑,进一步,我们将得到以下方程,这是一个几何级数。
所需的MUX总数=1+2+4+8+……+2(n-1)=2n-1
解码器是将给定数量的输入信号解码为给定数量的输出信号的组合电路。
例如:3到8解码器将3位输入信号解码为8位输出信号,如下所示
000=>输出0
001=>输出1
010=>输出2
011=>输出3
100=>输出4
101=>输出5
110=>输出6
111=>输出7
编码器是一个组合电路,它的工作方式正好相反。它接受给定数量的n个输入,并将它们编码为较小数量的输出
例如:一个8到3的编码器可以完全反转上述3到8的解码器。可以有8个输入,每个输入都可以编码成3位二进制输出。
编码器与多路复用器类似,区别在于多路复用器只有一个输出,其中n个输入被多路复用,而编码器通常有2n个输入(或更少)和n个输出。
A simple encoder is a circuit that converts a 2n bit one-hot vector to an n-bit output.
For example: a 4 to 2 simple encoder encodes as per following table. The simple encoder expects the inputs to be one hot and if more than one input is high, then the outputs becomes X.
A priority encoder on the other hand encodes inputs with more than one bit being high using a priority. For example: a 4 to 2 priority encoder will encode a 4 bit input and if more than one bit is high, the MSB takes priority. Hence, it can be represented as table shown below.
环形振荡器是一种由奇数个非门组成的器件,其输出在两个电压电平之间振荡,表示真与假。非门或反相器连接在一个链中,最后一个反相器的输出反馈给第一个反相器。
如果三个非门连接在一个链中,那么从输入到输出的值需要三倍的反相器延迟。因此,两次转换需要6倍的反相器延迟。因此,时钟频率将为1/[6x(反相器延迟)]。对于我们目前的情况,时钟频率将为=1/(6x2)THz=1000/12 GHz=83.33 GHz。
时序电路可以有两种类型:同步电路和异步电路
同步时序电路在离散的时刻改变它们的状态和输出值,这些时刻由时钟信号的上升沿(从0到1的转换)或下降沿(从1到0的转换)来指定。一个简单的例子是一个触发器,它存储一个二进制值,并且可以根据输入值在时钟边缘改变。
在异步时序电路中,从一种状态到另一种状态的转换是由主输入的变化引起的,而不需要像时钟边缘那样的任何外部同步。它可以看作是带反馈环的组合电路。由于逻辑门之间的反馈,异步时序电路有时会由于瞬态条件而变得不稳定,因此不常用。一个简单的例子:RS Latch。
建立时间是时钟进行有效转换之前,数据信号稳定的最短时间。
保持时间是时钟进行有效转换之后,数据信号稳定的最小时间。
在相互作用的任意两个触发器上,时钟信号到达时间的差异称为时钟偏斜
例如,在上图中,来自第一触发器的D输入通过组合数据路径电路传播到第二触发器。来自一个公共源(SYSCK)的时钟被路由到两个触发器,但是由于布线或路由延迟,当两个触发器的边缘被看到时,可能会有一个小的差异。这个时间的差异被称为时钟偏斜。
时钟偏差只在两个触发器之间重要,其中一个触发器输出由第二个触发器采样。
为了使该时序电路正确工作,第一个触发器的输出应通过组合数据路径传播,并且应在下一个时钟边缘之前,在与第二个触发器的建立时间相等的最小持续时间内保持稳定。
如果TCLKA是时钟周期,TCQ是时钟到输出的延迟,TPD是数据路径的传播延迟,TSET是触发器的建立时间,那么我们得到这个条件TCLKA≥TCQ+TPD+TSET
因此,本例中的时钟周期需要>=10+10+5=25ns,并且最大频率将为1/25ns=40MHz。
锁存器和触发器是存储信息的基本元件。一个锁存器或触发器可以存储一位信息。
锁存器和触发器之间的主要区别在于,对于锁存器,只要使能信号被断言,它们的输出就会不断地受到输入的影响。换句话说,当使能信号高时,当输入改变时锁存器的内容立即改变。
另一方面,触发器只在使能信号(通常是时钟信号)的上升沿或下降沿改变内容。在时钟的上升或下降沿之后,即使输入发生变化,触发器内容也保持不变。
当输出对不同事件的相对顺序或计时具有意外的依赖性时,将发生竞争条件。关于数字电子和SystemVerilog,竞争条件可分为两类:
硬件引起的竞争(Hardware race condition)
仿真引起的竞争(Simulation Induced race condition)
硬件竞争条件:如果我们看下面的SR锁存器(基于与非门),如果两个输入都是1(S=1和R=1),Q和Q’都会变成1,然后反馈到与非门。现在,如果S和R都立即变为0,Q和Q’都将进入竞争条件(值将开始振荡:1到0,0到1,1到0,依此类推…)。
通过适当的设计技术可以避免硬件竞争情况。示例:在SR锁存的情况下,我们可以通过如下所示的使能/控制信号来避免竞争条件:
always @(posedge clk or posedge reset)
if (reset) X1 = 0; // reset
else X1 = X2;
always @(posedge clk or posedge reset)
if (reset) X2 = 1; // reset
else X2 = X1;
SystemVerilog仿真器不保证多个always块之间的任何执行顺序。在上面的例子中,由于我们使用的是阻塞赋值,因此可能存在竞争条件,并且我们可以在多个不同的模拟中看到X1和X2的不同值。这是竞争的一个典型例子。如果第一个always块在第二个always块之前执行,我们将看到X1和X2为1。如果第二个always块在第一个always块之前执行,我们将看到X1和X2都为零。
有许多编码准则,遵循这些准则我们可以避免模拟引起的竞争条件。例如:这种特殊的竞争条件可以通过使用非阻塞分配而不是阻塞分配来避免。
让我们以下降沿触发D触发器为例。下降沿触发D触发器只在下降沿将输入(D)传输到输出。在所有其他时间,输出没有变化(Q保留其值)。要使用2:1 MUX实现此功能,我们需要两个2:1 MUX,如下图所示。
这里,一个MUX的选择线是CLK信号,另一个MUX的选择线CLK’信号(反向CLK)。现在,当CLK为1时,第一MUX的选择线(左侧的一个)选择D(连接到i1),并且D因此被传送到第一MUX的输出(该输出进一步被反馈到第一MUX并且也连接到第二MUX的i1)。因为,当CLK为1时,CLK’为0,所以D不传输到Q(因为第二个MUX选择了i0)。因此,直到CLK保持为1为止,D中的任何变化都反映在第一MUX的输出上,但是不反映在第二MUX的输出上,因为为第二MUX选择了i0(这只是Q,因为Q连接到第二MUX的i0)。现在,当CLK从1转换到0时,不再选择D(对于第一个MUX,i0是活动的),并且在时钟的负边缘转换到输出Q之前出现的D的值。
T触发器,T为0时输出不变,1时翻转。写出真值表就能看出来,将输入和Q异或再输入到D端。
为了将任何触发器(比如说D触发器)转换成任何其他触发器(比如说T触发器),写下目标触发器行为(在这种情况下是T触发器)的激励表,并实现一个执行以下操作的组合逻辑:
将T触发器的输入转换为D触发器的正确输入,使其共同起到T触发器的作用。下图说明了这一点。
下表包括T触发器的激励表(以下前3列),最后一列显示输出Qn变为Qn+1所需的D值。
在上表中,我们使用K-映射将D实现为T、Q(n)和Q(n+1)的函数。这将给我们:D=T.Qn’+T’.Qn,这是一个异或门。
遵循上述问题中描述的原则,我们确定转换所需的组合逻辑。答案是:J=D和K=D’
计数器是一种按循环顺序计数的时序电路,循环顺序可以是递增计数,也可以是递减计数。计数器是使用一系列触发器和组合逻辑实现的,这些逻辑将一个触发器的输出反馈给另一个触发器。有两种类型的计数器-同步和异步。
在同步计数器中,所有触发器的时钟输入都连接到一个公共时钟信号,因此所有触发器都是同步变化的。
在异步计数器中,时钟输入只连接到第一个触发器,第一个触发器的输出连接到第二个触发器的时钟输入,类似地,其他每个触发器都由前一个触发器的输出进行时钟计时。
同步计数器的一些例子是环形计数器和约翰逊计数器,而异步计数器的一些例子是升降计数器。
事实上,在以下两种情况中,Ci=1:
其对应的表达式为
递归后
可以看出每一级的进位信号可以不通过上一级的结果产生,只与输入有关系。因此减少了时间。
(2N+1)门
为了更好地理解这一点,请考虑1位和2位行波进位加法器。对于1位行波进位加法器,最长路径有3个门。
对于2位行波进位加法器,最长路径有5个门。
同步复位:在时钟边缘采样时复位。当复位是同步的。此时,复位信号就像任何其他输入信号,在时钟沿采样。
异步复位:没有时钟也可以进行复位,此时,复位信号具有最高优先级,可以随时发生。
每个触发器可以保存一位信息。因此,要实现32位寄存器,我们需要32个触发器。
Mealy机是一种有限状态机,其输出既依赖于当前状态,也依赖于当前输入。
Moore机是一种有限状态机,其输出仅依赖于当前状态。
激励表显示了当前状态已知时生成下一状态所需的最小输入。例如:下面是D、T和JK触发器的激励表。当前状态由Q(t)标识,而下一个状态为Q(t+1)。
取决于使用场景。
JK触发器可以导致一个更简单的电路,因为有许多不关心的值,触发器的输入,以实现下一个状态从目前的状态。
D触发器的优点是我们根本不需要设置触发器输入,因为D触发器的下一个状态等于输入。
在实践中,D触发器的使用更为频繁,因为:
2)每个触发器只有一个输入(与JK相比不是两个)
3)与JK相比,D触发器更易于实现。
构造一个状态图和一个状态表,
将二进制代码分配给所有定义的状态,
使用当前状态、下一个状态和触发器激励表找出正确的触发器输入值,可以帮助从当前状态和输入中获得下一个状态,
为触发器输入和输出编写方程(使用电路最小化技术(如K图)简化方程),
建造电路。
每个触发器可以存储一位信息。因此,一个触发器可用于实现要求最多2个状态的同步电路,两个触发器用于要求最多4个状态的同步电路,三个触发器用于要求最多8个状态的同步电路,四个触发器用于要求最多16个状态的同步电路。因此,对于具有9个状态的同步电路,我们必须使用4个触发器。
专用集成电路(ASIC)是为特定应用而设计的组件,由特定公司在特定系统中使用,或出售给单个公司用于特定用途。例如:为非常特定的系统设计的特定24x24 10G交换机特定于应用的标准产品(ASSP)是一种更通用的设备,它是使用ASIC工具和技术创建的,但打算由多家公司在更广阔的市场上为不同的系统使用。例如:音频/视频编码器/解码器芯片,也用于特定应用,但目标市场更广。
片上系统(SoC)是集成整个子系统的芯片,包括微处理器或微控制器、存储器、外围设备、自定义逻辑等。
ASIC或ASSP可以是SOC,也可以是基于芯片中存在的不同设计元素的非SOC。
下面的框图描述了ASIC、FPGA或SOC设计的典型设计流程。
冲冲冲!