出笔试题汇总,是为了总结秋招可能遇到的问题,做题不是目的,在做题的过程中发现自己的漏洞,巩固基础才是目的。
所有题目结果和解释由笔者给出,答案主观性较强,若有错误欢迎评论区指出,资料整理来自于“数字IC打工人”等数字IC相关公众号,牛客网等网站真题、网络笔试真题及面经抄录。
保持更新(2023.2.28)文章内含 单选题49道、多选题22道、填空题6道、判断题4道、简答题11道、逻辑推理题1道、C语言 python 脚本编程题5道。
在本文中笔者提供的所有代码,都封装成了API,可直接copy到软件编译、运行、给出结果。
1.以下关于 System Verilog 的描述, 正确的是
A.sv 中可以用 logic 代替 Verilog 中的 wire 和 reg 类型
B.sv 中, 定义成 reg 的信号会被综合成触发器
C.sv 中的 function 语言不可被综合
D.其他都不正确
E.sv 是提供给验证使用的, 因此其不能被综合
答案:A,定义成组合逻辑的reg不会综合成触发器;funciton 可以被综合。
2.UVM 层次化结构中, 最顶层的部件类型是
A. uvm_test
B. uvm_root
C. uvm_top
D. uvm_component
答案:B,uvm_root是验证平台中所有UVM components的“隐含”的top-level和phase控制器。用户不需要直接实例化uvm_root,UVM会自动创建uvm_root单一实例,用户可以使用全局变量(uvm_pkg范围内)uvm_top来访问uvm_root,可参考下图左上角红色部分注解。
3.数字信号上采样时, 一般需要添加什么样的滤波器, 完成功能为?
A. 高通, 抗混叠滤波
B. 低通, 抗周期延拓
C. 低通, 抗混叠滤波
D. 高通, 抗周期延拓
答案:B,上采样时,会出现很多高频噪声,需要对其进行低通滤波,也因为上采样的原理是在原来序列两个点之间插入L个0,最后上采样后周期是变短了,所以是抗周期延拓。如果是下采样,那也是添加低通滤波器,下采样过后,周期被延拓了,导致信号在频谱上有交叠,所以就需要滤波将混叠部分去除,若题目为下采样,则选C。
参考内容:数字信号上下采样对频谱影响,以及如何添加相应滤波器_信号重采样对频域估计的影响_ddatalent的博客-CSDN博客 和 数字信号中的上采样和下采样_信号上采样和下采样_ReCclay的博客-CSDN博客
4.下列属于异步总线的是?
A. SPI
B. USB
C. UART
D. IIC
普及一点概念:
同步通信:一方发送,另一方应答,否则不进行下一次传输(带时钟信号传输)。
异步通信:一方发送,不考虑另一方是否收到,直接进行下一次传输(不带时钟同步信号)。
单工:单向通信,只能由一方发送数据,另一方接收。
半双工:双方都可发送数据,但同一时刻只能一方发送,一方接收。
全双工:双方都可发送数据,并且可同时发送数据。
(1) SPI——同步通信;串行通信;全双工;主从通信(某一时刻可以出现多个从机,但只能存在一个主机,主机通过片选线来确定要通信的从机)。
(2) USB——同步通信;通用串行总线。
(3) UART——Universal Asynchronous Receiver/Transmitter,通用异步收发器;异步通信;串行通信;全双工; 对等总线,没有仲裁机制,所以只能挂载两个同时收发数据的设备,双方都可以发送和接收。
(4) I2C——同步通信;串行通信;半双工;主从通信(总线上支持多个主机和多个从机,总线上任何能够进行发送/接收数据的设备都可以占领总线。当然,任意时间点上只能存在一个主控。多主控,主器件同时争夺总线控制权时,可仲裁)。
答案:C
5.() 电路的逻辑功能特点是, 任意时刻的输出仅仅取决于该时刻的输入, 与电路原来的状态无关
A. 静态逻辑
B. 组合逻辑
C. 动态逻辑
D. 时序逻辑
答案:B
A:静态逻辑电路中靠稳定的输入信号使MOS晶体管保持导通或截止状态,从而维持稳定的输出状态。输入信号存在,对应的输出状态存在;只要不断电,输出信息可以长久保持;
C:动态逻辑电路中利用电容的存储效应来保存信息,即使输入信号不存在,输出状态也可以保持,但由于泄漏电流的存在,信息不能长期保持;
D:时序逻辑电路由存储电路和组合逻辑电路两部分组成,任何一个时刻的输出状态由当时的输入信号和电路原来的状态共同决定。
6.在芯片设计流程当中, 通常会进行后仿真(post-simulation) ,关于后仿的作用, 以下说法不正确的是
A. 抽检 netlist 是否和 RTL 功能一致
B. 抽检电路中是否出现有害的 glitch
C. 抽检时序是否有违规
D. 抽检电路中是否存在亚稳态
答案:后仿,是指综合后仿真,综合后用DC导出门级网表,网表Netlist带有时延信息,将网表和verilog文件结合在一起,用VCS编译仿真,就能得到带有时延的波形信息。所以A当然是后仿的作用,后仿主要是检查电路考虑时延后的各种时序是否出现违例,所以CD也正确,选B。
7.以下关于异步处理正确的是
A 信号经过两级触发器即可完成异步信号的传递‘
B 只要信号传递的两端时钟频率不相等, 即认为是异步信号
C 异步复位信号需要经过同步处理后再使用是安全的
D 异步 FIFO 中使用格雷码传递异步计数器可以保证每一拍传递的数据都是准确的
答案:C
A:信号分为单bit和多bits信号,若是多bits信号,就不能通过两级触发器传递;
B:错误的原因是不是没有考虑整数倍频率且相位差为0的两种时钟;
C:异步复位信号需要经过同步处理后再使用是安全的 (异步复位,同步释放)
D:使用格雷码如果出错只会有一位数据跟上一次数据不一样,应该不能保证每一拍都是正确的
8.关于跨时钟域电路的设计, 以下说法不正确的是
A 单 bit 信号经两级 D 触发器同步后即可进行跨时钟域传递
B 采用单一时钟的电路不会产生亚稳态
C 异步 FIFO 的两个时钟频率相同也可以正常工作
D 跨时钟域电路当中的亚稳态无法消除
答案:B,单一时钟电路,时钟频率高了也会出现时序违例,导致亚稳态发生。
4 种方法跨时钟域处理方法
(1)打两拍,两级触发器同步—单bit数据跨时钟域处理,适用于慢时钟域数据到快时钟域;
(2)异步FIFO—多bit数据跨时钟域处理;
(3)格雷码转换;
(4)加握手信号。
9.衡量数字通信系统传输质量的指标是
A 信噪比
B 噪声功率
C 语音清晰度
D 误码率
答案:D,衡量数字通信系统传输质量的指标分为两种:可靠性和有效性指标,有效性主要指标为传输速率,可靠性主要指标误码率或者说是误信率
10.以下代码片段实现的电路功能是
Input [3:0] in;
output [3:0] out;
wire [3:0] a,b;
assign a=in<<1;
assign b=in>>3;
assign out=a|b;
A 对输入信号 in 先右移 3 位, 再左移 1 位
B 对输入信号 in 循环左移 1 位
C 对输入信号 in 循环右移 3 位
D 对输入信号 in 先左移 1 位,再右移 3 位
答案:B
假设4bit输入信号in为[A,B,C,D],那么A=in<<1=[B,C,D,0],B=in>>3=[0,0,0,A];out=a|b,符号“|”是按位或,0||X=X,从而有out=[B,C,D,A],和输入相比循环左移了1位,选择B。
11. 当一个乘法器需要10个cycle才能完成计算任务,对其需要设置multicycle,setup会设置为10,hold设置为()
A.9
B.不需要设置
C.10
D.1
答案:A,在多周期设置中,Setup的周期是X,设置Hold周期为X-1。具体STA知识可以查看笔者其他文章 静态时序分析(STA)附秋招面试提问
12. 以下工艺器件中,电阻值的最大的是()
A. AA
B. Contact
C. Poly
D. VIA
答案:C,
1.AA(Active Area):活性区域,指用于制作晶体管等器件的区域,通常由氧化物和硅等材料组成。
2.Contact:接触,指将金属或其他导电材料与晶体管或其他器件的材料(如硅)相连接的结构。
3.Via:过孔,指用于连接不同层次(如金属层和多晶硅层)的导线的孔洞结构。
4.Poly(Polysilicon):多晶硅,指用于制作栅极等器件的材料,通常具有良好的导电性能和机械强度。
这些工艺结构中,电阻阻值最大的一般是多晶硅(poly),因为多晶硅的电阻率比金属和硅等材料高得多,通常在半导体器件中用作电阻器等元件。而其他结构(如AA、contact和Via)通常是用于连接和控制器件的,电阻阻值较小。
13. 当clock的周期是10ns,对于模块的input需要添加input delay,假设外部延迟是6ns,内部延迟是4ns,那模块的input delay需要设置为()
A. 5ns
B. 6ns
C. 4ns
D. 10ns
input_delay 下的是外部信号的delay,内部还有的裕量是clock_period - input_delay,一般在逻辑的顶层,下的外部逻辑的delay。比如:set_input_delay -clock CLK $dly [get_ports D]
答案:B,6ns。
14. 以下叙述中,不正确的是()
A. N MOS位于PWELL中
B. P MOS的substrate是N参杂
C. POLY的电阻值比Metal高
D. P WELL的参杂浓度比P Sub高
答案:A,N MOS位于P substrate中,即我们熟知的NMOS导电是在P型衬底中,加正向电压,栅极附近吸收电子形成N型导电沟道,所以N MOS位于P 衬底中。P MOS 则相反。
15. 以下对于MOORE/MEALY状态机的特点描述正确的是()
A. Moore状态机的输出仅与当前状态值相关,Mealy状态机的输出不仅与当前状态有关,也与当前输入值有关
B. Mealy状态机更容易出现错误
C. Moore状态机可以没有default状态
D. Mealy状态机的输出仅与当前状态值相关,Moore状态机的输出不仅与当前状态有关,也与当前输入值有关
答案:A,A是正确的,B选项,只要设计正确,两者都不会出问题。C选项,需要有default状态。D结论与A相反错误。
16. 已知Y=A(~B)+B+(~A)B,下列结果中正确的是()
A. Y=B
B. Y=A
C. Y=(~A)+(~B)
D. Y=A+B
答案:D。最暴力的方法就是画出真值表然后试答案,简单的方法就是化简表达式:
Y=A(~B)+B+(~A)B=A(~B)+(1+(~A))B=A(~B)+B=A+B,选D
17. 关于同步复位和异步复位说法错误的是()
A.异步复位在使用时,复位信号仍旧需要先经过同步后才能使用
B.同步复位在复位时会产生大的瞬态power
C.异步复位容易在输出产生毛利,从而影响后续电路工作
D.在大fanout时,异步复位时序更容易满足
答案:D。
A正确。
B选项,同步复位在复位时通常会产生较大的瞬态功率。这是因为在复位时,所有需要复位的寄存器都会被同时清零或设置为一个特定值,这会导致大量的开关操作和电荷移动,从而产生较大的瞬态电流和功率,正确。
C选项说的正是异步复位的缺点,正确。
D选项错误,在异步复位时序设计中,扇出较小时,由于电路的传输延迟较小,复位信号能够更快地传播到各个部分,因此容易满足时序要求。反之,扇出较大时,由于电路的传输延迟增大,可能会导致复位信号的传播速度变慢,从而导致时序不满足。
18. 16进制有符号数0×C6的十进制数是()
A.-57
B.-56
C.-59
D.-58
答案:D。0xC6 = 0b1100_0110;最高位是1,即符号位为1,是负数,在verilog中用补码表示,换算回来按位取反+1得到十进制数值,0b0011_1010=-(32+16+8+2)=-58,
19. 0×6F5A的十进制数是()
A.28510
B.其他均不正确
C.67532
D.28506
答案:D。
20. 16进制有符号数0×A7,其中低4bit为尾数,截掉后4bit,四舍五入后是()
A.0×9
B.0×8
C.0×A
D.0×B
答案:C。0xA7=0b1010_0111,低4bit四舍五入,当低4bit>=8时进位,当低4bit<=7时不进位。0111=7,不进,选C。
21. 异步FIFO中,指针编码应该使用什么编码方式()
A、One-hot
B、One-cold
C、Binary
D、Gray
答案:D。格雷码,处理跨时钟域问题。Gray编码相邻的两个数之间只有一位二进制数不同。在异步FIFO中,使用Gray编码来表示指针,可以避免读取指针值时出现的不稳定状态和错误读取问题。
22. 摩尔定律中写道,IC上可容纳晶体管数量约每多少个月增加一倍?()
A、10个月
B、12个月
C、18个月
D、24个月
答案:C,18个月,记住即可。
23. 在工作过程中,如果芯片过热,需要动态降低功耗开销,下面哪个方法不能实现这个功能()
A、降低芯片工作电压
B、降低芯片工作频率
C、增加低功耗cell比率
D、能芯片时钟门控
答案:C。动态功耗计算公式:CV^2f。A降低电压、B降低频率都能减少动态功耗。D是低功耗设计clock gating方法,可以降低功耗。C选项确实可以降低功耗,但是审题“工作过程中,芯片过热”,这种情况下,没法直接增加低功耗cell比率降低功耗,选C。
24. 对于32K个MAC,工作在1GHz时钟,满载情况下的峰值性能为多少OPS()
A、8 Tops
B、16Tops
C、32Tops
D、64 Tops
答案:一个MAC(Multiply-Accumulate)指的是一种基本的计算单元,可以进行乘加运算,可用于数字信号处理(DSP)中。32K个MAC的峰值性能取决于时钟频率,即32K * 1GHz = 32 Tops(Tera Operations per Second),因此选项 C 的答案是32Tops。1Tera = 1000G=10^12
25. 组合逻辑电路的逻辑冒险现象是由于( )引起的
A、电路有多个输出
B、逻辑门类型不同
C、电路未达到最简
D、电路中存在延时
答案:D。逻辑冒险(Hazard)是指由于在组合逻辑电路中信号传输延迟引起的问题,可能导致输出信号产生错误或不稳定的情况。
26. 若要将异或门当作反相器(非门)使用,则输入端A B的连接方式是( )
A、A或B中有一个接“0”
B、A和B并联使用
C、A或B中有一个接“1”
D、不能实现
答案:C。异或门,两端输入相反时,输出1。如果A或B中有一个为 1,则异或门的输出为另一个输入端的反相值,即反相器。
27. 下面那个功能不是在综合过程中实现的( )
A、translate
B、DFX insert
C、retiming
D、mapping
答案:B。
A、translate:将高级描述语言代码(如 Verilog、VHDL)转换为中间表示(如 RTL、gate-level netlist)的过程,也可以称为解析、语法分析、建立语法树。
B、DFX insert:指在通过对RTL代码的修改,增加一些附加电路或修改原有电路,以实现某些特定设计目标的操作。例如可靠性(Design for Reliability)、测试性(Design for Testability)、可维护性(Design for Maintainability)等,与综合过程无关。
C、retiming:通过重新安排寄存器的时钟边沿,改变数据通路中组合逻辑和寄存器之间的时序关系,以优化时序和减少功耗的技术。
D、mapping:将门级网表中的逻辑元件映射到目标芯片的逻辑单元(如查找表、寄存器)上,以满足特定的约束条件,如时序约束、面积约束、功耗约束等。
28. 下面哪个FP32数据格式是对的(符号位指数位小数位)( )
A、1.8.23
B、1.5.26
C、2.8.22
D、2.5.25
答案:A。在IEEE 754标准中,单精度浮点数(FP32)格式总共占用32位,由三部分组成:符号位、指数位和小数位。其中符号位占1位,指数位占8位,小数位占23位,在表示格式时,通常使用“符号位.指数位.小数位”的形式进行表示。
29. 下列不属于验证方法学的是( )
A、UVM
B、OVM
C、DVM
D、VMM
答案:C。UVM: Universal Verification Methodology。OVM: Open Verification Methodology。。VMM: Verification Methodology Manual。C不知道指啥,动态电压管理(Dynamic Voltage Management)、分布式虚拟内存(istributed Virtual Memory)?
30. 半导体工艺制程中的7nm,5nm对应的是( )
A、晶体管宽度
B、栅极宽度
C、源极宽度
D、金属线宽度
答案:B。半导体工艺制程中,7nm和5nm是指芯片制造工艺的特征尺寸。特征尺寸指的是芯片上最小的物理结构尺寸,低尺寸工艺中通常指晶体管的栅极宽度,但目前高尺寸工艺通常都采用三维晶体管,即在垂直方向上做多个晶体管,用低工艺的水平堆叠晶体管来达到高工艺的性能,进而自称是高工艺。对于这道单选题来说,硬选的话,选B,答案有些不妥。
31. 一个八位D/A转换器最小电压增量为0.01V,当输10011100时,输出电压为( )V
A 1.28
B 1.45
C 1.54
D 1.56
答案:D。10011100 = 156
32. 下述概念中不属于面向对象这种编程范畴的是()
A对象、消息
B继承、多态
C类、封装
D过程调用
答案:D。面向对象编程的核心概念包括对象、类、封装、继承、多态和消息。过程调用是指调用一个已定义的过程或函数来执行一段特定的操作,不是面向对象编程的概念。
33. 组合逻辑电路通常由( )组合而成
A记忆元件
B门电路
C计数器
D以上都正确
答案:B。
34. 三极管作为开关时工作在什么区域()
A饱和区+放大区
B击穿区+截止区
C放大区+击穿区
D饱和区+截止区
答案:D。在饱和状态下,三极管导通。在截止状态下,三极管截止。
35. 在C语言中(以16位PC机为例),5种基本数据类型的存储空间长度的排列顺序为()
A charB char=int C char D char=int=long int<=float 答案:A。 在16位的PC机中,char占1个字节,int占2个字节,long int占4个字节,float占4个字节,double占8个字节。
36. 下面表达式计算结果为4的是()
A 11/3
B 11.0/3
C (float)11/3
D (int)(11.0/3+0.5)答案:D。A选项=3。B选项=3.67。C选项=3.0。
37. 关于this指针使用做法正确的是()
A 保证每个对象拥有自己的数据成员,但共享处理这些数据的代码
B 保证基类私有成员在子类中可以被访问
C 保证基类保护成员在子类中可以被访问
D 保证基类公有成员在子类中可以被访问答案:A。this指针是一个指向当前对象的指针,它是在类的内部使用的。this指针的作用是保证每个对象拥有自己的数据成员,但共享处理这些数据的代码。当一个成员函数被调用时,this指针指向调用该函数的对象。通过this指针可以访问对象的数据成员和成员函数。
38. 在timescale 1ns/10ps的条件下,仿真器在6125ps时的打印时间格式为()
A 6
B 61
C 613
D 6125答案:A。因为$time系统函数返回的是当前仿真时间,而不是当前的时间单位或最小时间精度。timescale 1ns/10ps中:
要计算实际时间,就用$time*时间单位得到实际时间。
1.时间单位为1纳秒(ns),即1个时间单位代表1纳秒。
2.时间精度为10皮秒(ps),即仿真器的最小时间精度为10皮秒,表示的最小时间间隔为10皮秒。
39. 下列描述中采用时钟正沿触发且reset异步下降沿复位的代码描述是()
A always@(posedge clk or negedge reset) if(!reset)
B always@(posedge clk or reset) if(!reset)
C always@(posedge clk or negedge reset) if(reset)
D always@(negedge clk or posedge reset) if(!reset)答案:A。时钟正边沿触发,排除D。异步下降沿复位,排除B。reset下降沿后reset=0,判断复位if条件应该为if(!reset),排除C,选A。
40. 一个数组元素a[1]与下面哪个表示等价()
A *a+1
B a+1
C *(a+1)
D &a+1答案:C。摘抄自紫光笔试题,IC相关选择题中间突然来一道考察C语言的选择题,有点猝不及防。这是考察指针和数组的关系,a[1]指数组第二个元素的元素值,不是数组的地址。A选项,是a数组第一个元素值+1。B选项,数组第二个元素的元素地址。C选项,正确,括号内为第二个数组元素的地址,外面再加一个指针解码符号,得到第二个元素的值。D选项,和A选项一样。
41. 在systemverilog中声明随机变量的关键词为()
A randa
B randc
C randomize
D urandom_range答案:B。randc声明随机变量。随机变量只能在class中声明,SV中,rand和randc都只能修饰类的成员变量。
1.rand,表示每次随机化这个类时,这些变量都会赋一个值,每次随机的概率都是一样的
2.randc,周期随机性,即所有可能出现的值都赋过值后随机值才可能重复
42. 在设计中出现端口和驱动该端口位宽不匹配的情况,verilog/systemverilog默认处理方法错误的是()
A如果端口的位宽和驱动该端口的信号位宽相同,则该值可以无变化的通过该端口
B如果驱动端口比端口的接收端的位宽多,则驱动信号的高位bit会被截断
C如果驱动端口比端口的接收端的位宽多,则驱动信号的低位bit会被载断
D如果驱动端口比端口的接收端的位宽少,则依据verilog的赋值规则进行高比特位扩展答案:C。高bit会被截断。ABD都对。
43. linux下,删除文件命令是()
A mkdir
B rm
C mv
D del答案:B。A选项,创建文件夹make direction缩写。B选项,删除文件remove缩写。C选项,移动文件move缩写。D选项,delete是windows系统删除文件的命令。
44.
timescale 1ns/1ps forkbegin #1;endbegin #2;end join_none $display($time);
上述代码中需要等待多长时间?()
A 1ns
B 2ns
C 0ns
D 3ns答案:C。考察对fork join的理解。
1. fork-join语句会等待所有子程序都执行完毕后再继续执行后续代码。当所有子程序都完成后,join语句才会返回。
2. fork-join_any语句会等待至少有一个子程序执行完毕后就会继续执行后续代码。当有一个子程序完成后,join语句就会返回。
3. fork-join_none语句不会等待子程序执行完毕,而是直接继续执行后续代码。这种语句常用于一些无需等待子程序执行完毕的情况。
45.构成C语言程序的基本单位是()
A 函数
B 过程
C子程序
D 子例程答案:A,函数。
46. 在veriliog HDL的always块语句中的语句是如何执行的
A 顺序
B 并行
C 顺序或并行
D 不一定答案:C。描述组合逻辑时,always 语句块里面都用阻塞赋值,就是顺序执行的。描述时序逻辑时,always 语句块里都用非阻塞赋值,并行执行。
47. 在C语言中,一个int型数据在内存中占2个字节,则unsigned int型数据的取值范围为
A 0~255
B 0~32767
C 0~65535
D 0~2147483647答案:C。2^16=65536
48. 循环体至少被执行1次的语句是()
A for循环
B while循环
C do-while循环
D 任何一种循环答案:C。
49. Verilog HDL中信号没有定义数据类型时,缺省为什么数据类型()
A reg
B wire
C tri
D z答案:B,wire。module中输入输出端口没有定义数据类型的,都默认为线网wire类型。
二、多选题
1. 信号跨时钟域时,会出现亚稳态,其失效性和哪些因素有关__________
A.信号发射端的寄存器输出信号的翻转率
B.信号发射端的寄存器时钟频率
C.信号接收端的寄存器时钟频率
D.同步寄存器的级数答案:A,B,C,D
翻转率:指在单位时间内,一个逻辑门的输出从低电平变为高电平或从高电平变为低电平的次数。
A. 信号发射端的高存器输出信号的翻转率:亚稳态的出现是由于信号传输过程中的时序关系导致的,翻转率高的信号容易在传输过程中出现时序问题,从而导致亚稳态的产生。
B,C:频率不同的时钟传输数据,有可能会出现亚稳态。
D. 同步寄存器的级数:同步寄存器的级数越多,信号传输的延迟就越大,从而增加了亚稳态产生的风险。
2. 哪些Verilog的写法是不能综合的__________
A.输入为变量的除法
B.循环边界未在编译时指定的for循环
C.含有时序电路的function函数
D.输入为变量的乘法答案:B,C。A选项除法可以综合,但可能会产生较大的delay和消耗大量的资源,不建议直接写“/”。
3.关于异步fifo说法正确的是____________
A.异步fifo的reset信号,可以经过时钟同步后直接使用
B.读写指针需要通过格雷码做过域处理
C.使用中,读写clock可以是同步的
D.地址格雷码过域时,信号延迟必须小于1个源时钟的周期答案:B,C。
A选项:异步FIFO的reset信号不应该直接通过时钟同步器使用,因为异步FIFO的复位信号并没有跟读写时钟同步,会存在不同步的情况。使用异步FIFO的reset信号时,通常需要使用专门的同步电路对其进行同步,保证其同步到读写时钟的时序。
D选项,在特殊情况下,可能需要更长时间来完成信号的同步,信号延迟可以大于1个源时钟周期。
4.关于clock以下说法正确的是_____________
A.在clock path上可以使用OAI等组合控制逻辑
B.clock可以被当成data使用
C.在设计中尽可能的使用上升沿触发的逻辑
D.clock jitter越小越好答案:A,B,C,D。A选项,clock gating就是用OAI(或与非)门控制的。B选项,在加密解密电路中,时钟信号可以用作密钥的一部分,也可以用作算法中的一个参数。C选项,时钟上升沿的稳定性通常比下降沿更好。D选项,Clock jitter是指clock信号的时钟抖动,jitter越小,clock越稳定。
5.Hold violation可以通过__________方式解决
A.降低工作电压
B.升高工作电压
C.在capture clock path上插入clk buffer
D.降低时钟频率
E.提高时钟频率
F.在data path上插入delay cell答案:A,F。改变时钟频率对hold violation没有影响,因为hold violation的计算公式里没有clock cycle。降低工作电压可以增加ck_to_Q的时间,有利于避免hold violation。C选项,插clock buffer只会改变clock latency,而在hold violation的计算公式中, clock latency会被消掉,因此改变它不会对hold time slack产生影响。
6.以下说法正确的是__________
A.当工作电压从1.0V降低到0.9V,系统功耗会降低20%
B.当工艺从0.18um升级到0.13um,工作电压和频率不变的情况下,芯片面积减小,功耗不变
C.85C的leakage power是25C的10倍
D.降低系统时钟频率一半,延长系统运行时间一倍,会降低系统的power答案:D。A选项,动态功耗计算公式为:CV^2*f。不考虑静态功耗的情况下,工作电压降低到0.9V,动态功耗降低到原来的81%,和选项描述不符,但在绝对多选的情况下,BC肯定错,可以选AD。B选项,功耗会变小,因为走线电容都变小了。 C选项:按照统计数据,85c的leakage大约是25c的8倍左右,即温度每升高20度,leakage翻一倍。
7. 以下哪些是第三代移动通信标准
A EDGE
B TD-SCDMA
C LTE
D WIFI答案:A,B,C。
A. EDGE是一种用于GSM网络的高速移动数据传输技术,其速率可达到384kbps,属于2.5G移动通信标准。
B. TD-SCDMA是中国自主研发的3G移动通信标准之一,全称是Time Division-Synchronous Code Division Multiple Access。
C. LTE(Long-Term Evolution)是一种4G移动通信标准,是目前主流的4G技术之一,具有高速数据传输、低时延、高可靠性等特点。
D. WIFI是一种局域网技术,属于无线局域网标准,其速率通常较快,但覆盖范围较小,适用于家庭或办公室等小范围网络。
选项A,B,C是移动通信标准,而选项D是无线局域网标准。
8.下面哪个选项不可以消除hold time violation()
A 插入buff
B 提高时钟频率
C 降低时钟频率
D 提高电压答案:B,C,D。A选项,在数据端插入buffer,可以让数据更迟到达后一个寄存器(增加logic delay),进而缓解hold time violation。由STA理论可知,hold time slack计算公式中没有clock cycle,所以改变时钟频率不会改善hold time violation。D选项,提高电压,会让电路中晶体管充放电速度更快,导致数据更早到达,会使得hold time violation更容易发生。
9. 下面那些是基于Systemverilog的验证方法学?()
A VMM
B OVM
C UVM
D AVM答案:A,B,C,D。
10. 下面哪种方式可以对时序进行检查()
A 即时断言
B 开发断言
C 建立时间约束
D 保护时间约束答案:C,D。都属于时序分析的部分。
11. 芯方中设计中功耗密度过大,会产生什么不良影响()
A Hot-spot
B电压下降
C不满足时序约束
D封装成本变高答案:A,C,D。A选项,当芯片中设计的功耗密度过大时,会出现局部的温度升高,即出现“热点”(hot-spot)。B选项,温度升高导致晶体管临界电压下降,这可能会导致电路的电性能发生变化,从而导致电路行为不稳定,不满足时序约束等问题。D选项,温度升高也会对封装造成不良影响,例如,可能会导致封装材料失效,从而增加封装成本。
12. 数字电路的验证维度有哪些()
A完备性
B复用性
C高效性
D满足性能答案:A,B,C,D。参考博客:芯片验证全视之三: 验证能力的五个维度_OnePlusZero的博客-CSDN博客
13. 在验证中下列关于代码覆盖描述错误的是()
A代码覆盖率包括语句覆盖率
B代码覆盖率包括条件覆盖率
C代码覆盖率包括功能
D代码覆盖率达到100%说明所有Bug已清除答案:C,D。代码覆盖率不包括功能覆盖,而是只包括代码执行路径的覆盖情况。
14. 关于systemerilog中new操作的下列描述中,错误的是()
A 它可以用来动态创建对象和对象数据
B使用它创建对象时调用构造函数
C new操作被定义成一个需要有返回类型的函数
D使用它创建对象数组时必须指定对象的初始值答案:C,D 。构造函数不仅分配内存,还初始化变量。在默认情况下,它将变量设置成默认数值(二值变量为0,四值变量为X)等等。可以通过自定义new函数将默认值设成你想要的数值。所以new函数也称为“构造函数”。但是new函数不能有返回值,因为构造函数总是返回一个指向类对象的句柄,其类型就是类本身。
15. 以下同步逻辑电路和异步逻辑描述正确的是()
A同步逻辑电路是时钟之间没有固定的因果关系,异步逻辑电路是各时钟之间有固定的因果关系
B同步逻辑是由时序电路(寄存器和各种触发器)和组合逻辑电路构成的电路,其所有的操作都是在严格的时钟控制下完成的。
C异步逻辑电路不同时钟域之间不需要进行时钟同步
D 异步逻辑可能存在多个时钟信号,或者不存在时钟信号,电路中一个逻辑的变化就会引起整个电路逻辑的变化。答案:B,D。A选项,说反了。同步逻辑电路是由时钟信号进行驱动的,各个时钟信号之间有固定的相位关系,而异步逻辑电路是没有时钟信号进行驱动,不同部分之间没有固定的相位关系。C选项,跨时钟与需要同步。
16. 超大规模集成电路计中,为了高速设计,采取以下哪些措施()
A 流水线设计
B 并行化设计
C 资源共享
D 串行化设计答案:A,B。A选项,切流水减小寄存器之间组合逻辑delay,从而可以增加系统最大运行频率,进而实现告诉设计。B选项,并行化设计,以牺牲数倍资源的代价,提升系统数倍性能。C选项, 资源共享有助于降低面积和功耗。D选项, 串行化设计则会导致系统速度降低,因此不是高速设计的措施。
17. 竞争冒险现象可以怎样消除?()
A 加入滤波电容
B引入同步机制
C不加选通信号
D增加冗余逻辑答案:A,B,D。A选项,加入滤波电容,滤除毛刺,同时可以对窄脉冲起到平波的作用。B选项,加入同步机制,消除因为组合逻辑传输延时不一致引起的信号竞争。D选项,增加冗余逻辑,来改善组合逻辑传输路径延时不一致的问题,进而避免信号竞争。
18. 下列关于Setup/Hold Time说法正确的是?()
A如果DFF的Hold时间不满足,通常可以通过增加数据路径延时来解决
B如果DFF的Setup时间不满足,通常可以通过增加数据路径延时来解决
C如果DFF的Hold时间不满足,通常可以通过增加时钟路径延时来解决
D如果DFF的Setup时间不满足,通常可以通过增加时钟路径延时来解决答案:A,D。数据路径延时指的是从前一个DFF到后一个DFF数据传输的delay。时钟路径延迟指的是时钟到后一个DFF的delay t2减去时钟到前一个DFF的delay t1。增加时钟路径延迟,可以让后一个寄存器更慢采样,有利于避免setup violation。减少时钟路径延迟,可以让后一个寄存器更快采样,有利于避免hold violation。
DFF的hold时间不满足,代表数据到达后一个DFF的速度太快了,数据还没保持足够长的时间就被更新了,因此可以通过增加数据路径延时来解决或者减短时钟路径延时,让后一个寄存器采样时间更早,选A正确。DFF的setup时间不满足,代表数据到达后一个寄存器的时间太慢了,应该在后一个寄存器DFF的数据采样窗口之前到来,可以通过
19. 下列数据类型中属于四状态类型的有哪些()
A int
B logic
C bit
D time答案:B,D。
总结一下system verilog变量数据类型:
四值逻辑类型:integer、reg、logic、wire、tri、time。
二值逻辑类型:byte、shortint、int、longint、bit。
有符号类型:byte、shortint、int、longint、integer。
无符号类型:bit、logic、reg、wire、tri、time。
简答题第6题有张绿皮书sv数据类型的截图,可以参考。
20. 低功耗电路实现的方法有()
A 降低工作电压
B增加负载电容
C降低电路面积
D尽可能提高电路性能答案:A,C。B选项,增加负载电容会导致电路在充电和放电时需要更多的电荷移动,因此需要更多的电流,进而导致功耗增加。D选项,提升电路性能(提高时钟频率)会增加动态功耗。
21. 请找出以下总线中的串行总线()
A AXI
B SDIO
C UART
D IIC答案:C,D。
AXI(Advanced eXtensible Interface)总线:是ARM公司提出的高性能、可扩展的片上总线,支持高带宽和多处理器访问。主要应用在SoC(System on Chip)中。
SDIO(Secure Digital Input/Output)总线:是一种专门用于存储设备(如SD卡、MMC卡等)的输入输出接口,可以支持高速数据传输和安全数据存储。
UART(Universal Asynchronous Receiver/Transmitter)总线:是一种异步串行通信总线,用于将数据从一台设备传输到另一台设备。常用于计算机和外部设备(如调制解调器、打印机等)之间的数据传输。
IIC(Inter-Integrated Circuit)总线:是一种串行双向通信总线,用于连接集成电路芯片和其他外设,主要用于短距离、低速率的通信,例如连接温度传感器、EEPROM等设备。
需要注意的是,UART和IIC虽然都是串行总线,但它们的应用场景和传输方式是不同的。UART是异步传输,即每个数据字节都有起始位和停止位,而IIC是同步传输,不需要起始位和停止位。
22. 下列哪些方式可以减少亚稳态问题的影响()
A 提升系统时钟频率
B 用反应更快的FF
C 架构上增加data toggle rate
D 改善时钟质量答案:B,D。用反应更快的FF,可以减少T ck_to_Q,有利于避免setup violation。改善时钟质量,有利于减少clock jitter对时序的影响。
三、填空题
verilog 当中 a=4’b10x1;b=4’b10x1;那么逻辑表达式 a==b 为_______ a===b 为________
答案:x,1
相等运算符(==):参与比较的两个操作数必须逐位相等,其相等比较的结果才为 1, 如果某些位是不定态或高阻值,其相等比较得到的结果是不定值。
全等运算符(===):全等比较是对这些不定态或高阻值的位也进行比较,两个操作数必须完全一致,其结果才是 1,否则结果是 0
逻辑运算符可参考笔者其他文章:Verilog 逻辑与(&&)、按位与(&)、逻辑或(||)、按位或(|)、等于(==)、全等(===)的区别
2. 4bit 的信号输入和 8bit 的信号输入的乘法器内部计算输出信号至少需要______ bit 的位宽
答案:4bit信号的最大值为4'b1111 = 15, 8bit信号的最大值为8'b1111 1111 = 255;
乘积输出最大值为:255 * 15 = (2^4 - 1) * (2^8 - 1) = 2^12 - 2^8 -2^4 + 1,至少需要12bit位宽。
改一下题目:3bit信号输入和4bit信号输入的乘法器输出至少需要多少bit位宽?
max_output = 3'b111 * 4'b1111 = 7 * 15 = (2^3 - 1) * (2^4 - 1) = 2^7-2^4-2^3+1,用7bit即可描述,得出结论,X bit信号输入和 Y bit信号输入的乘法器输出信号至少需要(X+Y)bit。
3. 通常情况下, 芯片工作温度较________, 工作电压较_______ , 速度最快。
答案:电子迁移率主要受晶格散射影响,即随温度升高迁移率下降,芯片工作温度较低,则速度较快。芯片供电电压影响到电容充放电速度,电压降低时,芯片会变慢,电压升高时,芯片会变快。
4.以下代码的打印输出是___________
always@(posedge clk) begin
a=0;
a<=1;
$display(“%0b”,a);
end答案:0,同一时刻阻塞赋值和非阻塞赋值发生,以阻塞赋值结果为准。
5. 全部使用组合逻辑实现 A, B, C 的运算实现|A*(B+C)|^2 共需使用_______ 个乘法器与_______个加法器
答案:6个乘法器,5个加法器
此题:设A = Ar + Ai*j, B = Br + Bi*j, C = Cr + Ci*j,
A*(B+C) = (Ar*(Br+Cr) - Ai*(Bi+Ci)) + (Ai*(Br+Cr) + Ar(Bi + Ci))*j,令Br+Cr = Dr, Bi+Ci = Di;
则,要求的是复数的模的平方,|A*(B+C)|^2 = 实部的平方 + 虚部的平方 = (Ar*(Br+Cr) - Ai*(Bi+Ci)) ^ 2 + (Ai*(Br+Cr) + Ar(Bi + Ci)) ^ 2
= Ar^2*(Dr^2 + Di^2) + Ai^2*(Di^2 + Dr^2) ,其中Br+Cr = Dr, Bi+Ci = Di;
乘法器使用:Ar*Ar;Ai*Ai;Dr*Dr;Di*Di;Ar^2*(Dr^2 + Di^2);Ai^2*(Di^2 + Dr^2);6个乘法器
加法器使用:Br+Cr;Bi+Ci; Di^2 + Dr^2;Ar^2*(Dr^2 + Di^2) + Ai^2*(Di^2 + Dr^2) ;4个加法器
6. [Python] list1 = [0, 1, 2, 3, 4, 5],则list1[ : -2]=___
答案:[0,1,2,3]。考察python语法。
7.退出仿真的函数是哪个____
答案:$finish。
8. UVM中哪个phase是自下而上执行顺序?____
答案:build_phase
在 UVM 中,build_phase 是自下而上执行的 phase,也是 UVM 中最先执行的 phase。build_phase 用于创建和连接测试组件,其执行顺序与 testbench 中组件的继承关系相关,一般从下往上依次执行,即先创建和连接最底层的组件,再依次向上创建和连接其它组件。在 build_phase 中,我们可以使用 UVM 提供的各种工厂和配置机制,动态地创建测试组件并进行配置,以满足测试需求。
四、判断题
1. 可以通过两级触发器防止亚稳态传播,也可以用来同步多bit信号。
答案:错误。同步多bit信号,使用两级触发器在传输过程中,多个位的变化可能不是同时发生的。因此同步多bit信号,通常采用格雷码+两级同步的方式来保证每次数据跳变都只改变1bit。
2. 时钟域A的多bit信号一定要经过同步才能被时钟域B采用。
答案:错误。表述太过绝对,当时钟域A下的多bit信号能够稳定被时钟域B采集时,可以不同步,题目表述太过绝对。
3. 如果DFF的hold时间不满足,可以通过降低时钟频率来解决。
答案:错误。降低时钟频率无法解决hold violation,可以改善setup violation。
4. 假定没有毛刺产生,异步复位信号可以不管时钟,只要复位信号满足条件,就能完成复位动作。
答案:错误。异步复位信号是一种用于将电路恢复到其初始状态的信号,不依赖于时钟信号。当异步复位信号被激活时,电路将被强制进入其初始状态,无论时钟信号是否存在。
即使没有毛刺产生,异步复位信号也需要满足一些条件,例如保证信号的稳定性和正确性,以及在电路中的正确实现。使用异步复位信号时,需要考虑异步复位信号可能带来的不良影响,例如在复位期间可能出现的电路振荡或不稳定行为。
五、简答题
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)”,是三个关键指标,也是衡量芯片设计质量的重要标准。
性能(Performance):是指芯片在特定工作负载下的运行速度和处理能力,通常用时钟频率、吞吐量、延迟等指标来衡量。
功耗(Power):是指芯片在工作时消耗的能量,通常用静态功耗和动态功耗来表示。静态功耗是指芯片在工作时未做任何操作时的能耗,动态功耗则是指芯片在执行各种操作时所消耗的能量。
面积(Area):是指芯片的物理大小,通常用晶圆面积或晶体管数量来表示。芯片的面积越小,就可以在同样的封装中容纳更多的芯片,从而降低制造成本和提高性能。
在实际应用中,设计师需要根据具体的应用场景和需求来确定PPA的优先级和权重,以实现最优的设计效果。
4. 根据自己的理解列出经典处理器CPU执行大致阶段,以及各阶段的大致行为。
1.取指阶段(Instruction Fetch):从内存中取出下一条指令,存储到指令寄存器中。
2.译码阶段(Instruction Decode):将指令寄存器中存储的指令解码成对应的操作码和操作数,并确定指令的类型。
3.执行阶段(Execution):根据指令的类型和操作数,执行相应的操作,例如算术运算、逻辑运算、存储器读写等。
4.访存阶段(Memory Access):如果执行的操作需要访问内存,那么就将需要读取或写入的内存地址计算出来,并从内存中读取或写入数据。
5.写回阶段(Write Back):将执行结果写回到寄存器文件或存储器中,更新寄存器或存储器中的数据。
为了提高 CPU 的执行效率,现代处理器还会采用诸如流水线、超标量、动态执行等技术,将指令执行的不同阶段并行处理,从而实现更高效的指令执行。
5. 芯片设计中有些情况下会考虑将不同模块分时启动、分时停止,请闸述你对该场景的理解。
降低功耗:在芯片启动阶段,如果所有模块都同时启动,那么可能会导致瞬时功耗过高,超出电源的承受范围。而将不同模块分时启动可以避免这种情况的发生,从而降低整个芯片的功耗。
加快启动时间:将不同模块分时启动可以避免同时启动导致的系统响应时间过长的问题,从而加快芯片启动的速度。
方便调试和测试:在芯片设计的过程中,将不同模块分时启动、分时停止可以方便芯片设计人员对不同模块的功能进行测试和调试,从而提高开发效率和测试效果。
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 beginint unsigned random_number;timeunit 1ns;time seed = $realtime;repeat (10) beginseed = seed + $realtime;$display("Seed: %0d", seed);random_number = seed % 31;$display("Random number between 0 and 30: %0d", random_number);endend endmodule
12. 请列出SRAM与DRAM的不同之处?
SRAM(静态随机存取存储器)和DRAM(动态随机存取存储器)是两种常见的计算机内存类型,它们有以下几个不同之处:
存储原理:SRAM使用存储电路来存储数据,因此不需要刷新电路,存储速度快,一般用作Cache;DRAM使用电容来存储数据,需要定期进行刷新,存储速度较慢。
存储密度:由于SRAM的存储原理,每个存储单元需要的晶体管数量较多,因此相比于DRAM来说存储密度较低。
功耗:由于SRAM不需要进行刷新,因此功耗比DRAM低。
成本:由于制造工艺和存储密度的不同,SRAM的制造成本比DRAM高。
容量:由于存储密度的不同,DRAM比SRAM更适合存储大量数据。
13. 请列出一般系统中的Memory hierarchy.并解释系统中为何需要将存储器分层
一般系统中的Memory hierarchy如下:
寄存器(Register)
高速缓存(Cache, SRAM)
主存储器(Main Memory, DRAM)
辅助存储器(Auxiliary Storage)
存储器的速度越快,成本就越高。相反,存储器的成本越低,速度就越慢。使用Memory hierarchy可以通过在不同层次上使用不同类型的存储器来提高性能,并同时控制成本。例如,在寄存器中存储最频繁使用的数据,而在辅助存储器中存储不常用的数据,这样可以实现快速访问常用数据并降低成本。
14. 在一个CPU系统中,有2个Mster通过个2x1的AXI总线访问一个Slave,简述如何构造验证场景来进行验证,并保证验证的完备性
为了构造验证场景来进行验证并保证完备性,可以按照以下步骤进行:
设计测试计划:根据需求和规格文档,设计测试计划,确定需要验证的功能、性能和接口要求。
搭建仿真环境:根据需求和规格文档,搭建仿真环境,包括CPU系统、2个Master、AXI总线和1个Slave等组成部分。
编写测试用例:根据测试计划,编写测试用例,涵盖各种情况,包括正常情况、边界情况和异常情况等,例如读写操作、多Master并发操作等。
运行仿真:在仿真环境下运行测试用例,观察仿真结果,包括响应时间、数据正确性、错误处理等,以验证功能和性能的要求是否被满足。
分析仿真结果:根据仿真结果,分析测试用例的覆盖率和测试结果的有效性,发现和解决潜在的问题,以保证验证的完备性。
重复测试:在验证完成后,进行回归测试,保证之前通过的测试用例仍然可以通过,以保证系统的稳定性和可靠性。
提交验证报告:最后,根据验证结果,编写验证报告,总结验证的过程和结果,记录所有测试用例和验证结果,包括通过和失败的用例,以及未覆盖的部分和需要优化的地方等。
通过以上步骤的验证,可以确保验证场景完备性,使得设计实现能够满足系统规格要求,同时保证设计的正确性、可靠性和性能。
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) beginout <= in1 & in2out <= in1 ^ in2out <= 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
六、逻辑推理题
1. p先生、Q先生都具有足够的推理能力,而且都不说谎,这天,他们正在接受推理面试,他们知道桌子的抽屉里有16张扑克牌:
红桃A、Q、4
黑桃J、8、4、2、7、3
草花K、Q、5、4、6
方块A、Q
约翰教授从这16张牌中挑出一张牌来,并把这张牌的点数告诉p先生,把这张牌的花色告诉Q先生,这时,约翰教授问P先生和Q先生:你们能从已知的点数或花色中推知这张牌是什么牌吗?
P先生:“我不知道这张牌。
Q先生:“我知道你不知道这张牌”
P先生:“现在我知道这张牌了。”
Q先生:“我也知道了”
请问,这张牌是什么牌,并说明理由。
答案:红桃4。
有16张牌,P和Q先生都不会说谎,P知道牌的点数,但却说自己不知道这张牌,意味着这张牌的点数不是16张牌中唯一的那张,即可以排除:黑桃J、8、2、7、3,草花K、5、6这些唯一点数的牌,可以确定牌的点数为:A、Q、4
Q先生知道牌的花色,就知道P先生不知道这张牌,意味着Q先生知道的花色中出现的点数在其他花色里都出现过,即没有唯一点数的牌,因此可以确定Q先生知道的花色为:红桃和方块。此时可能的牌只剩下:
红桃A、Q、4
方块A、Q
但此时P先生却说自己知道这张牌是什么了,那么只能是红桃4,因为只有在P先生知道点数为4的情况下,才能唯一确定花色为红桃。
七、python、C语言、脚本编程题
1. 请用C语言写一个程序,计算输入字符串中每个字母的个数(字符串只包括小写字母)。举例如输入字符串为:aaaaabbcccefff,则结果打印为:5a2b3c1e3f。(联发科2022提前批)
答案:C语言编程题,需要记得一些C语言的基本语法,熟悉一下指针和数组,这类题目一般都不会太难。
#include
void main(){char str[100] = {0};int count[26] = {0};int i = 0;int count_index;scanf("%s", str);while(str[i] != '\0'){count_index = (str[i]- 'a');count[count_index] = count[count_index] + 1;i++;}for(i=0;i<26;i++){if(count[i]!=0){printf("%d%c",count[i],'a'+i);}}printf("\n"); } 输出结果:
2. [python]请使用种您熟悉的语言(C, Java, Python)定义二叉树的节点,并使用深度优先搜索,获取一个给定二叉树的最大深度,返回深度值。(联发科2022提前批)(同时也是Leecode easy 题)
比如,给定二叉树[3,9,20, null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度3.
答案:定义一个二叉树的结点结构体TreeNode,然后用递归的方式去访问二叉树的所有叶子节点,退出条件为not root,即root = None,即不存在的节点,此时not root 为真,退出该次递归函数。
class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Noneclass Solution:def maxDepth(self, root):length = 0def dfs(root, d):nonlocal lengthif not root:returnlength = max(length,d)dfs(root.left, d+1)dfs(root.right, d+1)dfs(root, 1)return lengthif __name__ == '__main__':# 定义题中所给的树root = TreeNode(3)root.left = TreeNode(9)node = TreeNode(20)root.right = nodenode.left = TreeNode(15)node.right = TreeNode(7)s = Solution() # 例化类,才能调用类中的类函数print(s.maxDepth(root))
3. [python]给你个字符串表达式s,请使用一种您熟悉的语言(C Java, Python)实现一个基本计算器来计算并返回它的值(运算只包含+-和括号)。(联发科2022提前批)
示例1:
输入:s=“1+1”
输出:2
示例2:
输入:s=“2-1+2”
输出:3
示例3:
输入:s=“2-1+2”
输出:3
示例3:
输入:s=“(1+(4+5+2)-3)+(6+8)”
输出:23
代码:
使用栈存储当前括号外的结果和符号,并使用递归处理括号内的表达式。在循环中分别处理数字、加号、减号和括号。如果遇到数字,则计算当前数字;如果遇到加号或减号,则将当前数字和符号推入栈中,并将当前数字和符号重置;如果遇到左括号,则递归处理括号内的表达式,并返回括号内的计算结果和括号结束的位置;如果遇到右括号,则将当前数字和符号推入栈中,并返回括号外的计算结果以及右括号结束的位置。
最后,我们将栈中的所有数字和符号相加,就可以得到整个表达式的计算结果。
def calculate(s: str) -> int:num = 0 # 记录当前数字sign = 1 # 记录当前符号stack = [] # 用来存储当前括号外的结果和符号res = 0 # 用来记录最终结果for i in range(len(s)):if s[i].isdigit():num = num * 10 + int(s[i])elif s[i] == '+':res += num * signnum = 0sign = 1elif s[i] == '-':res += num * signnum = 0sign = -1elif s[i] == '(':stack.append(res) # 先存结果,再存数字stack.append(sign) res = 0sign = 1elif s[i] == ')':res += num * signnum = 0res *= stack.pop()res += stack.pop()return res + num * signif __name__ == '__main__':s = "(1+(4+5+2)-3)+(6+8)"print(calculate(s))
输出结果:23
4. [Python]请用python写一段程序,用尽量少的语句实现下面功能:定义一个函数,判断给定目录下是否存在result.log文件,如果存在,则从result.log文件中找出所有包含fail字样(不区分大小写)的行,并将这些内容保存到一个名为fail.log的文件中,如果文件不存在则抛出异常()(联发科2022提前批)
代码:使用了os模块中的join()函数来拼接目录路径和文件名,open()函数以只读模式打开result.log,并以写入模式打开fail.log文件,lower()函数将每行字符串中的字母转为小写字母,writelines()函数将包含fail字样的行写入fail.log文件中。程序还使用了异常处理机制来处理找不到result.log文件的情况。
import osdef find_fail_lines(dir_path):try:with open(os.path.join(dir_path, 'result.log'), 'r') as f1, open(os.path.join(dir_path, 'fail.log'), 'w') as f2:fail_lines = [line for line in f1 if 'fail' in line.lower()]f2.writelines(fail_lines)print('Successfully saved fail lines to fail.log')except FileNotFoundError:print('result.log file not found in the directory')# example usage find_fail_lines('E:/modelsim_project/file_handle/')
5.请写段Python代码,打开一个文件,扫描每行,如果该匹配到“biren01”,“biren02”,……“biren99”则以行号Key,将匹配到的“birenxx”保存下来(2022壁仞)
要写这段代码要知道,在 Python 中,可以使用 enumerate 函数来同时获取文件的行号和内容,例如:
with open('file.txt') as file:for i, line in enumerate(file, 1):print(f"Line {i}: {line}",end="")
其中变量i为行的行号,变量line存储一整行,结果展示如下:
代码:
keywords = {} # 创建一个空字典,用于保存匹配到的关键字和行号 with open('file.txt') as file:for i, line in enumerate(file, 1):for j in range(1, 100):keyword = f'biren{j:02d}' # 生成关键字,如 'biren01'、'biren02' 等if keyword in line:if i not in keywords: # 如果当前行号还没有在字典中出现过,则添加新的键值对keywords[i] = [keyword]else: # 如果当前行号已经在字典中存在,则将匹配到的关键字添加到已有的列表中keywords[i].append(keyword) for key, value in keywords.items():print(f"行号 {key},匹配到的字符为:{value}")
第五行f'...' 表示一个格式化字符串,其中 {j:02d} 是一个占位符,表示将 j 的值格式化为两位数字,并且如果 j 不足两位,则在前面补零。这里的 d 表示将 j 格式化为十进制整数。因此,对于 j=1,生成的字符串就是 'biren01',代码输出结果如下: