这是实验室师兄面试过程中整理的面试和笔试题目,目前只有题目,后续随着提前批和春招的进行,会慢慢填坑,也会把一些博主的题目搬运过来。
基本:笔试面试常出现,需弄透
基本逻辑运算、仅用与非或仅用与或非、最小项之和、最大项之积、卡诺图化简、逻辑门的mos管组成,笔试常出现
setup、hold time分析,需深入理解,而不是简单会计算,笔试甚至可能出几道问答题
FSM(二段三段式),百度面试中问过
CDC(快到慢及慢到快): 两级触发器,FIFO(同步异步),握手,笔试会考,面试基本都会问,问得很深,需彻底弄懂,要能写出代码
串并转换
分频电路(奇数分频,偶数分频),非常基础,华为面试中出现过,不会基本直接挂
乒乓buffer
超前进位加法器
booth乘法器
Wallace树,比特大陆笔试题
异步复位同步释放电路,OPPO面试中问过,问得比较深
脉冲同步器
序列检测,华为面试中问过
毛刺的成因(竞争冒险)、无毛刺时钟切换,OPPO面试中问过
verilog代码与综合后的电路的对应关系(例如if-else语句综合后电路,要能画出来),英伟达笔试题
被数整除,除法器,百度面试中问过
数字IC设计基本步骤,各个步骤常用软件,OPPO面试问过
加分:面试中偶尔问到
体系结构:五级流水、旁路、分支预测、cache,阿里、寒武纪面试问过
总线:AMBA2.0/4.0 AHB/AXI/AXI Stream(ARM spec),OPPO面试问过
验证方法学:UVM ,验证环境搭建,组成部分,OPPO面试问过
各类协议:DDR、PCIE、SPI、IIC
低功耗设计方法学、RISC等,常见低功耗设计方法需要知道,我记得面试问过,搞忘哪家了
自己要掌握的一些能力
DFT:可测性设计,插入用于测试的硬件逻辑,提高芯片的可测性。主要包括内部扫描、内建测试和边界扫描三种。
形式验证:保证综合后的网表功能与RTL一致,或者网表与版图的一致。静态验证的一种。
时序约束和分析:通过计算各通路的延迟,确保setup、hold、skew、clockfrequency等指标符合要求,并优化面积、功耗性能。包括STA静态时序分析DTA动态时序分析。
工具:
- 时序分析:PrimeTime
- Verilog/SystemVerilog编译仿真:VCS+Verdi/
- 形式验证 formality
- 综合工具:DC
- 各种工具的自动化:TCL脚本
- Linux自动化:SHELL/Python脚本
- 编译过程自动化:Makefile
- 文本处理等:Python/Perl
参考链接
什么是冒险,什么是竞争,怎么消除
信号由于经由不同路径传输达到某一汇合点的时间有,先有后的现象,就称之为竞争。
同一线被不同值驱动称为冒险。
由于竞争现象所引起的电路输出发生瞬间错误的现象,就称之为竞争冒险。
FPGA设计中最简单的避免方法是尽量使用时序逻辑同步输入输出。
另外:加滤波电容,消除毛刺的影响
系统最高速度计算(最快时钟频率)和流水线设计思想
同步电路的速度是指同步系统时钟的速度,同步时钟愈快,电路处理数据的时间间隔越短,电路在单位时间内处理的数据量就愈大。假设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个时钟周期实现,因此系统的工作速度可以加快,吞吐量加大。注意,流水线设计会在原数据通路上加入延时,另外硬件面积也会稍有增加。
impulse 和 pulse脉冲(前者为冲击响应,后者为脉冲响应)
逻辑表达式的化简
最小周期的计算(最大的主频)这里去要注意Tclk-q也被称为clock output delay,被叫做Tco
奇偶校验在硬件上该怎么搞(异或就可以了)
门电路的与非门、或非门、二选器转化
什么是open-drain output?
Open-Drain Output漏极开路输出,称为OD门,两个OD门并联可以实现线与功能,输出端外接的上拉电阻提高驱动能力
锁存器(latch)和触发器(flip-flop)区别:
电平敏感的存储器件称为锁存器。可分为高电平锁存器和低电平锁存器,用于不同时钟之间的信号同步。
有交叉耦合的门构成的双稳态的存储原件称为触发器。分为上升沿触发和下降沿触发。可以认为是两个不同电平敏感的锁存器串连而成。前一个锁存器决定了触发器的建立时间,后一个锁存器则决定了保持时间。
IC设计过程中将寄生效应的怎样反馈影响设计师的设计方案
所谓寄生效应就是那些溜进你的PCB并在电路中大施破坏、令人头痛、原因不明的小故障。它们就是渗入高速电路中隐藏的寄生电容和寄生电感。其中包括由封装引脚和印制线过长形成的寄生电感;焊盘到地、焊盘到电源平面和焊盘到印制线之间形成的寄生电容;通孔之间的相互影响,以及许多其它可能的寄生效应。
理想状态下,导线是没有电阻,电容和电感的。而在实际中,导线用到了金属铜,它有一定的电阻率,如果导线足够长,积累的电阻也相当可观。两条平行的导线,如果互相之间有电压差异,就相当于形成了一个平行板电容器(你想象一下)。通电的导线周围会形成磁场(特别是电流变化时),磁场会产生感生电场,会对电子的移动产生影响,可以说每条实际的导线包括元器件的管脚都会产生感生电动势,这也就是寄生电感。
在直流或者低频情况下,这种寄生效应看不太出来。而在交流特别是高频交流条件下,影响就非常巨大了。根据复阻抗公式,电容、电感会在交流情况下会对电流的移动产生巨大阻碍,也就可以折算成阻抗。这种寄生效应很难克服,也难摸到。只能通过优化线路,尽量使用管脚短的SMT元器件来减少其影响,要完全消除是不可能的。
你知道那些常用逻辑电平?TTL与COMS电平可以直接互连吗?
常用逻辑电平:TTL、CMOS、LVTTL、LVCMOS、ECL(Emitter Coupled Logic)、PECL(Pseudo/Positive Emitter Coupled Logic)、LVDS(Low Voltage Differential Signaling)、GTL(Gunning Transceiver Logic)、BTL(Backplane Transceiver Logic)、ETL(enhanced transceiver logic)、GTLP(Gunning Transceiver Logic Plus);RS232、RS422、RS485(12V,5V,3.3V);
也有一种答案是:常用逻辑电平:12V,5V,3.3V。
TTL和CMOS 不可以直接互连,由于TTL是在0.3-3.6V之间,而CMOS则是有在12V的有在5V的。CMOS输出接到TTL是可以直接互连。TTL接到 CMOS需要在输出端口加一上拉电阻接到5V或者12V。
用CMOS可直接驱动TTL;加上拉电阻后,TTL可驱动CMOS.
高阻态的意义和用法
什么是"线与"逻辑,要实现它,在硬件特性上有什么具体要求?
线与逻辑是两个输出信号相连可以实现与的功能。在硬件上,要用oc门来实现,由于不用oc门可能使灌电流过大,而烧坏逻辑门. 同时在输出端口应加一个上拉电阻。oc门就是集电极开路门。od门是漏极开路门。
mealy机和Moore机的区别
用CMOS搭建逻辑门(注意可以只用与非门or或非门or二选来搭建任意的门电路)
CMOS反相器的功耗(注意背一下静态功耗,是扩山区和衬底之间的反向偏执电流引起的)
反相器的翻转时间(也叫transition time)和传播时间(propagation time)
基本逻辑运算
~(a ^ b) = (a & b) | (~a & ~b);
a ^ b = (~a & b) | (a & ~b)
格雷码与独热码
格雷码:相邻之间只变1bit,编码密度高。功耗低;可用于CDC。状态机中可节省状态寄存器,适合写适合写条件不复杂但是状态多的状态机。;
独热码:任何状态只有1bit为1,其余皆为0,编码密度低。但译码方便,节省组合逻辑;稳定性强,任意1bit错误都不会产生毛刺,适合写条件复杂但是状态少的状态机;
(对于FPGA,可用资源数固定,资源足够就用独热码)
assign graydata = (bindata >> 1) ^ bindata;
保留格雷码的最高位作为自然二进制码的最高位,二进制码的次高位为格雷码的次高位与二进 制码的(次高位+1)进行异或,其余各位采用类似的方法。代码如下:
assign {bindata[7],bindata[6:0]}={graydata[7],bindata[7:1]^bindata[6:0]}
localparam | parameter | define | |
---|---|---|---|
作用域 | 当前module | 当前module | 整个工程 |
参数传递 | 不可以 | 可 | 可 |
重定义 | 不可以 | defparameter | undef失效 |
注释:parameter如果在模块内部定义时视为localparam,无法进行参数传递,在模块名后写可以传递可以defparameter.
task | founction | |
---|---|---|
定义 | 任务不能出现always语句;可以包含延时控制语句(#),事件控制@等,但只能面向仿真,不能综合(可综合的任务只能实现组合逻辑) | 函数定义不能包含任何的时间控制语句,即#、@或者wait |
包含 | task可以包含其它的task和function。 | function不能包含task |
输入 | task可以没有或者有多个任意类型的变量 | function至少有一个输入变量 |
返回 | task则不返回值,也可以通过输出端口或双向端口返回一个或多个值 | function返回一个值,在函数的定义中,必须有一条赋值语句给函数中的一个内部变量赋以函数的结果值,该内部变量与函数具有相同的名字 |
调用 | 任务调用语句可以作为一条完整的语句出现 | 函数调用语句不能单独作为一条语句出现,只能作为赋值语句的右端操作数 |
连续赋值assign与always过程赋值
在连续赋值语句中,表达式右侧的计算结果可以立即更新表达式的左侧。在理解上,相当于一个组合逻辑之后直接连了一条线,这个逻辑对应于表达式的右侧,而这条线就对应于wire。
在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量可以声明成reg类型。根据触发条件的不同,过程赋值语句可以建模不同的硬件结构:如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。
wire和reg类型的区别
系统函数
$clog2
返回2为底的向上取整的对数,用于计算位宽。$signed
和$unsigned
。$signed(c)
是一个function,将无符号数c转化为有符号数返回,不改变c的类型和内容。接上述代码历程:$unsigned
同理。顺序块和并行块
跨时钟域处理方法总结–最终详尽版
同步电路和异步电路的区别:
sky课件
对于多位的异步信号如何进行同步?
亚稳态的定义是什么;
时序逻辑在跳变时,由于异步信号、跨时钟域等原因,不满足setup或hold条件,输出在0和1之间产生振荡。
什么是亚稳态,产生的原因,怎么消除(触发器无法在某个规定时间段内达到一个确定的状态)
为什么两级触发器可以防止亚稳态传播? (打两拍)
使用两级触发器来使异步电路同步化的电路其实叫做“一位同步器”,他只能用来对一位异步信号进行同步。两级触发器可防止亚稳态传播的原理:假设第一级触发器的输入不满足其建立保持时间,它在第一个脉冲沿到来后输出的数据就为亚稳态,那么在下一个脉冲沿到来之前,其输出的亚稳态数据在一段恢复时间后必须稳定下来,而且稳定的数据必须满足第二级触发器的建立时间,如果都满足了,在下一个脉冲沿到来时,第二级触发器将不会出现亚稳态,因为其输入端的数据满足其建立保持时间。同步器有效的条件:第一级触发器进入亚稳态后的恢复时间 + 第二级触发器的建立时间 < = 时钟周期。
更确切地说,输入脉冲宽度必须大于同步时钟周期与第一级触发器所需的保持时间之和。最保险的脉冲宽度是两倍同步时钟周期。 所以,这样的同步电路对于从较慢的时钟域来的异步信号进入较快的时钟域比较有效,对于进入一个较慢的时钟域,则没有作用 。
MTBF(平均失效间隔时间)的概念;
触发器进入亚稳态的时间可以用参数 MTBF(mean time between failures)来描述, MTBF即触发器采样失败的时间间隔,其公式描述如下:
M T B F = e t r / τ / T 0 f a MTBF=e^{{tr}/{τ}} /T_0fa MTBF=etr/τ/T0fa
其中
同步电路与异步电路的比较;
两级DFF同步器的原理和代码,以及输入窄脉冲情况下的变化;
握手协议进行同步的原理和代码,并与方法4)在资源、速度、适用情况等方面进行比较;
异步FIFO里为什么要用格雷码?
参考链接
异步FIFO的原理和代码,包括为什么需要同步读写指针,为什么要用格雷码,满空状态如何判断,为什么会有假满假空现象以及会对系统产生什么影响,FIFO深度如何选择等等;
异步复位同步释放的原理和代码,以及比较异步复位和同步复位的优缺点;
参考链接
解决亚稳态
这里有一篇关于写复位的文章,建议读一下:
FPGA-xilinx系列芯片的复位,你真的明白吗?
同步复位的优点大概有3条:
a、有利于仿真器的仿真。
b、有利于时序分析,而且综合出来的fmax一般较高。
c、只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。
缺点主要有以下几条:
a、复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk skew,组合逻辑路径延时,复位延时等因素。
b、FPGA内寄存器中支持异步复位专用的端口CLR,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。
对于异步复位来说,他的优点也有三条:
a、大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源。
b、设计相对简单。
c、异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。
缺点:
a、在复位信号释放(release)的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。
b、复位信号容易受到毛刺的影响。
异步复位同步释放电路
同步复位和异步复位都不可靠,将两者结合,取长补短,既解决了同步复位的资源消耗问题,也解决了异步复位的亚稳态问题。其根本思想,也是将异步信号同步化。
always @ (posedge clk)
rst_n <= a_rst_n; //关键:异步复位信号用同步时钟打一拍(也可以多拍)
always @ (posedge clk or negedge rst_n)
if(!rst_n) b <= 1'b0;
else b <= a;
always @ (posedge clk or negedge rst_n)
if(!rst_n) c <= 1'b0;
else c <= b;
/*另一种写法*/
//Synchronized Asynchronous Reset
module sync_async_reset(clock,reset_n,data_a,data_b,out_a,out_b);
input clock, reset_n;
input data_a, data_b;
output out_a, out_b;
reg rst_nr, rst_n;
reg out_a, out_b;
always @(posedge clock or negedge reset_n) begin
if(!reset_n) begin
rst_nr <= 1'b0;
rst_n <= 1'b0; //异步复位
end
else begin
rst_nr <= 1'b1;
rst_n <= rst_nr; //同步释放
end
end
//信号rst_n作为新的总的复位信号,后续可以以“异步”做复位使用
always @(posedge clock or negedge rst_n) begin
if(!rst_n) begin
out_a <= 1'b0;
out_b <= 1'b0;
end
else begin
out_a <= data_a;
out_b <= data_b;
end
end
endmodule // sync_async_reset
这个分类不是特别严谨,我的理由是用DC做综合或者用PT做时序分析都是在服务器的环境下,所以就放在一起了。一个数字IC设计工程师应该要能够借助这两个工具评估自己的设计。
安利一波邸老师的课:数字集成电路静态时序分析基础
STA – Setup time & Hold time 详细解读
两篇总结的很好的时序约束的文章:
笔试环节手撕代码的公司不少,状态机的设计方法一定要熟练
偶数分频很简单,一个计数器,输出高电平占一半,低电平也占一半
而奇数分频由于除以2除不尽,因此,需要使用两个计数器,产生两个占空比为40%的信号,但一个采集上升沿,一个采集下降沿,最后利用相位差,产生一个奇分频的信号,而对于2的整数次幂的分频电路就有意思了,它可以直接使用串联的回路型D触发器,这就是得2分频用一个FF,4分频用2个D,8分频用3个D。N分频用log2(N)个D。
设计一个自动饮料售卖机,饮料10分钱,硬币有5分和10分两种,并考虑找零
1.画出fsm(有限状态机)
2.用verilog编程,语法要符合FPGA设计的要求
3.设计工程中可使用的工具及设计大致过程?
设计一个自动售饮料机的逻辑电路。它的投币口每次只能投入一枚五角或一元的硬币。投入一元五角硬币后给出饮料;投入两元硬币时给出饮料并找回五角。
module sell(clk,rst,a,b,y,z);
input clk,rst,a,b;
output y,z;
parameter s0=0,s1=1;
reg state,next_state;
always@(posedge clk) begin
if(!rst) state<=s0;
else state<=next_state;
end
always@(a or b or cstate) begin
y=0;z=0;
case(state)
s0: if(a==1&&b==0)
next_state=s1;
else if(a==0&&b==1) begin
next_state=s0;
y=1;
end else
next_state=s0;
s1: if(a==1&&b==0) begin
next_state=s0;
y=1;
end
else if(a==0&&b==1) begin
next_state=s0;
y=1;
z=1;
end
else
next_state=s0;
default: next_state=s0;
endcase
end
endmodule
input nickel、dime乘法器Booth算法
input clk,rst_n,din[7:0],din_vld
output data_cnt[7:0],data_cnt_vld
本人项目和总线Arbiter有关,所以这方面应该多下点功夫才好。
AMBA总线(一)
AMBA总线(二)
这个总线是可以进行流水化的
这部分的内容稍微有点偏向专用领域,但是平头哥和比特大陆等公司的笔试题里出现了不少相关内容。