数字IC笔试千题解--简答题篇(六)

前言

出笔试题汇总,是为了总结秋招可能遇到的问题,做题不是目的,在做题的过程中发现自己的漏洞,巩固基础才是目的。

所有题目结果和解释由笔者给出,答案主观性较强,若有错误欢迎评论区指出,资料整理来自于“数字IC打工人”等数字IC相关公众号,牛客网等网站真题、网络笔试真题及面经抄录。

        保持更新(2023.9.25)文章内含 单选题270道、多选题106道、填空题16道、判断题17道、简答题72道、逻辑推理题3道、C语言 python 脚本编程题8道
在本文中笔者提供的所有代码,都写成了API,可直接copy到软件编译、运行、给出结果。  

        题目较多,即使有前人解析和强大的ChatGPT,也难免出错,若发现错误,欢迎评论区讨论。

        另外夹带一点私货~: 这一刻,我感觉一定要给.....
数字IC笔试千题解总字数已到达15w+,网页码字卡顿情况严重,故将其分割成多个部分以方便维护,链接如下:
数字IC笔试千题解--单选题篇(一)
数字IC笔试千题解--单选题篇(二)
​​​​​​数字IC笔试千题解--多选题篇(三)​​​​​​
数字IC笔试千题解--填空题篇(四)
数字IC笔试千题解--判断题篇(五)
数字IC笔试千题解--简答题篇(六)
数字IC笔试千题解--逻辑推理篇(七)
​​​​​​​​​​​​​​ 数字IC笔试千题解--编程&&脚本篇(八)


简答题

1. setup time和hold time是否可以同时为负,为什么?

答案:setup time 和 hold time可以为负,但不能同时为负。

从定义上去分析,setup time是指寄存器的输入数据在时钟上升沿到来之前,数据需要保持不变的时间。hold time是指寄存器的输入数据在时钟上升沿到来之后,数据需要保持不变的时间。

所以setup time+ hold time其实是给了寄存器一个能够准确采样输入信号的时间窗口,如果setup time和 hold time都为负,则setup time+ hold time<0,即寄存器采样数据的时间窗口为负,就没法准确采样数据,所以答案为否。


2. 写出如下电路图的真值表

答案:考察与门和异或门输入与输出的关系。(tip:这是一个1bit全加器电路,S为和,C为进位)

与门:两个输入1–>输出1,其他情况–>输出0。

异或门:两个输入不同–>输出1, 输入相同–>输出0

B=0

B=1

B=0

B=1

A=0

C=0

C=0

S=0

S=1

A=1

C=0

C=1

S=1

S=0


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

答案: 在芯片设计中,PPA代表“性能(Performance)、功耗(Power)和面积(Area)”,是三个关键指标,也是衡量芯片设计质量的重要标准。

  1. 性能(Performance):是指芯片在特定工作负载下的运行速度和处理能力,通常用时钟频率、吞吐量、延迟等指标来衡量。

  1. 功耗(Power):是指芯片在工作时消耗的能量,通常用静态功耗和动态功耗来表示。静态功耗是指芯片在工作时未做任何操作时的能耗,动态功耗则是指芯片在执行各种操作时所消耗的能量。

  1. 面积(Area):是指芯片的物理大小,通常用晶圆面积或晶体管数量来表示。芯片的面积越小,就可以在同样的封装中容纳更多的芯片,从而降低制造成本和提高性能。

在实际应用中,设计师需要根据具体的应用场景和需求来确定PPA的优先级和权重,以实现最优的设计效果。


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

1.取指阶段(Instruction Fetch):从内存中取出下一条指令,存储到指令寄存器中。

2.译码阶段(Instruction Decode):将指令寄存器中存储的指令解码成对应的操作码和操作数,并确定指令的类型。

3.执行阶段(Execution):根据指令的类型和操作数,执行相应的操作,例如算术运算、逻辑运算、存储器读写等。

4.访存阶段(Memory Access):如果执行的操作需要访问内存,那么就将需要读取或写入的内存地址计算出来,并从内存中读取或写入数据。

5.写回阶段(Write Back):将执行结果写回到寄存器文件或存储器中,更新寄存器或存储器中的数据。

为了提高 CPU 的执行效率,现代处理器还会采用诸如流水线、超标量、动态执行等技术,将指令执行的不同阶段并行处理,从而实现更高效的指令执行。


5. 芯片设计中有些情况下会考虑将不同模块分时启动、分时停止,请闸述你对该场景的理解。

  1. 降低功耗:在芯片启动阶段,如果所有模块都同时启动,那么可能会导致瞬时功耗过高,超出电源的承受范围。而将不同模块分时启动可以避免这种情况的发生,从而降低整个芯片的功耗。

  1. 加快启动时间:将不同模块分时启动可以避免同时启动导致的系统响应时间过长的问题,从而加快芯片启动的速度。

  1. 方便调试和测试:在芯片设计的过程中,将不同模块分时启动、分时停止可以方便芯片设计人员对不同模块的功能进行测试和调试,从而提高开发效率和测试效果。


6. What is The Difference Between Byte And Bit [7:0]

答案:很容易让人陷入误区就是1 byte = 8 bit,但其实这是考察system verilog中byte变量类型和bit变量类型的区别。byte类型为二值逻辑有符号数,bit类型为为二值逻辑无符号数。SV数据类型如下:摘抄自绿皮书


7. What Is The Use Of $cast?

答案:动态转换中,当我们使用类的时候,类句柄的向下转换,即从父类句柄转换为子类句柄时,需要使用 $cast( ) 函数进行转换,否则会出现编译错误,把父类句柄转换成子类句柄只有这一种方法,一般是在父类句柄指向子类对象的时候,又想要访问子类的成员变量时,使用cast函数转换。如果父类句柄指向的是父类对象,那么不能用cast函数转换,哪怕转换了也会转换失败,即函数返回0.

详细可参考笔者其他文章:验证基础-类型转换、虚方法、回调函数、对象拷贝_显示转换 静态转换_不吃葱的酸菜鱼的博客-CSDN博客


8. What is The Difference Between Mailbox And Queue?

答案:考察SV基础,

1.mailbox必须通过new()函数例化,而队列只需要声明即可。

2.mailbox的存取方法put()和get()是阻塞方法,即使用它们时,方法不一定会立刻返回,而队列所对应的是存取方式,push_back()和pop_front()方法都是非阻塞的,会立刻返回。

3.在传递形式参数时,如果是input方向,那么信箱类型传递的是句柄,而队列类型则完成的是队列内容的拷贝。


9. How To Call The Task Which is Defined In Parent Object Into Derived Class ?

答案:考察SV基础,子类可以通过super.xxx访问父类的成员变量和方法。


10. sequence如何启动,说出任意种方法

start方法是uvm中启动sequence最本质、最根本的方法。start方法是“uvm_seuquence_base”类中的一个task。


    my_sequence seq;
    seq = my_sequence::type_id::create("seq");
    seq.start(m_my_driver);

11. Without Using Randomize Method Or Rand, generate An Array Of Unique Values?

使用时间作为随机因素:可以使用当前时间或仿真时间作为随机种子,并使用一些算法(例如,线性同余法)来生成伪随机数。


module testbench;
  initial begin
    int unsigned random_number;
    timeunit 1ns;
    time seed = $realtime;

    repeat (10) begin
      seed = seed + $realtime;
      $display("Seed: %0d", seed);
      random_number = seed % 31;
      $display("Random number between 0 and 30: %0d", random_number);
    end

  end
endmodule

12. 请列出SRAM与DRAM的不同之处?

SRAM(静态随机存取存储器)和DRAM(动态随机存取存储器)是两种常见的计算机内存类型,它们有以下几个不同之处:

  1. 存储原理:SRAM使用存储电路来存储数据,因此不需要刷新电路,存储速度快,一般用作Cache;DRAM使用电容来存储数据,需要定期进行刷新,存储速度较慢。

  1. 存储密度:由于SRAM的存储原理,每个存储单元需要的晶体管数量较多,因此相比于DRAM来说存储密度较低。

  1. 功耗:由于SRAM不需要进行刷新,因此功耗比DRAM低。

  1. 成本:由于制造工艺和存储密度的不同,SRAM的制造成本比DRAM高。

  1. 容量:由于存储密度的不同,DRAM比SRAM更适合存储大量数据。


13. 请列出一般系统中的Memory hierarchy.并解释系统中为何需要将存储器分层

