2021乐鑫科技校招芯片岗提前批真题解析(修正版)

原创 数字IC自修室 2021-08-20 14:49

今天为大家带来乐鑫科技提前批芯片岗的真题解析,不得不承认这份题目难度在面试题中算比较高的,涉及的知识面也很广。笔者水平有限,如有错漏,欢迎指正哈。之前文章中有几处错漏,这篇文章予以修正,欢迎大家继续拍砖。

此外想说的是,本文答案仅供参考,请大家带着批判的眼光看待,先做题再看解析,才能真正起到刷题的作用。


1. 请根据下面的设计描述,尽可能多的列出你所能想到的测试点:

一个异步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读写的影响,覆盖读快写慢和读慢写快(理论上不该有任何影响)

 

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



解析:这个题目对熟悉单片机的同学比较友好,对没接触过的同学,可能就蒙圈了。在有限的题目描述里还没办法理解题目想让我们做什么,必须结合电路图来看。 


首先必须要明确题目里说的输入输出是针对“识别模块”来说的,不是针对这一大块开关电路来说的。识别模块在图中太不起眼了..在输入输出1~8管脚的连接处,感觉出题者默认大家对此电路功能都很清楚。如果输入输出都搞反了,那更不知道这道题要做什么了。 


这个题目对于处理模块来说,实际上想做的是按键识别,也就是通过对按键开关电路操作和观测来识别当前是哪个按键被按下了,然后输出该按键编码。可以看到每个按键都处于4x4矩阵的一个节点处,也就是说有(x,y)坐标,只要分别得到x和y的值就能锁定唯一按键。


如何得到x和y的值呢?首先需要观察,按键被按下之后会有什么效果。很明显,就是从电源VCC经过电阻到某一个识别模块控制输出端(比如说输出1)的电路导通了。这个时候如果这个模块输出(比如输出1)接地,那这就是一个完整的回路,而对于5~8来说,将观察到电压值从VCC变为0。因此通过控制1~4输出全接地,观察5~8是否有值拉低就可以判断是否有按键输入,同时可以得到输入键的横坐标x。


因为需要做去抖动功能,在看到5~8有拉低之后还要等上20ms才能确保是有效按键输入,题目频率是1kHz,20ms需要保证20个周期内5~8的值不变,如果跳变为全0,则重新重新开始等待按键输入。


如果有效按键输入被确认,接下来需要得到y坐标,同样可以通过控制1~4输出来观察5~8输入。要找到是哪一行的按键被按下,可以通过控制变量法,将1~4分别输出向量4‘’b0111,4’b1011, 4b1101, 4b1110,其中接VCC表示输出了高电平1,这个时候两端电压相等是没有电路导通的,只有输出接地0的那一路可能被导通。如果没被导通,那就是没有按键输入。这样依次排查可以找到纵坐标y值。

 

这里因为题目要求只要保证20个周期即可认为有效输入,而对于有效输入来说,其延续时间大部分情况下都远大于20个周期,因此在X_DETECT状态后4个周期内可以默认该有效输入依然保持有效,在X_DETECT期间不会因为按键本身无效导致结果错误。

 

最后就是简单地通过x和y坐标值查找或者计算得到具体的按键编码。状态转移图如下,verilog这里就不提供了,使用传统三段式写法写状态机就行。这里面Out[3:0]和In[3:0]分别对应4个输出和4个输入。