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

目录

 一、单选题

关于跨时钟域电路的设计,以下说法正确的是:

若要将异或非门当作反相器(非门)使用,则输入端A B端的连接方式是()

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

FIFO深度:ModuleA/ModuleB用的是同个Clock, Clock频率80MHz。

欲产生序列信号11010111,则至少需要()级触发器

以下关于System Verilog的描述,正确的

 UVM层次化结构中,最顶层的部件类型是 ()

数字信号上采样时,一般需要添加什么样的滤波器,完成功能为 ()

下列属于异步总线的是 ( )

()电路的逻辑功能特点是,任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。

在芯片设计流程当中,通常会进行后仿真(post-simulation),关于后仿的作用,以下说法不正确的是 ( )

以下关于异步处理正确的是 ( )

关于跨时钟域电路的设计,以下说法正确的是 ( )

衡量数字通信系统传输质量的指标是 ( )

移位运算符:以下代码片段实现的电路功能是 (  )

十六进制数0x12345678为big-endian格式,对应的little-endian格式为( )

大端模式与小端模式

C语言和RTL相比明显不同的是( )

下列不属于异步总线的是( )

实现以下( )CMOS电路基本单元需要的MOSFET 个数最少

二、多选题

以下方法哪些是进行面积优化( )。

速度优化,提高运行速度:

资源(面积)优化意义:

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

下面哪些属于动态验证范畴( ).

在异步设计中的对跨时钟处理的信号,功能验证时般需要考虑以下哪些因素()

可综合的verilog语法包括( )

在高速的系统设计中,下列哪种优化方案的可以提高系统的工作频率()

三、填空题

assign重写一段代码。

ROM位宽线宽

SRAM深度

OOP的三大特征是

NAND和NOR Flash的主要区别是:

四、问答题

五、编程题


​​​​​​​


 参考资料

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

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

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

delay 芯片时序output_2021**科技校招芯片岗提前批真题解析(修正版)_weixin_39834767的博客-CSDN博客

FPGA/IC笔试——**提前批 - 一曲挽歌 - 博客园 (cnblogs.com)


 一、单选题

关于跨时钟域电路的设计,以下说法正确的是:

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


FIFO深度: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

如果是规定使用移位寄存器,而不是状态机来实现的话,则需要5个寄存器。


以下关于System Verilog的描述,正确的

A:sv中可以用logic代替Verilog中的wire和reg类型

B:sv中,定义成reg的信号会被综合成触发器

C:sv中的function语言不可被综合

D:其他都不正确

E:sv是提供给验证使用的,因此不能被综合

分析:

A:正确 

Wire is verilog datatype whereas logic is SystemVerilog data type.

1.1、Logic:
SystemVerilog logic data type is 4-state data type

1.2、Wire:
Verilog wire also 4-state data type, wire is used to connect input and output ports of a module instantiation together with some other element in your design

B:错误

以下是verilog-2001的标准中对wire和reg的定义如下:

wire:
A wire net can be used for nets that are driven by a single gate or continuous assignment.
reg:
Assignments to a reg are made by procedural assignments (see 6.2 and 9.2). Since the reg holds a value between assignments, it can be used to model hardware registers. Edge-sensitive (i.e., flip-flops) and level sensitive (i.e., RS and transparent latches) storage elements can be modeled. A reg needs not represent a hardware storage element since it can also be used to represent combinatorial logic.

这段话的意思是:在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量可以声明成reg类型的。根据触发条件的不同,过程赋值语句可以建模不同的硬件结构:如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑

也就是说,综合出触发器的条件是,需要有时钟的边沿触发。

C:sv中的function语言可以被综合;

D:错误

E:sv是提供给验证使用的,因此不能被综合(可被综合


 UVM层次化结构中,最顶层的部件类型是 ()

A:uvm_test
B:uvm_root
C:uvm_top
D:uvm_component

分析:

uvm_root是验证平台中所有UVM components的“隐含”的top-level和phase控制器。用户不需要直接实例化uvm_root,UVM会自动创建uvm_root单一实例,用户可以使用全局变量(uvm_pkg范围内)uvm_top来访问uvm_root

答案:B


数字信号上采样时,一般需要添加什么样的滤波器,完成功能为 ()

A:高通,抗混叠滤波

B:低通,抗周期延拓

C:低通,抗混叠滤波

D:高通,抗周期延拓

分析:

上采样与下采样,转到:数字信号的生成——上采样与下采样_weixin_42385536的博客-CSDN博客_数字信号上采样

(网友解释:过采样技术的低通滤波器要同时完成量化噪声的滤除和降采样时抗混叠滤波的功能。)

答案:这里网上有两种答案,B和C。个人见解:上采样后,频谱被压缩了,插入零越多,压缩后的带宽越小,好像并不会造成频谱混叠,应该是为了抗周期延拓吧,毕竟周期延拓的现象更明显,所以我选B。


下列属于异步总线的是 ( )

A:SPI

B:USB

C:UART

D:IIC

分析:
(1) SPI——同步通信;串行通信;全双工;主从通信(某一时刻可以出现多个从机,但只能存在一个主机,主机通过片选线来确定要通信的从机)。

(2) USB——同步通信;通用串行总线。

(3) UART——Universal Asynchronous Receiver/Transmitter,通用异步收发器;异步通信;串行通信;全双工; 对等总线,没有仲裁机制,所以只能挂载两个同时收发数据的设备,双方都可以发送和接收。

(4) I2C——同步通信;串行通信;半双工;主从通信(总线上支持多个主机和多个从机,总线上任何能够进行发送/接收数据的设备都可以占领总线。当然,任意时间点上只能存在一个主控。多主控,主器件同时争夺总线控制权时,可仲裁)。

答案:选C


()电路的逻辑功能特点是,任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。

A:静态逻辑

B:组合逻辑

C:动态逻辑

D:时序逻辑

分析:

A:静态逻辑电路中靠稳定的输入信号使MOS晶体管保持导通或截止状态,从而维持稳定的输出状态。输入信号存在,对应的输出状态存在;只要不断电,输出信息可以长久保持;

B:动态逻辑电路中利用电容的存储效应来保存信息,即使输入信号不存在,输出状态也可以保持,但由于泄漏电流的存在,信息不能长期保持;

D:时序逻辑电路由存储电路和组合逻辑电路两部分组成,任何一个时刻的输出状态由当时的输入信号和电路原来的状态共同决定。

答案:选C


在芯片设计流程当中,通常会进行后仿真(post-simulation),关于后仿的作用,以下说法不正确的是 ( )

A:抽检netlist是否和RTL功能一致

B:抽检电路中是否出现有害的glitch

C:抽检时序是否有违规

D:抽检电路中是否存在亚稳态

答案:B


以下关于异步处理正确的是 ( )

A:信号经过两级触发器即可完成异步信号的传递

B:只要信号传递的两端时钟频率不相等,即认为是异步信号

C:异步复位信号需要经过同步处理后再使用是安全的

D:异步FIFO中使用格雷码传递异步计数器可以保证每一拍传递的数据都是准确的

分析:

A:信号分为单bit和多bits信号,若是多bits信号,就不能通过两级触发器传递;

B:错误的原因是不是没有考虑整数倍频率且相位差为0的两种时钟;

C:异步复位信号需要经过同步处理后再使用是安全的 (异步复位,同步释放)

D:使用格雷码如果出错只会有一位数据跟上一次数据不一样,应该不能保证每一拍都是正确的

答案:选C


关于跨时钟域电路的设计,以下说法正确的是 ( )

A:单bit信号经两级D触发器同步后即可进行跨时钟域传递

B:采用单一时钟的电路不会产生亚稳态

C:异步FIFO的两个时钟频率相同也可以正常工作

D:跨时钟域电路当中的亚稳态无法消除 

 分析:

A:单bit信号经两级D触发器同步后即可进行跨时钟域传递

B:采用单一时钟的电路不会产生亚稳态 (亚稳态产生原因是建立时间setup或保持时间hold不满足,单路时钟也有可能不满足)

C:异步FIFO的两个时钟频率相同也可以正常工作 (写快读慢、写满读快可以满足的话,写读时钟相同就是指写入和读取同时进行,这个应该也可以,只不过要设置一个优先级,否则有可能在满、空状态时出现问题),可以参考我的另一篇文章:同步(单时钟)、异步(双时钟)FIFO的Verilog HDL实现(含Testbench仿真代码)_Cheeky_man的博客-CSDN博客

D:跨时钟域电路当中的亚稳态无法消除 (只要系统中有异步元件,亚稳态就无法避免)

几种方法跨时钟域处理方法:

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

答案:C(有可能对)、D(一定对):单选的话,选D


衡量数字通信系统传输质量的指标是 ( )

A:信噪比

B:噪声功率

C:语音清晰度

D:误码率

分析:

衡量数字通信系统传输质量的指标分为两种:可靠性和有效性指标,有效性主要指标为传输速率,可靠性主要指标误码率或者说是误信率

答案:D 

移位运算符:以下代码片段实现的电路功能是 (  )

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位

分析:

在Verilog HDL中有两种移位运算符。
<<:(左移位运算符) >>:(右移位运算符)

其使用方法如下:
a >> n;
a << n;
a代表要进行移位的操作数,n代表要移几位。这两种移位运算都用0来填补移出的空位。下面举例说明:
module shift;
reg [3:0] start, result;
initial begin
start = 1; //start在初始时刻设为值0001
result = (start<<2); //移位后,start的值0100,然后赋给result
end
endmodule
这里假设in = 4'b0110,a = 4'b1100, b = 4'b0000, out = a | b = 1100;

再假设in = 4'b1001,a = 4'b0010, b = 4'b0001, out = a | b = 0011;

我们发现共同点:out是对in的循环左移1位

再验证一次:假设in = 4'b1011,a = 4'b0110, b = 4'b0001, out = a | b = 0111;验证正确!

答案:B、C正确(C只是方向不同)


十六进制数0x12345678为big-endian格式,对应的little-endian格式为( )

A.0x87654321

B.0x78563412

C.0x56781234

D.以上都不正确

分析:

参考:大端模式(big-endian)与小端模式(little-endian)_jason_cuijiahui的博客-CSDN博客

大端模式与小端模式

  1. 大端模式是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中.
  2. 小端模式是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中

一个数字4bit,半个byte:

例如:
一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122。那么0x11为数据高字节,0x22为数据低字节。

对于大端模式,就将0x11放在内存低地址中,即0x0010中;0x22放在内存高地址中,即0x0011中。
小端模式,就将0x11放在内存高地址中,即0x0011中;0x22放在内存低地址中,即0x0010中。

答案:B


C语言和RTL相比明显不同的是( )

A.难以描述设计对象的逻辑关系

B.难以描述设计对象的时间关系

C.难以描述设计对象的运算关系

D.难以描述设计对象的层次关系

分析:

应该是B,C语言是顺序进行的,verilog是并行,且有延时的功能


下列不属于异步总线的是( )

A.IIC

B.SPI

C.USB

D.UART

分析:

UART:通用异步收发器

答案:A、B、C


实现以下( )CMOS电路基本单元需要的MOSFET 个数最少

A . AND

B . OR 

C . NOR

D . XOR 

分析:

与非门NAND:4个 

 或非门NOR:4个

与门AND:与非门+反相器:6个

或门OR:或非门+反相器:6个

异或:XOR:6个

  1. 传输管逻辑

两个如上所示的晶体管,然后再用两个反相器产生两个输入信号的反信号,每个反相器需要两个mos管,因此总共需要2+2*2=6个

        2.传输门逻辑

不过这个需要互补nmos和pmos,上图四个mos管,外加一个反相器产生一个反信号,总共4+2=6个

答案:C


二、多选题

以下方法哪些是进行面积优化( )。

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})


