数字IC前端笔试常见大题整理(简答+手撕)
1、简述latch与FF的区别,并用verilog分别实现1bit latch与DFF。
Latch对电平信号敏感,在输入脉冲的电平作用下改变状态。DFF对时钟边沿敏感,检测到上升沿或下降沿触发瞬间时改变状态。
Latch代码:
DFF代码:
2、IC设计中reset的设计通常有同步reset和异步reset两种方式。
1) 简述两种reset方式的区别?
2) 异步reset的主要缺点是什么?
3) 设计中如何规避异步reset的缺点?
1)同步reset是指复位信号只在时钟上升沿到来时才有效,异步reset是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
2)异步reset的主要缺点是复位信号的随机性会导致亚稳态,而且对电路内的毛刺敏感,容易造成复位错误。
3)可以采用异步复位同步释放的方法来解决这个问题,即复位与clk无关,复位信号在第二级触发器的clk边沿到来后释放,第二级输出是稳定且被同步的。多打一拍,消除亚稳态,从而触发器会在一个或两个时钟周期内返回稳态。
3、阐述“时钟抖动”的基本概念,可能产生的原因?在数字逻辑设计中对setup time和hold time的影响是什么?
时钟抖动指的是信号周期的长度会有一定变化,从而导致下一个时钟沿到来的时间不确定,主要是时钟周期T变化。抖动是在时钟发生器内部产生的,产生的原因和晶格振动以及内部电路有关。时钟抖动的存在会影响电路中的时序收敛,导致setup time和hold time出现violation。
4、阐述一下meta-stability的概念及在设计中如何防止?
亚稳态指的是触发器无法在某个规定的时间内达到一个可以确认的状态。触发器进入亚稳态后,无法预测其输出电平,也无法预测输出何时能稳定。
在设计中,为了抑制亚稳态现象,在跨时钟域传输时,对于单bit信号,可以使用双锁存器法同步、边沿检测同步器、脉冲检测同步器的方法来进行同步。对于多bit信号,可以采用握手协议以及异步FIFO来解决。
5、给定一个时钟信号clk,设计一个占空比为50%的三分频时钟clk_div3,用Verilog写出这个设计。
6、设计一个顶层模块,顶层模块实现一个双口SRAM,一个口只读,一个口只写。试用Verilog写出这个顶层模块的实现。
7、根据自己的理解列出经典处理器CPU执行大致阶段,以及各阶段的大致行为。
取指(fetch):从主存中取指令到指令寄存器。
译码(decode):将指令按照指令结构,进行拆分解释,识别区分不同指令类别和各种获取操作数的方法。
执行(execute):实现指令的功能。
访存(memory):根据指令访问主存,读取操作数。
写回(write back):将运算结果写回到某存储器。
8、芯片设计三个核心指标为PPA,请解释这三个字母分别代表什么,并阐述你对PPA的理解。
performance性能、power功耗、area面积 。
在流水线设计中,流水线越深:追求性能,更高的主频。流水线越浅:追求功耗,小面积低功耗。
面积换功耗:门控时钟(动态功耗),电源门控、多阈值电压、动态电压(静态功耗)。
面积换性能:大容量cache提高cpu的hit几率。
功耗换性能:关键路径采用低阈值电压cmos,但静态功耗很大。
9、What is The Difference Between Mailbox And Queue?
队列存放有序的同类元素,同时结合了链表的优点可以任意位置操作或访问。mailbox是跨线程的通信,一个线程中写入数据,可以在另一个线程中将数据读出。
10、What Is The Use Of $cast?
11、UVM中,如果想要某个成员使用UVM compare和print函数,需要如何操作该变量?
通过域的自动化,在注册UVM类的同时可以声明今后会参与到对象拷贝、克隆、打印等操作的成员变量。
12、如何启动sequence?
1)使用start来启动
2)挂载在default sequence上来启动
13、请根据下面的设计描述,尽可能多的列出你所能想到的用于功能验证的测试点。
一个异步FIFO, rdata和wdata均为8位数据,FIFO深度为16,当rst_n输入为低时,FIFO被复位,当wclk的上升沿采样到wr为高时,数据被写入FIFO,当rclk的上升沿采样到rd为高时,FIFO输出数据。此外,当FIFO为空时,empty信号输出为高,当FIFO满时,full信号输出为高。
测试点:
(1) 同时读写,读写数据正确检查。
(2) FIFO满标志位检查。
(3) FIFO空标志位检查。
(4) 写过程中发生写复位,写数据和FIFO满标志被清空。
(5) 读过程中发生读复位,读数据和FIFO读空标志位被清空。
(6) 读写时钟相位相同,异步FIFO能正常工作。
(7) 读写时钟相位不同,异步FIFO能正常工作。
(8) 写时钟等于读时钟,异步FIFO能正常工作。
(9) 写时钟快于读时钟,异步FIFO能正常工作。
(10) 写时钟慢于读时钟,异步FIFO能正常工作。
(11) 写过程中发生写复位后,异步FIFO能继续正常工作。
(12) 读过程中发生读复位后,异步FIFO能继续正常工作。
(13) FIFO满以后,继续往FIFO写数据,异步FIFO不会被卡死,数据被读走以后,FIFO能继续正常工作。
14、简述流水线设计的方法和作用。
典型的流水线设计是将原本一个时钟周期完成的较大的组合逻辑,通过合理的切割后分由多个时钟周期来完成,这样一来该部分逻辑运行的时钟频率就会有明显的提升,尤其当它是一条关键路径时,采用流水线设计后整个系统的性能都会得到提升。
流水线设计从某种程度上可以提高系统频率,因此常用于高速信号处理领域,如果某个信号可以分为若干步骤处理,而且整个数据处理过程是单项的,即没有反馈运算和迭代运算,前一个步骤的输出就是下一个步骤的输入,可以考虑流水线设计来提高系统的频率。
15、请简述数字后端P&R流程。
后端设计流程:
1、可测性设计——DFT
Design ForTest,可测性设计。芯片内部往往都自带测试电路,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。
16、请简述 UVM 中的 Agent 组件。
uvm_agent是一个标准的验证环境“单位”,这样的单位通常包括一个driver、一个monitor和一个sequencer。为了复用,uvm_agent中通常只需包含一个monitor,而不需driver和sequencer。在agent中有is_active这个变量,默认值为UVM_ACTIVE,表示agent中需要例化driver、monitor和sequencer;is_active的值为UVM_PASSIVE则表示agent只例化monitor,即只具有检测功能。
17、请简述 UVM 中一个uvm_sequence_ item 的生命周期。
uvm_sequence_ item 的生命周期一般开始于sequence的body()方法,而后经历了随机化并穿越sequencer最终到达driver,直到被driver消化之后,它的生命周期才会结束。
18、请简述 SV 和UVM 中重载的方法。
SV中,由于其OOP的特性,可以利用虚函数的方法实现子类对父类的重载。
子类想要正确地override父类中的虚函数,需要保证以下四点:
函数才能重载函数。函数名相同返回类型相同。参数列表相同。
子类中要正确重载父类中的虚任务,需要保证以下三点:任务才能重载任务。任务名相同参数列表相同。
UVM中,则可以通过工厂机制来实现override。将所有的类都注册到工厂中,并通过工厂来创建对象。这样就无需再修改原始代码,保证了原有代码的封装性。
19、请简述形式验证的作用及使用场景。
形式验证(Formality):在后仿阶段,从功能上对综合后的网表进行验证,将综合后的网表与验证后的RTL设计对比,检查其是否在功能上存在等价性,保证逻辑综合过程中没有改变RTL描述的电路功能。
20、请简述 ASIC 开发的完整流程及各步骤使用的工具。
前端(逻辑设计)
需求分析:客户向fabless提出设计要求,fabless将其翻译为对芯片产品的技术需求。
算法设计:使用高级编程语言如C++设计和优化芯片钟所使用的算法;使用建模仿真工具如MATLAB进行浮点和定点的仿真,进而对算法进行评估和优化。
功能架构设计:根据分析的功能需求以及算法分析的结果,设计芯片架构。此外,架构师将系统功能进行分解和细化,形成SPEC规范,将设计参数化。
其中,包括处理器架构的选择(ARM、RISC-V),总线接口的选择(APB、AHB、AXI),软硬件功能的划分以及性能参数(引脚选择、电压频率、工艺选择、功耗和温度范围)。
在这一阶段,可以使用SystemC对芯片构架进行模拟和分析。
RTL设计(代码输入):使用Verilog HDL、VHDL等硬件描述语言将模块功能以代码来实现。
功能仿真验证(前仿):对RTL级的代码进行验证,以验证设计功能的正确性是否满足SPEC中的要求。
逻辑综合:基于特定的工艺库,设定电路的面积、时序等目标参数的约束条件,将设计的RTL级代码映射为门级网表netlist。逻辑综合需要基于特定的综合库,在不同的库中,门电路的基本标准单元(standard cell)的面积、时序参数是不一样的。
门级验证(后仿):对综合后的门级网表进行验证,这一阶段通常会使用仿真、静态时序分析和形式验证等工具。
静态时序分析(STA):在时序上对电路进行验证,检查电路是否存在建立时间(setup time)和保持时间(hold time)的违例。
形式验证(Formality):从功能上对综合后的网表进行验证,将综合后的网表与验证后的RTL设计对比,检查其是否在功能上存在等价性,保证逻辑综合过程中没有改变RTL描述的电路功能。
后端(物理设计)
可测性设计(DFT):在设计适当增加一些专门用于测试的电路,提高电路的可控制性和可观察性,从而降低电路的测试难度和复杂性,提高电路的测试效率,降低测试成本。
布局规划(Floorplanning):放置芯片的宏单元模块,在总体上确定各种功能电路的摆放位置,如IP模块、RAM、I/O引脚等。其会影响芯片的最终面积。
时钟树综合CTS(Clock Tree Synthesis):芯片中的时钟网络要驱动电路中所有的时序单元,所以时钟源端门单元带载很多,其负载延时很大并且不平衡,需要插入缓冲器减小负载和平衡延时。时钟网络及其上的缓冲器共同构成了时钟树。一般要反复几次才能做出一个比较理想的时钟树。
布线(Routing):布线是指在满足工艺规则和布线层数限制、线宽、线间距限制和各线网电性能约束的条件下,根据电路的连接关系将各单元和I/O Pad用互连线连接起来,这些是在时序驱动(Timing driven)的条件下进行的,保证关键时序路径上的连线长度能够最小。
寄生参数提取:由于导线本身存在的电阻,相邻导线之间的互感、耦合电容在芯片内部会产生信号噪声、串扰和反射。提取寄生参数进行再次分析验证,分析信号完整性问题。
物理版图验证:对布线完成的版图进行功能和时序上的验证。
LVS:版图和逻辑综合后的门级电路图对比验证。
DRC:设计规则检查,检查连线间距,连线宽度。
ERC:电器规则检查,检查短路开路。
实际的后端流程还包括电路功耗分析,以及随着制造工艺不断进步产生的DFM(可制造性问题)。
流片(Tape out):在所有检查和验证都正确无误的情况下把最后的物理版图以GDS II的文件格式交给Foundry,在晶圆硅片上做出实际的电路,再进行封装和测试,就得到了可以使用的芯片。
整理不易,持续更新,对你有帮助的话,记得收藏下来,随时刷题!
往期回顾:
#笔经面经##数字IC##芯片##春招##你为什么选择硬件行业#