C/C++教程

数字IC常考题(单选、多选、编程)

本文主要是介绍数字IC常考题(单选、多选、编程),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 参考资料

FPGA、数字IC系列(1)——乐鑫科技2021数字IC提前批笔试 - 知乎 (zhihu.com)

FPGA/数字IC秋招笔试面试002——FPGA设计的面积优化和速度优化(2022届) - 知乎 (zhihu.com)

IC/FPGA系统设计的速度和面积优化_Arist.-CSDN博客_面积优化和速度优化


 一、单选题

关于跨时钟域电路的设计,以下说法正确的是:
A: 信号经两级D触发器同步后即可进行跨时钟域传递
B: 跨时钟域电路存在亚稳态风险,最好避免使用
C: 跨时钟域电路中一定存在亚稳态
D: 采用单一时钟的电路也可能产生亚稳态

 分析:

A:只有单bit信号才能通过打两拍;

B:跨时钟域电路的使用难以避免,应想办法降低亚稳态风险;

C:“一定”过于绝对;

D:正确,单一时钟若不满足建立时间和保持时间,也会产生亚稳态

4 种方法跨时钟域处理方法
(1)打两拍,两级触发器同步——单bit数据跨时钟域处理,适用于慢时钟域数据到快时钟域;
(2)异步双口RAM(异步FIFO可以实现同样效果)——多bit数据跨时钟域处理;
(3)格雷码转换;
(4)加握手信号。


若要将异或非门当作反相器(非门)使用,则输入端A B端的连接方式是()
A:A或B中有一个接“0”
B:A和B并联使用
C:A或B中有一个接"1”
D:不能实现

 分析:

Y=!(A^B)=A同或B:A为0时,B为0/1,Y为1/0;

选A


以下代码综合出来的D触发器的D端逻辑表达式为:

always @( posedge clk or negedge rst_n) if(~rst n) q<= 1'b0; else if(set) q<= 1'b1; else if(wr) q<= wdata;

A: ~set & (we & wdata) | q
B: set | (wr | wdata) & q
C: set | wr & wdata | ~wr & q
D: set & (~wr & q) | wr & wdata & (~set)

分析:

按优先级应是rst_n最高,但是选项中并未出现,则set为1时,输出为1;否则wr为1且wdata为1时,输出为1;再wr为0的话,输出保持上一个q的值,则需要q为1;

因此选C


ModuleA/ModuleB用的是同个Clock, Clock频率80MHz。ModuleA和ModuleB同时启动,ModuleA产生如下周期性的burst数据给ModuleB,一共产生8次burst. burst rate : 1280 Mbit/s,burst持续时间1us。burst内部速率均匀,burst周期5us,余下的4us内没有数据

ModuleB收到启动信号后,需要花10us做初始化,所以先把Module A的数据缓存在ModuleB内部的同步FIFO中,同步FIFO位宽32bits,初始化结束后,ModuleB以640 Mbit/s的均匀速度从FIFO中读取数据。在满足功能需求的前提下,为了节省电路面积,要求FIFO size越小越好,以下四个选项的FIFO深度,选项()的FIFO深度符合要求:
A: 128
B: 64
C: 96
D: 160

分析:

ModuleA发出数据,但其速率较快,moduleB读取速率跟不上,因此通过中间的FIFO进行数据缓存,这样FIFO的输入端收到ModuleA的数据进行存储,同时moduleB在输出端进行数据的读取,现在要讨论的是FIFO的深度最小可为多少,就能满足条件?

解析:考虑最大数据情况,在ModuleB启动的10us内,ModuleA一直在传输数据,一共2us有效数据,需要存储 1280Mbit/s * 2us = 2560 bit;在第11us,ModuleA传输数据 1280Mbit/s * 1us = 1280 bit,ModuleB读取 640 Mbit/s * 1us = 640 bit,需要存储 1280 - 640 = 640 bit,此时共需存储 2560 + 640 = 3200 bit