一般系统中的Memory hierarchy如下:

  1. 寄存器(Register)

  1. 高速缓存(Cache, SRAM)

  1. 主存储器(Main Memory, DRAM)

  1. 辅助存储器(Auxiliary Storage)

存储器的速度越快,成本就越高。相反,存储器的成本越低,速度就越慢。使用Memory hierarchy可以通过在不同层次上使用不同类型的存储器来提高性能,并同时控制成本。例如,在寄存器中存储最频繁使用的数据,而在辅助存储器中存储不常用的数据,这样可以实现快速访问常用数据并降低成本。


14. 在一个CPU系统中,有2个Mster通过个2x1的AXI总线访问一个Slave,简述如何构造验证场景来进行验证,并保证验证的完备性

为了构造验证场景来进行验证并保证完备性,可以按照以下步骤进行:

  1. 设计测试计划:根据需求和规格文档,设计测试计划,确定需要验证的功能、性能和接口要求。

  1. 搭建仿真环境:根据需求和规格文档,搭建仿真环境,包括CPU系统、2个Master、AXI总线和1个Slave等组成部分。

  1. 编写测试用例:根据测试计划,编写测试用例,涵盖各种情况,包括正常情况、边界情况和异常情况等,例如读写操作、多Master并发操作等。

  1. 运行仿真:在仿真环境下运行测试用例,观察仿真结果,包括响应时间、数据正确性、错误处理等,以验证功能和性能的要求是否被满足。

  1. 分析仿真结果:根据仿真结果,分析测试用例的覆盖率和测试结果的有效性,发现和解决潜在的问题,以保证验证的完备性。

  1. 重复测试:在验证完成后,进行回归测试,保证之前通过的测试用例仍然可以通过,以保证系统的稳定性和可靠性。

  1. 提交验证报告:最后,根据验证结果,编写验证报告,总结验证的过程和结果,记录所有测试用例和验证结果,包括通过和失败的用例,以及未覆盖的部分和需要优化的地方等。

通过以上步骤的验证,可以确保验证场景完备性,使得设计实现能够满足系统规格要求,同时保证设计的正确性、可靠性和性能。


15. 用Veilog HDL简单实现x[7: 0]*480

先化简一下,x[7:0] * 480 = x [7:0] * (512-32)

assign out = (x<<9) - (x<<5);


16. 时序约束中,setup violation和hold violation的常见原因是什么?

这个从setup time slack和hold time slack的计算公式上出发解释就行。

setup_slack = clk_period + clk_path2_delay - dff_set_up - clk_uncertainty + clk_path1_delay + ck_to_q + logic_delay。

产生setup time violation的常见原因,可以是:1.时钟频率过高;2.数据路径组合逻辑延迟太大;3.异步电路信号采集错误;4.时钟抖动不稳定;5.后端寄存器时钟到达时间过慢。

hold time slack = clk_path1_delay + ck_to_q + logic_delay + clk_path2_delay + dff_hold + clk_uncertainty

产生hold time violation的常见原因,可以是:1.数据路径组合逻辑太短;2.时钟抖动不稳定;3.后端寄存器时钟到达时间过快。


17. FPGA产生两个输出脉冲,要求这两个脉冲之间的延迟为0.5ns,请描述你的实现方案。

用FPGA内部的模块,IODelay Components。

参考博客:产生脉冲之间的延迟_fpga产生ns级脉冲_傻童:CPU的博客-CSDN博客


18. 请画出如下语句综合后对应的电路(禾赛科技2022提前批)


reg out, int1, int2;
always @(posedge clk) begin
    out <= in1 & in2
    out <= in1 ^ in2
    out <= in1 l in2
end

会综合出最后一句out <= in1 l in2。

Verilog设计与逻辑综合实例解析(含代码) - 知乎 (zhihu.com)


19. 请画出如下语句综合后对应的电路


wire wire1, sel1, sel2, a,b,c;
assign wire1 = sel1==1 ? a : sel2 ? b: c

用了两个三目运算符,其实逻辑就是:


if(sel1==1)
    wire1 = a;
else if(sel2==1)
    wire1 = b;
else 
    wire1 = c;

综合出来是组合逻辑,用两个二选一的mux来做选择。


20. 请用尽量少的2选1 MUX实现一个两输入异或门。

用两个2选1 mux就行了。


21. 请分别解释LUT,CLB,BRAM,ISERDES,GTP,DSP

  • LUT (Look-Up Table):是FPGA中的基本逻辑单元,可以将其看作一个可编程的查找表,可实现各种逻辑运算和算术运算。LUT通常由多个输入和一个输出组成,其输入经过查找表的查找后,通过一个可编程的输出来输出结果。LUT是FPGA的重要组成部分,其数量和大小对FPGA的性能和资源占用有着重要的影响。

  • CLB (Configurable Logic Block):是FPGA中的一个可配置的逻辑块,由多个LUT、寄存器和其它可编程逻辑组成。CLB是FPGA中的核心组件之一,用于实现各种逻辑运算和状态机等电路功能。

  • BRAM (Block RAM):是FPGA中的一种存储器块,可用于存储数据和程序。BRAM可以配置为不同的宽度和深度,支持单口和双口读写操作。BRAM在FPGA中被广泛应用于FIFO缓存、DMA控制器、图像处理、FFT等领域。

  • ISERDES (Input Serializer/Deserializer):是FPGA中的一种输入序列化/反序列化器,用于将外部高速数据信号转换成FPGA内部时钟域的同步信号。ISERDES可以通过编程来配置各种输入时序和时钟域信息,可支持多种标准协议,如DDR、PCI Express、SATA等。

  • GTP (Gigabit Transceiver):是FPGA中的一种高速串行收发器,用于支持各种高速串行协议,如PCI Express、SATA、10G Ethernet等。GTP支持数据速率高达10Gbps以上,具有低功耗和低噪声等特点。

  • DSP (Digital Signal Processor):是FPGA中的一种可编程数字信号处理器,通常由多个硬件乘加器和寄存器文件组成,可用于实现各种数字信号处理算法,如滤波器、FFT、卷积、乘法累加等。DSP在FPGA中被广泛应用于音频、视频、雷达、通信等领域。


22. 请说明采用查表法实现8bit除以8bit的方法,并说明资源消耗情况。

要求x/y,就是求x*1/y

对1/y做查表法,y是ram的地址,1/y的结果用matlab算出来,保存为8bit二进制小数(整数为0),放到ram里。这样就用了2^8=256个 * 8bit = 256byte的ram空间。然后再和x相乘就行了


23. 使用verilog实现2个8bit补码的相加。

参考博客:补码加法运算_溢出判断——Verilog实现 - 代码先锋网 (codeleading.com)


module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); 
    assign s=a+b;
    assign overflow=((~a[7])&(~b[7])&s[7])|(a[7]&b[7]&(~s[7])); 
endmodule

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

方法:将较长的组合逻辑拆分成小段,在它们中间加寄存器减小组合逻辑delay

作用:可以提高时钟频率,提高数据吞吐量


25. 怎样用D触发器、与或非组成二分频电路?

将寄存器的输出Q端通过一个非门连接到寄存器的输入D端,每周期输出被取反一次,取反两次为Q的一周期。


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

一个异步FIFO, rdata和wdata均为8位数据,FIFO深度为16,当rst_n输入为低时,FIFO被复位,当wclk的上升沿采样到wr为高时,数据被写入FIFO,当rclk的上升沿采样到rd为高时,FIFO输出数据。此外,当FIFO为空时,empty信号输出为高,当FIFO满时,full信号输出无高。

1.写入和读取数据的基本测试,包括边界情况和常规情况。
2.确认写入数据和读出数据的一致性。
3.在FIFO满时进行写入测试,确认full信号是否正确。
4.在FIFO为空时进行读取测试,确认empty信号是否正确。
5.确认重置信号是否能够正确地清空FIFO,并设置empty和full信号的值。
7.验证读写时钟(rclk和wclk)是否正确的采样信号,并检查数据是否正确地从FIFO中读出。
8.测试FIFO深度是否正确,并确认FIFO是否可以正常处理各种数据数量。
9.测试不同的写入速率和读出速率,以确保FIFO在不同情况下的稳定性和正确性。
10.检查FIFO的异步读写是否能够正常工作。
11.确认FIFO是否能够正确地检测并处理任何错误,例如溢出和下溢。

27. 用D触发器搭建4进制的计数器。


module counter4(
    input             clk    ,
    input             reset  ,
    output reg [1:0]  cnt
);