ROM位宽线宽

用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深度

某个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


已知R1= R2 = R3 = R4 = R5 = R6 = R,下图从电源两端向右看去的等效电阻为____。

分析:电桥等效电阻:电桥等效电阻怎么求????_百度知道 (baidu.com)

答案:Requal = R + Rbrige = R + R = 2R


一批IC样品在测试中发现有setup或者hold时序问题,现取A、B、C、D四颗样品进行测试。A降温后停止工作,则很可能是____问题;B升温后停止工作,则很可能是____问题; C降压后停止工作,则很可能是____问题;D升压后停止工作,则很可能是____问题。

分析:
电压的关系可以确定,setup可以用提高电压来满足,所以C降压后停止工作可能是setup问题,D升压后停止工作可能是hold问题。
温度的关系没找到相关资料,但是按出题人的思路想,应该是和电压的影响相反,这里A和B猜测是hold和setup。

答案:hold(不确定),setup(不确定),setup,hold


下图表示几进制计数器

分析:

最后的Q2部分,上面1J处的意思是先把两输入信号做“与”运算,再将运算结果作为JK触发器的输入,在Quartus中绘制原理图如图所示,给出Modelsim仿真,可以按照仿真波形去验证自己画出的波形,对Q2,显然每5个CP时钟出现一次高电平脉冲,五进制计数器。

答案:五进制计数器


OOP的三大特征是

分析:面向对象程序设计(Object Oriented Programming)的三大特征:封装性、继承性、多态性


NAND和NOR Flash的主要区别是:

1.____中常存在坏块, 2.____容量可以做到很大,3.____写入速度比较快, 4.____读出速度比较快

分析:

1.(NAND)中常存在坏块, 2.(NAND)容量可以做到很大,3.(NAND)写入速度比较快, 4.(NOR Flash)读出速度比较快


verilog 当中 a=4'b10x1; b=4'b10x1; 那么逻辑表达式 a==b 为____,a===b为____;

分析:

verilog语言中'=='与'==='的区别_领悟£lifetruth...的博客-CSDN博客

逻辑相等==:两个操作数逐位比较,如果两个进行比较的位是不定态‘x’或者高阻态’z’,则输出x

逻辑全等===:在进行全等运算时,对不定态与高阻态也要进行比较,当两个操作数完全一致时,其结果才为1,否则为0