注意:此时达到FIFO的最大需要存储值,因为后面每次写入,moduleB都会有足够的时间(1us的发送数据,5us的读取时间)写出数据,即考虑第11us时FIFO的最大深度即可。
考虑读取,前15us共写入 3 * 1280=3840,读取 5*640=3200,需要存储640,这也是15us后,FIFO所能达到的最大数据容量了。
综合考虑,最大需要存3200bit深度需要 3200 / 32 = 100选A的128较为合适


欲产生序列信号11010111,则至少需要()级触发器
A: 3
B: 4
C: 2
D: 5

分析:

8bit的序列8个状态可以生成,8个状态用3bit的状态信号即可表征,选A


二、多选题

以下方法哪些是进行面积优化( )。
A: 串行化
B: 资源共享
C: 流水线设计
D: 寄存器配平
E: 逻辑优化
F: 关键路径优化

分析:

速度优化,提高运行速度

一般来说,速度优化比资源优化更重要,需要优先考虑。速度优化包括:FPGA的结构特性、HDL综合器性能、系统电路特性、PCB制版情况等,也包括Verilog的编程风格。下面主要讨论电路结构方面的速度优化方法。

(1)流水线设计(也是属于关键路径的优化,在关键路径的组合逻辑中插入寄存器);

(2)寄存器配平(重定时)

寄存器配平是使较长路径缩短,较短路径加长,使其达到平衡从而提高工作频率的一种技术。
若设计中,若两个组合逻辑块的延时差别过大,若T1>T2,则总体的工作频率 fmax取决于T1, 即最大的延时模块。对不合理设计进行改进,即将原本设计中的组合逻辑1的部分逻辑转移到组合逻辑2中,使t1≈t2,且T1+T2=t1+t2, T1>t1则总体的工作频率 fmax提高。

(3)关键路径优化(减少关键路径上的组合逻辑延时);

关键路径:指设计中从输入到输出经过的延时最长的逻辑路径。优化关键路径是提高设计工作速度的有效方法。
EDA工具中的综合器及设计分析器都提供关键路径的信息以便设计者改进设计。Quartus中的静态时序分析工具可以帮助找到延时最长的关键路径。

(4)消除代码优先级(if_else嵌套、case)

(5)并行化(加法树、乘法树,消除符号运算的优先级);(牺牲了资源)

若要实现A+B+C+D。首先实现AB=A+B,CD=C+D,将AB/CD锁存一个时钟周期再相加。树形结构法和面积优化提到的串行化是相反的

(6)乒乓操作法
乒乓操作法是FPGA开发中的一种数据缓冲优化设计技术,可视作另一种形式的流水线技术。乒乓操作本质是使用2倍的硬件资源,通过将数据产生时间和数据使用时间重叠,解决一个数据生产效率低于数据使用效率的问题。是一种拿面积换性能的方法。通过“输入数据流选择单元”和“输出数据流选择单元”按节拍、相互配合的切换,将经过缓冲的数据流“无缝”地送到“数据流运算处理模块。

无论是在ASIC还是FPGA中,硬件设计资源即面积(Area)是一个重要的技术指标。

资源(面积)优化意义:

1.可使用规模更小的可编程器件,降低系统成本,提高性价比。

2.当耗用资源过多时会严重影响时序性能。

3.为后续技术升级留下更多的可编程资源。

4.资源耗用太多会使器件功耗显著上升。

面积优化,提高资源利用率以降低功耗要求:

(1)串行化;

将原来耗用资源巨大、单时钟周期内完成的并行执行的逻辑块分割开,提取出相同的逻辑模块(一般为组合逻辑块),在时间上利用该逻辑模块,用多个时钟周期完成相同的功能,其代价是工作速度被大为降低。

  • 例 :实现
    在这里插入图片描述

  • 描述方式1: 采用并行逻辑设计:分别相乘再相加
    在这里插入图片描述

  • 描述方式2:采用串行化设计,逐个相乘逐个相加:只需要勇1个8位的乘法器和1个16位的加法器。但是速度明显会降低,将需要耗时5个clk才能完成一次运算,并且还需要一个附加信号start