always@(posedge clk) begin
  if (reset) begin
    cnt <= 2'b00; // 初始化为 0
  end
  else begin
    case(cnt)
      2'b00: cnt <= 2'b01;
      2'b01: cnt <= 2'b10;
      2'b10: cnt <= 2'b11;
      2'b11: cnt <= 2'b00;
    endcase
  end
end

endmodule

28. 设计一个同步fifo,读写时钟相同,其中在写入时每100个时钟周期会写10个,具体哪个时刻写入不确定,在读出侧每10个cycle会读1个,计算FIFO的最小深度?

答案:18。背靠背传输。

参考博文:FPGA笔试面试题之FIFO深度计算【字节跳动】【大疆】【简便计算公式】


29. 如下代码在综合时是否可以综合出时钟门控电路?如果能,画出时钟门控示意图,如果不能,请修改使信号out可以综合出时钟门控电路。


always @(posedge clk or negadge rst_n) begin
    if(rst_n==1'b0)
        out <= 64'b0;
    else if (en)
        out <= data;
    else
        out <=64'b0;
end

不能综合出门控时钟


module clkGating(
    input clk,
    input rst_n,
    input out_en,
    input [63:0] data,
    
    output reg out
    
);

reg en1;
wire clk_en;

always@(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
        en1 <= 1'b0;
    end
    else begin
        en1 <= out_en;
    end
end

assign clk_en = clk & en1;

always @(posedge clk_en or negedge rst_n) begin
    if(rst_n==1'b0)
        out <= 64'b0;
    else
        out<= data;
end

endmodule


30. 用Verilog语言实现一个带使能的模100异步清0计数器;模块定义为module count (out, count_en, clr, clk);


module count (out, count_en, clr, clk);

  output reg [6:0] out;
  input count_en, clr, clk;

  always @(posedge clk or negedge clr)begin
    if (!clr) begin
      out <= 7'd0;
    end
    else if (count_en) begin
           if (out == 7'd99) begin
             out <= 7'd0;
           end
           else begin
             out <= out + 1;
           end
    end
  end

endmodule

31. 动态功耗和静态功耗分别指的是哪些?可以通过什么方法降低?

动态功耗:P_dynamic= k*C*V*V*f + m*V*I_sc,和 电压、负载电容、工作时钟频率、信号翻转率、短

路电流有关;

电压角度:

(1)降低工作电压;(2)多电压域;(3)动态电压缩放DVS技术(处理器在不同工作模式下使用不同电压);(4)电源关断技术,power-gating;

负载电容角度:与工艺有关

(1)按比例缩小集成度,降低器件电容;(2)多芯片系统中,可以考虑多芯片封装,减低接口间电容;(3)合理的布局布线;

工作时钟频率角度:

(1)降低工作频率;(2)多时钟域;(3)门控时钟,clock gating;

数据翻转率角度:

(1)使用格雷码等状态翻转比较少的编码;(2)数据不操作说,保持上次的值,而不是强制置0或者置1;(3)使用使能信号、片选信号,减少不必要的切换;

静态功耗:P_static = V*I_leak,和 电压、漏电流 有关,而漏电流和工艺有关;

电压角度 V:

(1)降低工作电压;(2)多电压域;(3)动态电压缩放DVS技术(处理器在不同工作模式下使用不同电压);(4)电源关断技术,power-gating;

电流角度 I_leak(漏电流):

(1)使用HVT高阈值晶体管,漏电流小;(2)多阈值;


32. s(t)为fsk调制信号s(t)=x(n)sin(w1t)+x’(n)sin(w2t), {w1>w2},x(n)={1,011,01}.带通滤波的通带为w1±a,0<(w1-w2)/2 下图给出包络检波的解调框图,请画出b,c,d各点的波形,a点波形图如下。

在信号处理中,常见的一些基本概念如下:

  1. 带通滤波(Band-pass filtering):指将信号中某个特定频率范围内的信号通过,而将其他频率的信号阻止或衰减,从而实现对信号的滤波处理。带通滤波器通常用于去除信号中的噪声或某些频率成分,以获得更清晰的信号。

  1. 全波整流(Full-wave rectification):是指将信号的负半周期变为正半周期。通常使用二极管或整流电路来实现,可以将信号的幅值放大。

  1. 低通滤波(Low-pass filtering):是指将信号中的高频成分滤除,只保留低频成分。低通滤波器常用于去除信号中高频噪声,平滑信号或降低信号带宽。

  1. 抽样判决(Sampling and decision):是指对信号进行采样,通过一个决策器来对样本进行分类,以获得更好的信号质量。抽样判决通常用于数字通信中的调制解调过程中,可以使传输信号的抗干扰能力更强,同时提高误码率。


33.

1)请解释什么是input delay,什么是output delay?可以通过作图等方式来解释。

input delay:时钟触发后信号信号到达输入端口前经过的延迟。

output delay:输出端口输出信号后到下一个触发器采样前信号的传输延迟。

2)有如下图所示电路示意图,已知clock-2-Q的delay为1.5ns,时钟周期T=12ns,F0与F1之间的skew为1ns,setup time为1ns,hold time为0.5ns,为保证电路不会出现setup time violation和hold time violation的情况,求tc0_max, tc0_min, tc1_max,tc1_min

skew = 1ns,是指时钟到达F1比时钟到达F0早1ns。

这样的话,F0.clk->F1.D路径的偏斜就是 -1ns。F1.clk->F0.D路径的偏斜就是 1ns。

F0.clk->F1.D路径:

建立关系:tcq + tc0 + tsetup < tclk + tskew,1.5 + tc0 + 1 < 12 + (-1) ,tc0 < 8.5ns
保持关系:tcq + tc0 > thold + tskew,1.5 + tc0 > 0.5 + (-1),tc0 > -2ns。

F1.clk->F0.D路径:

建立关系:tcq + tc1 + tsetup < tclk + tskew,1.5 + tc1 + 1 < 12 + (1) ,tc0 < 11.5ns
保持关系:tcq + tc1 > thold + tskew,1.5 + tc1 > 0.5 + (1),tc0 > 0ns。

3)什么是OCV,为什么要使用OCV,并在所示的电路示意图中指出哪些路径受到OCV的影响?

On Chip Variation(OCV)是指芯片内部电路因为制造工艺的变化而导致的性能差异。这种差异可能会导致芯片设计者所预测的电路性能与实际电路性能不一致。OCV的影响因素有很多,例如制造工艺的变化、温度、电压、Aging等,这些因素都会导致电路性能的变化。

OCV影响的主要是器件性能,因此有器件的路径都会受OCV影响

参考博客:

介绍一下芯片OCV_伟酱的芯片后端之路的博客-CSDN博客

STA - PVT、RC、OCV_zhuangdk的博客-CSDN博客


34. 以下程序的功能是求100-999之间的水仙花数(水仙花数是指一个三位数的各位数字的立方和是这个数本身,如:153=1^3+5^3+3^3).请补充【 ?】处的代码


#include
int fun(int n){
    int i,j,k,m;
    m=n;
    【1】
    for(i-1;i<4;i++){
      【2】
       m=(m-j)/10;
       k=k+j*j*j;
    }
    if(k==n)
        【3】
    else return(0);
}
void main(){
    int i;
    for(i=100;i<1000;i++){
        if(【4】==1)
            cout<

补充后的代码


#include
int fun(int n){
    int i,j,k,m;
    m=n;
    k = 0;                    // 需要将 k 的初值设为 0
    for(i-1;i<4;i++){
       j=m % 10;              //取m的个位数
       m=(m-j)/10;
       k=k+j*j*j;
    }
    if(k==n)
        return(1);            //是水仙花数
    else return(0);
}
void main(){
    int i;
    for(i=100;i<1000;i++){
        if(fun(i)==1)         //如果是水仙花数,则输出
            cout<

35.题目描述如下,共5个小题:

Q1:如果报从FF_A到FF_B path的setup违例,请问是违反FF_A的setup还是FF_B的setup?(+2)如果报从FF_A到FF_B path的hold违例,请问是违反FF_A的hold还是FF_B的hold?(+2)

即数据在到达后一个寄存器的时候到达的太晚(setup violation)或太早(hold violation)a) 违反的是后一个寄存器FF_B的setup。b)违反的是后一个寄存器FF_B的hold

Q2请写出FF_A到FF_B path setup检查需满足period的条件公式?(+4)

CLK_D_A + A_CK2Q + Comb_D + B_setup < T + CLK_D_B
setup_slack = T + CLK_D_B - CLK_D_A - A_CK2Q - Comb_D - B_setup > 0

Q3.请写出FF_A到FF_B path hold检查需满足的条件公式?(+4)

CLK_D_A + A_CK2Q + Comb_D > CLK_D_B + B_hold
hold_slack = CLK_D_A + A_CK2Q + Comb_D - CLK_D_B - B_hold > 0

Q4.如果发现组合逻辑Comb_D太大超出预期,请列出可能的原因?(+4)

使得组合逻辑太大的原因有很多,比如①组合逻辑中有很多级联运算(乘法)、②组合逻辑的运算位宽很大,导致综合出来的门电路扇入扇出很大、③组合逻辑中有很多多余的操作,例如不必要的运算等、④输入的变量过多也会导致综合出来的门很复杂。

Q5.如果Comb只是两级buffer组成,Comb_D太大超出预期请列出可能的原因?(+4)

①buffer的负载过重,即大扇入扇出,缓冲器的负载过重可能导致缓冲器的传输延迟时间增加
②buffer本身质量就不好,具有较大延迟

36. 某主频为400MHz的CPU执行标准测试程序,程序中指令类型、执行数量和平均时钟周期数如下:

指令类型 指令执行数量 平均时钟周期数

整数 45000 1

数据传送 75000 2

浮点 8000 10

1.求该计算机的有效CPI(Cycle Per Instruction). MIPS(Million Instruction Per Second)和程序执行时间。

CPI = (整数指令执行次数 × 整数指令的平均时钟周期数 + 数据传送指令执行次数 × 数据传送指令的平均时钟周期数 + 浮点指令执行次数 × 浮点指令的平均时钟周期数) ÷ 总指令执行次数
CPI = (45000 × 1 + 75000 × 2 + 8000 × 10) ÷ (45000 + 75000 + 8000) = 2.5
其次,计算 MIPS:
MIPS = 主频 × 10^6 ÷ CPI
MIPS = 400 ÷ 2.5 = 160
最后,计算程序执行时间:
程序执行时间 = 总指令数 × CPI ÷ 主频
由于没有给出总指令数,我们需要先计算出来:
总指令数 = 整数指令执行次数 + 数据传送指令执行次数 + 浮点指令执行次数
总指令数 = 45000 + 75000 + 8000 = 128000
程序执行时间 = 128000 × 2.5 ÷ (400 × 10^6) = 0.8 秒
因此,该计算机的有效CPI为2.5,MIPS为160,程序执行时间为0.8秒。

2.若将CPU中浮点单元加速10倍,CPU整体性能提升比例是多少?

CPU整体性能提升比例可以用 Amdahl's Law 来计算:
加速前浮点指令所占的比例为 P,CPU 整体性能提升比例为 S,则有:
S = 1 ÷ (1 - P + P ÷ 10)
其中,P = 浮点指令执行次数 ÷ 总指令执行次数,即
P = 8000 ÷ (45000 + 75000 + 8000) = 0.0476
代入计算可得:
S = 1 ÷ (1 - 0.0476 + 0.0476 ÷ 10) ≈ 1.05
因此,若将上面CPU中浮点单元加速10倍,则 CPU 整体性能提升比例约为 1.05 倍。

37. 为该逻辑表达式作化简:Y=A'BC+ABC'+ABC+AB'C+AB'C'('表示取非运算)

利用卡诺图化简:Y=A+BC


38. 某IP有支持3种op操作:WRITE/READ/NOP,其中这个IP 40%是处于读的状态,40%是处于写状态,20%左右是处于NOP状态,请写出constraint(sv代码)

答案:这是一道验证的手撕题,涉及到的知识是生成随机变量,然后给随机变量下随机生成的权重约束即可。目的是随机生成三个OP code,按照比例4:4:2的方式送给slave。


randc int OP_code;
constraint OP_dist{
    OP_code dist {0:=40,1:=40,2:=20};
}

参考笔者其他博客:验证基础-随机约束与随机控制_地址不互相重叠 约束 sv_不吃葱的酸菜鱼的博客-CSDN博客


39. Please provide Linux shell command(s)to find all files which contains string "Montage" or "montage" in the/home/user.

答案:grep -rli 'Montage\|montage' /home/user/

- `grep` 命令用于在文件中搜索指定的模式。 - `-r` 选项用于在指定的目录和其子目录中递归搜索。 - `-l` 选项用于只输出包含模式的文件名,而不是匹配的行。(字母L的小写,如果没有这个,则会输出所有含有字段的文件名及对应行) - `-i` 选项用于忽略大小写。 - `'montage'` 是要搜索的模式。 - `/home/user/` 是要搜索的目录。


40. What's the Non_Blocking assignment(b <= a)and Blocking assignment(b = a)?

阻塞赋值(blocking assignment)使用等号(“=”)进行赋值,例如:`a = b;` 表示把变量 b 的值赋给变量 a,执行这条语句时,程序会等待赋值操作完成后再执行下一条语句。阻塞赋值是一种同步的赋值方式,它会按照顺序执行每个赋值语句,并且在当前赋值语句执行完毕之前,不会执行下一个赋值语句。

非阻塞赋值(non-blocking assignment)使用“<=”进行赋值,例如:`a <= b;` 表示把变量 b 的值赋给变量 a,执行这条语句时,程序不会等待赋值操作完成后再执行下一条语句,而是直接执行下一条语句。非阻塞赋值是一种异步的赋值方式,它可以同时执行多个赋值语句,每个语句的执行时间是不确定的。非阻塞赋值的执行顺序是无关紧要的,它只保证了所有赋值语句在一个时钟周期内都执行完毕。


41. Please use verilog write an 8bits asynchronous reset D flip-flop(8bits低有效异步复位的D触发器)


module ff_8bits(
    input         clk    ,
    input         rstn   ,
    input  [7:0]  D      , 
    output [7:0]  Q
);
reg [7:0] Q_reg;
always @(posedge clk or negedge rstn)begin
    if(!rstn)begin
        Q_reg <= 8'd0;
    end
    else begin
        Q_reg <= D;
    end
end
assign Q = Q_reg;
endmodule

42. What's the difference between "task" and "function" in Verilog?

task:

任务能调用另一个任务,也能调用另一个函数;
任务可以在非0仿真时刻执行;
任务可以包含延迟、时间或者时序控制声明语句;
任务可以没有或者有多个输入(input)、输出(output)和双向(inout)变量;
任务不返回任何值,任务可以通过输出(output)或者双向(inout)变量传递多个值;
任务的调用是通过一条单独的任务调用语句实现;
任务调用只能出现在过程块中;
任务的执行可以由disable语句进行中断。

function:

函数能调用另一个函数,但不能调用另一个任务;
函数总是在仿真时刻0就开始执行;
函数一定不能包含任何延迟、事件或者时序控制声明语句;
函数至少有一个输出变量,可以有多个输入变量;
函数只能返回一个值,函数不能有输出(output)、或者双向(inout)变量;
函数不能单独作为一条一句出现,它只能以语句的一部分的形式出现;
函数调用可以出现在过程块或者连续赋值语句中;
函数的执行不允许由disable语句进行中断。

43. Please use two methods to generate a 100MHz Clk signal in testbench,you can use verilog or system verilog


//method 1
always #5 clk = ~clk;
//method 2
initial begin
    forever #5 clk = ~clk;
end

44. What's the setup time and hold time in Synchronous circuit,and how to resolve if setup time was not met?

建立时间是指数据在寄存器采样之前,数据需要保持不变的时间

保持时间是指数据在寄存器采样之后,数据需要保持不变的时间

当出现了setup violation,可以通过如下方式解决:

a). 降低时钟频率;

b). 对critical path切分pipeline;

