《硬件仿真(Emulation)EDA工具前端设计流程》

硬件仿真(Emulation)EDA工具设计流程总结,仅介绍必要设计步骤,具体详细步骤由于公司机密,暂不详细说明。


文章目录

  • 前言
  • 1. Emulation
    • 1.1 什么是Emulation
    • 1.2 Emulation和Simulation的区别
  • 2. 设计流程
    • 2.1 前端设计流程(FrontEnd)
      • 2.1.1 Analyze
      • 2.1.2 Elaboration
      • 2.1.3 Synthesis
    • 2.2 后端设计流程(BackEnd)
      • 2.2.1 分割(Partitioning)
      • 2.2.2 静态时序分析(Static Timing Analysis)
      • 2.2.2 路由(Routing)
    • 2.3 Runtime
  • 总结


前言

这里是基于FPGA的Emulation(硬件仿真)或者说prototyping(原型验证)的EDA工具设计全流程。
当然,不是所有的工具都会按照本文讲的逻辑和顺序进行设计,但总的方向是一致的。

本文重点介绍Emulation的前端设计(FrontEnd)流程,后端设计(BackEnd)流程和Runtime仅仅提及,后有机会就会更新。
本人才疏学浅,如有雷同,纯属巧合,如有错误,请多多指教!!


1. Emulation

1.1 什么是Emulation

用户设计的芯片(ASIC等)需要进行功能上的验证,常见的验证工具有Simulation和Emulation

Emulation就是指,模拟出用户设计芯片中实际使用的硬件,再进行仿真

其中大多数是基于FPGA(Field Programmable Gate Array,现场可编程逻辑门阵列,可以理解为通用芯片)进行设计的。
其主要实现是通过将用户设计的芯片模拟到FPGA对应的元器件上,如LUT(组合逻辑)、RAM(存储单元)、REG(触发器或锁存器)、MUX(多数选择器)、CARRY(进位链)、DSP(数字信号处理器)等,再进行仿真

1.2 Emulation和Simulation的区别

两个都有仿真验证的意思,emulation的效率和速度比simulation高很多

simulation一般是说利用软件在服务器进行的仿真
emulation一般说的是利用FPGA,或者是硬件加速器来进行仿真验证。

  • Simulation == 模拟,Emulation == 仿真
    Emulation,是指用软件去模拟出某个系统中各个部件的组成,真实地模拟出系统的运行机制,如内存(RAM)、寄存器(FF/Latch)、MUX、DSP、LUT等等。
    Simulation,是指用软件去模拟某个系统的功能,并不要求实现该系统的内部细节,只要在同样的输入下软件的输出和系统的输出一致。

  • Simulation:高层次上的模拟,类似于black box

  • Emulation:注重于对底层的模拟,类似于白盒


2. 设计流程

基于FPGA的Emulator设计流程主要分为三部分,分别为前端FE、后端BE和Runtime

总输入为:用户设计,以Verilog、VHDL、system verilog为主(RTL)
总输出为:可以进行验证的,模拟好的总设计

2.1 前端设计流程(FrontEnd)

前端设计主要包括了以下3个方面进行设计,分别为Analyze(分析)、Elaboration(详尽描述)、和Synthesis(综合)

2.1.1 Analyze

输入:RTL设计
输出:AST(Abstract Syntax Tree,抽象语法树),有层级信息的RTL

  • Analyze分析:读入RTL代码,检查设计文件语法和语义错误的过程,分析每个文件的语法是否正确
    语法规则由语言规定。如在VHDL上,如果您编写if但忘记包含THEN子句,则违反了VHDL语言的语法和规则集。

大多数会配parser使用,parser顾名思义,语法分析器,主要将用户写的设计语言(RTL),翻译成电脑可识别的语言。

一般来说,我们更喜欢使用AST存储RTL。

  1. AST将代码根据源代码语法生成对应的树状结构
    意义:编程语言太多,需要一个统一的结构让计算机识别
    树上的每个节点 = 源代码中的一种结构
    抽象:抽象语法树并不会表示出真实语法出现的每一个细节,如嵌套括号被隐含在树的结构中,并没有以节点的形式呈现。
    作用:抽象语法树并不依赖于源语言的语法,也就是说语法分析阶段所采用的上下文无文文法,因为在写文法时,经常会对文法进行等价的转换(消除左递归,回溯,二义性等),这样会给文法分析引入一些多余的成分,对后续阶段造成不利影响,甚至会使合个阶段变得混乱。因些,很多编译器经常要独立地构造语法分析树,为前端,后端建立一个清晰的接口。

