IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)

面试基本信息

准备暑期实习之前看了看要准备的东西在这里记录一下,大多数是网上搜集的资料。

首先是中英文的自我介绍(毕竟还是想去外企的,都准备一下)

手撕题目

  • 状态机
  • 奇偶分频
  • python和C的基本逻辑运算
  • Tcl基本命令
  • 先看书,了解,带着问题去实现项目,uvm实战看一遍。

前端验证

时序设计的本质就是满足每一个触发器的建立/保持时间。

  • SystemVerilog总结

SystemVerilog:由Verilog发展而来的硬体描述、硬件验证统一语言,前一部分基本上是2005年版Verilog的扩展,而后一部分功能验证特性则是一门面向对象程序设计语言。面向对象特性很好地弥补了传统Verilog在芯片验证领域的缺陷,改善了代码可重用性,同时可以让验证工程师在比寄存器传输级更高的抽象级别,以事务而非单个信号作为监测对象,这些都大大提高了验证平台搭建的效率。[1]

  • 逻辑型变量 logic 可以代替reg和wire,如果某个变量有多个驱动源,那只能使用wire定义。

  • 多维压缩数组

  • 枚举型变量,使用一系列有实际字面意义的名称来代表若干变量:过去用parameter来描述有限状态机。在SystemVerilog中,使用枚举更加方便。

  • 新增数据类型(byte 8位)、(shortint 16位)、(int 32位)、(longint 64位)、(bit,1位)

  • 结构体和联合体

  • 条件、选择语句的唯一性和优先性(unique,priority)

  • 过程代码(组合逻辑:always_comb、时序逻辑:always_ff、锁存器:always_latch),防止综合处不符合预期的硬件模型。

  • 接口,引入interface,减少大量需要声明的端口名称。

  • 专门针对验证的特性:新的数据类型(string),提供了动态数组、关联数组和队列(queues)。

  • 含约束的随机化:可以对定义在类或者其他语句块中的整数型变量进行随机化。

  • 断言:由sequences,properties组成。自动检查定义的属性是否得到满足,如果违背则会给出警告。

  • 功能覆盖:在硬件验证中,功能覆盖是指验证过程中对人工定义信号事件的数据采样和收集过程。功能覆盖率在某种程度上反映了被测设计在所给输入激励下,其内部功能正确与否被检测到的百分比。功能覆盖率越高,一般代表测试越完备。