(2)资源共享;

  • 通过一个例子进行说明。现需要实现功能:通过选择信号s来选择执行A0 * B还是A1 * B的。
    描述方式1:对两个乘法电路进行选择
    RTL结构:
    在这里插入图片描述
    图1:先乘后选择
    描述方式2: 对乘项进行选择
    RTL结构:
    在这里插入图片描述

    图2:先选择后乘

  • 两种方式一比较,后者在逻辑结果上没有任何改变,但却节省了一个代价高昂的乘法器,使得整个设计占用的面积几乎减少了一半。

总结:

  • 资源共享主要针对数据通路中耗费逻辑资源较多的模块,通过选择、复用的方式共享使用该模块,达到减少资源使用、优化面积的目的。

  • 并不是在任何情况下都能以此法实现资源优化,输入与门之类的模块使用资源共享是无意义的,有时甚至会增加资源的使用(多路选择器的面积显然要大于与门)。高级的HDL综合器,如QuartusII和Synplify Pro等,通过设置能自动识别设计中需要资源共享的逻辑结构,自动地进行资源共享。

(3)逻辑优化;

使用优化后的逻辑进行设计,可以明显减少资源的占用。

  • 状态机的设计要尽可能简洁,不要搞出不必要的,多个状态对同一个数据做处理。
  • if语句中用单bit的标志位代替多bit的数据来进行条件判断。
  • 设计尽可能简洁,不要弄出冗余赋值。

答案:ABE


下面哪些属于动态验证范畴( ).
A: 形式验证
B: Modelsim仿真
C: 后仿
D: STA

分析:

https://kdocs.cn/l/caWkw1Hg9EzG
[金山文档] IC设计完整流程及EDA工具.pof

A:形式验证,也是验证范畴,从功能上(STA是时序上)对综合后的网表进行验证。形式验证是一种静态的验证手段,它根据电路结构静态地判断两个设计在功能上是否等价,常用来判断一个设计在修改前和修改后其功能是否保持一致。它运行时无须测试向量,但是必须有一个参照设计和一个待验证的设计。工具:Synopsys的Formality

B:Modelsim仿真中既可以功能仿真(静态),也可以时序仿真(动态),时序仿真时利用网表文件”.vo”和延时文件”.sdo”;

C:后仿,时序仿真加入布局布线的连线延时,属于动态时序分析;
D:Static Timing Analysis,静态时序分析;属于验证范畴,主要在时序上对电路进行验证:检查电路是否存在建立时间(setup time)和保持时间(hold time)的违例(violation)。
工具:Synopsys的Prime Time                

前仿是针对RTL的功能验证,
后仿是针对是综合后(加入约束,延时等信息)的网表文件,在前仿的基础上加入了延时信息的功能仿真,同时验证了设计的时序以及功能都正确。


在异步设计中的对跨时钟处理的信号,功能验证时般需要考虑以下哪些因素()
A: 信号变化的最小宽度
B: 信号高电平有效还是低电平有效
C: 时钟频率
D: 相位和抖动

分析:

相位和抖动是考虑时序仿真所用,其他都是正常的功能仿真时要考虑的,比如在Modelsim的功能仿真(前仿)时,TestBench需要考虑ABC内容。

答案:ABC 


可综合的verilog语法包括( )
A: for
B: wait
C: assign
D: initial
E: time
F: always
G: generate

分析:

(1)所有综合工具都支持的结构:

always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。
    (2)所有综合工具都不支持的结构

time,defparam,$finish,fork,join,initial,delays,UDP,wait。
    (3)有些工具支持有些工具不支持的结构:

casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。