答案:x;0


4bit的信号输入和8bit的信号输入的乘法器内部计算输出信号至少需要____bit的位宽

分析:

4 bit + 8 bit 需要 :8+1 = 9bit

4 bit * 8 bit 需要 :4+8=12bit

举例:15(2^4 - 1) + 255(2^8 - 1) = 270< 2^9 - 1 =511,所以9位足够

15(2^4 - 1) * 255(2^8 - 1) = 3825,(2^11 - 1 = 2047) < 3825< (2^12 - 1 =4095),所以需要12位


通常情况下,芯片工作温度较(低),工作电压较(高),速度最快。


以下代码的打印输出是 ( )

always@(posedge clk)
begin
    a = 0;   
    a <= 1;  
    $display("%0b",a);
end

分析:

a = 0;   //阻塞赋值(拦住你:先别走,活干完了再走):必须马上执行,此时a已经为0

a <= 1;  //非阻塞赋值:等always块结束了再执行(您先忙儿,我等会儿来),此时a还是原来的值。

%b使用固定宽度显示,以适应所显示表达式的最大可能值。 %0b显示最小宽度,禁止任何前导0或间隔。

答案:打印输出为0;程序执行完后,a为1了


全部使用组合逻辑实现复数A,B,C的运算|A*(B+C)|^2时, 共需使用()个乘法器与()个加法器

分析:

两个复数的乘法:4个乘法器,2个加法器

此题:设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;

答案:6个乘法器5个加法器


四、问答题

请根据下面的设计描述,尽可能多的列出你所能想到的测试点。
如下图所示异步FIFO, rdata和wdata均为8位数据,FIFO深度为16.当rst_n输入为低时,FIFO被复位,当wclk的上升沿采样到wr为高时,数据被写入FIFO;当rclk的上升沿采样到rd为高时,FIFO输出数据。此外,当FIFO为空时,empty信号输出为高,当FIFO满时, full信号输出为高。

分析:

根据题目,主要有两个一级测试点

  1. FIFO基本功能
  2. 异步处理

对于FIFO基本功能,基本可以使用黑盒用例进行端到端测试,通过注入特定序列的输入检测输出是否符合预期,有以下二级测试点:

  1. 写端口时序行为与描述一致,检查数据在wr被采样时刻正确写入
  2. 读端口时序行为与描述一致,检查数据在rd被采样时刻正确读出
  3. FIFO能保证先进先出
  4. 信号能正确生成
  5. 信号能正确生成
  6. 检查在写满读空之后是否有做读写保护防止数据覆盖(白盒可检查memory数据)
  7. 检查在写满读空之后是否有做读写保护防止空满信号错乱(白盒可检查指针,内部计数器)
  8. 检查是否能被正常复位解复位后各输出信号初始状态(复位值)是否正常

对于异步处理,必须要进行白盒测试,假设内部实现是经典的异步FIFO实现,则有以下二级测试点:

  1. 格雷码转换逻辑的正确性
  2. 跨时钟域是否进行同步器打拍处理,以及指针信号经过同步器打拍延时对功能带来的影响(理论上不应该有任何影响)
  3. 频率不同对FIFO读写的影响,覆盖读快写慢和读慢写快(理论上不该有任何影响)

请实现对4*4矩阵式健盘的按键识别,假设每次都是单按键输入,需要有去抖功能(持续20 ms以上被认为是有效键值) ,模块时钟频率为1 kHZ.
要求用状态机实现,定义状态,画出状态转移图,并用Verilog完整描述该识别模块
矩阵式健盘电路结构参见下图,其中行线1-4由识别模块控制输出,列线5~8为识别模块的输入。


Verilog实现串行CRC-8,G(D)=D8+D2+D+1。

4d75e87ae3073bf5d7f5e469cfb8b702.png


解析:状态机,可以按照C语言的CRC-8转成状态机写法,用计数器代替for循环。


五、编程题

使用verilog编写一根单向导线wire_a仿真模型,此导线的传输延迟为5ns,且不会过滤此波形。

源代码:

`timescale 1ns/10ps
module wire_a(
    input      in,//输入
    output    out //输出
);
reg out_reg;

always@(*) begin
    out_reg <= #5 in;
end

assign out = out_reg;

endmodule

使用Verilog/SV撰写如下功能模块;求输入信号序列din在din_vld为高电平的时间段内的次小值和次小值出现的次数。接口信号如下:

module sec_min(
    input clk,           //时钟信号
    input rst_n,         //复位信号
    input [9:0] din,     //10bit无符号数
    input din_vld,       //输入数据有效信号
    output [9:0] dout,   //次小值
    output [8:0] cnt     //次小值出现的次数,溢出时重新计数
);

endmodule

  • 15
    点赞
  • 177
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cheeky_man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值