c). 用更好、更稳定的时钟;

d). 用采样速度更快的FF(让ck_to_q的时间变短)。


45. 请用下面CMOS组成反相器,与非门,或非门。

左边的为NMOS,右边的为PMOS,其实就是用NMOS、PMOS搭建反相器,与非门和或非门。

反相器:上拉PMOS,下拉NMOS。

与非门:上拉两个并行的PMOS,下拉两个串行的NMOS。

或非门:上拉两个串行的PMOS,下拉两个并行的NMOS。


46. What's the result of these function print A and print B?


`timescale  1ns/10ps

class BasePacket;
    int A=1;
    int B=2;
    
    function void printA;
        $display ("BasePocket::A is %0d", A);
    endfunction
    
    virtual function void printB; 
        $display ("BasePacket::B is %0d", B);
    endfunction 
endclass

class My_Packet extends BasePacket;
    int A=3;
    int B=4;
    
    function void printA;
        $display("My_Pocket::A is %0d", A);
    endfunction 
    
    virtual function void printB;
        $display("My_Pocket::B is %0d", B);
    endfunction 
endclass 

module tb_sv();
BasePacket P1;
My_Packet P2;

initial begin
    P1=new();
    P2=new();
    P1.printB;
    P1=P2;
    P1.printA;
    P1.printB;
    P2.printA;
    P2.printB;    
end
endmodule

答案:验证题,涉及到的知识点有继承、虚方法、父类子类调用同名成员变量和方法的问题。

首先,定义了两个类class,父类BasePacket,子类My_packet继承自父类BasePacket。子类和父类里面都有A、B两个变量,以及printA和printB两个打印方法。其中printB是虚方法。接着开始声明两个类,以及创建了各自的变量new(),。

这道题涉及的知识点有点多,容我一一道来

虚方法(virtual function):

当不同的句柄类型指向同一个对象的时候,它们调用的函数或者变量可能结果会不一样。在父类句柄指向子类对象的时候,如果子类和父类都定义了一个同名的方法,那么这个父类句柄只能访问父类的该方法而不能访问子类的方法,而事实上我们把它指向一个子类的对象更希望的是调用函数的时候它也能调用子类的方法,要想这样做,可以用cast函数把父类的句柄类型转换成子类的句柄,但是如果每次都这么做会使得代码很冗余,还容易出错。
虚方法要解决的问题就是一个动态绑定,不管句柄类型如何,只要你指向的是子类对象,那么调用方法的时候即使有同名方法,也会调用子类中的方法。虚方法通过virtual声明,只需声明一次即可。注意虚方法解决的是方法的同名索引,不能索引成员变量,没有虚成员的说法。

步骤分析:

题目总共有五个pinrt函数,主要看这五个print函数的各自结果是什么:

第一个print:父类对象访问父类虚方法,输出B is 2。这个没什么歧义。

第二个print:将父类句柄指向子类对象,使用printA,由于printA不是虚方法,所以父类句柄只能访问父类的该方法而不能访问子类的方法,调用的printA是父类的printA,故输出A is 1。

第三个print:将父类句柄指向子类对象,使用printB,由于printB是虚方法,只要你指向的是子类对象,那么调用方法的时候即使有同名方法,也会调用子类中的方法。调用的是子类中的printB,故输出B is 4。

第四个print:子类继承父类,在父类和子类里,可以定义相同名称的成员变量和方法(形式参数和返回类型也应该相同),而在引用时,将按照句柄类型来确定作用域。 printA是子类的方法,子类直接调用printA,作用在子类的作用域,输出A is 3。

第五个print:和第四个print一致,输出B is 4。

vcs仿真结果如下与分析一致:


47. 一个好的验证流程可以在一定程度上保证验证的质量和效率,假设当你要验证一个DUT的时候。你会按照怎样的流程进行验证?请列出每个step并给出详细说明

以下是一个基本的DUT验证流程,包含了常见的步骤和建议:

1.确认验证需求和规范:确定DUT的验证需求,包括所需的输入、输出、时序等,并确定使用的验证规范(如UVM、OVM等)。
2.编写测试计划:编写测试计划,包括测试目标、测试场景、测试用例、测试环境等。
3.编写测试用例:根据测试计划编写测试用例,每个测试用例应当包含输入、输出、预期结果以及实际结果比较。
4.构建验证环境:构建DUT的验证环境,包括建立信号接口、创建仿真模型、设置仿真时钟、生成仿真数据等。
5.运行仿真:使用仿真器运行测试,对DUT进行功能验证、时序验证、边界条件验证等。
6.分析仿真结果:对仿真结果进行分析,检查实际结果与预期结果是否一致,识别故障点并进行debug。
7.确认验证覆盖率:通过评估测试用例的覆盖率,确认已经充分验证了DUT的功能。
8.优化验证:根据覆盖率评估结果,对测试计划、测试用例、验证环境等进行调整和优化,以提高验证效率和覆盖率。
9.验证通过:当DUT的验证结果满足设计规范和验证需求时,确认验证通过并准备进行后续流程,如集成测试、验证报告等。

总之,一个好的DUT验证流程应当具备规范、可重复、可扩展、高效的特点,能够充分覆盖DUT的功能和时序,并保证验证结果的准确性和可靠性。


48.如何用一个2选一的MUX和一个INV实现异或。

out = A'B+AB',异或逻辑


49.What are recovery and removal times?请描述recovery时间和removal时间的概念。

同步电路中,输入数据需要与时钟满足setup time和hold time才能进行数据的正常传输,防止亚稳态;

类似的,对于一个异步复位寄存器来说,置位和复位信号同样需要和时钟满足recovery time和removal time才能有效进行置位和复位操作

recovery time:恢复时间。撤销复位时,恢复到非复位状态的电平必须在时钟有效沿到来之前的一段时间到来,才能保证时钟能有效恢复到非复位状态,此段时间为recovery time。

removal time :撤销时间。撤销复位时,在时钟有效沿到来之后复位信号还需要保持的时间为撤销时间removal time。

comment:从定义可以看出,recovery timeremoval time都指的是撤销复位或者置位而言的,即系统或者设备将要work起来,并不是指复位和撤销置位(系统或者设备都要停止work了,还管它亚稳态作甚!)


50.The clock cycle is T, the clock toregister output delay is Tco, setup and hold time of a register are Tsetup andThold, what's the Tdelay constrain?时钟周期为T,时钟到寄存器输出延时Tco,寄存器建立时间Tsetup,寄存器保持时间Thold。请描述逻辑延时Tdelay的建立和保持时间要求(不考虑时钟延时)。

STA分析。

setup分析:Tco+Tdelay+Tsetup

hold分析:Tco+Tdelay>Thold


51.What's the difference between a LATCH anda DFF?请描述LATCH和DFF的概念和区别?

1、latch由电平触发,非同步控制。在使能信号有效时latch相当于通路,在使能信号无效时latch保持输出状态。DFF由时钟沿触发,同步控制。

2、latch容易产生毛刺(glitch),DFF则不易产生毛刺。

3、如果使用门电路来搭建latch和DFF,则latch消耗的门资源比DFF要少,这是latch比DFF优越的地方。所以,在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现。

4、latch将静态时序分析变得极为复杂。


52.What's the difference between asynchronous and an asynchronous circuit?同步电路和异步电路的区别是什么?

同步电路和异步电路的区别在于电路触发是否与驱动时钟同步,从行为上讲,就是所有电路是否在同一时钟沿下同步地处理数据。


53.What is IR-drop, in which area will beeasy to have IR-drop problem ?什么是IR-drop,在那些地方容易出IR-drop问题?

IR-drop是指由于电阻对电流的阻碍而产生的电压下降。在一个电路中,当有大量电流通过一条线路或电源时,电路的电阻会导致该线路或电源的电压下降,这种现象就是IR-drop。

IR-drop问题通常在芯片的电源和地电路中出现,特别是在大型数字电路中,如处理器和存储器。这些电路中的大量晶体管和连线会导致电阻增加,从而导致IR-drop问题。此外,在高速设计中,电源和地电路中的电感和电容也会导致电压下降,并增加IR-drop问题的发生。


54.How do you synchronize an asynchronousinput?异步信号如何进行同步?

单bit:从慢到快,采用两级触发器,减少可能出现的亚稳态影响;从快到慢,脉冲展宽

多bit:异步FIFO、DMUX、Dual RAM;寄存器锁存,握手协议,有效使能后同步;


55.There is an X present in my gate-levelsimulation due to a timing violation. How do you identify the source of it andthe type of violation? 如果在后仿中波形中出现了X,如何去定位,且可能是什么问题?

1、仿真pattern自身原因,比如程序使用了未初始化(写)的存储区,读出红X的数据并使用,导致红X传播;

2、仿真环境或者平台原因,模型或者整chip顶层PIN脚的信号没有驱动,是高阻Z态,进入数字逻辑内部变成红X传播;

3、DFF、gating cell等由于setup/hold不满足,或者rst信号的recovery/removal不满足,或者异步逻辑同步的第一拍DFF,产生红X引起传播;

4、不带复位端的DFF引起X传播

X态也就是亚稳态,他是会传播的:亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。


56.Please describe the ECO flow(includingpre-mask ECO and post-mask ECO).请描述ECO流程,包括pre-mask和post-mask ECO。

ECO(Engineering Change Order)流程是在芯片设计完成后,发现问题需要修正时所采取的一种流程。这个过程主要分为两个阶段:pre-mask ECO 和 post-mask ECO。

  1. pre-mask ECO:pre-mask ECO 是在设计完成后芯片还未进入工艺制造前所进行的修改。该流程的主要目的是解决设计中存在的问题,如电路逻辑不正确、功耗太高或者时序不满足等问题。在 pre-mask ECO 过程中,设计团队通常使用 RTL 仿真验证 EC0 的修复效果,并进行网表级仿真,以确保修复不会引入新问题。

  1. post-mask ECO:如果在芯片生产后还存在问题,则需要进行 post-mask ECO。这个过程的主要目的是在芯片生产过程中发现的问题进行修复。在 post-mask ECO 过程中,设计团队需要将已制作的芯片样品反馈回来进行修改,从而修复设计中的问题。通常,post-mask ECO 采用物理层面上的修改来解决问题,例如通过引入金属连接或者改变物理结构等方式进行修复。

总体来说,ECO 流程是在芯片设计完成后所进行的一种修复流程。其中 pre-mask ECO 是在芯片制造前进行的修改,而 post-mask ECO 是在芯片生产后进行的修改,通过这两个过程来确保芯片设计的正确性和完整性。


57.What are various techniques to resolve routing congestion?如何解决routing congestion问题?

Routing congestion是指在布线时出现的信号线相互干扰或布线资源不足的情况,导致某些信号线无法被成功布线。以下是几种解决routing congestion问题的方法:

1.增加布线资源:可以增加布线资源,如增加线路的层数、增加线宽等。但这种方法可能会导致板子变得更大,成本更高。

2.降低信号速率:减少信号的传输速率可以减少信号线之间的干扰。但是这种方法可能会影响电路的性能和速度。

3.重分配布局:重新安排电路的布局,以减少布线资源的使用。这可以通过重新设计PCB布局来实现。

4.使用优化的布线算法:使用能够处理routing congestion问题的优化布线算法,例如Maze routing算法和Lee-Moore算法等。这些算法会优化路径选择和布线资源的使用,从而减少routing congestion的发生。

5.使用阻抗匹配:对布线电路进行阻抗匹配,使其更加稳定和可靠,从而减少信号线之间的干扰。这种方法需要专业的阻抗匹配工具和技术。


58.Please describe the rtl with INV, AND, OR andDFF. 请用与、或、非门和寄存器画出代码所描述的电路。


always@(posedgeclk or negedge rst_n)
begin
    if(!rst_n) begin
        cnt<= 2'd0;
    end
    else if(cnt_en) begin
        if(ina)
            cnt <= cnt+2'd1;
    end
    else begin
        cnt <=2'd0;
    end
end

异步复位寄存器。代码中涉及到了加法和选择,先画一个全加器的门级电路。全加器涉及到异或,所以再画一个异或电路。最后根据代码中的mux情况,把全加器和mux连起来。(tips:笔者画图的时候忘记不能用mux了,可以用与门和或门实现二选一mux)

59.What are the different sources of powerconsumption? Please describe different techniques used to reduce powerconsumption.芯片的功耗分为哪种类型,请描述降低功耗的方式。

功耗分为动态功耗和静态功耗。

动态功耗公式为:P_switch=1/2CV^2f。

降低动态功耗

(1)使用门控时钟
降低活动因子是降低功耗的非常有效的办法
(2) 减小毛刺
毛刺会增大活动因子,有可能使门的活动因子增加到1以上。
(3)减小负载电容
电容来自于电路中的连线以及晶体管。缩短连线长度,良好的平面规划和布局可以使连线电容减小。选择较小的逻辑级数以及较小的晶体管可以减小器件的翻转电容。
(4)电压域
动态功耗与电压有平方的关系,降低电源电压可以显著降低功耗。将芯片划分成多个电压域,每个电压域可以根据特定电路的需要进行优化。例如,对于存储器采用高电源电压来保证存储单元的稳定性,对于处理器采用中等大小的电压,对运行速度较低的IO外围电路采用低电压。解决跨电压域信号传输的方法是使用电平转换器。
(5)动态电压调整DVS
CPU处理不同的任务有不同的性能要求。对于低性能要求的任务,可以使时钟频率降低到足以按预定时间完成任务的最低值,然后使电压降低到该频率下工作所需要的最小值就可以节省大量的能耗。
(6)降低频率
动态功耗正比于频率,芯片只应当工作在所要求的频率下,不能比所要求的还要快。由前面小结可以,降低频率还可以采用较低的电源电压,大大降低功耗。
(7)谐振电路
谐振电路通过使能量在储能元件如电容或电感之间来回传送而不是将能量泄放到来减小翻转功耗。

降低静态功耗:

(1)电源门控
减小静态电流最容易的方法就是关断休眠模块的电源。这一技术称为电源门控。
(2) 多种阈值电压和栅氧厚度
有选择的应用多种阈值电压可以使具有低Vt晶体管保持性能而又使具有高Vt晶体管的其他路径减少泄漏。
大多数纳米工艺的逻辑管采用薄栅氧,IO晶体管采用厚的多的栅氧以使它们能够承受较大的电压。
(3)可变阈值电压
通过体效应可以调制阈值电压。在休眠模式下应用一个反向体偏置减小泄漏。在工作模式下利用一个正向体偏置来提高性能。
(4)输入向量控制
由前面可知,堆叠效应和输入排序会引起亚阈值泄漏和栅泄漏的变化。因此,一个逻辑模块的泄漏与门的输入有关。输入向量控制是当模块置于休眠模式时,应用一组输入图案使模块的泄漏最小。这些输入向量可以通过寄存器上的置位/复位输入端或通过扫描链加入。

参考博客:静态功耗与动态功耗_yuzhong_沐阳的博客-CSDN博客


60.Implement below RTL logic with DFF andNOR/NAND/INV cells:


always@(posedge clk or negedge rst_n) begin
    if(!rst_n)
        C<=1'b0;
    else if (B)
        C<=~A;
    else;
end    

不考虑复位信号,C的表达式可以写为:C = B'C+BA',进而得到电路图。


61.什么是亚稳态?如何防止亚稳态传播或减少亚稳态概率?

亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。

亚稳态具有如下特点:

1)亚稳态违背了时序,无法在规定时间成为稳态。

2)亚稳态输出不确定,但是会传给后一级触发器。这会导致后级电路出错。所以亚稳态危害很大。

3)亚稳态最终都会稳定下来,但需要较长的时间。

Tsu为建立时间:是指在触发器的时钟信号上升沿到来以前,数据稳定不变的时间,如果建立时间不够,数据将不能在这个时钟上升沿被稳定的打入触发器,Tsu就是指这个最小的稳定时间。

Th为保持时间:是指在触发器的时钟信号上升沿到来以后,数据稳定不变的时间,如果保持时间不够,数据同样不能被稳定的打入触发器,Th就是指这个最小的保持时间。

Tco为输出时间:是触发器在clk时钟上升沿到来之后需多长的时间才能稳定输出的的时间。

Tmet:亚稳态输出恢复到稳定状态所需的超出Tco的额外时间称为稳定时间,即经过这段时间,亚稳态变成稳态了。

如果数据传输中不满足触发器的Tsu和Th,就会造成数据不稳定,从而导致亚稳态。

如何避免亚稳态:

异步信号、跨时钟域信号都是亚稳态高发区。

对于异步信号,一般采用多级同步器,可以避免亚稳态的发生。

对于跨时钟域信号,通常有4 种方法跨时钟域处理方法

(1)打两拍,两级触发器同步—单bit数据跨时钟域处理,适用于慢时钟域数据到快时钟域;

(2)异步FIFO—多bit数据跨时钟域处理;

(3)格雷码转换;

(4)加握手信号(guide信号)。


62.翻译以下段落,并根据描述画出I2C接口的start和stop时序:

The I2C bus employs two signals, SDA(data)and SCL (clock), to communicate between integrated circuits in a system.Thebus transfers data serially, one bit at a time. The 8-bit address anddatabytes are transferred with the most-significant bit (MSB) first. Inaddition, each byte transferred on the bus is acknowledged by the receivingdevice withan acknowledge bit. Each transfer operation begins with the masterdevicedriving a start condition on the bus and ends with the master devicedriving astop condition on the bus. The bus uses transitions on the data pin(SDA) whilethe clock is at logic high to indicate start and stop conditions. Ahigh-to-lowtransition on the SDA signal indicates a start, and a low-to-hightransitionindicates a stop. Normal data-bit transitions must occur within thelow time ofthe clock period.

I2C总线采用两个信号,即SDA(数据)和SCL(时钟),在系统中的集成电路之间进行通信。该总线逐位串行传输数据。8位地址和数据字节以最高位(MSB)优先的顺序传输。此外,总线上传输的每个字节都由接收设备用一个确认位进行确认。每次传输操作都是由主设备在总线上发送起始条件并以主设备在总线上发送停止条件结束。总线在时钟处于逻辑高电平时使用数据引脚(SDA)上的转换来表示起始和停止条件。SDA信号上的从高到低的转换表示起始,而从低到高的转换表示停止。正常的数据位转换必须在时钟周期的低电平期间内发生。


63.The following schematic shows datapath operators going into a register. From power perspective, figureout the inefficient part and draw a new schematic with your fix.

低功耗设计,加一个门控时钟:


64.Suppose there is a logfile

The file's content is like:

__

should be "ERROR" or"WARNING" or "INFO"

should be "TYPE" plusan integer number.

Please write a function named as printErrors to parse the log, filter out required information and print some messages. Given astring logPath representing the log file path.

The requirements are:

a. The output messages should be ERROR level and their MESSAGE_CONTENT should contain “NVIDIA_SOC”

b. Sorted the output order by MODULE_TYPE number

c. Use any script language you like.

###

Example 1:

log file.

ERROR_TYPE1_NVIDIA

INFO_TYPE1_NVIDIA SOC

ERROR_ TYPE4_THIS_IS_NVIDIA_SOC

WARNING_TYPE2_SOC

ERROR_TYPE1_SOC

ERROR_TYPE1_NVIDIA_SOC_TEAM

ERROR_TYPE4_NVIDIA_SOC

ERROR_TYPE12_NVIDIA_SOC

Example 2:

log file:

ERROR_TYPE1_NVIDIA

ERROR_TYPE12_NVIDIA_SOC

ERROR_TYPE1_Nvidia_soc

INFO_TYPE2_NVIDIA_SOC TEAM

ERROR TYPE12 NVIDIA SOC

###

Please provide your answer in the following editor


65.Gate level logic netlist_ais optimized to netlist_b in back-end flow. And they are checked by formalcheck tool to prove whether they are functional equivalence. Please answer belowquestions.

1.What is the concept of combinational and sequential logic?Please classify A/B/C/D cells in below netlist_a schematic, which belong to combinational logic and which belongs to sequential logic?

①:

组合逻辑输出仅依赖于输入,而与电路的先前状态无关。

时序逻辑输出不仅取决于输入,还取决于电路的先前状态。

②:

A是时序逻辑,BCD是组合逻辑。

2. If the value vector 110 is applied to the left three flops D pin After 1 cycle what is the D pin value of the reg_d in netlist_a/netlist_b?

netlist_a:输出1

netlist_b:输出0

3. Please estimate if above netlists are function equivalent or not according to the netlist schematics and explain why?

不等效,结果都不一样。


66. 3-stages pipelinecircuit shown as below.

The clock period is 0.9

The clock uncertainty is 0.1

The cell delay for F1/F2/F3 from CP-> Q are 0.15

The library setup require time for F1/F2/F3 are 0.1

1. Please calculate the setup slack between F1 and F2

答案:setup 时序分析公式如下

clk_latency + clk_pathF1_delay + ck_to_q + logic_delay < clk_period+clk_latency + clk_pathF2_delay - dff_set_up - clk_uncertainty

1.3+0.6+0.15+0.8<0.9+1.3+0.5-0.1-0.1

2.85<2.5

time slack = - 0.35ns

2. Please describe what's clock skew and suggest how to fix the setup violation between F1 and F2 with clock skew

clock skew就是同一个时钟源到不同寄存器中间的时间差,也就是上面的:

clk_pathF2_delay-clk_pathF1_delay

上一题中的clock skew = -0.1

从clock skew的角度出发,修复时序违例,可以在后一级时钟的时钟路径上加buffer,把clk_pathF2_delay增大。

3. Please re calculate the slack betweenF2 and F3 after the setup violation between F1 and F2 are fixed to 0

修复了时序为例后,clk_pathF2_delay=0.85ns。用第一题同样的公式可以计算出F2和F3的setup time slack:

clk_latency + clk_pathF2_delay + ck_to_q + logic_delay < clk_period+clk_latency + clk_pathF3_delay - dff_set_up - clk_uncertainty

1.3+0.85+0.15+0.1<0.9+1.3+0.5-0.1-0.1

2.4<2.5

time slack = 0.1ns


67.Please use NAND2 gatesto create new logic signal as below: (Use as less gates as possible) New_ logic= ECO_SELECT? Original_logic & mask: original logic;

答案:可以把上面的逻辑表达式化为加法形式。

上面的公式太复杂,用简单字母表示:

Y=A?B&C:B=ABC + A'B=B(AC+A')=B(A'+C)=B(AC')'

C接一个与非门得到C'。C'和A接一个与非门得到(AC')'。B和(AC')'接两个与非门得到B(AC')',所以总共需要四个与非门。


68.Design a sequence(10100) detector. The logic with single bit input and single bit output. When detecting input bit with the sequence of 10100 output pulse with one cycle of 1'b1,otherwise output keeps 1'b0. (No need to write RTL code, just provide a schematic diagram or a state machine flow chart.)

画序列检测的状态转移图。S5状态输出1,其他情况输出0.


69.如下所示assertion,请问在图示波形中哪个时钟可以判定为success?

答案:

disable iff语句可以用来在某个条件下暂时禁用一个断言。

EN信号高电平有效,等到A上升沿的时候,其前一个周期(~B)成立,等待0个周期,(B&&~C)成立,等待1个周期;直到D为1的过程中,(B&&C)语句一直成立;等待1个周期,B成立。

所以综上所述,第15个时钟会判定为success。

参考博客:systemVerilog Assertion (SVA)断言语法_OnePlusZero的博客-CSDN博客


70.有一个电路模块M,其功能如下图。

假设只有如下器件:

请用上述器件搭建实现该功能的电路。

数字在2,3,7,5,4,0循环,用二进制表示就是:010,011,111,101,100,000,很容易发现相邻两个数字的变化只有1bit,进而联想到这是格雷码。类似格雷码,但又有所区别,因为格雷码从010到下一位是110,这里是011,所以需要做个判断。具体实现就是计数器从2到3的时候,输出结果右移一位,计数器到7的时候,下一周期转到0。再从2开始计时。

题目出的不好,这样子没规律搭电路很费时,又不知道有啥意义,最后还给了每个门的时间,又没给时钟周期,STA分析都做不了。

或者有人发现有规律的话,在评论区补充,我修改一下。


71.请回答以下问题:

(1)请简单解释时钟的skew和jitter的概念

Clock skew是一个信号时钟沿着同一个时钟网络到达源寄存器和目标寄存器的时间差。

Clock jitter是由于晶振不稳定导致的时钟抖动,不可避免。

(2)请描述可测性设计(DFT:design for test)与验证的区别是什么

可测性设计是指在设计阶段考虑测试的策略和工具,以确保芯片可以被有效地测试和诊断。可测性设计的目标是设计一个易于测试和诊断的芯片,以便在生产和使用过程中可以快速、准确地检测故障并进行修复。可测性设计包括设计布线、设计扫描链、测试点的选择等等。

验证则是验证设计是否符合规格说明书和要求。验证的目的是确保设计满足其预期的功能和性能,并且在各种情况下都能正常工作。验证过程通常使用仿真、验证工具和硬件测试进行。

简而言之,DFT旨在使芯片易于测试和诊断,而验证则旨在验证设计是否符合规格说明书和要求。


72.下图电路在同一时钟域中,实现的功能是在SEL0与SEL1分别为0和1时,将DATA0加DATA1的结果传给REG输入端。

现需要降低该电路的功耗,请使用常见的逻辑单元,在不改变上述电路功能的原则下修改,画出修改后的电路图。

一个二选一MUX需要用4个与非门实现:

一个与门用两个与非门实现,一个非门用一个与非门实现。

优化后的电路实现了相同的功能,相比较两个MUX(八个与非门),这里只用了五个与非门,博主没有细想,可能还有优化空间,欢迎评论区讨论。


73.格雷码在异步电路中的应用:

4bit宽的binary code与Gray code之间的转换公式如下:

reg[3.0]g: //Gray code

reg[3.0]b: //Binary code

g[0]=b[0]^b[1]: b[3]=g[3]:

g[1]=b[1]^b[2]: b[2]=g[3]^g[2];

g[2]=b[2]^b[3]: b[1]=g[3]^g[2]^g[1];.

g[3]=b[3]: b[0]=g[3]^g[2]^g[1]^g[0];

设有两路异步clock:clk0,clk1,要求在ck0 domain产生一个4bit计数器,并把计数结果传输到ck1 domain(Fclk1>2*Fclk0),请用Verilog实现该设计:

如果计数器步进为2,即按照0->2->4->6->0这样的顺序循环,上述设计会存在什么问题?

过段时间再来做。


74.某电路有如下的Waveform:

其中,clk,din[2:0]为输入;out1,out2为输出。din[2:0]的值是随机的。

(1)请使用1个DFF,若干与,或,非门,实现上述功能,并画出电路图

答案:

(1)din是输入,out1在din=2,3,7的时候,会拉高,out2是一个上升沿检测电路。

din=2,3,7,这些数字用二进制表示为:010,011,111。

所以out1=din[0]'din[1]din[2]'+din[0]din[1]din[2]'+din[0]din[1]din[2]

对out1打一拍再和out1做异或可以得到out2

(2)使用Verilog语言对上述电路进行描述。


module out_1_2(
  input       clk   ,
  input [2:0] din   ,
  output      out1  ,
  output      out2
);
reg out1_beat;
always @(posedge clk)begin
  out1_beat <= out1;
end
assign out1 = ((!din[0])&&din[1]&&(!din[2])) + (din[0]&&din[1]&&(!din[2])) + (din[0]&&din[1]&&din[2]);
assign out2 = out1_beat ^ out1;

endmodule 

75.静态时序分析

对于如下电路图:

图中Timing参数解释:

Thold Hold time最小时间
TSu Setup time最小时间
TCq Clock-> Q delay
输入IN的Input Delay恒为0.5ns.

1.求出该电路所能达到的最大频率?

求最大频率检查setup路径。

FF1到FF2的setup:

clk_latency + clk_pathF1_delay + ck_to_q + logic_delay < clk_period+clk_latency + clk_pathF2_delay - dff_set_up - clk_uncertainty

1+2+2+2+2

FF2到FF1的setup:

寄存器1 的data_arrive有两条路径,一条是从din直接到D端的Path1,另一条是从F2的Q端到D端Path2。

Path1 :0.5 + 2 = 2.5 ns(din + Tandgate)组合逻辑路径

Path2 :1 + 1 + 2 + 2 = 6ns (两个buffer+Tcq+Tandgate)时序逻辑路径

最长的delay为Path2

clk_latency + clk_pathF2_delay + ck_to_q + logic_delay < clk_period+clk_latency + clk_pathF1_delay - dff_set_up - clk_uncertainty

6< clk_period+1-3,得到clk_period最小为8ns,最大频率为120MHz,

两条路径分析,取小频率,所以该电路达到最大频率为100MHz。

2.时钟频率为50M,该电路是否有时序违规?如果有,写出计算过程,并给出修改意见.

时钟频率为50M,经过我们第一题的分析,该电路一定不会出现setup违例,所以需要检查hold violation。

FF1到FF2的hold:

1+2+2+2+2>1+1+2成立

FF2到FF1的hold:

0.5+2>1+2,不成立,hold violation。

修改意见:① 需要将IN的输入延迟增加到1ns以上。② 给路径FF2到FF1换个更大延迟的与门。


76.简述芯片设计制造的流程

  1. 需求分析和规划:根据产品需求和市场研究,确定芯片的功能、性能、功耗、尺寸、成本等要求,制定项目计划和时间表。

  1. 设计前端:包括电路设计、功能验证、逻辑综合、时序分析等。设计人员通过EDA(Electronic Design Automation)工具对芯片的各个功能模块进行电路设计,并对电路进行仿真、验证,生成原理图和电路网表。然后对电路进行逻辑综合和时序分析,生成综合后的网表。

  1. 物理设计:包括布图、布局、布线和物理验证等。设计人员将综合后的网表进行布图和布局,确定各个模块的位置和大小,然后进行布线,将芯片内的各个模块连通,形成电路。最后进行物理验证,确认电路的正确性和可制造性。

  1. 设计后端:包括设计验证、测试、验证、修复和产生GDSII等。通过EDA工具对布局和布线进行验证和测试,识别电路中的错误和缺陷,并进行修复。然后生成芯片的GDSII文件,这是一种数字格式,描述了芯片的物理结构。

  1. 制造:包括掩模制作、晶圆制造、封装测试等。通过GDSII文件制作光掩模,然后使用光刻技术在晶圆上制造芯片。制造完成后,对芯片进行封装和测试,确保芯片的性能和质量符合要求。


77.如何用UVM验证方法搭建验证平台,简述思路即可(包括各个部分的功能)

UVM(Universal Verification Methodology)是一种用于构建验证环境的标准方法,该方法可以帮助验证工程师提高验证效率和可维护性。下面是搭建UVM验证平台的一般思路:

  1. 编写DUT模型:首先需要准备待验证的DUT模型,可以使用Verilog、VHDL等硬件描述语言编写,也可以使用其他高级语言如SystemVerilog、C++等构建模型。

  1. 编写测试用例:根据DUT模型的需求,编写测试用例,用于验证模型的正确性和完整性。测试用例一般包括生成输入数据、将其送入DUT模型中、收集输出数据以及检查输出数据是否符合预期等步骤。

  1. 编写UVM testbench:使用UVM框架构建testbench,用于控制测试用例、生成仿真事件、收集仿真结果等。testbench通常包括以下组件:

  • Agent:用于处理输入/输出信号和数据的发送和接收,包括monitor、driver和scoreboard等组件。

  • Sequence:用于生成测试用例的sequence组件。

  • Environment:用于组织testbench中各个组件的层次关系,并提供各个组件之间的连接和通信。

  • Configuration:用于指定testbench的各种参数和属性。

  1. 运行仿真:运行仿真程序,将测试用例传递到DUT模型中,收集仿真结果,并与预期结果进行比对。如果存在不匹配,需要进行调试和修复。

总体来说,UVM验证平台的搭建包括以下步骤:准备DUT模型、编写测试用例、构建UVM testbench、运行仿真、收集仿真结果并调试。需要注意的是,UVM验证平台的具体实现可能因为项目的不同而有所差异。


78.CMOS的功耗主要是什么?(5分)

  1. 静态功耗:即芯片处于静态模式下时的功耗,也称为漏电流功耗。静态功耗是由于晶体管的漏电流引起的,在CMOS电路中,静态功耗通常占总功耗的一部分。

  1. 动态功耗:即芯片处于动态模式下时的功耗,也称为开关功耗。动态功耗是由于晶体管在进行开关操作时产生的电荷和放电引起的。

  1. 短路功耗:在CMOS电路中,由于电路中存在多条不同路径,可能会出现不同路径上的信号同时处于高电平或低电平的情况,导致短路电流,从而产生功耗。

在CMOS电路中,每个晶体管都有一个开关时间,即从开启到关闭的时间。当一个晶体管开启时,其下游的负载电容将充电,同时上游的电感也将充电。如果在此期间,该晶体管的下游电路中的其他晶体管也开始了充电过程,则它们之间就会出现短路电流。这会导致不必要的功耗,因为这些电流会在电路的电阻中产生电压降,从而消耗功率。

  1. 互联功耗:芯片中不同电路之间的连线也会引起功耗,互联功耗通常是由于电路间的电容和电感引起的。

  1. 开关速度功耗:在CMOS电路中,由于晶体管在进行开关操作时需要一定时间,快速的开关操作可能会引起功耗,尤其是在高频率下。


79.请将下面这段C语言描述的串行处理过程,转换为单拍完成的并行处理,并用可综合的Verilog来描述。


#include 
unsigned charcal_table_high_first(unsigned char value)
{
    unsigned char i;
    unsigned char checksum = value;
    for (i=8; i>0; --i)
    {
    if (checksum & 0x80)
    checksum= (checksum<< 1)^ 0x31;
    else
    checksum= (checksum << 1);
    }
    return checksum;
}
int main(void)
{
    /*我的第一个C程序*/
    print("%x",cal_table_high_first(60));
    getch();
}
//输出为:b8

答案:0x80是二进制的8'b0100_0000。if判断条件里面的与是按位与,有1出1,所以只要checksum的第6bit(从0开始计数)为1,那么if判断条件就满足。0x31是二进制的8'b0011_0001。

你可能感兴趣的:(数字IC设计基础及进阶知识,FPGA,硬件设计,数字IC)