求职“笔试经”第十五弹:FPGA设计中复位用法(华为硬件逻辑岗)
华为不想错过我的推送,记得右上角-查看公众号-设为星标,摘下星星送给我!
本次解析是华为硬件逻辑实习岗的最后4道题。上周留下的题目有很多同学参与了答题,但整体正确率却创下了新低。初步分析就是大家对FPGA这块知识的掌握还是欠佳的,对一些概念性的东西了解不透彻,特别多选题更是拿捏不准,这需要大家多去学习、看书来,更要仔细看今天的解析。
40、(正确率≤23%)下列关于initial和always的说法正确的是( )。(华为硬件逻辑实习岗)
A initial和always不能同时执行
B initial只能执行一次
C always只要条件符合即可执行
D initial不可以综合,always可以综合
解析:本题目主要考察了Verilog中并行块的用法
这是道多选题,具体有几个正确选项题干没有明确说明,只能根据我们平时所积累的知识来一个个判断,如果多选了一个或者少选了一个都不得分。
这道题主要是考察的是Verilog中最常用的两个并行块的用法,always块在可综合的时序电路中是必不可少的语法,而initial块在仿真中也几乎是必须用到的。
并行块顾名思义,就是可并行执行,即是一上电多个并行信号同时执行。而在语法的实现上就是通过多个并行的always块来实现的,多个always块中的不同信号在FPGA上电后是同时执行的,所以这也是为什么同一个变量不能在多个always中被赋值的原因,会报出多驱动的错误。因为它们之间是并行执行的,电路不可能同时给同一个信号既赋值为0又赋值为1,会导致不确定的状态,所以同一变量只能在一个always中被赋值,这样代码更加清晰简洁容易维护。
同样initial也是,但和always不同的是initial一“上电”只执行一次,所以B选项正确,而always块是只要其敏感列表中的条件满足就一直执行下去,所以C选项正确。initial被一些综合器视为不可综合的语法,通常用于仿真的Testbench模块中对激励矢量的描述或用于给寄存器变量赋初值,而在实际电路中赋初值是没有意义的,在综合时会被忽略,但却可以在可综合模块中对存储器加载初始化文件,这属于一种可综合的行为,但不能就因此说initial就是可综合的语法,所以不要轻易在可综合的模块中使用initial,或者干脆最好不要用。所以D选项正确。
很多人没有选D选项可能是见到initial在可综合的代码中使用过,且有些综合其器还能编译通过,以为它是可以被综合的,但它确实是一种特殊的存在,如果使用不当可能会导致某些不可预测的错误。
如果always和initial同时存在于一个模块中时也是一“上电”同时执行的,不分先后顺序,所以A选项错误。
凡是在always和initial赋值号左边的变量都要定义成reg型,reg具有对某一个时间点状态进行保持的功能,如果在可综合的时序逻辑中表达,会被映射成一个真实的物理寄存器,而在Verilog仿真器中寄存器类型的变量通常要占据一个仿真内存空间。
41、(正确率≤19%)下列哪种说法正确( )。(华为硬件逻辑实习岗)
A 同步复位增加了时序收敛的难度
B 同步化异步复位可以保证逻辑正确复位
C 从使用资源的角度看,应该使用异步复位
D 异步复位可能会导致逻辑错误
解析:本题目主要考察了在FPGA设计中复位的用法
这道题目也是一道多选题,而且是目前为止正确率最低的一道题目。大家在进行FPGA逻辑设计时肯定经常会用到复位,学习者在入门学习时往往都是使用Altera公司(15年被Intel收购)的芯片,因为Altera公司的开源资料相对较多且开发软件比较容易上手。我们在学习时发现相关的代码实例几乎都是用的异步复位,很多学习者没有太注意这块的内容,都是直接照搬例程,也没有深究其原因,就以为异步复位就是约定成俗的习惯性写法,其实这是一种误区。
为什么需要复位呢?这个很容易理解,单片机也常用复位,就是怕系统万一跑飞了还能够初始化后回到正常状态。同样这里使用复位也有这个原因,且我们使用的复位往往都是全局复位,复位有两种,一种是同步复位,一种是异步复位。
我们以D触发器的例子来进行讲解。同步复位的D触发器中的“同步”是和工作时钟同步的意思,也就是说,当时钟的上升沿(也可以是下降沿,一般习惯上为上升沿触发)来到时检测到按键的复位操作才有效,否则无效。如下图所示,最右边的三根红色的竖线表达的就是这种效果,sys_rst_n被拉低后led_out没有立刻变为0,而是当syc_clk的上升沿到来的时候led_out才复位成功,在复位释放的时候也是相同原因。
同步复位的D触发器RTL代码:
根据上面RTL代码综合出的RTL视图如下图所示,由一个选择器和一个寄存器构成:
异步复位的D触发器RTL代码:
根据上面RTL代码综合出的RTL视图如下图所示,只有一个寄存器构成。
如果复位时的值不是0而改为1,相当于复位时将D触发器置为1,则使用D 触发器上的置位端口,其综合的RTL视图如下图所示。
通过上面同步复位和异步复位综合出的D触发器的RTL视图对比,我们可以发现采用同步复位会多出来一个选择器的结构,这里我们可能不禁会有疑问,为什么多了一个选择器?原因就是由Altera的最小逻辑单元LE中的寄存器结构决定的,如下图所示,在Chip Planner视图中我们发现LE中的寄存器有一个连接到寄存器的异步复位信号!ACLR的PAD,也就是说Altera器件中的基本单元就是由异步复位且低有效结构的寄存器组成的,如果不按照这个现有的资源来设计我们就需要额外使用其他的资源,从而造成浪费,所以这就是我们所“默认”Altera器件中往往都是异步复位低有效的原因。
但是在使用Xilinx的芯片时规则又变了,官方文档《Vivado使用误区与进阶》中明确说明尽量避免使用异步复位,且如果使用复位就用高复位,巧的是刚好和Altera推荐的规则相反,也是因为内部结构决定的,这也是这两家公司非常有意思的地方,所以我们在开发Altera和Xilinx的芯片时复位要区别对待。所以C项错误。
同步复位的D触发器和异步复位的D触发器的不同点是复位有效的条件是“立刻”执行还是等待“沿”再执行的区别。异步复位有一个明显的问题就是会产生亚稳态的问题。B项和D项说的就是这个问题。全局复位我们往往都是外接一个按键,异步复位时按键一旦按下就立刻进行复位,复位可以在任何时候发生,表面上看跟时钟没有关系,但真实情况是异步复位也需考虑时钟跳变沿,因为时钟沿变化和异步复位都可以引起Q端数据变化。如果异步复位信号跟时钟在一定时间间隔内发生变化(Removal time和Recovery time,类似于建立/保持时间),就是说只要复位信号不在时钟有效沿附近变化(复位信号远离时钟有效沿),就可以保证电路的正常复位和撤销,否则Q值将无法确定即产生亚稳态现象。这个时候即使异步复位信号持续时间再长都没有办法,因为不定态已经传递下去。而同步复位就没有这种问题,所以我们需要结合一下两者的优点,异步复位同步释放机制,如下图所示,所以B选项和D选项正确。
问题最大的其实就是A选项,很多同学都没选这个选项,以为同步复位的效果会好,其实只要存在复位都会增加布局布线的负担,因为复位会像时钟一样连接到每一个寄存器上,是相当复杂的工程,会增加时序收敛的难度,所以A选项正确。难道不用复位吗?也不完全是,我们还需要参考官方的建议,在《Vivado使用误区与进阶》中提到我们要遵循 Xilinx 建议的复位准则:(1)尽量少使用复位;(2)必须复位时采用同步复位;(3)确保使用高电平有效的复位;(4)避免异步复位(RAMB 和 DSP48 模块中不支持异步复位)。如果不用复位那寄存器的初值我们怎么给呢?在代码中定义寄存器的时候直接在变量名后赋初值即可,Verilog-2001标准支持这种写法。
Xilinx 的复位准则必须严格遵守,根据现场支持的经验来看,很多设计性能的瓶颈就在于设计源代码时没有考虑底层实现器件的硬件结构特点,尤其以复位信号的实现问题最为突出。在Xilinx的官方手册UG949中也写道关于复位的问题,Xilinx器件提供专用的全局置位/复位信号(GSR)。在器件配置结束时,该信号将器件配置中所有顺序单元的初始值。如果未指定初始状态,则为顺序原语分配默认值。在大多数情况下,默认值为零。 FDSE和FDPE 原语是例外,默认为逻辑1。每个寄存器在配置结束时将处于已知状态。因此没有必要单独为初始化加电器件编写全局复位代码。
Xilinx强烈建议用户仔细判断设计何时需要复位,何时不需要复位。大多数情况下,在控制路径逻辑上可能需要复位以确保正常运行。然而在数据路径逻辑上通常不需要复位。
限制复位使用的方法如下:(1)限制复位网络的总体扇出;(2)减少复位路由所需的互联数量;(3)简化复位路径的时序;(4)从而在许多情况下能够从整体上提升性能、缩小占位面积和降低功耗。
42、(正确率26%)关于任务和函数的区别,下列说法错误的是( )。(华为硬件逻辑实习岗)
A 函数可以包含时延和时序控制
B 函数不能调用任务
C 函数必须带有至少一个输入
D 函数只能返回一个值
解析:本题目主要考察了Verilog中任务和函数的特点
任务和函数有助于简化程序,往往在编写用于仿真Testbench中使用较多。在《IEEEStandard Verilog Hardware Description Language》中有详细对任务和函数用法的介绍和示例。
任务和函数的共同点:
1)任务和函数必须在模块内定义,其作用范围仅适用于该模块,可以在模块内多次调用。
2)任务和函数中可以声明局部变量,如寄存器,时间,整数,实数和事件,但是不能声明线网类型的变量。
3)任务和函数中只能使用行为级语句,但是不能包含always和initial块,设计者可以在always和initial块中调用任务和函数。
任务和函数的不同点:
1)函数能调用另一个函数,但是不能调用任务;任务可以调用另一个任务,也可以调用函数。所以B选项正确。
2)函数总是在仿真时刻0开始;任务可以在非零时刻开始执行。
3)函数一定不能包含任何延迟,事件或者时序控制声明语句;任务可以包含延迟,事件或者时序控制声明语句。所以A选项错误。
4)函数至少要有一个输入变量,也可以有多个输入变量;任务可以没有或者有多个输入,输出,输入输出变量。所以C选项正确。
5)函数只能返回一个值,函数不能有输出或者双向变量任务不返回任何值,或者返回多个输出或双向变量值。所以D选项正确。
由上述的特点决定:函数用于替代纯组合逻辑的Verilog代码,而任务可以代替Verilog的任何代码。
任务使用关键字task和endtask来进行声明,如果子程序满足下面任何一个条件,则必须使用任务而不能使用函数。自动(可重入)任务:Verilog任务中所有声明的变量地址空间都是静态分配的,因此如果在一个模块中多次调用任务时,可能会造成地址空间的冲突,为了避免这个问题,Verilog通过在task关键字后面添加automatic使任务称为可重入的,这时在调用任务时,会自动给任务声明变量分配动态地址空间,这样有效避免了地址空间的冲突。
函数使用关键字function和endfunction定义,对于子程序,如果满足下述所有条件则可以用函数来完成:跟任务调用一样,在模块中如果调用多次函数,也会碰到地址冲突的问题,因此也引入automatic关键字来对函数可重用性声明。没有进行可重用性声明的函数不可以多次或者递归调用,进行了可重用性声明的函数可以递归调用。
43、(正确率45%)请选出哪个不是FPGA的加载方式( )。(华为硬件逻辑实习岗)
A 被动并行 B 主动串行
C I2C加载 DJTAG
解析:本题目主要考察了FPGA的上电加载模式
目前spartan6、Vertex6系列FPGA可以支持多种配置方式,从配置时钟的来源可分为:Master Modes、Slave Modes;从数据读取方式可分为:Parallel、Serial Modes。这样排列组合以下就有如下配置方式:Master Serial、Slave Serial、Slave Parallel、MasterParallel。另外Spartan 6等新片子还支持一种SelectMAP 模式,也可以分为MasterSelectMAP和Slave SelectMAP两种,这两种方式具体的特点参见相关官方手册UG380。另外还可以采用JTAG方式在线配置,不过掉电程序是不能保留的。
FPGA的配置包括直接使用下载电缆对FPGA器件进行编程、对外部EEPROM和FLASH进行编程、使用MPU对FPGA器件进行编程、外部EEPROM和FLASH对器件进行编程等。
FPGA器件配置方式分三大类:主动配置、被动配置和JTAG配置。
主动配置:由FPGA器件引导配置操作过程。
被动配置:由计算机或控制器控制配置过程。上电后,控制器件或主控器把存储在外部存储器中的数据送入FPGA器件内,配置完成之后将对器件I/O和寄存器进行初始化。初始化完成后,进入用户模式,开始正常工作。一旦设计者选定了FPGA系统的配置方式,需要将器件上的MSEL引脚设定为固定值,以指示当前所采用的配置方式。常用的配置方式有:
PS配置(Passive Serial ConfiguraTIon):被动串行配置
AS配置(AcTIveSerial ConfiguraTIon):主动串行配置
PPS配置(Passive Parallel Synchronous ConfiguraTIon):被动并行同步配置
FPP配置(Fast Passive Parallel Configuration):快速被动并行配置
PPA配置(Passive Parallel Asynchronous Configuration):被动并行异步配置
PSA配置(Passive Serial Asynchronous Configuration):被动串行异步配置
JTAG配置(Joint Test Action Group Configuration)
下一期我们将对本套所有的题目进行一个详细的分类整理,然后分析出题套路以及我们该如何应对华为硬件逻辑岗的笔试,敬请期待……
目前,我们安排的是每周二更新求职笔试经系列,计划涵盖的公司包含:华为,京东,大疆,商汤,中兴,CVTE,AMD,海康威视,黑金,汇顶等。(会陆续补充)