《硬件仿真(Emulation)EDA工具前端设计流程》_第1张图片

2.1.2 Elaboration

输入:RTL(AST)
输出:设计在FPGA上的具体映射(如具体的硬件REG、LUT等)

  • Elaboration:详尽描述
    RTL语言本质上是分层的。顶层实体实例化信号、组件和进程。每个组件都实例化了额外的信号、组件和进程
    编译器探索自顶向下的设计层次结构,并构建一个互连表,直到它到达设计的构建块
    在这一步中,构建块仍然是通用的RTL结构:逻辑门、寄存器、存储器等

《硬件仿真(Emulation)EDA工具前端设计流程》_第2张图片

Analyze:每个module还是独立的,没有instance的关系
Elaboration: 用analyze已经读入的RTL代码来构建hierarchy(跨层级结构)。顶层是可以设置的。这个时候整个design的层次就有了,instance的关系也明确了

同时Elaboration还会根据优化选项进行一定的优化,简化树型结构。比如,去除设计层次,用信号命名来表示原层次关系。还可以进行边界优化,合并组合逻辑,合理的优化会很大程度上加速Emulation的过程。

总结:Elaboration可以理解为将一个设计从顶到下,每一层逻辑关系(父子,迭代等等)讲清楚,为后续综合(Synthesis)提供方便。

2.1.3 Synthesis

输入:RTL(FPGA硬件)
输出:门级网表(Gate level Netlist),多以(.v)或(.edif)表示

逻辑综合,将设计的RTL转换为门级网表(Netlist、EDIF、门级verilog等),作为后端的输入。

这里可以参考逻辑综合入门。

2.2 后端设计流程(BackEnd)

后端设计主要作用就是将综合好的网表,如何放到实际的FPGA上,主要分为两步,分别为:布局(partition)和布线(routing)

2.2.1 分割(Partitioning)

对硬件仿真工具的性能影响最大的是基本元件(FPGA或是处理器)之间的连接延迟,因此分割(partitioning)对仿真速度的影响最大。

一个设计是很大的,最终实现的FPGA可能有5、6块,甚至10块之多。
那如何将一个大的设计分成多块,放到每一个FPGA上,这就是分割的工作。

这里的步骤主要分为:

  1. Board level partition:一个设计最后可能需要分为好几个板子(每个板子上有不止一块FPGA),实现的是如何将设计分割成多个板子
  2. FPGA level partition:在每个board上,有多块FPGA,实现的是如何将设计分割成多个FPGA

传统的分割器(partitioner)只优化切割数(Sum of External Degrees),所以不能有效的优化时序(timing),因此应用时序驱动的分割器来提高硬件仿真性能。

2.2.2 静态时序分析(Static Timing Analysis)

基于FPGA的硬件仿真器需要用定时器(timer)作静态时序分析来替FPGA布局布线(P&R)生成时序约束(timing constraints),并执行签核(signoff)时序分析。

软件编译器可以使用每个FPGA原件(primitive)的Liberty(一种用来描述原件的行业标准格式)模型来执行静态时序分析和时钟推断。
一个设计是很大的,最终实现的FPGA可能有5、6块,甚至10块之多。

2.2.2 路由(Routing)

在布局结束之后,现在需要将这些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比率的插座。该引擎利用计时器来了解时序路径的关键性。

《硬件仿真(Emulation)EDA工具前端设计流程》_第3张图片

2.3 Runtime

在实际实现中,所有流程的最后是需要跑一遍的,这个跑的动作,我们称为Runtime

在Runtime时,因为要模拟一个实际的操作系统,包括内存行为,公共驱动程序和库负载以及文件结构的类型等, 可以将仿真视为DBI(dynamic binary instrumentation,动态二进制工具),这里就会有一些工作。


总结

Emulation主要实现了将大的ASIC电路,映射到多个FPGA上,最后我们跑FPGA验证设计是否符合要求。

上文介绍的流程是主要flow,由于每家公司的flow不尽相同,这里就不做详细介绍。

你可能感兴趣的:(EDA,fpga开发)