FPGA设计流程
LUT
FPGA的核心存储单元在于LUT,目前大多采用SRAM工艺实现,其工作流程是:
- 在FPGA上电时,会使用一个配置文件(configuration file)对所有的LUT进行初始化。这个过程本质上是利用LUT RAM的写端口对其进行编程。
- 配置文件包含了每个LUT要实现的逻辑功能的真值表。它会将这些真值表预先写入LUT内部的SRAM单元。
- 具体来说,配置文件会将每个输入组合对应的输出结果,写入到SRAM单元的相应地址位置。每个SRAM单元存储1bit,对应一个输入组合的输出值。
- 一旦完成配置,LUT的SRAM单元就成为一个只读的逻辑查找表。在电路工作时,输入信号的组合会作为地址,从SRAM中读取预先写入的逻辑结果并输出。
- 在某些FPGA中,LUT还可以被直接用作RAM。此时会有额外的输入端口用于写数据和写使能,与用于读取的地址端口共享。
IOB(可编程输入/输出单元)
就是板载IO接口,并且FPGA中的IO接口被划分为若干组bank,每一个bank都必须使用相同的电压标准。
数字时钟管理模块
你的开发板有没有DCM?在verilog设计中有没有用到?
我无法确定安路的开发板里DCM存不存在或者它具体指的是什么,我只知道安路的开发板里时钟资源如下:
- 针对高速I/O接口设计的2路IOCLK
- 16路全局时钟
- 支持4个PLLs用于频率综合
- 5路时钟输出
- 分频系数1到128
- 支持5路时钟输出级联
- 动态相位选择
可以认为,DCM描述的是一个时钟整体,它指代了开发板上的各种时钟控制模块。在实际开发中,我通常使用的PLL锁相环是一个软核IP,也就是需要我手动调试verilog代码并综合到目标电路中,例如,修改时钟输出频率与相移等。进而引发新的思考,如何在不使用IP核的情况下进行时钟分频?
嵌入式RAM(BRAM)
你的开发板中BRAM有多大?
安路开发板板载1Mbits的BRAM,大概是0.128M(兆),板载8M的SDRAM。
zynq开发板板载4.9Mbits的BRAM,大概是0.6125M(兆),板载1G的SDRAM。
BRAM在开发过程中可以被配置成双扣RAM等,那如果只用verilog如何实现?
嵌入式IP单元
什么是硬核和软核?
硬核IP(Hard IP)是已经经过物理设计和验证的IP模块,通常以特定工艺节点的版图形式提供。它们的设计已经固定,不能轻易修改,具有高性能和高可靠性,适合对性能和可靠性要求较高的应用,如处理器核心、存储器接口和高速通信接口等。硬核IP可以直接集成到芯片设计中,减少了设计和验证的时间。
软核IP(Soft IP)是以源代码(如Verilog或VHDL)或综合后的网表形式提供的IP模块。它们可以根据不同的设计需求进行修改和优化,适应不同的工艺节点和设计要求,提供了更大的设计灵活性和可移植性。软核IP常用于需要灵活设计和定制的应用,如嵌入式处理器、DSP核心和定制逻辑模块等。
ASIC设计流程
最首要的问题,ASIC设计工程师与FPGA工程师的区别在哪
ASIC设计工程师要交付哪些东西?
- 设计文档
- 详细的设计文档,包括芯片架构、功能描述、模块设计、时序分析、功耗分析、形式验证等内容。
- 这些文档需要清晰、完整、准确地描述芯片的设计过程和结果,为后续的芯片制造、测试和应用提供指导。
- RTL代码
- 用Verilog或VHDL等硬件描述语言编写的RTL代码,是芯片设计的核心。
- RTL代码需要经过严格的语法和功能验证,确保其能够正确地实现芯片的功能。
- 网表
- 网表是描述芯片互连关系的文本文件,是逻辑综合和物理设计的基础。
- 网表需要经过格式检查和逻辑验证,确保其能够正确地反映RTL代码的设计意图。
FPGA设计工程中也会产生网表文件
- GDSII流文件
- GDSII流文件是芯片物理设计的最终成果,用于制造芯片的光罩。
- GDSII流文件需要符合制造工艺的要求,并经过严格的检查和验证,确保其能够正确地制造出芯片。
- 我感觉GDSII文件和bitstreams文件有着相似之处,他们都是由RTL设计完成后综合产生的文件,用来描述电路的某种物理布局结构,最大的区别在于,bitstreams文件产生后可以立马下载进FPGA中进行运行,但GDSII文件还需要经过物理设计、制造、测试等多个阶段才能产生最终实际的芯片。
ASIC设计工程师和DFT工程师是什么关系
DFT设计工程师主要负责生成可测性设计,报错scan、mbist等,产生测试向量,协助后端工程师完成时序收敛。这些虽然也可以用verilog实现,但一般都有专用的DFT工具,例如synopsys的DFT工具。从网上找了一些工具的使用流程,方便认识一下这些DFT工具怎么用的:
Synopsys DFT Compiler使用示例
使用Synopsys DFT Compiler进行DFT插入和优化涉及多个步骤,包括准备设计环境、配置DFT选项、插入DFT结构、生成测试向量和验证。以下是一个详细的指南,帮助你逐步完成这些任务。
使用Synopsys DFT Compiler的步骤
- 准备设计环境
首先,确保你的设计环境中已经安装了Synopsys工具,并配置好相应的环境变量。例如:
source /path/to/synopsys/setup.csh
- 读取设计网表
在启动Synopsys Design Compiler的命令行界面(dc_shell)后,读取综合后的设计网表:
read_verilog design_netlist.v
- 定义DFT约束和配置
设置扫描链的配置和其他DFT选项:
# 设置扫描链数量 set_scan_configuration -scan_chain_count 10 # 设置扫描链的最大长度 set_scan_configuration -max_length 500 # 设置插入DFT时的约束 set_dft_configuration -dft_enable scan
- 插入扫描链
插入扫描链结构:
insert_dft
- 插入BIST结构
如果需要插入内建自测试(BIST)结构,可以进行如下设置:
# 创建逻辑BIST create_bist -type logic -pattern_count 100 # 插入BIST insert_bist
- 插入边界扫描(Boundary Scan)
插入JTAG边界扫描结构:
insert_boundary_scan
- 验证DFT结构
运行静态时序分析和功能验证,确保DFT结构不影响设计的正常功能和时序:
check_dft check_timing
- 生成测试向量
生成用于制造测试的测试向量:
generate_patterns -format STIL -output test_patterns.stil
- 故障模拟和覆盖率分析
运行故障模拟,分析测试向量的覆盖率:
run_fault_simulation -report coverage_report.txt
- 导出插入DFT后的网表
最后,导出包含DFT结构的设计网表:
write_verilog design_with_dft.v
示例脚本
下面是一个完整的Tcl脚本示例,可以用来自动化上述过程:
# 设置环境变量和路径 source /path/to/synopsys/setup.csh # 读取设计网表 read_verilog design_netlist.v # 设置扫描链配置 set_scan_configuration -scan_chain_count 10 set_scan_configuration -max_length 500 set_dft_configuration -dft_enable scan # 插入扫描链 insert_dft # 插入BIST create_bist -type logic -pattern_count 100 insert_bist # 插入边界扫描 insert_boundary_scan # 验证DFT结构 check_dft check_timing # 生成测试向量 generate_patterns -format STIL -output test_patterns.stil # 运行故障模拟和覆盖率分析 run_fault_simulation -report coverage_report.txt # 导出插入DFT后的网表 write_verilog design_with_dft.v
注意事项
- 设计准备:确保设计在插入DFT结构之前已经过详细验证,避免引入新的问题。
- 工具版本:不同版本的Synopsys工具可能有不同的命令和选项,请参考相应版本的用户手册。
- 测试验证:在实际生产中,生成的测试向量需要在实际测试设备上验证,确保测试方案的有效性。
通过上述步骤和示例脚本,可以有效地使用Synopsys DFT Compiler进行可测试性设计的插入和优化。
根据实习的经验,DFT工程师和ATE工程师在某种程度上是有交叠的,只不过对于大公司来说他们的工作分得很开,但小公司却有可能一人担任两个工作。