硬件仿真(Emulation)EDA工具设计流程总结,仅介绍必要设计步骤,具体详细步骤由于公司机密,暂不详细说明。
这里是基于FPGA的Emulation(硬件仿真)或者说prototyping(原型验证)的EDA工具设计全流程。
当然,不是所有的工具都会按照本文讲的逻辑和顺序进行设计,但总的方向是一致的。
本文重点介绍Emulation的前端设计(FrontEnd)流程,后端设计(BackEnd)流程和Runtime仅仅提及,后有机会就会更新。
本人才疏学浅,如有雷同,纯属巧合,如有错误,请多多指教!!
用户设计的芯片(ASIC等)需要进行功能上的验证,常见的验证工具有Simulation和Emulation
Emulation就是指,模拟出用户设计芯片中实际使用的硬件,再进行仿真
其中大多数是基于FPGA(Field Programmable Gate Array,现场可编程逻辑门阵列,可以理解为通用芯片)进行设计的。
其主要实现是通过将用户设计的芯片模拟到FPGA对应的元器件上,如LUT(组合逻辑)、RAM(存储单元)、REG(触发器或锁存器)、MUX(多数选择器)、CARRY(进位链)、DSP(数字信号处理器)等,再进行仿真
两个都有仿真验证的意思,emulation的效率和速度比simulation高很多
simulation一般是说利用软件在服务器进行的仿真
emulation一般说的是利用FPGA,或者是硬件加速器来进行仿真验证。
Simulation == 模拟,Emulation == 仿真
Emulation,是指用软件去模拟出某个系统中各个部件的组成,真实地模拟出系统的运行机制,如内存(RAM)、寄存器(FF/Latch)、MUX、DSP、LUT等等。
Simulation,是指用软件去模拟某个系统的功能,并不要求实现该系统的内部细节,只要在同样的输入下软件的输出和系统的输出一致。
Simulation:高层次上的模拟,类似于black box
Emulation:注重于对底层的模拟,类似于白盒
基于FPGA的Emulator设计流程主要分为三部分,分别为前端FE、后端BE和Runtime
总输入为:用户设计,以Verilog、VHDL、system verilog为主(RTL)
总输出为:可以进行验证的,模拟好的总设计
前端设计主要包括了以下3个方面进行设计,分别为Analyze(分析)、Elaboration(详尽描述)、和Synthesis(综合)
输入:RTL设计
输出:AST(Abstract Syntax Tree,抽象语法树),有层级信息的RTL
大多数会配parser使用,parser顾名思义,语法分析器,主要将用户写的设计语言(RTL),翻译成电脑可识别的语言。
一般来说,我们更喜欢使用AST存储RTL。
输入:RTL(AST)
输出:设计在FPGA上的具体映射(如具体的硬件REG、LUT等)
Analyze:每个module还是独立的,没有instance的关系
Elaboration: 用analyze已经读入的RTL代码来构建hierarchy(跨层级结构)。顶层是可以设置的。这个时候整个design的层次就有了,instance的关系也明确了
同时Elaboration还会根据优化选项进行一定的优化,简化树型结构。比如,去除设计层次,用信号命名来表示原层次关系。还可以进行边界优化,合并组合逻辑,合理的优化会很大程度上加速Emulation的过程。
总结:Elaboration可以理解为将一个设计从顶到下,每一层逻辑关系(父子,迭代等等)讲清楚,为后续综合(Synthesis)提供方便。
输入:RTL(FPGA硬件)
输出:门级网表(Gate level Netlist),多以(.v)或(.edif)表示
逻辑综合,将设计的RTL转换为门级网表(Netlist、EDIF、门级verilog等),作为后端的输入。
这里可以参考逻辑综合入门。
后端设计主要作用就是将综合好的网表,如何放到实际的FPGA上,主要分为两步,分别为:布局(partition)和布线(routing)
对硬件仿真工具的性能影响最大的是基本元件(FPGA或是处理器)之间的连接延迟,因此分割(partitioning)对仿真速度的影响最大。
一个设计是很大的,最终实现的FPGA可能有5、6块,甚至10块之多。
那如何将一个大的设计分成多块,放到每一个FPGA上,这就是分割的工作。
这里的步骤主要分为:
传统的分割器(partitioner)只优化切割数(Sum of External Degrees),所以不能有效的优化时序(timing),因此应用时序驱动的分割器来提高硬件仿真性能。
基于FPGA的硬件仿真器需要用定时器(timer)作静态时序分析来替FPGA布局布线(P&R)生成时序约束(timing constraints),并执行签核(signoff)时序分析。
软件编译器可以使用每个FPGA原件(primitive)的Liberty(一种用来描述原件的行业标准格式)模型来执行静态时序分析和时钟推断。
一个设计是很大的,最终实现的FPGA可能有5、6块,甚至10块之多。
在布局结束之后,现在需要将这些board、FPGA连接起来实现具体功能,我们已知,在理想状态,我们不考虑连接线上的成本,但实际电路中,越长的线、越绕的线成本是越高的。
因此这个时候如何连接,可以实现效率最大化,这就是路由的工作。
基于FPGA的硬件仿真器需要将每个分割分配给一个FPGA,以减少最坏时序路径的延迟,从而提高硬件仿真性能。
硬件仿真器的FPGA之间的连接拓扑(connection topology)通常不是对称的,换句话说,某对FPGA会比其它一对FPGA间具有更多的或更多类型的电缆(如图)。因此软件编译器需要由定时器来驱动路由器,通过不同的LVDS或MGT电缆来路由FPGA间网络,以减少最坏时序路径的延迟,从而提高性能。
硬件仿真器的连接拓扑通常不构成完整图(complete graph),因此路由器可能必须创建馈通线(feedthrough)以在两个未通过电缆直接连接的FPGA之间布线。并且路由器可能会决定绕过其他一些FPGA,根据计时器的指导,在两个FPGA之间较少使用的电缆上布线,以加快仿真性能。
软件编译器也需要有一个TDM分配(assignment)引擎,该引擎将每条布线线路分配到具有特定TDM比率的TDM插座(socket)。
由于TDM比率越高,TDM插座占用的延迟就越多,TDM分配引擎会将更关键的时序路径上的布线分配给具有较小TDM比率的插座。该引擎利用计时器来了解时序路径的关键性。
在实际实现中,所有流程的最后是需要跑一遍的,这个跑的动作,我们称为Runtime
在Runtime时,因为要模拟一个实际的操作系统,包括内存行为,公共驱动程序和库负载以及文件结构的类型等, 可以将仿真视为DBI(dynamic binary instrumentation,动态二进制工具),这里就会有一些工作。
Emulation主要实现了将大的ASIC电路,映射到多个FPGA上,最后我们跑FPGA验证设计是否符合要求。
上文介绍的流程是主要flow,由于每家公司的flow不尽相同,这里就不做详细介绍。