CN112181356A - 一种可配置的多进多出fifo的设计方法及装置 - Google Patents

一种可配置的多进多出fifo的设计方法及装置 Download PDF

Info

Publication number
CN112181356A
CN112181356A CN202011043662.9A CN202011043662A CN112181356A CN 112181356 A CN112181356 A CN 112181356A CN 202011043662 A CN202011043662 A CN 202011043662A CN 112181356 A CN112181356 A CN 112181356A
Authority
CN
China
Prior art keywords
signal
fifo
input
vld
output
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202011043662.9A
Other languages
English (en)
Other versions
CN112181356B (zh
Inventor
王俊辉
孙彩霞
郑重
郭维
郭辉
雷国庆
隋兵才
黄立波
冯权友
倪晓强
王永文
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
National University of Defense Technology
Original Assignee
National University of Defense Technology
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by National University of Defense Technology filed Critical National University of Defense Technology
Priority to CN202011043662.9A priority Critical patent/CN112181356B/zh
Publication of CN112181356A publication Critical patent/CN112181356A/zh
Application granted granted Critical
Publication of CN112181356B publication Critical patent/CN112181356B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F5/00Methods or arrangements for data conversion without changing the order or content of the data handled
    • G06F5/06Methods or arrangements for data conversion without changing the order or content of the data handled for changing the speed of data flow, i.e. speed regularising or timing, e.g. delay lines, FIFO buffers; over- or underrun control therefor
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F30/00Computer-aided design [CAD]
    • G06F30/30Circuit design
    • G06F30/34Circuit design for reconfigurable circuits, e.g. field programmable gate arrays [FPGA] or programmable logic devices [PLD]
    • G06F30/343Logical level
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Computing Systems (AREA)
  • Evolutionary Computation (AREA)
  • Geometry (AREA)
  • Design And Manufacture Of Integrated Circuits (AREA)
  • Communication Control (AREA)

Abstract

本发明公开了一种多进多出FIFO,包括控制单元fifo_ctl和数据存储单元fifo_dp,控制单元fifo_ctl的输出端和数据存储单元fifo_dp之间连接有信号wren、读指针rptr和写指针wptr一共三组信号,本发明能够支持上下游流量控制的FIFO队列的多进多出,实现数据的快速缓存和流量控制,适用于多种场景;本发明还提供一种针对该多进多出FIFO的可配置的设计方法,能够实现多进多出FIFO的设计工作的可配置化,通过一次编写python代码,即可实现多种FIFO队列,可以极大加速设计过程,减少设计缺陷。

Description

一种可配置的多进多出FIFO的设计方法及装置
技术领域
本发明涉及芯片设计领域,具体涉及一种可配置的多进多出FIFO的设计方法及装置,包括一种多进多出FIFO,以及针对该多进多出FIFO的可配置化设计方法。
背景技术
在芯片设计中,为了实现信号处理中数据的暂存需求,通常会设置各种宽度和长度的队列。一般而言,鉴于数字芯片设计中流水线式的数据流方式,其所使用的队列都是先进先出(First-In-First-Out,FIFO)队列。而且,多种输入宽度、存储宽度、输出宽度和流控策略的FIFO会在同一设计中被同时用到。虽然这些队列的基本功能相同,但其输入宽度、存储宽度、输出宽度和流控策略的不同,使得这些队列通常都是采用单独设计的方式:根据所需要的关键参数,单独设计并实现每个队列的逻辑,然后再分别进行验证。这样的做法,需要消耗大量的时间和资源分别一一进行设计与验证。而且,由于通常这些FIFO会被不同的设计师与验证师所使用,其设计与验证中所遇到的问题与积累的经验,无法快速进行共享。因此,迫切需要一种可配置的多进多出FIFO的设计方法和装置,既能够根据一套可配置的代码快捷生成可用的FIFO,又能够在设计与验证的循环中不断完善可配置代码,实现经验共享和资源高效利用。
当前,多进多出FIFO的设计一般有2个方法。第一种方法是直接编写所有参数都已经固定的FIFO的verilog代码。然后,针对这一种配置进行设计和验证。第二种方法是在第一种的基础上,利用宏支持一定的可配置。这种方法通常可以实现FIFO中元素宽度、FIFO深度等参数的可配置。输入宽度和输出宽度的可配置需要利用ifdef/else/endif等宏定义开关来进行。在这种方法中,不同配置中不变的逻辑可以实现共享,但是与输入和输出宽度直接相关的逻辑就需要利用一种单独的情形。这就使得该方法无法支持更多的输入和输出宽度组合,而且不同组合之间代码基本是并行的,仍然需要分别进行设计和验证。
由此可见,现有的方法都无法真正实现多进多出FIFO的可配置化,大大增加了芯片设计的开销,也增加了基于可配置化进行性能探索等工作的难度。
发明内容
本发明要解决的技术问题:针对现有技术的上述问题,提供一种多进多出FIFO,本发明能够实现支持上下游流量控制的FIFO队列的多进多出,能够实现数据的快速缓存和流量控制,适用于多种场景;本发明还提供一种针对该多进多出FIFO的可配置的设计方法,本发明能够实现多进多出FIFO的设计工作的可配置化,通过一次编写python代码,即可实现多种FIFO队列,可以极大加速设计过程,减少设计缺陷。
为了解决上述技术问题,本发明采用的技术方案为:
一种多进多出FIFO,包括控制单元fifo_ctl和数据存储单元fifo_dp,所述控制单元fifo_ctl和数据存储单元fifo_dp均带有时钟输入信号clk和复位控制信号rst,所述控制单元fifo_ctl的输出端和数据存储单元fifo_dp之间连接有信号wren、读指针rptr和写指针wptr一共三组信号,其中信号wren用于表示每个元素是否要根据输入进行更新;读指针rptr用于表示当前输出的指针;写指针wptr用于表示当前输入的指针;所述数据存储单元fifo_dp带有输入信号data_in和输出信号data_out,所述输入信号data_in的输入带宽为输入宽度*元素宽度,所述输出信号data_out的输出宽度为输出宽度*元素宽度,元素宽度为多进多出FIFO的基本宽度。
可选地,所述控制单元fifo_ctl的输入信号包括ielem_vld、ielem_cnt、oelem_free,输出信号还包括oelem_valid、emtpy、full、fifo_top_vld,输入信号ielem_vld表示当前周期输入数据是否有效;输入信号ielem_cnt表示当前周期输入数据的有效元素个数;输入信号oelem_free表示当前周期队列下游可接收的元素的个数;输出信号oelem_valid表示当前周期的输出数据是否有效;输出信号emtpy表示FIFO队列是否为空;输出信号full表示当前多进多出FIFO是否已满;输出信号fifo_top_vld表示当前多进多出FIFO中最高输入宽度的位的有效状态。
可选地,所述控制单元fifo_ctl输出的读指针rptr表示输出元素的指针位置,随着有效输出而循环增加;写指针wptr表示输入元素的指针位置,根据最后输入的有效元素而循环增加;信号wren根据写指针wptr的值和有效输入元素将对应位置的位置为1,指导数据进入到数据存储单元fifo_dp中;所述控制单元fifo_ctl包括:
输入转换语句模块BCT,用于将正常二进制编码的输入信号ielem_cnt转变为输入宽度的塔式编码的信号ielem_cnt_dec,N位的塔式编码是指对于二进制表示的x,其从x+1到0位都是为1,其余高位都是为0;
第一状态计算语句模块QVC,用于结合信号ielem_cnt_dec、输入信号ielem_vld和信号queue_vld生成信号queue_vld_inc,信号queue_vld表示当前多进多出FIFO中有效元素个数,信号queue_vld_inc用于表示接收该周期有效的输入元素后多进多出FIFO当前的有效状态;其中,信号queue_vld采用塔式编码,信号queue_vld_inc为将最左侧的1扩展有效元素的个数;
第二状态计算语句模块QVD,用于根据信号queue_vld_inc输出信号queue_vld_dec_winc,信号queue_vld_dec_winc表示考虑了当前周期有效输入和有效输出以后的FIFO队列有效状态;还用于根据输入信号oelem_free和表示当前多进多出FIFO中有效元素个数的信号queue_vld生成信号queue_vld_dec_woinc,信号queue_vld_dec_woinc表示无有效输入元素时的FIFO队列有效状态的变化;
溢出判断语句模块CO,用于根据queue_vld_inc信号、输入信号oelem_free计算表示是否会发生溢出的信号overflow,如果信号queue_vld_inc右移输入信号oelem_free表示的元素个数后仍然超过多进多出FIFO的深度,则信号overflow就置高表示发生溢出;
选择语句模块MUX,用于在信号overflow的控制选择信号queue_vld_dec_winc或信号queue_vld_dec_woinc作为信号queue_vld_dec,且信号overflow置高时选择信号queue_vld_dec_woinc,否则选择信号queue_vld_dec_winc,信号queue_vld_dec表示本周期最后的队列状态信号;
寄存语句模块FF,用于对信号queue_vld_dec进行寄存器暂存,生成表示当前多进多出FIFO中有效元素个数的信号queue_vld供下个周期使用,且信号full为信号queue_vld的最高位;信号empty为信号queue_vld的最低位取反的结果;信号fifo_top_vld为信号queue_vld中最高输入宽度的指定若干位;信号oelem_valid为输入信号oelem_free与信号queue_vld的与操作的结果。
可选地,所述数据存储单元fifo_dp包括:
旋转移位模块,用于对于输入信号data_in输入的数据,根据写指针wptr表示的指针的值,将数据进行旋转移位得到旋转后的元素data_bank,旋转后的元素data_bank的起止地址为写指针wptr的位置;
数据读写模块模块,用于将旋转后的元素data_bank根据信号wren分别写入对应的数据存储入口data_entry的元素中,并根据读指针rptr的值,将数据存储入口data_entry中的元素移动到输出信号data_out中。
此外,本发明还提供一种前述多进多出FIFO的设计方法,包括:
1)在python语言环境中针对所述的多进多出FIFO编写基于Pyverilog的python源代码;
2)将得到的python源代码生成包含预编译命令的verilog代码;
3)在verilog语言环境中将包含预编译命令的verilog代码中的所有预编译宏进行展开,生成包含AUTO命令的verilog代码;
4)配置verilog-mode将包含AUTO命令的verilog代码中的AUTO命令展开,从而得到多进多出FIFO的目标verilog代码。
可选地,步骤1)之前还包括python语言的环境准备的下述步骤:在python中下载并配置Pyverilog模块,为使用codegen等函数提供环境支撑;使用python语言编写自动配置助手模块auto_conf_assist,所述自动配置助手模块auto_conf_assist用于对Pyverilog语言的补充,实现了单行注释、多行注释以及宏语句的支持;使用python语言编写参数配置模块param,参数配置模块param包含多进多出FIFO的关键配置参数,其中关键配置参数Param_E_SIZE表示元素的宽度;关键配置参数Param_I_WIDTH表示输入宽度的值;关键配置参数Param_O_WIDTH表示输出宽度的值;关键配置参数Param_FULL_DPETH表示FIFO队列的深度。
可选地,步骤1)的详细步骤包括:结合自动配置助手模块auto_conf_assist中的函数,使用Pyverilog语言编写多进多出FIFO及其控制单元fifo_ctl和数据存储单元fifo_dp,使用import语句分别引入pyverilog的代码解释器vparser.ast和代码生成器ASTCodeGenerator;引入自动配置助手模块auto_conf_assist中的单行注释、多行注释以及宏语句的支持函数;引入参数配置模块param中的关键配置参数,通过vast.Ioport函数,结合vast.Input/Ouput函数就完成FIFO队列的输入端口和输出端口的定义,单行注释用于生成verilog文件中的注释,vast.Identifier函数负责声明变量或者语句,params中声明了相关参数;ports中包含了所有的输入和输出端口;items中包含了所有的verilog语句,最后,使用vast.Module函数就完成了FIFO队列的构造,通过使用ASTCodeGenerator和codegen.visit函数就完成verilog代码的生成,完成多进多出FIFO及其控制单元fifo_ctl和数据存储单元fifo_dp的源码编写后,将其提交到代码库中。
可选地,步骤3)之前还包括verilog语言环境准备的下述步骤:下载并并配置验证工具包Verilator,该验证工具包Verilator用于进行Verilog HDL模拟与Lint检查,其中包含的vppreproc工具可以实现宏定义函数的展开;为了配合vppreproc工具,使用verilog语言编写包含预编译使用的宏函数的预定义模块predefines,宏函数用于生成寄存器的缓存逻辑、生成多选一代码的逻辑和生成case语句等代码的逻辑,其中生成寄存器缓存逻辑的函数支持带或者不带reset、带enable信号或者不带enable信号、数据宽度为1或大于1。
可选地,步骤3)包括:使用验证工具包Verilator中的vppreproc工具将包含预编译命令的verilog文件中的所有预编译宏进行展开,从而生成包含AUTO命令的verilog代码。
可选地,所述AUTO命令包括AUTOREG命令、AUTOINST命令。
本发明多进多出FIFO具有下述优点:本发明多进多出FIFO能够实现支持上下游流量控制的FIFO队列的多进多出。在芯片设计中,经常需要用到FIFO队列。本发明所述的FIFO队列支持各种输入宽度、输出宽度和缓存深度的组合,支持上下游流量控制,能够实现数据的快速缓存和流量控制,适用于多种场景。
本发明多进多出FIFO的设计方法具有下述优点:本发明多进多出FIFO的设计方法能够实现多进多出FIFO的设计工作的可配置化。芯片设计经常同时需要多种FIFO队列。本发明可配置的设计方法可以根据配置需求,从python源代码直接生成满足输入宽度、输出宽度和缓存深度的verilog设计代码。通过一次编写python代码,即可实现多种FIFO队列,可以极大加速设计过程,减少设计缺陷。
附图说明
图1为本发明的多进多出FIFO的模块划分及接口信号示意图。
图2为本发明中fifo_ctl模块的核心信号示意图。
图3为本发明中二进制编码与塔式编码的对比图。
图4为本发明中fifo_dp模块的数据流入和流出示意图。
图5为本发明中可配置的多进多出FIFO的设计流程图。
图6为本发明中可配置的多进多出FIFO的关键参数示意图。
具体实施方式
下面结合附图,对本发明的一种可配置的多进多出FIFO的设计方法及装置进行进一步详细说明。根据下面的说明和权利要求书,本发明的特征和优点将更加明确。需要说明的是,附图均采用非常简化的形式,仅用于简洁、直观地对本发明实例进行辅助说明。
如图1所示,本实施例提供一种多进多出FIFO,包括控制单元fifo_ctl和数据存储单元fifo_dp,控制单元fifo_ctl和数据存储单元fifo_dp均带有时钟输入信号clk和复位控制信号rst,控制单元fifo_ctl的输出端和数据存储单元fifo_dp之间连接有信号wren、读指针rptr和写指针wptr一共三组信号(用来控制数据存储到数据存储单元fifo_dp中),其中信号wren用于表示每个元素是否要根据输入进行更新;读指针rptr用于表示当前输出的指针;写指针wptr用于表示当前输入的指针;数据存储单元fifo_dp带有输入信号data_in和输出信号data_out,输入信号data_in的输入带宽为输入宽度*元素宽度,输出信号data_out的输出宽度为输出宽度*元素宽度,元素宽度为多进多出FIFO的基本宽度。
参见图1,本实施例多进多出FIFO使用一个名称为fifo的模块进行实现,该多进多出FIFO包括控制单元fifo_ctl和数据存储单元fifo_dp两个子模块。控制单元fifo_ctl主要包含FIFO控制相关的逻辑;数据存储单元fifo_dp主要包含数据通路相关的逻辑。图1中:clk和rst为输入信号,分别为模块所需要的时钟与重启信号;data_in和data_out信号分别为输入和输出信号,表示数据的输入与输出,其宽度与设计要求的输入宽度和输出宽度相对应,分别为输入宽度*元素宽度和输出宽度*元素宽度(每个元素的宽度为FIFO队列的基本宽度)。参见图1,控制单元fifo_ctl的输入信号包括ielem_vld、ielem_cnt、oelem_free,输出信号还包括oelem_valid、emtpy、full、fifo_top_vld,输入信号ielem_vld表示当前周期输入数据是否有效;输入信号ielem_cnt表示当前周期输入数据的有效元素个数;输入信号oelem_free表示当前周期队列下游可接收的元素的个数;输出信号oelem_valid表示当前周期的输出数据是否有效;输出信号emtpy表示FIFO队列是否为空;输出信号full表示当前多进多出FIFO是否已满;输出信号fifo_top_vld表示当前多进多出FIFO中最高输入宽度的位的有效状态。需要说明的是,一般的FIFO队列的输入宽度都要大于输出宽度,因此本实施例也只支持这种方式。
参见图1,控制单元fifo_ctl的输出端和数据存储单元fifo_dp之间连接有用来控制数据存储到数据存储单元fifo_dp中的信号wren、读指针rptr和写指针wptr一共三组信号,信号wren用来表示每个元素是否要根据输入进行更新;读指针rptr信号表示了FIFO当前输出的指针;写指针wptr表示了FIFO当前输入的指针。本实施例中,控制单元fifo_ctl输出的读指针rptr表示输出元素的指针位置,随着有效输出而循环增加;写指针wptr表示输入元素的指针位置,根据最后输入的有效元素而循环增加;信号wren根据写指针wptr的值和有效输入元素将对应位置的位置为1,指导数据进入到数据存储单元fifo_dp中。
如图2所示,控制单元fifo_ctl包括:
输入转换语句模块BCT,用于将正常二进制编码的输入信号ielem_cnt转变为输入宽度的塔式编码的信号ielem_cnt_dec,N位的塔式编码是指对于二进制表示的x,其从x+1到0位都是为1,其余高位都是为0,图3为塔式编码的一个实例,可见其中低位的1呈塔状布置;
第一状态计算语句模块QVC,用于结合信号ielem_cnt_dec、输入信号ielem_vld和信号queue_vld生成信号queue_vld_inc,信号queue_vld表示当前多进多出FIFO中有效元素个数,信号queue_vld_inc用于表示接收该周期有效的输入元素后多进多出FIFO当前的有效状态;其中,信号queue_vld采用塔式编码,信号queue_vld_inc为将最左侧的1扩展有效元素的个数;
第二状态计算语句模块QVD,用于根据信号queue_vld_inc输出信号queue_vld_dec_winc,信号queue_vld_dec_winc表示考虑了当前周期有效输入和有效输出以后的FIFO队列有效状态;还用于根据输入信号oelem_free和表示当前多进多出FIFO中有效元素个数的信号queue_vld生成信号queue_vld_dec_woinc,信号queue_vld_dec_woinc表示无有效输入元素时的FIFO队列有效状态的变化;
溢出判断语句模块CO,用于根据queue_vld_inc信号、输入信号oelem_free计算表示是否会发生溢出的信号overflow,如果信号queue_vld_inc右移输入信号oelem_free表示的元素个数后仍然超过多进多出FIFO的深度,则信号overflow就置高表示发生溢出;
选择语句模块MUX,用于在信号overflow的控制选择信号queue_vld_dec_winc或信号queue_vld_dec_woinc作为信号queue_vld_dec,且信号overflow置高时选择信号queue_vld_dec_woinc,否则选择信号queue_vld_dec_winc,信号queue_vld_dec表示本周期最后的队列状态信号;
寄存语句模块FF,用于对信号queue_vld_dec进行寄存器暂存,生成表示当前多进多出FIFO中有效元素个数的信号queue_vld供下个周期使用,且信号full为信号queue_vld的最高位;信号empty为信号queue_vld的最低位取反的结果;信号fifo_top_vld为信号queue_vld中最高输入宽度的指定若干位;信号oelem_valid为输入信号oelem_free与信号queue_vld的与操作的结果。
参见图2可知,第二状态计算语句模块QVD给出表示考虑了当前周期有效输入和有效输出以后的FIFO队列有效状态——queue_vld_dec_winc信号。另外一方面,如果全部接收当前周期的有效元素,FIFO队列会发生溢出。因此,控制单元fifo_ctl还需要考虑当前输入可能无法输入的情况。在这种情况中,QVD语句直接结合表示当前周期可输出元素个数的输入信号oelem_free和表示当前FIFO队列中有效元素个数的信号queue_vld,给出无有效输入元素时的队列有效状态的变化——信号queue_vld_dec_woinc。
本实施例中,数据存储单元fifo_dp包括:
旋转移位模块,用于对于输入信号data_in输入的数据,根据写指针wptr表示的指针的值,将数据进行旋转移位得到旋转后的元素data_bank,旋转后的元素data_bank的起止地址为写指针wptr的位置;
数据读写模块模块,用于将旋转后的元素data_bank根据信号wren分别写入对应的数据存储入口data_entry的元素中,并根据读指针rptr的值,将数据存储入口data_entry中的元素移动到输出信号data_out中。
图4为数据存储单元fifo_dp中数据流入和流出的示意图。该图中作为数据存储单元fifo_dp中相关参数的一个样例,数据的输入宽度为8,输出宽度为4,FIFO队列的深度为24。本发明并不限定这些参数的数值。对于左侧data_in输入的数据,数据存储单元fifo_dp会根据wptr指针的值,将数据进行旋转移位。旋转后的数据有效元素的起止地址为写指针wptr的位置。然后,旋转后的元素data_bank根据wren信号分别写入对应的数据存储入口data_entry的元素中。在图4中,输入元素0写入到了数据存储入口data_entry的13号元素中;输入元素1写入到了数据存储入口data_entry的14号元素中;依次类推。同时,模块根据读指针rptr的值,将数据存储入口data_entry中的元素移动到data_out中。其中,读指针所在的2号元素就对应了输出信号data_out的0号元素;3号元素就对应了data_out的1号元素;依次类推。其中,输入信号data_in和输出信号data_out都是采用的总线方式,x号元素对应数据的位置为[(x+1)*信号宽度-1:x*信号宽度-1]。
此外,以上述多进多出FIFO为基础,本实施例还提供一种前述多进多出FIFO的设计方法,包括:
1)在python语言环境中针对该多进多出FIFO编写基于Pyverilog的python源代码;
2)将得到的python源代码生成包含预编译命令的verilog代码;
3)在verilog语言环境中将包含预编译命令的verilog代码中的所有预编译宏进行展开,生成包含AUTO命令的verilog代码;
4)配置verilog-mode将包含AUTO命令的verilog代码中的AUTO命令展开,从而得到多进多出FIFO的目标verilog代码。
如图5所示,FIFO的设计主要可以分为7个步骤:相关python语言的环境准备、编写基于Pyverilog的python源代码、生成包含预编译命令的verilog代码、verilog语言的相关环境准备、生成包含AUTO命令的verilog代码、配置verilog-mode和生成目标verilog代码。
参见图5,本实施例步骤1)之前还包括python语言的环境准备的下述步骤:在python中下载并配置Pyverilog模块,为使用codegen等函数提供环境支撑;使用python语言编写自动配置助手模块auto_conf_assist,自动配置助手模块auto_conf_assist用于对Pyverilog语言的补充,实现了单行注释(comment函数)、多行注释(mcomment函数)以及宏语句(macro_dis函数)的支持;使用python语言编写参数配置模块param,参数配置模块param包含多进多出FIFO的关键配置参数,如图6所示,其中关键配置参数Param_E_SIZE表示元素的宽度;关键配置参数Param_I_WIDTH表示输入宽度的值;关键配置参数Param_O_WIDTH表示输出宽度的值;关键配置参数Param_FULL_DPETH表示FIFO队列的深度。以图6为例,元素的宽度为8,输入宽度为8,输出宽度为4,FIFO队列最多可以存储24个元素。通过修改这些参数,最后生成的相关verilog代码就会发生变化。
本实施例中,步骤1)的详细步骤包括:结合自动配置助手模块auto_conf_assist中的函数,使用Pyverilog语言编写多进多出FIFO及其控制单元fifo_ctl和数据存储单元fifo_dp,使用import语句分别引入pyverilog的代码解释器vparser.ast和代码生成器ASTCodeGenerator;引入自动配置助手模块auto_conf_assist中的单行注释、多行注释以及宏语句的支持函数;引入参数配置模块param中的关键配置参数,通过vast.Ioport函数,结合vast.Input/Ouput函数就完成FIFO队列的输入端口和输出端口的定义,单行注释用于生成verilog文件中的注释,vast.Identifier函数负责声明变量或者语句,params中声明了相关参数;ports中包含了所有的输入和输出端口;items中包含了所有的verilog语句,最后,使用vast.Module函数就完成了FIFO队列的构造,通过使用ASTCodeGenerator和codegen.visit函数就完成verilog代码的生成,完成多进多出FIFO及其控制单元fifo_ctl和数据存储单元fifo_dp的源码编写后,将其提交到代码库中。
步骤2)将得到的python源代码生成包含预编译命令的verilog代码时,使用python的运行命令‘python fifo*.v.py’,就可以由python源码文件生成对应的包含预编译命令的verilog文件:fifo.v、fifo_ctl.v和fifo_dp.v。
参见图5,本实施例步骤3)之前还包括verilog语言环境准备的下述步骤:下载并并配置验证工具包Verilator,该验证工具包Verilator用于进行Verilog HDL模拟与Lint检查,其中包含的vppreproc工具可以实现宏定义函数的展开;为了配合vppreproc工具,使用verilog语言编写包含预编译使用的宏函数的预定义模块predefines,宏函数用于生成寄存器的缓存逻辑、生成多选一代码的逻辑和生成case语句等代码的逻辑,其中生成寄存器缓存逻辑的函数支持带或者不带reset、带enable信号或者不带enable信号、数据宽度为1或大于1。例如,gen_dffew_macro宏函数为支持enable、不支持reset的寄存器缓存语句。
本实施例中步骤3)包括:使用验证工具包Verilator中的vppreproc工具将包含预编译命令的verilog文件中的所有预编译宏进行展开,从而生成包含AUTO命令的verilog代码。如图5所示,`gen_dffew_macro语句就展开为多行的寄存器缓存语句,此时生成的为包含AUTO命令的verilog文件。
本实施例中,AUTO命令包括AUTOREG命令、AUTOINST命令。
步骤4)生成目标verilog代码之前还包括配置verilog-mode的步骤:下载verilog-mode文件以后,结合编码环境,配置好使用verilog-mode的环境和具体方式。步骤4)生成目标verilog代码时,使用verilog-mode将其中的AUTOREG、AUTOINST等命令进行展开,就可以得到目标verilog文件,可以将其提交到代码库中。
本实施例多进多出FIFO的设计方法能够实现支持上下游流量控制的FIFO队列的多进多出,并能够实现多进多出FIFO的设计工作的可配置化。
以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (10)

1.一种多进多出FIFO,其特征在于,包括控制单元fifo_ctl和数据存储单元fifo_dp,所述控制单元fifo_ctl和数据存储单元fifo_dp均带有时钟输入信号clk和复位控制信号rst,所述控制单元fifo_ctl的输出端和数据存储单元fifo_dp之间连接有信号wren、读指针rptr和写指针wptr一共三组信号,其中信号wren用于表示每个元素是否要根据输入进行更新;读指针rptr用于表示当前输出的指针;写指针wptr用于表示当前输入的指针;所述数据存储单元fifo_dp带有输入信号data_in和输出信号data_out,所述输入信号data_in的输入带宽为输入宽度*元素宽度,所述输出信号data_out的输出宽度为输出宽度*元素宽度,元素宽度为多进多出FIFO的基本宽度。
2.根据权利要求1所述的多进多出FIFO,其特征在于,所述控制单元fifo_ctl的输入信号包括ielem_vld、ielem_cnt、oelem_free,输出信号还包括oelem_valid、emtpy、full、fifo_top_vld,输入信号ielem_vld表示当前周期输入数据是否有效;输入信号ielem_cnt表示当前周期输入数据的有效元素个数;输入信号oelem_free表示当前周期队列下游可接收的元素的个数;输出信号oelem_valid表示当前周期的输出数据是否有效;输出信号emtpy表示FIFO队列是否为空;输出信号full表示当前多进多出FIFO是否已满;输出信号fifo_top_vld表示当前多进多出FIFO中最高输入宽度的位的有效状态。
3.根据权利要求2所述的多进多出FIFO,其特征在于,所述控制单元fifo_ctl输出的读指针rptr表示输出元素的指针位置,随着有效输出而循环增加;写指针wptr表示输入元素的指针位置,根据最后输入的有效元素而循环增加;信号wren根据写指针wptr的值和有效输入元素将对应位置的位置为1,指导数据进入到数据存储单元fifo_dp中;
所述控制单元fifo_ctl包括:
输入转换语句模块BCT,用于将正常二进制编码的输入信号ielem_cnt转变为输入宽度的塔式编码的信号ielem_cnt_dec,N位的塔式编码是指对于二进制表示的x,其从x+1到0位都是为1,其余高位都是为0;
第一状态计算语句模块QVC,用于结合信号ielem_cnt_dec、输入信号ielem_vld和信号queue_vld生成信号queue_vld_inc,信号queue_vld表示当前多进多出FIFO中有效元素个数,信号queue_vld_inc用于表示接收该周期有效的输入元素后多进多出FIFO当前的有效状态;其中,信号queue_vld采用塔式编码,信号queue_vld_inc为将最左侧的1扩展有效元素的个数;
第二状态计算语句模块QVD,用于根据信号queue_vld_inc输出信号queue_vld_dec_winc,信号queue_vld_dec_winc表示考虑了当前周期有效输入和有效输出以后的FIFO队列有效状态;还用于根据输入信号oelem_free和表示当前多进多出FIFO中有效元素个数的信号queue_vld生成信号queue_vld_dec_woinc,信号queue_vld_dec_woinc表示无有效输入元素时的FIFO队列有效状态的变化;
溢出判断语句模块CO,用于根据queue_vld_inc信号、输入信号oelem_free计算表示是否会发生溢出的信号overflow,如果信号queue_vld_inc右移输入信号oelem_free表示的元素个数后仍然超过多进多出FIFO的深度,则信号overflow就置高表示发生溢出;
选择语句模块MUX,用于在信号overflow的控制选择信号queue_vld_dec_winc或信号queue_vld_dec_woinc作为信号queue_vld_dec,且信号overflow置高时选择信号queue_vld_dec_woinc,否则选择信号queue_vld_dec_winc,信号queue_vld_dec表示本周期最后的队列状态信号;
寄存语句模块FF,用于对信号queue_vld_dec进行寄存器暂存,生成表示当前多进多出FIFO中有效元素个数的信号queue_vld供下个周期使用,且信号full为信号queue_vld的最高位;信号empty为信号queue_vld的最低位取反的结果;信号fifo_top_vld为信号queue_vld中最高输入宽度的指定若干位;信号oelem_valid为输入信号oelem_free与信号queue_vld的与操作的结果。
4.根据权利要求1所述的多进多出FIFO,其特征在于,所述数据存储单元fifo_dp包括:
旋转移位模块,用于对于输入信号data_in输入的数据,根据写指针wptr表示的指针的值,将数据进行旋转移位得到旋转后的元素data_bank,旋转后的元素data_bank的起止地址为写指针wptr的位置;
数据读写模块模块,用于将旋转后的元素data_bank根据信号wren分别写入对应的数据存储入口data_entry的元素中,并根据读指针rptr的值,将数据存储入口data_entry中的元素移动到输出信号data_out中。
5.一种权利要求1~4中任意一项所述的多进多出FIFO的设计方法,其特征在于,包括:
1)在python语言环境中针对权利要求1~4中任意一项所述的多进多出FIFO编写基于Pyverilog的python源代码;
2)将得到的python源代码生成包含预编译命令的verilog代码;
3)在verilog语言环境中将包含预编译命令的verilog代码中的所有预编译宏进行展开,生成包含AUTO命令的verilog代码;
4)配置verilog-mode将包含AUTO命令的verilog代码中的AUTO命令展开,从而得到多进多出FIFO的目标verilog代码。
6.根据权利要求5所述的多进多出FIFO的设计方法,其特征在于,步骤1)之前还包括python语言的环境准备的下述步骤:在python中下载并配置Pyverilog模块,为使用codegen等函数提供环境支撑;使用python语言编写自动配置助手模块auto_conf_assist,所述自动配置助手模块auto_conf_assist用于对Pyverilog语言的补充,实现了单行注释、多行注释以及宏语句的支持;使用python语言编写参数配置模块param,参数配置模块param包含多进多出FIFO的关键配置参数,其中关键配置参数Param_E_SIZE表示元素的宽度;关键配置参数Param_I_WIDTH表示输入宽度的值;关键配置参数Param_O_WIDTH表示输出宽度的值;关键配置参数Param_FULL_DPETH表示FIFO队列的深度。
7.根据权利要求6所述的多进多出FIFO的设计方法,其特征在于,步骤1)的详细步骤包括:结合自动配置助手模块auto_conf_assist中的函数,使用Pyverilog语言编写多进多出FIFO及其控制单元fifo_ctl和数据存储单元fifo_dp,使用import语句分别引入pyverilog的代码解释器vparser.ast和代码生成器ASTCodeGenerator;引入自动配置助手模块auto_conf_assist中的单行注释、多行注释以及宏语句的支持函数;引入参数配置模块param中的关键配置参数,通过vast.Ioport函数,结合vast.Input/Ouput函数就完成FIFO队列的输入端口和输出端口的定义,单行注释用于生成verilog文件中的注释,vast.Identifier函数负责声明变量或者语句,params中声明了相关参数;ports中包含了所有的输入和输出端口;items中包含了所有的verilog语句,最后,使用vast.Module函数就完成了FIFO队列的构造,通过使用ASTCodeGenerator和codegen.visit函数就完成verilog代码的生成,完成多进多出FIFO及其控制单元fifo_ctl和数据存储单元fifo_dp的源码编写后,将其提交到代码库中。
8.根据权利要求5所述的多进多出FIFO的设计方法,其特征在于,步骤3)之前还包括verilog语言环境准备的下述步骤:下载并并配置验证工具包Verilator,该验证工具包Verilator用于进行Verilog HDL模拟与Lint检查,其中包含的vppreproc工具可以实现宏定义函数的展开;为了配合vppreproc工具,使用verilog语言编写包含预编译使用的宏函数的预定义模块predefines,宏函数用于生成寄存器的缓存逻辑、生成多选一代码的逻辑和生成case语句等代码的逻辑,其中生成寄存器缓存逻辑的函数支持带或者不带reset、带enable信号或者不带enable信号、数据宽度为1或大于1。
9.根据权利要求8所述的多进多出FIFO的设计方法,其特征在于,步骤3)包括:使用验证工具包Verilator中的vppreproc工具将包含预编译命令的verilog文件中的所有预编译宏进行展开,从而生成包含AUTO命令的verilog代码。
10.根据权利要求9所述的多进多出FIFO的设计方法,其特征在于,所述AUTO命令包括AUTOREG命令、AUTOINST命令。
CN202011043662.9A 2020-09-28 2020-09-28 一种可配置的多进多出fifo的设计方法及装置 Active CN112181356B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011043662.9A CN112181356B (zh) 2020-09-28 2020-09-28 一种可配置的多进多出fifo的设计方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011043662.9A CN112181356B (zh) 2020-09-28 2020-09-28 一种可配置的多进多出fifo的设计方法及装置

Publications (2)

Publication Number Publication Date
CN112181356A true CN112181356A (zh) 2021-01-05
CN112181356B CN112181356B (zh) 2022-08-19

Family

ID=73945811

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011043662.9A Active CN112181356B (zh) 2020-09-28 2020-09-28 一种可配置的多进多出fifo的设计方法及装置

Country Status (1)

Country Link
CN (1) CN112181356B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113676398A (zh) * 2021-08-26 2021-11-19 深信服科技股份有限公司 一种数据恢复方法、装置、设备及可读存储介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008083827A (ja) * 2006-09-26 2008-04-10 Toshiba Corp データ幅可変fifoメモリ、fifoメモリ及び記憶装置
CN101930350A (zh) * 2009-06-24 2010-12-29 合肥力杰半导体科技有限公司 深度不是2的幂的异步fifo存储器设计
US20160035399A1 (en) * 2014-07-31 2016-02-04 Texas Instruments Incorporated Method and apparatus for asynchronous fifo circuit
CN107220023A (zh) * 2017-06-29 2017-09-29 中国电子科技集团公司第五十八研究所 一种嵌入式可配置fifo存储器
CN111367495A (zh) * 2020-03-06 2020-07-03 电子科技大学 一种异步先入先出的数据缓存控制器

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008083827A (ja) * 2006-09-26 2008-04-10 Toshiba Corp データ幅可変fifoメモリ、fifoメモリ及び記憶装置
CN101930350A (zh) * 2009-06-24 2010-12-29 合肥力杰半导体科技有限公司 深度不是2的幂的异步fifo存储器设计
US20160035399A1 (en) * 2014-07-31 2016-02-04 Texas Instruments Incorporated Method and apparatus for asynchronous fifo circuit
CN107220023A (zh) * 2017-06-29 2017-09-29 中国电子科技集团公司第五十八研究所 一种嵌入式可配置fifo存储器
CN111367495A (zh) * 2020-03-06 2020-07-03 电子科技大学 一种异步先入先出的数据缓存控制器

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
闫若川FPGA: "FPGA 之 python 编写FPGA代码,pyverilog写verilog的代码", 《HTTPS://WWW.CNBLOGS.COM/YANRUOCHUANFPGA/P/9336823.HTML》 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113676398A (zh) * 2021-08-26 2021-11-19 深信服科技股份有限公司 一种数据恢复方法、装置、设备及可读存储介质
CN113676398B (zh) * 2021-08-26 2023-11-03 深信服科技股份有限公司 一种数据恢复方法、装置、设备及可读存储介质

Also Published As

Publication number Publication date
CN112181356B (zh) 2022-08-19

Similar Documents

Publication Publication Date Title
US8286025B1 (en) Selection of port adapters for clock crossing boundaries
CN109815619B (zh) 一种将同步电路转化为异步电路的方法
CN112181356B (zh) 一种可配置的多进多出fifo的设计方法及装置
CN113792520A (zh) 布局布线方法、装置、同步电路以及集成电路芯片
CN117236253B (zh) 一种fpga布线方法、装置、计算机设备及存储介质
US6546542B2 (en) Parameterized designing method of data driven information processor employing self-timed pipeline control
CN113900975B (zh) 一种同步fifo
CN102201817B (zh) 基于存储器折叠架构优化的低功耗ldpc译码器
US7676685B2 (en) Method for improving the data transfer in semi synchronous clock domains integrated circuits at any possible m/n clock ratio
CN102937915A (zh) 用于多核处理器的硬件锁实现方法及装置
US20080079459A1 (en) Integrated circuit and input data controlling method for reconfigurable circuit
JP2004133525A (ja) Lsi設計検証装置およびlsi設計検証方法
CN117422024B (zh) 数据位宽转换方法、装置、计算机设备及介质
US6510480B1 (en) Data transfer circuit and data processing method using data transfer circuit for handling interruption processing
CN116010301B (zh) 从数据流到dma配置的映射方法与装置、存储介质和dla
CN112800704B (zh) 基于功能buffer的芯片后端改版方法、装置及计算机设备
CN1259620C (zh) 带有快速位提取和位插入单元的数字信号处理器
JPH1092939A (ja) 半導体集積回路の自動配置配線方法
CN116680230B (zh) 一种硬件加速电路及芯片
CN218100209U (zh) 多比特异步接口电路
CN102495713A (zh) 实现任意深度异步fifo的方法及系统
CN112542187B (zh) 一种高速读ID和芯片状态的电路和flash存储器
JP2000057180A (ja) 高位合成装置、高位合成方法および高位合成プログラムを記録した媒体
JP2006155448A (ja) データ処理装置およびデータ処理装置の設計方法
CN106897234B (zh) 一种处理器以及处理器内置存储器的控制方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant