美文网首页
ASIC转FPGA

ASIC转FPGA

作者: 喜欢萝莉的逗逼青年 | 来源:发表于2017-12-07 13:41 被阅读237次

    1.目标

    将ASIC设计代码做一定转换,变成FPGA的输入,供FPGA原型验证使用。


    2.ASIC转FPGA基本原理

    ASIC和FPGA的物理结构不同,ASIC是基于标准单元库,而FPGA是基于厂商提供的宏单元模块(查找表),这就导致了如果要进行FPGA原型验证,ASIC代码就必须做一定的转换,才能够移植到FPGA上。这种转换,只是代码层次上的转换,用FPGA可以实现的方式去替换ASIC中部分代码,功能并没有改变。 因此首先要进行寄存器传输级(RTL)代码的修改。然后进行FPGA器件映射,映射工具根据设置的约束条件对RTL代码进行逻辑优化,并针对选定的FPGA器件的基本单元映射生成网表。接着进行布局布线,生成配置文件和时序报告等信息。当时序能满足约束条件时,就可以利用配置文件进行下载。如果时序不能满足约束,可通过软件报告时序文件来确认关键路径,进行时序优化。可以通过修改约束条件,或者修改RTL代码来满足要求。


    3 需要转换的代码

    存储单元是必须进行代码转换的,ASIC中的存储单元通常用代工厂所提供的Memory Compiler来定制,它可以生成.gsp、.v等文件。.v文件只用来做功能仿真,通常不能综合。而最后流片时,只需将标准提供给代工厂。如果直接将ASIC代码中的存储单元作为FPGA的输入,是综合不出来的,会被当成一个无用的black box,还会报缺失文件的错误;而FPGA厂商其实已经提供了经过验证并优化的存储单元。因此存储单元要进行代码转换。

    按照ASIC设计中RAM、ROM的设计信息,在vivado中生成功能相同的存储单元IP核,并在设计文件中进行替换。注意,替换不代表改变其功能,替换的过程中,要了解代工厂所用存储单元的接口信号,以及读写有效信号。位宽等,vivado中一般存储的IP核都是高有效信号。数字电路中,时钟是整个电路最重要、最特殊的信号。在 ASIC中,用布局布线工具来放置时钟树,利用代工厂提供的 PLL进行时钟设计。 FPGA中通常已经配置一定数量的 PLL 宏单元,并有针对时钟优化的全局时钟网络,一般是经过 FPGA的特定全局时钟管脚进入 FPGA内部,后经过全局时钟 BUFG适配到全局时钟网络的,这样的时钟网络可以保证相同的时钟沿到达芯片内部每一个触发器的延迟时间差异是可以忽略不计的。因此时钟单元也是需要进行转换的。

    当前,ASIC设计中并没有放置PLL,不需替换,为了便于仿真,使用vivado 生成时钟单元的IP核。在tb_top里面定义了一对差分时钟(时钟频率100Mhz,差分时钟互为取反)。使用IBUFDS (差分输入的缓冲器)差分信号缓冲器,支持低压差分信号,进行缓冲。然后,送入到生成的时钟IP核里,时钟IP核定义了输入和输出的时钟关系,以及分频系数,输入100Mhz,按照分频的系数,输出80,80,40,20的时钟频率。由于实现结构上的不同,FPGA器件内部的单元延时远大于ASIC的基本门单元延时。导致在同样设计的情况下,ASIC可以满足其时序,而FPGA有可能无法满足。为了验证的需要,修改ASIC代码实现FPGA原型时,对ASIC实现的流水结构,在FPGA实现时需要适当增加流水。比如在一个很长的组合逻辑路径中加入寄存器。如图1所示。

    image.png

    在FPGA设计中要使用时钟使能代替门控时钟。在ASIC的设计中,为了减少功耗,使用门控时钟(clock gating),门控时钟的结构如图2
    所示。当写有效时,数据才写进存储器,那么只有写有效时,寄存器才会发生翻转,这样可以减少功耗。

    image.png

    由于设计的异步特性,对于FPGA来说,使用这种门控时钟容易产生毛刺,导致数据不正确。所以在FPGA设计中,使用有使能信号的电路来替换门控时钟电路。可直接利用xilinx已有模块,BUFGCE,是带有时钟使能端的全局缓冲, 它有一个输入I、一个使能端CE和一个输出端O。只有当BUFGCE的使能端CE有效(高电平)时,BUFGCE才有输出, 与全局时钟资源相关的Xilinx器件原语包括:IBUFG、IBUFGDS、BUFG、BUFGP、BUFGCE、BUFGMUX、BUFGDLL和DCM等。(具体信息详见:http://blog.163.com/fangfangwife@126/blog/static/69522522200874103923525/)


    4.具体过程

    1.传入设计文件

    • 添加不加约束,DC综合后的设计文件,好处就是在DC综合过程中,会把设计文件调用一些库文件也综合进去,避免了发生缺失文件这样的问题。(DC脚本中含有工艺厂商的库文件),综合的时候会辨认出module中调用的单元;如DW_minmax(ps:不同参数的DW_minmax,也是可以识别出来的)

    • 利用脚本,按照filelist,把所有filelist上的module合成一个.v文件,这样做的好处就是,用chipscope仿真的时候便于观察,容易定位到问题;坏处就是,设计文件调用其他地方的module时,容易发生缺失文件的问题。(需要注意:同样的module也有可能传入的参数不同)

    做法:使用DC综合后的设计文件。IP核仿真出现问题,则用.v文件替换,查找原因;

    2 传入设计文件过程中遇到的问题总结

    • 在Messags 窗口,常会出现一些Critical Warning,如不能打开include file 。这是因为vivado编译的时候,找不到include的文件。虽然说,已经把综合后的文件或.v文件全都放进去了,但vivado只是个工具,它只会去寻找缺少的文件名,而不会检测大文件是否内部包含;.

      解决方法:首先要在project setting 和 simulation setting中设置include file 的search path,可以手动添加,也可以利用tcl脚本添加;手动添加 到所需文件的文件夹即可;利用tcl脚本添加,一次要写入全部的include file的search path,因为,每写一次都会覆盖掉上次所设置的search path。

      脚本命令如下:
      
      project setting:
      set_property include_dirs{path1 path2 ...}[current_fileset]
      simulation setting:
      set_property include_dirs{path1 path2 ...}[get_filesets sim_1]    
      ps:sim_1 是当前仿真工程的名字
      

      DW_minmax module缺失的问题:

      DW_minmax module缺失,找到设计文件中所有的DW_minmax模块,确认传入参数的类型,对每种传入参数类型的DW_minmax模块单独进行DC综合,然后,传入到FPGA.如果使用的是DC综合后的.getch文件,不会出现该问题。

      RAM替换的问题,有些RAM存在BWEB 写有效信号(带B、N的一般都是低有效信号,带A的为高有效信号) 总结如下:

       CEB信号;1:RAM处于idle状态 ;  0:RAM被使能
       WEB信号;读写控制信号,1:读,0:写
       BWEB信号:写有效信号,BWEB[0]为0时,数据才能被写入。
      

      xilinx 生成的IP核通常只有ena、wea,即使能信号、读写控制信号。遇到这种情况,一般处理方法:例化IP核时,可以生成写有效信号wea;例如72bit位宽,可以生成[8:0]wea信号。此时,ena可以看成,读写控制信号;ena=1代表写操作,ena为0代表读操作;wea此时代表写有效信号。

       连接关系:  .ena(~WEB),.wea(~BWEB)
      

      使用IP生成器生成RAM、ROM等存储器的时候, 除了参数设置外,还需要输入一个名为.coe的文件来初始化块存储器的内容。

    3.搭建FPGA最小系统

    将ASIC转FPGA,首先需要先搭一个A7最小系统。A7最小系统仿真、综合成功后,再由上而下,添加AHB总线以及AHB总线上的QSPI、SDMMC、NFC、SMC、DEVC、GMAC、USB等IP核,仿真综合成功后,最后添加两条APB总线,以及APB总线上挂载的SPI、I2C、UART、TIMER、GPIO、CAN、WDT等IP核.

     最小系统包括时钟单元、复位单元、RAM、ROM、总线AXI以及CPU(A7),具体结构如图所示:
    
    image.png

    在搭建FPGA系统时,需要创建一个全局define.v,该文件主要是定义IP是否挂在FPGA系统上。因为,硬件部门常常只针对单个IP进行验证工作,简单的验证UART,只需要在define.v中定义下UART即可,便于灵活控制以及节省综合、实现的时间,这个常用到宏编译命令`ifdef 。

    相关文章

      网友评论

          本文标题:ASIC转FPGA

          本文链接:https://www.haomeiwen.com/subject/hdudixtx.html