建立可综合模型的原则
    要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:
    (1)不使用initial。
    (2)不使用#10。
    (3)不使用循环次数不确定的循环语句,如forever、while等。
    (4)不使用用户自定义原语(UDP元件)。
    (5)尽量使用同步方式设计电路。
    (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。
    (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。
    (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。
    (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。
    (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。
    (11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。
    (12)避免混合使用上升沿和下降沿触发的触发器。
    (13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。
    (14)避免在case语句的分支项中使用x值或z值。

不可综合verilog语句

1、initial

    只能在test bench中使用,不能综合。(我用ISE9.1综合时,有的简单的initial也可以综合,不知道为什么)

2、events

    event在同步test bench时更有用,不能综合。

3、real

    不支持real数据类型的综合。

4、time

    不支持time数据类型的综合。

5、force 和release

    不支持force和release的综合。

6、assign 和deassign

   不支持对reg 数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。

7、fork join

    不可综合,可以使用非块语句达到同样的效果。

8、primitives

    支持门级原语的综合,不支持非门级原语的综合。

9、table

    不支持UDP 和table的综合。
10、敏感列表里同时带有posedge和negedge

    如:always @(posedge clk or negedge clk) begin...end

    这个always块不可综合。
11、同一个reg变量被多个always块驱动

12、延时

    以#开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。

    如:a=#10 b;

    这里的#10是用于仿真时的延时,在综合的时候综合工具会忽略它。也就是说,在综合的时候上式等同于a=b;

13、与X、Z的比较

    可能会有人喜欢在条件表达式中把数据和X(或Z)进行比较,殊不知这是不可综合的,综合工具同样会忽略。所以要确保信号只有两个状态:0或1。

答案:ACFG


在高速的系统设计中,下列哪种优化方案的可以提高系统的工作频率()
A:树型结构
B:迟置信号后移
C:流水线
D:资源共享

分析:

D是资源(面积)优化,树形结构、迟置信号后移、流水线均能提高系统工作频率。

答案:ABC


三、填空题

assign重写一段代码。

分析:

in[i]为1时,out[i] = a[i] ^ b[i];

in[0]为0时,out[0] = 0; in[i](i>0) 为0时,out[i] = in[i-1]; 即in[i] = 0时,out[i] 为in[i] 的左移一位,最低位为0;

答案:assign out = ( in & (a^b) ) | (~in & {in[6:0],'b0} ) 或 assign out = (in) ? (a^b) : ({in[6:0],'b0})


用2048x12的ROM芯片,最多能实现____个输入____个 输出的组合逻辑的数

分析:

深度:2048,2^11=2048,需要11条地址线表示输入;

位宽:12,需要12条数据线表示输出;

答案:11,12


一个4bit的输入A,A!=4‘b0,A中从MSB开始出现的第一个1的位置上表示为B。

e.g: A=4‘b0111, B=2’b10(从MSB开始,第一个1出现在A的bit2)。则B[1]=____, B[0]=____.

分析:用B来表示A中第一个1的位置,如A = 4’b0011,第一个1出现在A的bit1,则B=2'b01;

可以列真值表很快得到答案:

A[3]A[2]A[1]A[0]B[1]B[0]

0

00100
001001
001101
010010
010110
011010
011110
100011
100111
101011
101111
110011
110111
111011
111111

答案:B[1] = A[3] | A[2];B[0] = A[3] | (~A[2] | A[1])

某个SRAM一共12根地址线A11~A0,32根数据线D31~D0,如果要实现2^20bytes的memory,需要____块这样的SRAM

分析:

1bytes(字节) = 8bits(位)

12根地址线,存储深度为2^12,32根数据线(32位)有4 Bytes, 即一个SRAM可存储2^12 * 2^2 = 2^14 Bytes,共需 2^20 / 2^14 = 2^6 = 64 块。

答案:64

 

这篇关于数字IC常考题(单选、多选、编程)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!