数字IC实习---面试记录

一、项目相关

1、使用的NPU算力?整个系统跑了多少帧?图片输入的尺寸?使用的目标检测模型?整个系统都有啥?
  • RK3399 Pro 的NPU算力:3.0 TOPS(TOPS:每秒万亿次操作)!
  • 10FPS;由于只是用于监控然后警报,虽然没有达到人眼所需的30FPS,但是完全够用!
  • 图片的输入尺寸是416*416,因为这是目标检测模型YOLOV3所要求的输入格式!
  • 整个系统的结构如下所示:数字IC实习---面试记录_第1张图片
2、FPGA上用什么控制的DDR?使用的是mig ip核提供给用户的哪一种接口?
  • 使用的MIG IP核控制的DDR;一共有两种用户接口,分别是AXI和app,使用的是较简单的app:XILINX 的 MIG IP(非AXI4)接口时序以及控制。
3、两点校正算法?

基于定标的非均匀校正算法(两点校正)。

module cor(
	output reg [15:0] cor_res_r,//校正完成的结果
	input wire [7:0] G,//gain
	input wire [15:0] O,//offset
	input wire [15:0] data,
	input wire clk,
	input wire rst_n
    );
//pipeline 1
reg [23:0] mult_res;
always@(*)
begin
	mult_res <= G * data;
end	

reg  [15:0] mult_res_r;
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		mult_res_r <= 16'b0;
	else
		mult_res_r <= mult_res[22:7];//由于增益扩大了128倍,因此结果应该缩小128倍
end

