> 文章列表 > 联发科 2024届 IC实习笔试分析

联发科 2024届 IC实习笔试分析

联发科 2024届 IC实习笔试分析



说明

记录一下  4月19日晚,发哥的一场笔试。分享给需要的 IC 人。

岗位:数字IC设计验证(安徽 合肥)

转载要经本人同意!

我的见解不一定都是准确的,欢迎评论区交流指正~~


1、(20分)很经典的数电题目,请看:

这个数电题目只能说是很经典了;最关键的是处理约束项。

那么关于带约束项的化简,此处给出我的见解,供参考。

约束项的一般形式为:与或式  =  0 (如果不是此种形式,最好化为此种形式);如此题的BC = 0;或者AB +CD = 0;ABC + CD = 0;等等。

直接求解的思路就是,画出卡诺图,把约束式等号左侧的各个与项对应的卡诺图格子画X,即无关项。对本题而言就是将BC(即B=1,且C=1)对应的格子画X。

下面给出具体求解:

 

2、(5分)简答题,ASIC flow 中综合工具的作用是什么?综合的时候需要SDC文件进行约束,请列举3条SDC的语法。

给出我的见解:综合的作用就是将 HDL 代码映射为期间库中的门级网表。

SDC语法列举:

set_input_delay delay_value -clock clock_ref [–max] [–min] [–clock_fall] [-rise] [-fall] [-add_delay] input_list

create_clock[-add] [-name <clock_name>] -period [-waveform<edge_list>]

set_false_path -from [get_clocks CLKA]-to [get_clocks CLKB]]

3、(10分)智力题(推理题)

文字太烦,本人直接放弃。给大家看看:

(1)2 12 1112 3112 132112 ,问你下一个数是啥?给理由;

 

(2)有一个小偷费劲力气进入到了银行的金库里。在金库里他找到了一百个箱子,每一个箱子里都装满了金币。不过,只有一个箱子里装的是真的金币,剩下的99个箱子里都是假的。真假金币的外形和质感完全一样,任何人都无法通过肉眼分辨出来。它们只有一个区别:真金币每一个重量为101克,而假金币的重量是100克。在金库里有一个电子秤,它可以准确地测量出任何物品的重量,精确到克。但很不幸的是,这个电子秤和银行的报警系统相连接,只要被使用一次就会立刻失效。请问,小偷怎么做才能只使用一次电子秤就找到装着真金币的箱子呢?

这个题目很经典:

 4、(10分)选择参与过的任一个项目,简述项目内容以及流程,讲述您在项目中承担的任务,挑一项你认为难的地方并阐述解决方案。

5、(5分)用python写一个冒泡排序的函数以及测试程序。

def bubbleSort(arr):n = len(arr)# 遍历所有数组元素for i in range(n):# Last i elements are already in placefor j in range(0, n-i-1):if arr[j] > arr[j+1] :arr[j], arr[j+1] = arr[j+1], arr[j]arr = [64, 34, 25, 12, 22, 11, 90]bubbleSort(arr)print ("排序后的数组:")
for i in range(len(arr)):print ("%d" %arr[i]),

6、(15分)用Verilog 写一个 Round Robin 仲裁器。模块端口如下:

input clock;

input reset_b;

input [N-1:0] request;

input [N-1] lock;

output [N-1] grant; //one-hot

此处的 lock 输入信号,表示请求方收到了仲裁许可,在对应的lock拉低之前,仲裁器不可以开启新的仲裁。(可简单理解为仲裁器占用)

该题要求参数化编程,在模块例化时可调整参数。也即是说你不能写一个固定参数,比如N=8的模块。

参考波形图:

此题的思路参考:

Round-Robin算法的verilog实现  

结合题目的需求,我在这里给出我的见解:

设计源码:

