芯片原厂必学课程 - 第六篇章 - FPGA 设计篇
06-05 量产项目中 FPGA 原型验证的不足之处
新芯设计:专注,积累,探索,挑战
🌏 一、引言
对于量产项目中的 FPGA 原型验证而言,这是整个验证的关键路径,提供给了软件工程师进行验证和测试,也是能够复现各种复杂场景的重要支撑,提供给了验证工程师一个重要的参考点,然而,就是如此重要的一个 FPGA 原型验证,也难免存在一些 ASIC 验证中无法覆盖的测试点,因此,熟悉量产项目中 FPGA 原型验证的不足之处,有助于一名高级数字 IC 设计工程师准确识别量产风险
NOTES:本文来自《芯片原厂必学课程 - 第六篇章 - FPGA 设计篇》技术专栏
🌏 二、正文
✅ FPGA 上的运行速度、工作频率、整体性能都是偏低的,有些模块的吞吐测试可能无法验证
############### TIMING CONSTRAINTS ###############
create_clock -name i_sys_clk -period 5.00 -waveform {0.00 2.50} [get_ports sys_clk_p]
set_clock_groups -asynchronous -group [get_clocks "i_sys_clk"]
create_clock -name SWD_TCK -period 100.00 -waveform {0.00 50.00} [get_ports SWD_TCK]
set_clock_groups -asynchronous -group [get_clocks "SWD_TCK"]
set_input_delay -clock [get_clocks SWD_TCK] 60 [get_ports SWD_TMS]
set_output_delay -clock [get_clocks SWD_TCK] 30 [get_ports SWD_TMS]
create_clock -name vga_dclk_o -period 40.00 -waveform {0.00 20.00} [get_ports vga_dclk_o]
set_clock_groups -asynchronous -group [get_clocks "vga_dclk_o"]
set_input_delay -clock [get_clocks vga_dclk_o] 24 [get_ports vga_data_o[*]]
set_input_delay -clock [get_clocks vga_dclk_o] 24 [get_ports vga_hsync_o]
set_input_delay -clock [get_clocks vga_dclk_o] 24 [get_ports vga_vsync_o]
set_input_delay -clock [get_clocks vga_dclk_o] 24 [get_ports vga_de_o]
set_output_delay -clock [get_clocks vga_dclk_o] 12 [get_ports vga_data_o[*]]
set_output_delay -clock [get_clocks vga_dclk_o] 12 [get_ports vga_hsync_o]
set_output_delay -clock [get_clocks vga_dclk_o] 12 [get_ports vga_vsync_o]
set_output_delay -clock [get_clocks vga_dclk_o] 12 [get_ports vga_de_o]
create_clock -name cmos_pclk_i -period 40.00 -waveform {0.00 20.00} [get_ports cmos_pclk_i]
create_clock -name cmos_xclk_o -period 40.00 -waveform {0.00 20.00} [get_ports cmos_xclk_o]
create_clock -name QSPI_FLASH_SCK -period 40.00 -waveform {0.00 20.00} [get_ports QSPI_FLASH_SCK]
set_clock_groups -asynchronous -group [get_clocks "cmos_pclk_i"]
set_clock_groups -asynchronous -group [get_clocks "cmos_xclk_o"]
set_clock_groups -asynchronous -group [get_clocks "QSPI_FLASH_SCK"]
set_false_path -from [get_ports sys_rst_n]
set_false_path -from [get_pins u_arm_video_soc_wrapper/*] -to [get_pins *_ila_r_reg/D]
set_false_path -from [get_pins u_arm_video_soc_wrapper/*] -to [get_pins *_ila_r*]
set_false_path -from [get_pins *] -to [get_pins *_ila_r_reg/D]
set_false_path -from [get_pins *] -to [get_pins *_ila_r*]
✅ FPGA 上无法验证电源域、休眠唤醒、低功耗设计等等场景,FPGA 芯片是单独的电源域,或者设计者无法划分 FPGA 芯片中的电源域
✅ ANA 模拟部分,数字 FPGA 主要是基于 LUT 组成的,对于模拟部分无法实现,模拟部分只能通过其它的方式来验证或者来替代
✅ PLL 晶振部分,例如 FPGA 无法实现 ASIC 特有的模拟晶振,只能通过例化 FPGA PLL 或者简单的手写计数来作为 FPGA 时钟
// Standard Verilog HDL For "Clock Divider"
module ccu_clkdiv(
input wire clki ,
input wire rst_n,
output reg clko
);
always @(posedge clki or negedge rst_n) begin
if(!rst_n)
clko <= 1'b0;
else
clko <= ~clko;
end
endmodule
✅ DFT 测试部分,例如 FPGA 无法验证 SCAN MODE 的测试模式
✅ PAD 外围部分,例如 FPGA 无法验证 IO PAD 上下拉部分,FPGA 只能以同等功能的代码来代替
assign PAD = enable ? dout : 1'bz;
assign din = (~enable)? PAD : 1'b0;
✅ 时序约束部分和管脚约束部分,FPGA 不仅较难收敛同时不具备 ASIC 约束的参考性,FPGA 的时序约束和管脚约束是不同于 ASIC 的,这里约束的主要目的只是为了满足测试验证需求