//pipeline2
reg [16:0]add_res;
always@(*) 
begin
	if (O[15] == 1'b1)//O为有符号数,存储时无需采用补码,仅用高位指示符号位即可,在此处进行符号判断
		add_res <= mult_res_r - O[14:0];
	else
		add_res <= mult_res_r + O[14:0];
end

always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		cor_res_r <= 16'b0;
	else if (add_res > 16'd65535)
		cor_res_r <= 16'd65535;
	else 
		cor_res_r <= add_res[15:0];
end
endmodule
  • 实际上8位的G[7:0]的最大值是1000_0000,所以最多也就是增益了128倍,为了归一化,将乘法结果的低7位给截掉,最高位也可以去掉。
  • O的最高位表示符号,所以实际上只有14位。先将加减结果扩位,然后做一个最大值的截位。之所以不做最小值的截位,是因为根据实际情况分析后确定不会发生。

当然也可以把下溢处理给加上:

module cor(
output reg [15:0] cor_res_r,//校正完成的结果
input wire [7:0] G,//gain
input wire [15:0] O,//offset
input wire [15:0] data,
input wire clk,
input wire rst_n
    );
//pipeline 1
reg [23:0] mult_res;
always@(*)
begin
	mult_res <= G * data;
end	

reg  [15:0] mult_res_r;
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		mult_res_r <= 16'b0;
	else
		mult_res_r <= mult_res[22:7];//由于增益扩大了128倍,因此结果应该缩小128倍
end

//pipeline2
//由于O是有符号的,但是没有使用补码存储,所以还是需要使用减号,因此就使用了下面的方式判断上下溢出!
//如果直接使用的是有符号加法,那么就可以使用通用方式判断溢出。然后如果是两个正数,就是上溢,否则就是下溢!
reg [16:0]add_res;
always@(*) 
begin
	if (O[15] == 1'b1)//O为有符号数,存储时无需采用补码,仅用高位指示符号位即可,在此处进行符号判断
		if (mult_res_r > O[14:0]) 
			add_res <= mult_res_r - O[14:0];
		else
			add_res <= 0;//最小值截位
	else
		add_res <= mult_res_r + O[14:0];
end

always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		cor_res_r <= 16'b0;
	else if (add_res > 16'd65535)//最大值截位
		cor_res_r <= 16'd65535;
	else 
		cor_res_r <= add_res[15:0];
end

endmodule
4、asic频率多少?在FPGA上原型验证的时候跑到了多少?

100MHZ,100MHZ。

5、用FPGA原型验证是直接把asic的代码搬到FPGA上吗?

不是的,asic本身只是接收数据然后处理完成之后输出。在验证的时候,就需要很多的外围电路去搭建系统,比如sd卡读取图像数据,然后使用ddr3存储,核心计算模块的结果比较,以及vga显示等都需要去设计。

6、在FPGA上对asic的计算结果进行比对时,参考模型为什么还是用Verilog写的?

在该asic中,除了计算模块,数据流也非常的重要,整个数据流中,除了计算模块外,还包括很多大大小小的模块。因此,在参考模型中,只保留计算模块,这样就可以消除数据流的影响,获取计算结果后保存在fifo中,然后对asic的计算结果也保存在fifo中,将两个fifo中的数据依次读出进行比较就可以知道asic整个数据流以及计算模块的计算结果是不是正确的。

7、时序分析和约束做了啥?
  • 在fpga上搭建好验证系统后,就需要综合以及布局布线了。在布局布线完成后,就需要进行后仿真,也就是时序仿真,然后分析时序报告,看有没有违例。如果有违例,就需要看一下是哪一块出了问题,是建立时间不满足还是保持时间不满足。找到出问题的点后,就可以在逻辑上做一些优化,主要就是对两个寄存器之间的组合逻辑做一些优化。
  • 约束的话,就是一些关于clock的一些基本的时钟约束。
8、流片后的测试做了啥?

片子拿到之后,就在想应该如何进行测试。鉴于fpga的IO数量不足,此时需要使用两块板子进行测试。FPGA1负责读取图像数据,然后按照emccd芯片要求的时序输出给emccd。fpga2则接收emccd输出的处理后的图像数据,然后使用vga进行显示,观察图像是否正常。设计vga显示的时候,由于原图像是4096 * 4096的,肯定显示不了,所以就对图像数据做了一个8倍下采样,变成了512 * 512。
数字IC实习---面试记录_第2张图片

9、测试过程中遇到过哪些印象比较深刻的问题?
  • 有一个问题还是印象比较深刻的:emccd处理后的图像数据是否正确是需要验证的。一开始是准备使用ila进行监测,但是ila是实时的,而且数据量确实很大,不太方便观察到所有的数据。于是就单独设计了一个uart发送模块,想要通过串口将数据发送的本地保存下来,然后和matlab处理后的数据进行对比。
  • 但是,由于图像数据是16bit的,uart一次最多只能发送8bit,于是就使用状态机,实现了将16bit的数据分两次发送,并成功保存在了本地。
  • FPGA 16bit 串口发送程序设计!
10、为什么要将8个16bit的数据拼接成256bit,最后不还是要拆分开吗?

因为每8个16bit的数据是要并行输出给emccd的,但是一开始从sd卡读取的这8个16bit的数据是顺序读取的。所以需要拼接到一块,相当于暂存一下,最后再拆分成8个数据并行输出。如果不拼接,那就需要使用8个16bit的fifo去缓冲,拼接的话,直接使用一个256bit的fifo去缓冲即可。

11、你从EMCCD这个项目中学到了啥?
  • 这个项目的核心算法其实很简单,就是一些乘加操作。我学到的其实是整个系统对数据流的处理:
  • ①比如一开始的timing input模块,它就是用于两级模块之间的同步。因为下一级是使用100MHZ的clk_sdram对上一级的60MHZ的clk_out时钟域的行场同步信号进行同步,且行场同步信号是单bit信号,所以直接使用的是打三拍的方式,然后检测行场同步信号的上升沿,此时才将输入进来的hsync和vsync输出,上一级的数据才算真正进入到下一级。
  • ②输入进来之后,需要多bit图像数据进行缓存。由于写入数据的时钟和读出数据的时钟不是一个,所以使用异步fifo来做跨时钟域的同步。
  • ③还有比如在对两个sdram进行读写时,使用了乒乓操作,在写其中一个sdram的同时,可以读另一个sdram;或者说在读一个sdram时,可以同时写另一个sdram;这样可以使数据没有停顿的输出到下一级,提高了数据的处理效率。
  • ④还学会了要善于使用状态机控制时序逻辑:如spi读写,sd卡读写,uart读写,sdram读写,ddr读写等。

二、项目之外

1、Verilog中阻塞与非阻塞的区别

https://blog.csdn.net/qq_39507748/article/details/108716370

2、AMBA总线

这个感觉总是会问到,最常用的就是AHB和AXI,最好能把有哪几个模块、有哪些信号,读写数据几种模式(单次、突发)的时序图简单叙述出来,以及这两种总线各自的特点。

  • AMBA 系列之 AHB 协议
  • AMBA 系列之 AXI 总线协议初探
  • AMBA 系列之 AHB/APB/AXI 对比
3、流水线相关

Verilog 流水线设计

  • 讲一下流水线的概念,以及其优势?
  • 某段组合逻辑被拆分之后,这段逻辑的处理时间是变长了,还是变短了,还是不变?
  • 流水线级数是不是越多越好?

你可能感兴趣的:(数字IC踩坑中,芯片,数字电路,verilog,fpga)