// ===================================================================================
// 功能:
// 		-1- Round Robin 仲裁器
//      -2- 仲裁请求个数N可变
// 		-3- 加入lock机制(类似握手)
// 		-4- 复位时的最高优先级定为 0 ,次优先级:1 -> 2 …… -> N-2 -> N-1
// By:Xu Y. B.
// ===================================================================================`timescale 1ns / 1ps
module Round_Robin_Arbiter #(
parameter 		N 		= 		4 //仲裁请求个数
)(
input 							clock,
input 							reset_b,
input 			[N-1:0]			request,
input 			[N-1:0]			lock,
output reg 		[N-1:0] 		grant//one-hot);
// 模块内部参数localparam LP_ST_IDLE      		 = 3'b001;// 复位进入空闲状态,接收并处理系统的初次仲裁请求
localparam LP_ST_WAIT_REQ_GRANT  = 3'b010;// 等待后续仲裁请求到来,并进行仲裁
localparam LP_ST_WAIT_LOCK 		 = 3'b100;// 等待LOCK拉低// 模块内部信号
reg [2:0]   R_STATUS;
reg [N-1:0] R_MASK;
wire [N-1:0] W_REQ_MASKED;assign W_REQ_MASKED = request & R_MASK;always @ (posedge clock)
beginif(~reset_b)beginR_STATUS <= LP_ST_IDLE;R_MASK <= 0;grant <= 0;endelsebegincase(R_STATUS)LP_ST_IDLE:beginif(|request) //首次仲裁请求beginR_STATUS <= LP_ST_WAIT_LOCK;grant <= request & ((~request)+1);R_MASK <= ~((request & ((~request)+1))-1 | (request & ((~request)+1)));	endelsebeginR_STATUS <= LP_ST_IDLE;endend     LP_ST_WAIT_REQ_GRANT://处理后续的仲裁请求beginif(|request)beginR_STATUS <= LP_ST_WAIT_LOCK;if(|(request & R_MASK))//不全为零begingrant <= W_REQ_MASKED & ((~W_REQ_MASKED)+1);R_MASK <= ~((W_REQ_MASKED & ((~W_REQ_MASKED)+1))-1 | (W_REQ_MASKED & ((~W_REQ_MASKED)+1)));endelsebegingrant <= request & ((~request)+1);R_MASK <= ~((request & ((~request)+1))-1 | (request & ((~request)+1)));endendelsebeginR_STATUS <= LP_ST_WAIT_REQ_GRANT;			grant <= 0;			R_MASK <= 0;			endend   LP_ST_WAIT_LOCK:beginif(|(lock & grant)) //未释放仲裁器		begin		R_STATUS <= LP_ST_WAIT_LOCK;		end		else if(|request) //释放的同时存在仲裁请求		 begin		R_STATUS <= LP_ST_WAIT_LOCK;if(|(request & R_MASK))//不全为零begingrant <= W_REQ_MASKED & ((~W_REQ_MASKED)+1);R_MASK <= ~((W_REQ_MASKED & ((~W_REQ_MASKED)+1))-1 | (W_REQ_MASKED & ((~W_REQ_MASKED)+1)));endelsebegingrant <= request & ((~request)+1);R_MASK <= ~((request & ((~request)+1))-1 | (request & ((~request)+1)));end		endelsebeginR_STATUS <= LP_ST_WAIT_REQ_GRANT;grant <= 0;			R_MASK <= 0;end		end		default:		beginR_STATUS <= LP_ST_IDLE;R_MASK <= 0;grant <= 0;endendcaseend
end
endmodule

仿真文件:

// =====================================================================
// 功能:测试模块 Round_Robin_Arbiter 功能 
// By:Xu Y. B.
// =====================================================================`timescale 1ns / 1ps
module TB_Round_Robin_Arbiter();parameter 		N 		= 		4; //仲裁请求个数reg 							clock;
reg 							reset_b;
reg 			[N-1:0]			request;
reg 			[N-1:0]			lock;
wire 			[N-1:0] 		grant;//one-hotinitial clock = 0;
always #10 clock = ~clock;initial
beginreset_b <= 1'b0;request <= 0;lock <= 0;#20;reset_b <= 1'b1;@(posedge clock)request <= 2;lock <= 2;@(posedge clock)request <= 0;@(posedge clock)request <= 5;lock <= 7;@(posedge clock)lock <= 5;@(posedge clock)request <= 1;@(posedge clock)lock <= 1;@(posedge clock)request <= 0;@(posedge clock)lock <= 0;#100;$finish;
endRound_Robin_Arbiter #(.N(N)) inst_Round_Robin_Arbiter (.clock   (clock),.reset_b (reset_b),.request (request),.lock    (lock),.grant   (grant));endmodule

仿真结果:

 对比给的参考波形,二者一致。

7、(15分)关于DMA寄存器配置,DMA寄存器(地址 0x81050010)表:

Type 表示读写类型。Reset 表示复位值。

写一个C函数 void dma_driver(void),按步骤完成以下需求:

  • 分配DMA所需的源地址(0x30)
  • 分配DMA所需的目的地址(0x300)
  • 设置传输128 Byte 数据
  • 开始DMA传输
  • 等待DMA传输结束

代码写法不唯一,这里给出我的见解:

void dma_driver(void)
{unsigned int *prt = (unsigned int *)0x81050010;int DMA_SRC_ADDR = 0x30;int DMA_DST_ADDR = 0x300;int DMA_LENGTH = 128;int DMA_START = 0X01;// STEP1*prt |= DMA_SRC_ADDR << 2; // STEP2*prt |= DMA_DST_ADDR << 13; // STEP3*prt |= DMA_LENGTH << 24; // STEP4	*prt |= DMA_START; while((*prt) & DMA_START){}
}

8、(20分)二阶带通滤波器,利用RC组件搭建,通带范围 1kHz~30kHz ,两个电阻 R 均为10kΩ ,问两个电容容值多少?

首先你得知道二阶带通(RC)滤波器的电路长啥样:

 

基本思路就是计算传输函数,然后找截止频率;由于R1=R1=10kΩ,所以公式推导时均用R表示:(如发现推导步骤有问题,请及时在评论区留言,谢谢

 根据最后推导得到的表达式,对于 jwRC2 ,这一项,当 w 趋于无穷大时,uo/ui 趋于零。那么高频的临界点就是 wRC2 = 1+2C2/C1;(此时忽略低频项 1/jwRC1) ;

同理,对于低频项 1/jwRC1, w 趋于无穷小时,uo/ui 趋于零 ,那么低频的临界点就是   1/wRC1 = 1+2C2/C1;

整理:

 

求解过程用到了MATLAB:

 

思路参考自: RC频率滤波电路设计

至此,发哥19日晚的笔试题目全部整理完毕,如有问题,请及时告知(评论区留言吧~~)

IC 加油!