除了上述特性,SystermVerilog还在以下方面对传统Verilog进行了增强:

  • 过程赋值操作符(包括阻塞和非阻塞)能够直接对数组进行操作

  • 端口(输入、输出、双向)可以支持更多的数据类型,包括结构体、枚举、实数等

  • For循环内部可以自动定义变量,并为它添加了continuebreak功能

  • 在原有的while循环基础上添加了do-while循环

  • 可以使用关键字const来声明常量

  • 可以对整个数组进行初始化

  • 预处理器的字符串宏的功能得到增强

  • 除了原有的并发过程语句块fork/join结构,还提供join_nonejoin_any两种代码块结尾方式

  • 任务的端口能够被声明为引用类型(ref),这使得任务能够直接获取任务参数自身(引用传递),而不是一个临时复制的数值(值传递)。因此,对输入方向的形式参数的操作会直接改变对应的实际参数。

  • 函数能够被声明为空类型void,即不返回任何数值

  • 参数(parameters)可以被声明为任何类型,包括用户使用typedef定义的新类型

  • 提供SystemVerilog DPI(即SystemVerilog直接编程接口)来连接以C语言、C++编写的模块

  • UVM

    UVM验证方法学是基于systemverilog语言形成的一个高效的验证方法。它的主要特点是提高了代码的复用性,使得验证人员能通过代码移植复用修改快速搭建验证平台,从而将主要精力放在具体测试用例的编写上。另一方面,UVM封装了很多好用的方法,这使得验证人员不必过多关注底层实现,而且减少了验证平台的调试时间。

    验证用于找出DUT(device under test)中的bug,这个过程通常是把DUT放入一个验证平台中来实现的。一个验证平台要实现如下基本功能:

    • 验证平台要模拟DUT的各种真实使用情况,这意味着要给DUT施加各种激励,有正常的激励,也有异常的激励;有这种模式的激励,也有那种模式的激励。激励的功能是由driver来实现的。
    • 验证平台要能够根据DUT的输出来判断DUT的行为是否与预期相符合,完成这个功能的是记分板(scoreboard,也被称为checker,本书统一以scoreboard来称呼)。既然是判断,那么牵扯到两个方面:一是判断什么,需要把什么拿来判断,这里很明显是DUT的输出;二是判断的标准是什么。
    • 验证平台要收集DUT的输出并把它们传递给scoreboard,完成这个功能的是monitor
    • 验证平台要能够给出预期结果。在记分板中提到了判断的标准,判断的标准通常就是预期。假设DUT是一个加法器,那么当在它的加数和被加数中分别输入1,即输入1+1时,期望DUT输出2。当DUT在计算1+1的结果时,验证平台也必须相应完成同样的过程,也计算一次1+1。在验证平台中,完成这个过程的是参考模型(reference model)。

    一个简单的验证平台框图如图2-1所示。在UVM中,引入了agentsequence的概念,因此UVM中验证平台的典型框图如图2-2所示。

    IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第1张图片

    UVM学习笔记–sequence和sequencer_wonder_coole的博客-CSDN博客_sequencer

    一个简单的UVM验证平台_bleauchat的博客-CSDN博客_uvm验证平台

  • setup time和holdup time 亚稳态

    1)setup是建立时间,时间边缘前面数据信号保持不变的时间
    2)holdup保持时间,时间边缘后面数据信号保持不变的时间

    建立时间Tsu(setup):触发器在时钟上升沿到来之前,其数据输入端的数据必须保持不变的最小时间。
    保持时间Th(hold):触发器在时钟上升沿到来之后,其数据输入端的数据必须保持不变的最小时间。

    Tclk > Tcq + Tcomb + Tsetup - Tskew

    Thold < Tcq + Tcomb - Tskew

    Tclk    = Frequency of clock
    Tcq     = Flop clock to Flop q delay
    Tcomb   = Delay on the combinational logic between the Flops
    Tsetup  = Required setup time of a Flop
    Thold   = Required hold time of a Flop
    Tskew   = Delay between clock edges of two adjacent flops(本例中,是CLK2落后于CLK1的时间)
    

    IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第2张图片

    为什么要满足建立时间与保持时间

    因为触发器内部数据的形成是需要一定的时间的,如果不满足建立和保持时间,触发器将进入亚稳态,进入亚稳态后触发器的输出将不稳定,在0和1之间变化,这时需要经过一个恢复时间,其输出才能稳定,但稳定后的值并不一定是你的输入值。这就是为什么要用两级触发器来同步异步输入信号。这样做可以防止由于异步输入信号对于本级时钟可能不满足建立保持时间而使本级触发器产生的亚稳态传播到后面逻辑中,导致亚稳态的传播。

    为什么两级触发器可以防止亚稳态传播(解决跨时钟域问题)

    这也是一个异步电路同步化的问题。使用两级触发器来使异步电路同步化的电路其实叫做“一位同步器”,他只能用来对一位异步信号进行同步。两级触发器可防止亚稳态传播的原理:假设第一级触发器的输入不满足其建立保持时间,它在第一个脉冲沿到来后输出的数据就为亚稳态,那么在下一个脉冲沿到来之前,其输出的亚稳态数据在一段恢复时间后必须稳定下来,而且稳定的数据必须满足第二级触发器的建立时间,如果都满足了,在下一个脉冲沿到来时,第二级触发器将不会出现亚稳态,因为其输入端的数据满足其建立保持时间。同步器有效的条件:第一级触发器进入亚稳态后的恢复时间 + 第二级触发器的建立时间 < = 时钟周期,接收域级联的两个寄存器使用要去往的时钟域的时钟,发送端时钟域寄存器输出和接收端异步时钟域级联寄存器输入之间不能有任何其他组合逻辑。同步器中级联的寄存器中除了最后一个寄存器外所有的寄存器只能有一个扇出,即只能驱动下一级寄存器的输入。

    更确切地说,输入脉冲宽度必须大于同步时钟周期与第一级触发器所需的保持时间之和。最保险的脉冲宽度是两倍同步时钟周期。所以,这样的同步电路对于从较慢的时钟域来的异步信号进入较快的时钟域比较有效,对于进入一个较慢的时钟域,则没有作用 。

    IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第3张图片

    如何解决亚稳态问题

    • 改善时钟边沿,让其变化更加陡峭
    • 降低系统时钟
    • 引入同步机制,增加缓冲(二级寄存)
    • 使用工艺更好、建立与保持时间更短的器件
    • 异步FIFO和握手协议

    FPGA跨时钟域处理3大方法 | 电子创新网赛灵思社区 (eetrend.com)

  • 什么是竞争与冒险现象?如何判断?如何消除

    竞争:在组合电路中,信号经由不同的途径达到某一会合点的时间有先有后,这种现象称为竞争。

    冒险:由于竞争而引起电路输出发生瞬间错误现象称为冒险。表现为输出端出现了原设计中没有的窄脉冲,常称其为毛刺。

    静态冒险是指输入有变化,而输出不应变化时产生的单个窄脉冲,就是说某个信号的输入变化前后在稳定状态下输出应该是保持不变的,但是在转换的瞬间发生了变化

    动态冒险则指的是输入变化时,输出也应变化时产生的冒险。

    动态冒险是由静态冒险引起的,因此存在动态冒险的电路也存在静态冒险。

    静态冒险根据产生条件的不同,分为功能冒险和逻辑冒险两大类。

    当有两个或两个以上输入信号同时产生变化时,在输出端产生毛刺,这种冒险称为功能冒险

    如果只有一个变量产生变化时出现的冒险则是逻辑冒险

    冒险往往会影响到逻辑电路的稳定性,因此要注意冒险的消除。

    办法一:修改逻辑表达式避免以上情况【需要逻辑分析能力】

    办法二:采样时序逻辑,仅在时钟边沿采样【推荐,事实上也最常用】

    办法三:在芯片外部并联电容消除窄脉冲【物理方法】 作者:Rong晔 https://www.bilibili.com/read/cv9021457 出处:bilibili

  • SRAM种类

    SRAM(Static):分为双极型和CMOS两种。从功能上分可以分为异步和同步SRAM。异步SRAM的访问独立于时钟,数据输入输出都由地址的变化控制。同步SRAM的所有访问都在时钟的上升/下降沿启动。地址、数据输入和其他控制信号均与时钟信号相关,

    用户申请资源时,FPGA先提供Block RAM,当Block RAM不够时再提供分布式RAM进行补充。Block RAM是单独的RAM资源,一定需要时钟,而Distributed RAM可以是组合逻辑,即给出地址马上给出数据,也可以加上register变成有时钟的RAM,而Block RAM一定是有时钟的。

    两者区别总结:1、 bram需要时钟,dram给出地址后即可输出数据。2、 dram使用更灵活方便些。3、 bram有较大的存储空间,dram浪费LUT资源。4、 如果要产生较大的FIFO或timing要求较高就用bram,否则,就可以用dram。5、 在异步fifo ,用两种RAM可供选择,BRAM和DRAM,BRAM是FPGA中整块的双口RAM资源,DRAM是拼接LUT构成。

  • 同步复位和异步复位各自优缺点

    同步复位:当时钟上升沿检测到复位信号,执行复位操作(有效的时钟沿是前提)。always @ ( posedge clk );

    优点:

    a、有利于仿真器的仿真;b、可以使所设计的系统成为 100% 的同步时序电路,有利于时序分析,而且可综合出较高的 Fmax;c、由于只在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的复位毛刺。

    缺点:

    a、复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑诸如 clk skew 、组合逻辑路径延时 、复位延时等因素(所以复位信号有时需要脉冲展宽,用以保证时钟有效期间有足够的复位宽度);b、由于大多数的逻辑器件的目标库内的 DFF 都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会一方面额外增加FPGA内部的逻辑资源,另一方面也增加了相应的组合逻辑门时延。

    异步复位:它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。always @ ( posedge clk or negedge rst_n );

    优点:

    a、大多数目标器件库的 DFF 都有异步复位端口,那么该触发器的复位端口就不需要额外的组合逻辑,这样就可以节省资源;b、设计相对简单;c、异步复位信号识别方便(电路在任何情况下都能复位而不管是否有时钟出现)。**缺点:**a、最大的问题在于它属于异步逻辑,问题出现在复位释放时,而不是有效时,如果复位释放接近时钟有效沿,则触发器的输出可能进入亚稳态(此时 clk 检测到的 rst_n 的状态就会是一个亚稳态,即是0是1是不确定的),从而导致复位失败。b、可能因为噪声或者毛刺造成虚假复位信号(比如以前的游戏机玩到一半突然复位)(注意:时钟端口、清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错,因此判断逻辑电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题);c、静态定时分析比较困难。d、对于 DFT (Design For Test可测性设计)设计,如果复位信号不是直接来自于 I/O 引脚,在 DFT 扫描和测试时,复位信号必须被禁止,因此需要额外的同步电路。

    总结:推荐使用异步复位、同步释放的方式,并且复位信号为低电平有效。

    module sync_async_reset (
    input    clk,
    input    rst_i,
    input    data_a,
    input    data_b,
    output   out_a,
    output   out_b
     );
    
    reg     d1, d2;
    reg     d3, d4;
    assign  out_a= d3;
    assign  out_b= d4;
    assign  rst_o= d2;
    
    always @ (posedge clock,negedge rst_i)begin
    	if (!rst_i)begin
    		d1<= 1'b0;
    	end
    	else begin
    		d1<= 1'b1;
    	end
    end
    
    always @(posedge clock,negedge rst_i)begin
    	if(irst_i)begin
    		d2<= 1'b0;
    	end
    	else begin
    		d2<= d1;
    	end
    end
    
    always @ (posedge clock,negedge rst_o)begin
    	if (!rst_o)begin
    		d3<= 1'b0;
    		d4<= 1'b0;
    	end
    	else begin
    		d3<= data_a;
    		d4<= data_b;
    	end
    end
    
    endmodule
    

    IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第4张图片

    这里:

    一、电路解释:是指复位信号到来的有效与否与 clk 无关,而且复位信号的撤除也与 clk 无关,但是复位信号的撤除是在下一个 clk 来到后才起的作用。

    二、电路目的:为了防止复位信号撤除时,可能产生的亚稳态。

    三、电路详解:异步复位:复位信号 rst_sync_n 由高拉低时实现异步复位。同步释放:这个是关键,即当复位信号 rst_async_n 撤除时(由低拉高),由于双缓冲电路(双寄存器)的作用,rst_sync_n 不会随着 rst_async_n 的撤除而撤除。假设 rst_async_n 撤除时发生在 clk 上升沿,如果不加此电路则可能发生亚稳态事件,但是加上此电路以后,假设第一级 D 触发器 clk 上升沿时 rst_async_n 正好撤除,(第一个DFF 此时是出于亚稳态的;假设此时识别到高电平;若是识别到低电平,则增加一个 Delay)则 DFF1 输出高电平,此时第二级触发器也会更新输出,但是输出值为前一级触发器 clk 来之前时的 Q1 输出状态,显然 Q1 之前为低电平,所以第二级触发器输出保持复位低电平,直到下一个 clk 来之后,才随着变为高电平,即同步释放。

  • 如何对多位异步信号进行同步

    首先确定多位异步信号是否具有相关性,比如递增地址,可以用格雷码编码,只有一位发生变化,这样可以用两级触发器来进行同步,能够避免亚稳态的传播,但是不能保证正确性,因此只对位数很小的进行同步处理,比如控制信号、地址等;如果是大量数据的跨时钟与传输,可以使用异步fifo,双口RAM,增加握手协议等。

  • 异步FIFO

    异步FIFO通过比较读写地址进行满空判断,但是读写地址属于不同的时钟域,所以在比较之前需要先将读写地址进行同步处理,将写地址同步到读时钟域再和读地址比较进行FIFO空状态判断(同步后的写地址一定是小于或者等于当前的写地址,所以此时判断FIFO为空不一定是真空,这样更保守),将读地址同步到写时钟域再和写地址比较进行FIFO满状态判断(同步后的读地址一定是小于或者等于当前的读地址,所以此时判断FIFO为满不一定是真空,这样更保守),这样可以保证FIFO的特性:FIFO空之后不能继续读取,FIFO满之后不能继续写入。

    为什么2进制(binary编码)指针不适合做空满判断。
    事实上2进制读指针在增减时,经常发生多位突变,比如6位地址111111会在下一时刻变成000000,在实际电路中,这个变化过程要持续很长一段时间,会由111111经历6个状态转移到达000000。比如111111-> 101111 -> 100111 ->100110 -> 100100 -> 000100-> 000000。由于写时钟与读时钟不同步,异步的写时钟很可能会在状态不稳定的中间某个状态抽样,这样就会得到错误的读指针,进而做出错误的状态判断,导致系统异常。而且由于多位同时突变,凭借概率论常识可知发生错误的可能性很大。

    格雷码(Gray)
    那么怎样才能避免这个问题的发生呢?显然,在中间状态抽样,这个是不可避免的,这是异步系统天生的缺陷。我们的目标是:即使在中间状态抽样,也要不影响空满状态的判断。
    符合这个要求的编码方法是每次只能有1个比特发生改变。为什么这么说呢?因为当只有一个比特发生改变时,即使在中间状态抽样,其结果也不外乎两种:递增前原指针和递增后新指针。显然递增后新指针是最新情况的反映,如果抽样到这个指针,那么和我们的设计预期是一致的,如果抽样到递增前的原指针,会有什么结果呢?假设现在抽样读指针,那么最坏的情况就是把“不满”判断成了“满”,使得本来被允许的写操作被禁止了,但是这并不会对逻辑产生影响,只是带来了写操作的延迟。同样的,如果现在抽样写指针,那么最坏的情况就是把“不空”判断成了“空”,使得本来被允许的读操作被禁止了,但是这也不会对逻辑产生影响,只是带来了读操作的延迟。

    显然每次只变化1比特的编码方案可以有效解决中间状态下空满状态的判断问题,格雷码就是这样的一种编码。
    格雷码每次只有一位跳变,但也需要使用两级寄存才安全。如果产生了亚稳态,使用两级寄存器后数据很大概率会回到某一个稳定状态,防止亚稳态传播。

    在异步的FIFO中,采用格雷码进行计数,相邻的数据仅仅只有1bit变化,这样在两个时钟域同步的时候仅仅可能只有1bit产生亚稳态,通过同步以后,亚稳态可以消除,最坏的情况是这1bit采错,但是即使是采错地址也只是相差1个,这对判断空满标志不会产生影响。

  • 锁存器(latch)与寄存器(reg)与触发器(flip-flop)的关系与区别

    FF是边沿触发,能存储1bit信息,寄存器是多个FF组成的,FF是寄存器的基本组成单元,所以寄存器也是边沿触发,而锁存器是电平触发。所以FF和Reg属于同步时序电路,latch属于异步时序电路。Latch主要产生于if和case的描述不全导致的,latch容易产生毛刺(glitch),所以尽量避免。

  • RTL实现if…else和case分析

    if…else…

    IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第5张图片

    IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第6张图片

    case语句实现与上述一样的功能

    IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第7张图片

    IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第8张图片

    发现RTL视图差别很大,而且从RTL视图也能看出if…else…有明显的优先级,case语句是并行的。但是我们再看看technology map:

    IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第9张图片

    两种表达方式的technology map的结果一样,说明映射到FPGA板子上的硬件电路一样。

  • Verilog语言中case、casex、casez的用法和区别

    真值表

    IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第10张图片

    case语句中,敏感表达式与与各项值之间的比较是一种全等比较,每一位都相同才会认为匹配。

    casez,如果某些位置的值位高阻z,那么就会忽略对这些位的比较,只关注其他位置的比较。

    casex,不考虑x和z

  • 状态机

    状态机描述时关键是要描述清楚几个状态机的要素,即如何进行状态转移,每个状态的输出是什么,状态转移的条件等。具体描述时方法各种各样,最常见的有三种描述方式:

    (1)一段式:整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;

    (2)二段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;

    (3)三段式:在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。

    根据状态机的输出是否与输入条件相关,可将状态机分为两大类,即摩尔(Moore)型状态机和米勒(Mealy)型状态机。

    (1)Moore状态机:组合逻辑的输出只取决于当前状态。Moore机属于异步输出状态机,它的输出仅为当前状态的函数,与当前输入信号状态无关。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pnx1ngDj-1650959438165)(https://cdn.jsdelivr.net/gh/Ryushane/PicGo_Pictures/img/2022/03/11/v2-7228ecf21e093b718868fa6e720a1d03_1440w.jpg)]

    (2)Mealy状态机:组合逻辑的输出不仅取决于当前状态,还取决于输入状态。Mealy机属于同步输出状态机,它的输出是当前状态和所有输入的函数,其输出会在输入变化后立即发生,不依赖于时钟的同步。

    IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第11张图片

  • 低功耗设计

FPGA 的开发流程是什么?

FPGA的设计流程就是利用EDA开发软件和编程工具对FPGA芯片进行开发的过程。 典型FPGA的开发流程一般如图所示,包括功能定义/器件选型、设计输入、功能仿真、综合优化、综合后仿真、实现、布线后仿真、板级仿真以及芯片编程与调试等主要步骤。

  • 时序综合报告吗

    生成时序报告后,如何阅读时序报告并从时序报告中发现导致时序违例的潜在问题是关键。

    首先要看Design Timing Summary

    在这个Summary里,呈现了Setup、Hold和Pulse Width的总体信息,但凡WNS、WHS或WPWS有一个小于0,就说明时序未收敛。

    IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第12张图片

    找到时序最糟糕的路径

    如果时序未收敛,并不需要分析所有未收敛的路径,而是先关注时序最糟糕的路径,先优化这些路径,有可能优化这些路径之后,这些路径收敛了,同时其他路径也能够收敛。只需要点击上图中WNS之后的数字,即可显示这些最糟糕的路径,如下图所示。

    IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第13张图片

    分析时序最糟糕的路径

    只需要双击上图中的路径,就能显示该路径对应的时序报告的详细信息,如下图所示。在这个报告中,首先可以看到Slack,其值为负,表明时序未收敛。接着看Source和Destination。通常,Source为时钟端口,如图中触发器的C端口;Destination为数据端口,如图中触发器的D端口。**从Source和Destination还可以看到起始cell和终止cell的驱动时钟,从而可判定该路径是否为跨时钟域路径。**这一点也可以从Requirement部分给出的信息加以验证。图中Requirement显示均为同一时钟,故此处为单一时钟下的时序路径。紧接着Path Type为Setup,表明该报告为建立时间路径报告,其后的信息Max at Slow Process Corner其中的Slow意味着High Temperature Low Voltage。如果是Path Type为Hold,表明该报告为保持时间路径报告,其后的信息为Min at Fast Process Corner,Fast意味着Low Temperature High Voltage。**对于Requirement一栏,一定要看Requirement是否合理,例如,如果Requirement为1ns,那么显然是不合理的,这说明时序约束本身有问题。**其后的Data Path Delay由两部分构成,逻辑延迟(对应图中的logic)和线延迟(对应图中的route)。这一栏同时显示了每部分延迟占的百分比。**对于7系列FPGA,如果逻辑延迟超过了25%,那么说明时序违例的主要原因是逻辑级数太高了;对于UltraScale系列FPGA,这个指标则为50%。对于7系列FPGA,如果线延迟超过了75%,那么说明时序违例的主要原因是线延迟太高了;对于UltraScale系列FPGA,这个指标则为50%。**对于Logic Levels,**通常认为1个LUT+1根net的延迟为0.5ns,**据此来评估逻辑级数是否过高。例如如果时钟为100MHz,那么逻辑级数在10/0.5=20左右是可以接受的。对于Clock Path Skew,如果该值超过了0.5ns,就要关注;对于Clock Uncertainty,如果该时钟是由MMCM或PLL生成,且Discrete Jitter超过了50ps,就要回到Clocking Wizard界面尝试修改参数改善Discrete Jitter。

    IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第14张图片

    对于跨时钟域路径,如下图所示,从Requirement部分信息可以看到源时钟和目的时钟是不同的,即可表明该路径为跨时钟域路径。这里Requirement为1ns,显然是不合理的,这说明跨时钟域路径的约束不合理。

    IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第15张图片

    总体而言,打开时序报告,要看路径Source、Destination、Requirement、Data Path Delay、Logic Levels、Clock Path Skew和Clock Uncertainty。还有一点至关重要,时序分析在综合之后就要开始分析,而不是等到布局布线之后再看。综合之后着重分析的是逻辑级数、资源利用率和控制集。

遇到时序问题怎么解决?

扇出太大,增加buffer或者复制几份信号。

讲一下建立时间和保持时间?
时序不满足,怎么办?
根据经典模型,写一下建立时间的公式?
保持时间和路径延时的公式?
建立时间和保持时间在器件级怎么理解?
什么是 jitter?
什么是 skew?

简言之,skew通常是时钟相位上的不确定,而jitter是指时钟频率上的不确定。造成skew和jitter的原因很多。

由于时钟源到达不同寄存器所经历路径的驱动和负载的不同,时钟边沿的位置有所差异,因此就带来了skew。

而由于晶振本身稳定性,电源以及温度变化等原因造成了时钟频率的变化,就是jitter。

时钟抖动(Clock Jitter):指芯片的某一个给定点上时钟周期发生暂时性变化,使得时钟周期在不同的周期上可能加长或缩短。
时钟偏移(Clock Skew):是由于布线长度及负载不同引起的,导致同一个时钟信号到达相邻两个时序单元的时间不一致。
区别:Jitter是在时钟发生器内部产生的,和晶振或者PLL内部电路有关,布线对其没有影响。Skew是由不同布线长度导致的不同路径的时钟上升沿到来的延时不同。

  • 改善时钟边沿,让其变化更加陡峭
  • 降低系统时钟
  • 引入同步机制,增加缓冲(二级寄存)
  • 使用工艺更好、建立与保持时间更短的器件

时钟歪斜是FPGA设计中最严重的问题之一。电路中控制各元件同步运行的时钟源到各元件的距离相差很大,时钟歪斜就是在系统内不同元件处检测到有效的时钟跳变沿所需的时间差异。为了保证各个元件的建立保持时间,歪斜必须足够小。若歪斜的程度大于从一边缘敏感存储器的输出到下一级输入的延迟时间,就能使移位寄存器的数据丢失,使同步计数器输出发生错误,故必须设法消除时钟歪斜。减少时钟歪斜的方法有以下几种:(1)采用适当的时钟缓冲器,或者在边缘敏感器件的输出与其馈给的任何边缘敏感器件输入端之间加入一定的延迟以减小歪斜。(2)严重的时钟歪斜往往是由于在FPGA内的时钟及其它全局控制线(如复位线)使负载过重造成的,在信号线上接一串线形缓冲器,使驱动强度逐步增大,可以消除时钟歪斜。(3)在受时钟控制的部件之后分别接入缓冲器,并在两个缓冲器输出端之间接一平衡网络。(4)采用FPGA内的PLL模块可以对输入时钟进行很好的分频和倍频,从而使时钟歪斜减到最低程度。
怎么解决上述的两个问题?
考虑上述问题,把 jitter 加入上述的公式?

后续会问的问题

什么时候毕业?
可以来实习嘛?
用的什么FPGA?
竞争冒险的解决办法。
亚稳态的概念及解决办法。
单bit和多bit的处理办法,除了异步FIFO和握手协议、双口RAM,还了解其他的吗?
建立时间和保持时间的概念、由什么决定。
Block RAM和分布式RAM。
DDR、PCIE、以太网的概念。
FPGA布局布线和时序错误遇到过吗?怎么解决?
UVM
三分频、占空比50%的代码。

module Div_three(
    input clk,
    input rst_n,
    output div_three
);
reg [1:0] cnt;
reg div_clk1;
reg div_clk2;
always @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        cnt <= 0;
    end
    else if(cnt == 2)
        cnt <= 0;
    else begin
        cnt <= cnt + 1;
    end
end
always @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        div_clk1 <= 0;
    end
    else if(cnt == 0)begin
        div_clk1 <= ~div_clk1;
    end
    else
        div_clk1 <= div_clk1;
end

always @(negedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        div_clk2 <= 0;
    end
    else if(cnt == 2)begin
        div_clk2 <= ~div_clk2;
    end
    else
        div_clk2 <= div_clk2;
    end
assign div_three = div_clk2 ^ div_clk1;
endmodule

英文自我介绍。
介绍一个自己的项目。
根据项目来问异步FIFO、单口RAM、仲裁的问题。
跨时钟域的方法。
握手协议需要几个cycle。
低功耗方法。
工艺制程对功耗的影响。
验证的问题。
fork_join三兄弟的区别。

IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第16张图片

IC前端面试总结(已拿NVIDIA和字节跳动ASIC芯片实习Offer)_第17张图片

验证方法学:driver\monitor\score borad\golden test.
英文问题:队列中插入数据的方法、怎么看待英伟达收购ARM。
为什么想来英伟达?
反问。
国庆节之前会出最终的结果。

低功耗方法学。

常见的低功耗技术

常见的技术可以总结为7种。其中前4种需要设计者重点关注,后面三种其实都集成到工具里了,不专门做这方面研究的知道个原理即可。

  1. power gating, 关电压。手动设计,需要重点关注。
  2. 多电源域设计。手动设计,需要重点关注。
  3. Frequency and Voltage scaling design。手动设计,需要重点关注。
  4. 应用层面优化。手动设计。玄学。可以关注。
  5. Clock gating。知道原理即可,工具自动优化。
  6. 逻辑门动态功耗优化。知道原理即可,工具自动优化。
  7. 晶体管阈值优化。知道原理即可,工具链自动优化。

FIFO、RAM存储的设计和验证。
跨时钟域的问题。
仲裁机制。
AMBA总线协议,APB\AHB\AXI\ACE的区别和联系。

AMBA (Advanced Microcontroller Bus Architecture) 高级处理器总线架构

AHB (Advanced High-performance Bus) 高级高性能总线

ASB (Advanced System Bus) 高级系统总线

APB (Advanced Peripheral Bus) 高级外围总线

AXI (Advanced eXtensible Interface) 高级可拓展接口

AHB主要是针对高效率、高频宽及快速系统模块所设计的总线,它可以连接如微处理器、芯片上或芯片外的内存模块和DMA等高效率模块。

APB主要用在低速且低功率的外围,可针对外围设备作功率消耗及复杂接口的最佳化。APB在AHB和低带宽的外围设备之间提供了通信的桥梁,所以APB是AHB或ASB的二级拓展总线。

AXI:高速度、高带宽,管道化互联,单向通道,只需要首地址,读写并行,支持乱序,支持非对齐操作,有效支持初始延迟较高的外设,连线非常多。

UART、IIC、SPI协议。
常用的Debug方法。
无毛刺的时钟切换电路设计。

setup, hold 时序问题的修复方法。
怎么看待英伟达收购ARM。

Arm是未来趋势,低功耗,x64。剪裁过RISC指令集会更高效,待机功率和运行功率相对来说都很低。我认为消费级产品使用Arm架构,为什么想来英伟达。因为我自己也用过Jetson 2 和Jetson Xavier,目前Arm架构的产品虽然有不足,但是随着越来越多的开发者开始开发Arm适配的软件,整个生态会变得前途无量。

喜欢硬件和数码产品,平时也会做视频剪辑和图像处理,所以会
还有哪些offer。

DFT(Design For Test)可测试性

  • 为什么要做DFT

    验证(Verification)的目的是检查设计中的错误,确保设计符合其设计规范和所期望的功能;而测试(Testing)则是检查芯片的加工制造过程中所产生的缺陷和故障。

后端

TCL脚本

VIVADO 之 TCL脚本工具 [上] (基本语法)_long_fly的博客-CSDN博客_tcl脚本

毕业哪一年:

什么时候可以出来实习,6,7,8月

职位有了解吗:

TR Flow,自动布局布线

最终生成GDS文件,交给工厂去生产

自己做的是偏前端,为什么对后端感兴趣。

之前写Verilog,但是存在时钟限制,对纯硬件的更感兴趣。

AI芯片和GPU是ASIC,跟FPGA不太一样,FPGA是可重载,ASIC功耗能效比会更好一些。

投产,开门的门禁。对于门禁这种场景需要降低成本。最终是做ASIC,FPGA是为了验证。

在里面碰到什么问题,如何体现自己的能力。遇到的问题是硬件问题没考虑到。大扇出,神经网络里有很多乘加运算,逻辑门电路,输入数据需要跟几十个、上百个运存电路进行运算,会造成扇出过大。在ASIC设计里会放Gbuff设计一下,在FPGA就是复制几分,均摊一下。

(Testing)则是检查芯片的加工制造过程中所产生的缺陷和故障。

后端

TCL脚本

VIVADO 之 TCL脚本工具 [上] (基本语法)_long_fly的博客-CSDN博客_tcl脚本

毕业哪一年:

什么时候可以出来实习,6,7,8月

职位有了解吗:

TR Flow,自动布局布线

最终生成GDS文件,交给工厂去生产

自己做的是偏前端,为什么对后端感兴趣。

之前写Verilog,但是存在时钟限制,对纯硬件的更感兴趣。

AI芯片和GPU是ASIC,跟FPGA不太一样,FPGA是可重载,ASIC功耗能效比会更好一些。

投产,开门的门禁。对于门禁这种场景需要降低成本。最终是做ASIC,FPGA是为了验证。

在里面碰到什么问题,如何体现自己的能力。遇到的问题是硬件问题没考虑到。大扇出,神经网络里有很多乘加运算,逻辑门电路,输入数据需要跟几十个、上百个运存电路进行运算,会造成扇出过大。在ASIC设计里会放Gbuff设计一下,在FPGA就是复制几分,均摊一下。

问题:入职时间,平时可否线上实习,线上远程时间比较自由。最少的到岗天数是多少。

你可能感兴趣的:(fpga开发)