• 数字IC前端笔试常见大题整理(简答+手撕)


    目录

    1. 简述latch与FF的区别,并用verilog分别实现1bit latch与DFF。

    2. IC设计中reset的设计通常有同步reset和异步reset两种方式。

    3. 阐述“时钟抖动”的基本概念,可能产生的原因?在数字逻辑设计中对setup time和hold time的影响是什么?

    4. 阐述一下meta-stability的概念及在设计中如何防止。

    5. 给定一个时钟信号clk,设计一个占空比为50%的三分频时钟clk_div3,用Verilog写出这个设计。

    6. 设计一个顶层模块,顶层模块实现一个双口SRAM,一个口只读,一个口只写。试用Verilog写出这个顶层模块的实现。

    7. 根据自己的理解列出经典处理器CPU执行大致阶段,以及各阶段的大致行为。

    8. 芯片设计三个核心指标为PPA,请解释这三个字母分别代表什么,并阐述你对PPA的理解。

    9. What is The Difference Between Mailbox And Queue?

    10. What Is The Use Of $cast?

    11. UVM中,如果想要某个成员使用UVM compare和print函数,需要如何操作该变量?

    12. 如何启动sequence?

    13. 请根据下面的设计描述,尽可能多的列出你所能想到的用于功能验证的测试点。

    14. 简述流水线设计的方法和作用。

    15. 请简述数字后端P&R流程。

    16. 请简述 UVM 中的 Agent 组件。

    17. 请简述 UVM 中一个uvm_sequence_ item 的生命周期。

    18. 请简述 SV 和UVM 中重载的方法。

    19. 请简述形式验证的作用及使用场景。

    20. 请简述 ASIC 开发的完整流程及各步骤使用的工具。

    1. 简述latch与FF的区别,并用verilog分别实现1bit latch与DFF。

    Latch对电平信号敏感,在输入脉冲的电平作用下改变状态。
    DFF对时钟边沿敏感,检测到上升沿或下降沿触发瞬间时改变状态。

    Latch代码:

    module latch(
    input d,
    input ena,
    output q);
    	
    always@(ena)begin
    	if(ena)
    		q = d;
    end
    
    endmodule
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    DFF代码:

    module DFF(
    input clk,
    input reset,
    input d,
    output q
    );
    always@(posedge clk)begin
    	if(reset)
    		q = 0;
    	else
    		q = d;
    end
    
    endmodule
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1. IC设计中reset的设计通常有同步reset和异步reset两种方式。
      1) 简述两种reset方式的区别。
      2) 异步reset的主要缺点是什么?
      3) 设计中如何规避异步reset的缺点?

    1)同步reset是指复位信号只在时钟上升沿到来时才有效,异步reset是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
    2)异步reset的主要缺点是复位信号的随机性会导致亚稳态,而且对电路内的毛刺敏感,容易造成复位错误。
    3)可以采用异步复位同步释放的方法来解决这个问题,即复位与clk无关,复位信号在第二级触发器的clk边沿到来后释放,第二级输出是稳定且被同步的。多打一拍,消除亚稳态,从而触发器会在一个或两个时钟周期内返回稳态。具体代码可参考:异步复位同步释放

    1. 阐述“时钟抖动”的基本概念,可能产生的原因?在数字逻辑设计中对setup time和hold time的影响是什么?

    时钟抖动指的是信号周期的长度会有一定变化,从而导致下一个时钟沿到来的时间不确定,主要是时钟周期T变化。抖动是在时钟发生器内部产生的,产生的原因和晶格振动以及内部电路有关。时钟抖动的存在会影响电路中的时序收敛,导致setup time和hold time出现violation。

    1. 阐述一下meta-stability的概念及在设计中如何防止。

    亚稳态指的是触发器无法在某个规定的时间内达到一个可以确认的状态。触发器进入亚稳态后,无法预测其输出电平,也无法预测输出何时能稳定。
    在设计中,为了抑制亚稳态现象,在跨时钟域传输时,对于单bit信号,可以使用双锁存器法同步、边沿检测同步器、脉冲检测同步器的方法来进行同步。对于多bit信号,可以采用握手协议以及异步FIFO来解决。

    1. 给定一个时钟信号clk,设计一个占空比为50%的三分频时钟clk_div3,用Verilog写出这个设计。
    module clk_div3 (
    parameter n=3,
    input       clk,
    input       rst,
    output      clk_div
    );
        
    reg 	[15:0]  cnt;
    reg 			clk_pos,clk_neg;
    
    always @(posedge clk or negedge rst)begin
      if(!rst)
        cnt <= 0;
      else if(cnt == n-1)
        cnt <= 0;
      else
        cnt <= cnt + 1;
    end
        
    always @(posedge clk or negedge rst)begin
        if(!rst)
            clk_pos <= 1'b0;
        else if(cnt == n-1)
            clk_pos <= 1'b1;
        else
            clk_pos <= 1'b0;
    end
    
    always @(negedge clk or negedge rst)begin
        if(!rst)
            clk_neg <= 0;
        else if(cnt == n-1)
            clk_neg <= 1'b1
    	else
            clk_neg <= 1'b0;
    end 
    assign clk_div = clk_pos | clk_neg;
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    1. 设计一个顶层模块,顶层模块实现一个双口SRAM,一个口只读,一个口只写。试用Verilog写出这个顶层模块的实现。
    module	SRAM
    (input	clk_in,
    input	wr_en,
    input	[3:0]addr_wr,
    input	[3:0]addr_rd,
    input	[7:0]din,
    input	rd_en,
    output	[7:0]dout
    );
    
    reg	[7:0]mem[7:0];
    always@(posedge clk_in)
    	begin
    		if(wr_en == 1'b1)
    			mem[addr_wr] <= din;
    	end
    always@(posedge clk_in)
    	begin
    		if(rd_en == 1'b1)
    			dout <= mem[addr_rd];
    	end
    endmodule
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    1. 根据自己的理解列出经典处理器CPU执行大致阶段,以及各阶段的大致行为。

    取指(fetch):从主存中取指令到指令寄存器。
    译码(decode):将指令按照指令结构,进行拆分解释,识别区分不同指令类别和各种获取操作数的方法。
    执行(execute):实现指令的功能。
    访存(memory):根据指令访问主存,读取操作数。
    写回(write back):将运算结果写回到某存储器。

    1. 芯片设计三个核心指标为PPA,请解释这三个字母分别代表什么,并阐述你对PPA的理解。

    performance性能、power功耗、area面积 。

    在流水线设计中,流水线越深:追求性能,更高的主频。流水线越浅:追求功耗,小面积低功耗。
    面积换功耗:门控时钟(动态功耗),电源门控、多阈值电压、动态电压(静态功耗)。
    面积换性能:大容量cache提高cpu的hit几率。
    功耗换性能:关键路径采用低阈值电压cmos,但静态功耗很大。

    1. What is The Difference Between Mailbox And Queue?

    队列存放有序的同类元素,同时结合了链表的优点可以任意位置操作或访问。
    mailbox是跨线程的通信,一个线程中写入数据,可以在另一个线程中将数据读出。

    1. What Is The Use Of $cast?

    $cast为了强制类型转换,可以把基类句柄赋值给扩展类句柄,前提是基类句柄指向了这个扩展类对象或者这个扩展类的扩展类对象,强制类型转换后,这个扩展类句柄就会指向这个扩展类的对象或者这个扩展类的扩展类的对象。

    1. UVM中,如果想要某个成员使用UVM compare和print函数,需要如何操作该变量?

    通过域的自动化,在注册UVM类的同时可以声明今后会参与到对象拷贝、克隆、打印等操作的成员变量。

    class trans;
    	rand bit [7:0] data;
    	rand bit [3:0] addr;
    	`uvm_object_utils_begin(trans)
    		`uvm_field_int(data, UVM_ALL_ON)
    		`uvm_field_int(addr, UVM_ALL_ON)
    	`uvm_object_utils_end(trans)
    endclass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 如何启动sequence?

    1)使用start来启动

    my_sequence my_seq;
    my_seq = my_sequence::type_id::creat("my_seq");
    my_seq.start();
    
    • 1
    • 2
    • 3

    2)挂载在default sequence上来启动

    uvm_config_db#(uvm_objec_wrapper)::set(this,
    						"env.i_agt.sqr.main_phase",
    						"default_sequence",
    						my_sequence::type_id::get());
    
    • 1
    • 2
    • 3
    • 4
    1. 请根据下面的设计描述,尽可能多的列出你所能想到的用于功能验证的测试点。

    一个异步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能继续正常工作。

    1. 简述流水线设计的方法和作用。

    典型的流水线设计是将原本一个时钟周期完成的较大的组合逻辑,通过合理的切割后分由多个时钟周期来完成,这样一来该部分逻辑运行的时钟频率就会有明显的提升,尤其当它是一条关键路径时,采用流水线设计后整个系统的性能都会得到提升。
    流水线设计从某种程度上可以提高系统频率,因此常用于高速信号处理领域,如果某个信号可以分为若干步骤处理,而且整个数据处理过程是单项的,即没有反馈运算和迭代运算,前一个步骤的输出就是下一个步骤的输入,可以考虑流水线设计来提高系统的频率。

    1. 请简述数字后端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

    1. 请简述 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,即只具有检测功能。

    1. 请简述 UVM 中一个uvm_sequence_ item 的生命周期。

    uvm_sequence_ item 的生命周期一般开始于sequence的body()方法,而后经历了随机化并穿越sequencer最终到达driver,直到被driver消化之后,它的生命周期才会结束。

    1. 请简述 SV 和UVM 中重载的方法。

    SV中,由于其OOP的特性,可以利用虚函数的方法实现子类对父类的重载。
    子类想要正确地override父类中的虚函数,需要保证以下四点:
    函数才能重载函数。函数名相同返回类型相同。参数列表相同。
    子类中要正确重载父类中的虚任务,需要保证以下三点:任务才能重载任务。任务名相同参数列表相同。
    UVM中,则可以通过工厂机制来实现override。将所有的类都注册到工厂中,并通过工厂来创建对象。这样就无需再修改原始代码,保证了原有代码的封装性。

    1. 请简述形式验证的作用及使用场景。

    形式验证(Formality):在后仿阶段,从功能上对综合后的网表进行验证,将综合后的网表与验证后的RTL设计对比,检查其是否在功能上存在等价性,保证逻辑综合过程中没有改变RTL描述的电路功能。

    1. 请简述 ASIC 开发的完整流程及各步骤使用的工具。

    可参考:数字芯片设计流程

  • 相关阅读:
    华为鸿蒙4,3,2禁用Google谷歌服务框架,使用最新谷歌Google play服务
    除静电离子风枪的工作原理及应用
    CSAPP-BombLab详解
    Spring AOP如何使用AspectJ注解进行开发呢?
    猿创征文|瑞吉外卖——移动端_购物车
    信息学奥赛一本通:1170:计算2的N次方
    C#版Facefusion ,换脸器和增强器
    django根据时间(年月日)动态修改表名--方法二
    Leetcode 15:三数之和
    机器学习入门(1)
  • 原文地址:https://blog.csdn.net/Sisyphus415/article/details/127443723