CN111814417B - 一种基于字符分隔值文件转换Verilog代码的方法 - Google Patents
一种基于字符分隔值文件转换Verilog代码的方法 Download PDFInfo
- Publication number
- CN111814417B CN111814417B CN202010531916.5A CN202010531916A CN111814417B CN 111814417 B CN111814417 B CN 111814417B CN 202010531916 A CN202010531916 A CN 202010531916A CN 111814417 B CN111814417 B CN 111814417B
- Authority
- CN
- China
- Prior art keywords
- state
- sub
- reading
- statement
- file
- 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.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F30/00—Computer-aided design [CAD]
- G06F30/30—Circuit design
- G06F30/34—Circuit design for reconfigurable circuits, e.g. field programmable gate arrays [FPGA] or programmable logic devices [PLD]
Landscapes
- Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Evolutionary Computation (AREA)
- Geometry (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了基于字符分隔值文件转换Verilog代码的方法:S1,读取字符分隔值总文件中的数据,根据总文件内的记录去搜索符合条件的字符分隔值子文件;S2,处理字符分隔值总文件和子文件内的数据,生成端口信号列表和变量定义部分的Verilog代码;S3,给每个字符分隔值子文件分配状态号区间,读取各个子文件内的状态跳转数据,生成状态跳转部分的Verilog代码;S4,读取每个字符分隔值子文件内对应状态所执行的操作,生成各个状态语句执行的Verilog代码。本发明为字符分隔值文件数据转化到硬件描述提供了切实可行的方案,当需要编写的状态机状态很多时,可有效简化状态的插入和删除问题以及子状态机间相互跳转问题,能够降低代码编写的出错率,提高开发的效率。
Description
技术领域
本发明涉及FPGA开发的状态机设计领域,尤其涉及一种基于字符分隔值文件转换Verilog代码的方法。
背景技术
在FPGA开发的状态机设计领域,需要组织处理大量的状态,如何组织状态机的状态跳转以及设计友好的状态机输入方法并将其快速转换为可综合的Verilog代码有着比较广泛的应用前景与意义;而实现字符分隔值格式文件转换为Verilog代码的关键在于如何将Verilog代码中的各个元素在字符分隔值中呈现,以及如何组织状态机中的状态跳转;目前还未有字符分隔值文件转换为Verilog代码的相关方法,且相比于其他设计方式,采用字符分隔值的设计方式更加的直观灵活,且文件读取兼容不同平台。
发明内容
本发明实施例提供了一种基于字符分隔值格式文件转换Verilog代码的方法,可以根据字符分隔值文件中的内容快速生成可综合的Verilog代码,简化状态机设计时Verilog代码的编写,使状态机中状态的增删更加方便快捷,降低出错的概率,提高开发速度。
为了解决上述技术问题,本发明实施例提供的一种基于字符分隔值文件转换Verilog代码的方法,包括以下步骤:
S1,读取字符分隔值总文件中的数据,根据总文件内的记录去搜索符合条件的字符分隔值子文件;
S2,处理字符分隔值总文件和子文件内的数据,生成端口信号列表和变量定义部分的Verilog代码;
S3,给每个字符分隔值子文件分配状态号区间,读取各个子文件内的状态跳转数据,生成状态跳转部分的Verilog代码;
S4,读取每个字符分隔值子文件内对应状态所执行的操作,生成各个状态语句执行的Verilog代码。
所述S1,读取字符分隔值总文件中的数据,根据总文件内的记录去搜索符合条件的字符分隔值子文件,包括以下步骤:
S10,在字符分隔值总文件中的State列中按顺序从第二行开始读取各个子状态,一直读取到State列有字段为空,完成子状态的读取,根据子状态的名称,将子状态分为3类:可返回母状态的子状态、不可返回母状态的子状态和线性序列机子状态,并将子状态的名称保存在列表<Sub_State_Name>中,各子状态称为Sub_StateX,X=1~N;
S11,根据<Sub_State_Name>中的内容,搜索符合子状态名称的字符分隔值子文件,分类别读入所有子文件的数据并将其保存。
优选地,所述S10,根据子状态的名称,将子状态分为3类,其子状态分为以下三类:
不可返回母状态的子状态:状态标号前不加任何特殊符号的状态,这类状态不能作为被调用的子状态,其最后一个状态必须带有要跳转去的下一状态;
可返回母状态的子状态:状态标号前带有”$”,作为子状态被调用,在子状态全部完成之后自动跳转回调用子状态的母状态,其子状态的最后一个状态没有确定对应的目标状态;
线性序列机子状态:状态标号前带有”#”,这类标号的子状态可使用线性序列机来实现若干简单通信时序。
优选地,所述S2,处理字符分隔值总文件和子文件内的数据,生成端口信号列表和变量定义部分的Verilog代码,包括以下步骤:
S20,从带有#的子状态名称所对应的子文件中读取第一行除State之外的所有字段,每个字段对应一个端口信号,将其通过文件写入操作,写入到目标文本文件中,写入文本文件中的内容为“module(端口信号1,端口信号2,……,端口信号N);”;
S21,读取总文件中Variable那一列的数据,当读到字段为空时,Variable读取完毕,将其用于生成模块内所有定义的变量,其生成文件的文本形式为“wire/reg[n1:0]变量名1;wire/reg[n2:0]变量名2;……;wire/reg[n3:0]变量名N;”,在生成变量定义的代码之后在其文本之后生成现态次态切换的Verilog代码。
优选地,所述S3,给每个字符分隔值子文件分配状态号区间,读取各个子文件内的状态跳转数据,生成状态跳转部分的Verilog代码,包括以下步骤:
S30,读取<Sub_State_Name>中所有的子状态标号,每个状态标号作为一个子状态,为每个子状态分配500个状态号,每个子状态的基本状态号以500为单位递增,Sub_State1的基本状态号范围为0-499,Sub_State2的基本状态号为500-999,按此分配,在文本中生成Verilog代码中每次均固定生成“always@(*)begin n_state=0;case(c_state)”;
S31,解析状态设计子文件,按行读取与状态跳转的各列,首先读取<State_Cur>,生成文件的文本形式为“(分配到的基本状态号+子状态中的状态):”,在遇到下一状态之前,所有的状态跳转判断语句均属于同一状态,再读取<State_Jump_Condition>判断语句的字段,其生成文件的文本形式为if(判断语句字段),若判断语句字段为空,则判断语句字段不生成任何文本,接着读取目标状态的那一字段,其生成文件的文本形式为(“n_state=跳转的目标状态字段;”),继续读取当前状态下其余各行的状态跳转判断语句以及目标状态,生成前述文本,当<State_Cur>读取到其他状态号时完成当前状态所有状态跳转分支的Verilog语句生成,在该状态文本的最后添加(“else n_state=c_state;”),一个状态最终生成的Verilog文本代码的形式为“(基本状态号+子状态内状态号偏移):begin if(判断语句1)n_state=目标状态1;else if(判断语句2)n_state=目标状态2;……else if(判断语句N)n_state=目标状态N;else n_state=c_state;end”;
S32,解析出跳转目标状态为可跳转回母状态的子状态,将母状态的当前状态号的下一状态号保存在状态号寄存器组SC中,并且由SC_Cnt来记录应该返回的状态号存储在SC中的哪个16位寄存器中,当调用可返回的子状态时,为了能否返回母状态,必须记录下返回母状态所需要的状态号,因此要求在该状态下能自动在Verilog文件的当前状态下的无条件执行语句块中添加“SC[SC_Cnt]<=c_state+1’b1;SC_Cnt<=SC_Cnt+1’b1;”,当子状态返回时,从SC中取出之前保存的状态号,目标状态自动设置为SC[SC_Cnt–1’b1],并且在子状态的最后一个状态的执行语句块中自动添加SC_Cnt<=SC_Cnt–1’b1,使得每次都能够取到正确的返回状态,此执行语句可由脚本自动生成无需自行写在字符分隔值文件中;
S33,线性序列机状态跳转不需要状态跳转判断语句,下一时钟到来的时候,自动进行状态跳转,0~n-1状态的下一目标状态都是c_state+1,且没有跳转条件,文本生成形式同S31,当来到最后一个状态的时候,返回调用线性序列机子状态的母状态,同S32;
S34,重复执行S31,S32,将所有状态设计子文件中的状态跳转部分的代码生成,当所有的状态跳转部分的代码生成完成之后,在末尾补全此组合逻辑部分的代码,补充的内容为“default:n_state=0;endcase end”,即完成状态设计子文件的状态跳转部分的代码生成。
优选地,所述S4,读取每个字符分隔值子文件内对应状态所执行的操作,生成各个状态语句执行的Verilog代码,包括以下步骤:
S40,生成时序逻辑部分固定的Verilog语句,其文本格式为always@(posedgeClk,negedge Rst)begin,读取总文件中Rst列的数据,当读到字段字段为空时,Rst所有执行语句读取完成,将其用于生成模块中的复位部分代码,其生成文件的文本形式为“if(Rst)begin复位语句1;复位语句2;……;复位语句N;end”,在复位语句生成之后需要添加上“case(c_state)”;
S41,读取<State_Cur>,生成文件的文本形式为“(分配到的基本状态号+子状态中的状态):”,在当前状态下读取<Operate>,当行数在下一状态所在行或者<Operate>为空的时候完成<Operate>的读取,在S32中所需要添加到无条件执行语句块中的语句也自动归属到<Operate>中,生成无条件执行语句块的Verilog代码,其生成的文本形式为“beginOperate1;Operate2;……;OperateN;end”;
S42,按顺序读取<O_C>,当读取到一条不为空的<O_C>字段时,接着读取与其在同一行的<O_M_C>字段,判断后续若干行的<O_C>是否为空,若为空,则将此若干行的<O_M_C>字段均作为满足<O_C>条件时执行的语句块,其生成的文件的文本形式为if(执行语句判断条件)begin执行语句1;执行语句2;……;执行语句n;end,继续读取<O_C>、<O_M_C>和<State_Cur>生成前述Verilog语句,当在<State_Cur>中读到其他状态时完成当前状态下对应Verilog代码的生成,其生成文本的形式为if(执行语句判断条件1)begin执行语句x1;执行语句x2;……;执行语句xn;end else if(执行语句判断条件2)begin执行语句y1;执行语句y2;……;执行语句ym;end;
S43,按顺序读取<O_N_M_C>,读到空字段或者<State_Cur>列读取到其他的状态,则标志着不满足所有判断条件的执行语句块读取完毕,将读取到的语句块生成Verilog代码,其文本形式为“else begin执行语句1;执行语句2;……;执行语句N;end”;
S44,重复S40-S42,将子状态中的所有状态的执行语句全部生成Verilog代码,完成之后在文件的末尾添加上“default:;endcase end endmodule”,至此全部的Verilog代码已经全部生成。
本发明的有益效果如下:
在字符分隔值文件中设计状态机,并将其自动转化为可综合的Verilog代码。使得状态机的设计更加的直观,方便。避免编写Verilog代码时出现的耗时长,容易出错的问题。首先本发明可以用于解决字符分隔值格式文件转换Verilog代码的问题,当状态机的状态非常的繁多,且经常需要增删状态的时候,采用此方法可以更加方便的在原有状态机的基础上进行修改,当状态简单时,也可以使用本方法设计状态机快速生成可综合的Verilog代码。
附图说明
图1为本发明实施例的基于字符分隔值文件转换Verilog代码的方法的步骤流程图;
图2为本发明具体实施例的基于字符分隔值格式文件转换Verilog代码的方法中字符分隔值主文件的框架结构;
图3为本发明具体实施例的基于字符分隔值格式文件转换Verilog代码的方法中各字符分隔值子文件中的状态号段分配;
图4为本发明具体实施例的基于字符分隔值格式文件转换Verilog代码的方法中字符分隔值子文件中最后一个状态自带目标跳转状态,无需返回母状态的子文件框架结构;
图5为本发明具体实施例的基于字符分隔值格式文件转换Verilog代码的方法中字符分隔值子文件中最后一个状态不带目标跳转状态,能够返回母状态的子文件框架结构;
图6为本发明又一具体实施例的基于字符分隔值格式文件转换Verilog代码的方法中字符分隔值子文件中最后一个状态不带目标跳转状态,能够返回母状态的子文件框架结构;
图7为本发明具体实施例的基于字符分隔值格式文件转换Verilog代码的方法中能使用线性序列机来生成简单通信时序的子文件框架。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
相反,本发明涵盖任何由权利要求定义的在本发明的精髓和范围上做的替代、修改、等效方法以及方案。进一步,为了使公众对本发明有更好的了解,在下文对本发明的细节描述中,详尽描述了一些特定的细节部分。对本领域技术人员来说没有这些细节部分的描述也可以完全理解本发明。
首先,需要了解的是本发明所述一种基于字符分隔值格式文件转换为Verilog代码的方法,在本实施例中是用于解决将字符分隔值格式编写的状态机转换成可综合Verilog代码的问题,当状态机的状态非常的繁多,且经常需要增删状态的时候,采用此方法可以更加方便的在原有状态机的基础上进行修改,当状态简单时,也可以使用本方法设计状态机快速生成可综合的Verilog代码,方法中字符分隔值文件格式定义为:
(1)字符分隔值文件的每一行称为一条记录,每行之中以分隔符分隔的被称为字段,在本方法中记录之间以换行符作为分隔符,字段之间以逗号作为分隔符,文件的第一行记录的是列名,第一行每个字段对应一列。文件的第二行以后的字段存储在与列名相对应的那一列,若该列的字段为空,依然需要加逗号代表该字段的存在。
(2)主文件的行列关系参见图2,主文件第一行的列名是<State>、<Variable>、<Rst>,其具体文本形式为“State,Variable,Rst”,其中<State>这一列中存放的是最终生成的Verilog代码中所需要的所有子文件的名称(同时也是子状态的名称),<Variable>这一列存放的是整个模块中需要定义的所有变量,<Rst>这一行存放的是整个模块在复位的时候需要执行的所有操作,第二行开始将每列所对应的字段存储在记录中,其具体的文本形式是“子文件名,变量定义,复位语句”。
(3)状态设计子文件的行列关系参见图3,图4,图5,图6,第一行的列名是<State_Cur>、<State_Jump_Condition>、<State_Aim>、<Operate>、<O_C>、<O_M_C>、<O_N_M_C>,其具体文本形式为“State_Cur,State_Jump_Condition,State_Aim,Operate,O_C,O_M_C,O_N_M_C”,其中<State_Cur>这一列存放的是当前状态,在每个状态设计子文件中,<State_Cur>这一列都是从“0”开始递增的,<State_Jump_Condition>这一列存放的是状态跳转的条件,<State_Aim>这一列存放的是跳转的下一目标状态,<Operate>这一列存放的是在当前状态下不需要任何条件便可以执行的语句,将属于这一列的字段定义为“Operate1,Operate2,……,OperateN”,<O_C>这一列存放的是在当前状态下分支语句执行的判断条件,<O_M_C>这一列存放的是在当前状态下满足判断条件时执行的语句,<O_N_M_C>这一列存放的是在当前状态下不满足所有判断条件时,执行的语句,其具体文本形式为“当前状态,状态跳转条件,跳转的下一目标状态,直接执行的语句,分支判断语句,判断条件满足时执行的语句,分支条件全不满足时执行的语句”,当字段的内容是判断条件或者操作语句时,最多只能有一条判断条件语句或者操作语句,判断语句有多条的时候,将其分行书写,每条判断语句对应的操作语句块的第一条操作语句也应处于判断语句同一行,当语句块不止一行代码的时候,将语句块中的多条语句分行书写,下一条判断语句写在当前判断语句包含的操作语句块结束时所在行的下一行,下一状态写在当前所有判断语句和执行语句结束时所在行的下一行。
(4)线性序列机子文件的行列关系参见图7,第一行的列名是当前状态和模块的端口信号列表,其具体的文本形式为State,端口信号1,端口信号2,……,端口信号N,线性序列机子文件中的State从“0”开始,往后递增,第二行往后的记录存放的是线性序列机各个状态下端口信号的赋值操作(记为Assignment),其具体的文本形式为“State,Assignment1,Assignment2,……,AssignmentN”。
参见图1,为本发明实施例的本发明的技术方案为基于字符分隔值文件转换Verilog代码的方法的步骤流程图,包括以下步骤:
S1,读取字符分隔值总文件中的数据,根据总文件内的记录去搜索符合条件的字符分隔值子文件;
S2,处理字符分隔值总文件和子文件内的数据,生成端口信号列表和变量定义部分的Verilog代码;
S3,给每个字符分隔值子文件分配状态号区间,读取各个子文件内的状态跳转数据,生成状态跳转部分的Verilog代码;
S4,读取每个字符分隔值子文件内对应状态所执行的操作,生成各个状态语句执行的Verilog代码。
所述S1,读取字符分隔值总文件中的数据,根据总文件内的记录去搜索符合条件的字符分隔值子文件,包括以下步骤:
S10,在字符分隔值总文件中的State列中按顺序从第二行开始读取各个子状态,一直读取到State列有字段为空,完成子状态的读取,根据子状态的名称,将子状态分为3类:可返回母状态的子状态、不可返回母状态的子状态和线性序列机子状态,并将子状态的名称保存在列表<Sub_State_Name>中,各子状态称为Sub_StateX,X=1~N;
S11,根据<Sub_State_Name>中的内容,搜索符合子状态名称的字符分隔值子文件,分类别读入所有子文件的数据并将其保存。
S10,根据子状态的名称,将子状态分为3类,其子状态分为以下三类:
不可返回母状态的子状态:状态标号前不加任何特殊符号的状态,这类状态不能作为被调用的子状态,其最后一个状态必须带有要跳转去的下一状态;
可返回母状态的子状态:状态标号前带有”$”,作为子状态被调用,在子状态全部完成之后自动跳转回调用子状态的母状态,其子状态的最后一个状态没有确定对应的目标状态;
线性序列机子状态:状态标号前带有”#”,这类标号的子状态可使用线性序列机来实现若干简单通信时序。
S2,处理字符分隔值总文件和子文件内的数据,生成端口信号列表和变量定义部分的Verilog代码,包括以下步骤:
S20,从带有#的子状态名称所对应的子文件中读取第一行除State之外的所有字段,每个字段对应一个端口信号,将其通过文件写入操作,写入到目标文本文件中,写入文本文件中的内容为“module(端口信号1,端口信号2,……,端口信号N);”;
S21,读取总文件中Variable那一列的数据,当读到字段为空时,Variable读取完毕,将其用于生成模块内所有定义的变量,其生成文件的文本形式为“wire/reg[n1:0]变量名1;wire/reg[n2:0]变量名2;……;wire/reg[n3:0]变量名N;”,在生成变量定义的代码之后在其文本之后生成现态次态切换的Verilog代码。
S3,给每个字符分隔值子文件分配状态号区间,读取各个子文件内的状态跳转数据,生成状态跳转部分的Verilog代码,包括以下步骤:
S30,读取<Sub_State_Name>中所有的子状态标号,每个状态标号作为一个子状态,为每个子状态分配500个状态号,每个子状态的基本状态号以500为单位递增,Sub_State1的基本状态号范围为0-499,Sub_State2的基本状态号为500-999,按此分配,在文本中生成Verilog代码中每次均固定生成“always@(*)begin n_state=0;case(c_state)”;
S31,解析状态设计子文件,按行读取与状态跳转的各列,首先读取<State_Cur>,生成文件的文本形式为“(分配到的基本状态号+子状态中的状态):”,在遇到下一状态之前,所有的状态跳转判断语句均属于同一状态,再读取<State_Jump_Condition>判断语句的字段,其生成文件的文本形式为if(判断语句字段),若判断语句字段为空,则判断语句字段不生成任何文本,接着读取目标状态的那一字段,其生成文件的文本形式为(“n_state=跳转的目标状态字段;”),继续读取当前状态下其余各行的状态跳转判断语句以及目标状态,生成前述文本,当<State_Cur>读取到其他状态号时完成当前状态所有状态跳转分支的Verilog语句生成,在该状态文本的最后添加(“else n_state=c_state;”),一个状态最终生成的Verilog文本代码的形式为“(基本状态号+子状态内状态号偏移):begin if(判断语句1)n_state=目标状态1;else if(判断语句2)n_state=目标状态2;……else if(判断语句N)n_state=目标状态N;else n_state=c_state;end”;
S32,解析出跳转目标状态为可跳转回母状态的子状态,将母状态的当前状态号的下一状态号保存在状态号寄存器组SC中,并且由SC_Cnt来记录应该返回的状态号存储在SC中的哪个16位寄存器中,当调用可返回的子状态时,为了能否返回母状态,必须记录下返回母状态所需要的状态号,因此要求在该状态下能自动在Verilog文件的当前状态下的无条件执行语句块中添加“SC[SC_Cnt]<=c_state+1’b1;SC_Cnt<=SC_Cnt+1’b1;”,当子状态返回时,从SC中取出之前保存的状态号,目标状态自动设置为SC[SC_Cnt–1’b1],并且在子状态的最后一个状态的执行语句块中自动添加SC_Cnt<=SC_Cnt–1’b1,使得每次都能够取到正确的返回状态,此执行语句可由脚本自动生成无需自行写在字符分隔值文件中;
S33,线性序列机状态跳转不需要状态跳转判断语句,下一时钟到来的时候,自动进行状态跳转,0~n-1状态的下一目标状态都是c_state+1,且没有跳转条件,文本生成形式同S31,当来到最后一个状态的时候,返回调用线性序列机子状态的母状态,同S32;
S34,重复执行S31,S32,将所有状态设计子文件中的状态跳转部分的代码生成,当所有的状态跳转部分的代码生成完成之后,在末尾补全此组合逻辑部分的代码,补充的内容为“default:n_state=0;endcase end”,即完成状态设计子文件的状态跳转部分的代码生成。
S4,读取每个字符分隔值子文件内对应状态所执行的操作,生成各个状态语句执行的Verilog代码,包括以下步骤:
S40,生成时序逻辑部分固定的Verilog语句,其文本格式为always@(posedgeClk,negedge Rst)begin,读取总文件中Rst列的数据,当读到字段字段为空时,Rst所有执行语句读取完成,将其用于生成模块中的复位部分代码,其生成文件的文本形式为“if(Rst)begin复位语句1;复位语句2;……;复位语句N;end”,在复位语句生成之后需要添加上“case(c_state)”;
S41,读取<State_Cur>,生成文件的文本形式为“(分配到的基本状态号+子状态中的状态):”,在当前状态下读取<Operate>,当行数在下一状态所在行或者<Operate>为空的时候完成<Operate>的读取,在S32中所需要添加到无条件执行语句块中的语句也自动归属到<Operate>中,生成无条件执行语句块的Verilog代码,其生成的文本形式为“beginOperate1;Operate2;……;OperateN;end”;
S42,按顺序读取<O_C>,当读取到一条不为空的<O_C>字段时,接着读取与其在同一行的<O_M_C>字段,判断后续若干行的<O_C>是否为空,若为空,则将此若干行的<O_M_C>字段均作为满足<O_C>条件时执行的语句块,其生成的文件的文本形式为if(执行语句判断条件)begin执行语句1;执行语句2;……;执行语句n;end,继续读取<O_C>、<O_M_C>和<State_Cur>生成前述Verilog语句,当在<State_Cur>中读到其他状态时完成当前状态下对应Verilog代码的生成,其生成文本的形式为if(执行语句判断条件1)begin执行语句x1;执行语句x2;……;执行语句xn;end else if(执行语句判断条件2)begin执行语句y1;执行语句y2;……;执行语句ym;end;
S43,按顺序读取<O_N_M_C>,读到空字段或者<State_Cur>列读取到其他的状态,则标志着不满足所有判断条件的执行语句块读取完毕,将读取到的语句块生成Verilog代码,其文本形式为“else begin执行语句1;执行语句2;……;执行语句N;end”;
S44,重复S40-S42,将子状态中的所有状态的执行语句全部生成Verilog代码,完成之后在文件的末尾添加上“default:;endcase end endmodule”,至此全部的Verilog代码已经全部生成。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (1)
1.一种基于字符分隔值格式文件转换Verilog代码的方法,其特征在于,包括以下步骤:
S1,读取字符分隔值总文件中的数据,根据总文件内的记录去搜索符合条件的字符分隔值子文件;
S2,处理字符分隔值总文件和子文件内的数据,生成端口信号列表和变量定义部分的Verilog代码;
S3,给每个字符分隔值子文件分配状态号区间,读取各个子文件内的状态跳转数据,生成状态跳转部分的Verilog代码;
S4,读取每个字符分隔值子文件内对应状态所执行的操作,生成各个状态语句执行的Verilog代码;
所述S1,读取字符分隔值总文件中的数据,根据总文件内的记录去搜索符合条件的字符分隔值子文件,包括以下步骤:
S10,在字符分隔值总文件中的State列中按顺序从第二行开始读取各个子状态,一直读取到State列有字段为空,完成子状态的读取,根据子状态的名称,将子状态分为3类:可返回母状态的子状态、不可返回母状态的子状态和线性序列机子状态,并将子状态的名称保存在列表<Sub_State_Name>中,各子状态称为Sub_StateX,X=1~N;
S11,根据<Sub_State_Name>中的内容,搜索符合子状态名称的字符分隔值子文件,分类别读入所有子文件的数据并将其保存;
所述S10,根据子状态的名称,将子状态分为3类,其子状态分为以下三类:
不可返回母状态的子状态:状态标号前不加任何特殊符号的状态,这类状态不能作为被调用的子状态,其最后一个状态必须带有要跳转去的下一状态;
可返回母状态的子状态:状态标号前带有”$”,作为子状态被调用,在子状态全部完成之后自动跳转回调用子状态的母状态,其子状态的最后一个状态没有确定对应的目标状态;
线性序列机子状态:状态标号前带有”#”,这类标号的子状态可使用线性序列机来实现若干简单通信时序;
所述S2,处理字符分隔值总文件和子文件内的数据,生成端口信号列表和变量定义部分的Verilog代码,包括以下步骤:
S20,从带有#的子状态名称所对应的子文件中读取第一行除State之外的所有字段,每个字段对应一个端口信号,将其通过文件写入操作,写入到目标文本文件中,写入文本文件中的内容为“module(端口信号1,端口信号2,……,端口信号N);”;
S21,读取总文件中Variable那一列的数据,当读到字段为空时,Variable读取完毕,将其用于生成模块内所有定义的变量,其生成文件的文本形式为“wire/reg [n1:0] 变量名1; wire/reg [n2:0] 变量名2; ……; wire/reg [n3:0] 变量名N;”,在生成变量定义的代码之后在其文本之后生成现态次态切换的Verilog代码;
所述S3,给每个字符分隔值子文件分配状态号区间,读取各个子文件内的状态跳转数据,生成状态跳转部分的Verilog代码,包括以下步骤:
S30,读取<Sub_State_Name>中所有的子状态标号,每个状态标号作为一个子状态,为每个子状态分配500个状态号,每个子状态的基本状态号以500为单位递增,Sub_State1的基本状态号范围为0-499,Sub_State2的基本状态号为500-999,按此分配,在文本中生成Verilog代码中每次均固定生成“always@(*) begin n_state = 0; case(c_state)”;
S31,解析状态设计子文件,按行读取与状态跳转的各列,首先读取<State_Cur>,生成文件的文本形式为“(分配到的基本状态号+子状态中的状态):”,在遇到下一状态之前,所有的状态跳转判断语句均属于同一状态,再读取<State_Jump_Condition>判断语句的字段,其生成文件的文本形式为if(判断语句字段),若判断语句字段为空,则判断语句字段不生成任何文本,接着读取目标状态的那一字段,其生成文件的文本形式为(“n_state= 跳转的目标状态字段;”),继续读取当前状态下其余各行的状态跳转判断语句以及目标状态,生成前述文本,当<State_Cur>读取到其他状态号时完成当前状态所有状态跳转分支的Verilog语句生成,在该状态文本的最后添加(“else n_state = c_state;”),一个状态最终生成的Verilog文本代码的形式为“(基本状态号+子状态内状态号偏移): begin if(判断语句1)n_state = 目标状态1;else if(判断语句2)n_state = 目标状态2; …… elseif(判断语句N)n_state = 目标状态N; else n_state = c_state;end”;
S32,解析出跳转目标状态为可跳转回母状态的子状态,将母状态的当前状态号的下一状态号保存在状态号寄存器组SC中,并且由SC_Cnt来记录应该返回的状态号存储在SC中的哪个16位寄存器中,当调用可返回的子状态时,为了能否返回母状态,必须记录下返回母状态所需要的状态号,因此要求在该状态下能自动在Verilog文件的当前状态下的无条件执行语句块中添加 “SC[SC_Cnt] <= c_state + 1’b1; SC_Cnt <= SC_Cnt + 1’b1;”,当子状态返回时,从SC中取出之前保存的状态号,目标状态自动设置为SC[SC_Cnt – 1’b1],并且在子状态的最后一个状态的执行语句块中自动添加SC_Cnt <= SC_Cnt – 1’b1,使得每次都能够取到正确的返回状态,此执行语句可由脚本自动生成无需自行写在字符分隔值文件中;
S33,线性序列机状态跳转不需要状态跳转判断语句,下一时钟到来的时候,自动进行状态跳转,0~n-1状态的下一目标状态都是c_state + 1,且没有跳转条件,文本生成形式同S31,当来到最后一个状态的时候,返回调用线性序列机子状态的母状态,同S32;
S34,重复执行S31,S32,将所有状态设计子文件中的状态跳转部分的代码生成,当所有的状态跳转部分的代码生成完成之后,在末尾补全此组合逻辑部分的代码,补充的内容为“default: n_state = 0; endcase end”,即完成状态设计子文件的状态跳转部分的代码生成;
所述S4,读取每个字符分隔值子文件内对应状态所执行的操作,生成各个状态语句执行的Verilog代码,包括以下步骤:
S40,生成时序逻辑部分固定的Verilog语句,其文本格式为always@(posedge Clk,negedge Rst) begin,读取总文件中Rst列的数据,当读到字段字段为空时,Rst所有执行语句读取完成,将其用于生成模块中的复位部分代码,其生成文件的文本形式为 “if(Rst)begin 复位语句1; 复位语句2; ……;复位语句N; end”,在复位语句生成之后需要添加上“case(c_state)”;
S41,读取<State_Cur>,生成文件的文本形式为 “(分配到的基本状态号+子状态中的状态):”,在当前状态下读取< Operate >,当行数在下一状态所在行或者< Operate >为空的时候完成< Operate >的读取,在S32中所需要添加到无条件执行语句块中的语句也自动归属到<Operate>中,生成无条件执行语句块的Verilog代码,其生成的文本形式为 “beginOperate1; Operate2;……;OperateN;end”;
S42,按顺序读取<O_C>,当读取到一条不为空的<O_C>字段时,接着读取与其在同一行的<O_M_C>字段,判断后续若干行的<O_C>是否为空,若为空,则将此若干行的<O_M_C >字段均作为满足<O_C>条件时执行的语句块,其生成的文件的文本形式为if(执行语句判断条件) begin 执行语句1;执行语句2; ……;执行语句n;end,继续读取<O_C>、<O_M_C>和<State_Cur>生成前述Verilog语句,当在<State_Cur>中读到其他状态时完成当前状态下对应Verilog代码的生成,其生成文本的形式为if(执行语句判断条件1) begin 执行语句x1;执行语句x2;……; 执行语句xn; end else if(执行语句判断条件2) begin 执行语句y1;执行语句y2 ;…… ;执行语句ym; end;
S43,按顺序读取<O_N_M_C>,读到空字段或者<State_Cur>列读取到其他的状态,则标志着不满足所有判断条件的执行语句块读取完毕,将读取到的语句块生成Verilog代码,其文本形式为“else begin 执行语句1; 执行语句2; …… ; 执行语句N; end”;
S44,重复S40-S42,将子状态中的所有状态的执行语句全部生成Verilog代码,完成之后在文件的末尾添加上“default: ; endcase end endmodule”,至此全部的Verilog代码已经全部生成。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010531916.5A CN111814417B (zh) | 2020-06-11 | 2020-06-11 | 一种基于字符分隔值文件转换Verilog代码的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010531916.5A CN111814417B (zh) | 2020-06-11 | 2020-06-11 | 一种基于字符分隔值文件转换Verilog代码的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111814417A CN111814417A (zh) | 2020-10-23 |
CN111814417B true CN111814417B (zh) | 2023-09-26 |
Family
ID=72844929
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010531916.5A Active CN111814417B (zh) | 2020-06-11 | 2020-06-11 | 一种基于字符分隔值文件转换Verilog代码的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111814417B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112560401B (zh) * | 2020-12-22 | 2024-04-09 | 成都海光微电子技术有限公司 | Verilog文件转换方法、装置、存储介质及设备 |
CN114253524B (zh) * | 2021-12-20 | 2024-05-24 | 山东浪潮科学研究院有限公司 | 一种基于脚本的用于辅助状态机逻辑代码设计的方法 |
CN114327567A (zh) * | 2022-01-05 | 2022-04-12 | 北京字节跳动网络技术有限公司 | 一种符号恢复方法及装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6990438B1 (en) * | 2000-09-12 | 2006-01-24 | Synopsys, Inc. | Method and apparatus for observability-based code coverage |
CN109725900A (zh) * | 2019-01-07 | 2019-05-07 | 西北工业大学 | 寄存器传输级Verilog代码的SMV模型构建方法 |
-
2020
- 2020-06-11 CN CN202010531916.5A patent/CN111814417B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6990438B1 (en) * | 2000-09-12 | 2006-01-24 | Synopsys, Inc. | Method and apparatus for observability-based code coverage |
CN109725900A (zh) * | 2019-01-07 | 2019-05-07 | 西北工业大学 | 寄存器传输级Verilog代码的SMV模型构建方法 |
Also Published As
Publication number | Publication date |
---|---|
CN111814417A (zh) | 2020-10-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111814417B (zh) | 一种基于字符分隔值文件转换Verilog代码的方法 | |
US8972930B2 (en) | Generating text manipulation programs using input-output examples | |
CN101099129A (zh) | 组织指向对象的指针 | |
CN107145538B (zh) | 表格数据查询方法、装置与系统 | |
CN101675415B (zh) | 程序模式分析装置、模式出现状况信息产生方法、模式信息生成装置及程序 | |
CN103631385A (zh) | 一种在文字输入中筛选候选项的方法和装置 | |
CN103049098A (zh) | 输入法切换方法及设备 | |
CN108846069B (zh) | 一种基于标记语言的文档执行方法及装置 | |
CN104424239A (zh) | 资源文件加载方法和装置 | |
CN102279886B (zh) | 元数据处理方法及设备 | |
CN102508822A (zh) | 泰语显示方法、装置和系统 | |
George | Practical data science with Python: learn tools and techniques from hands-on examples to extract insights from data | |
CN112394928A (zh) | 一种嵌入式系统中多级菜单构建方法与计算机存储介质 | |
CN112363974B (zh) | 一种可编程状态机的控制方法及系统 | |
CN102810095B (zh) | 一种学词方法和装置 | |
CN111142871A (zh) | 一种前端页面开发系统、方法、设备、介质 | |
CN104516734A (zh) | 业务流程配置方法及装置 | |
CN103186365A (zh) | 一种根据字形轮廓变化生成控制指令的方法及系统 | |
CN114936045B (zh) | Mcal的io驱动模块自动配置方法及系统、存储介质 | |
CN101615082B (zh) | 一种文字输入方法 | |
CN112863278B (zh) | 一种题目条件替换后的解题方法 | |
US7240301B2 (en) | System and method to insert new pages with a schematic capture tool | |
CN101251839A (zh) | 古文字与现代汉字之间的转换方法 | |
CN102369526B (zh) | 信息配置过程中的辅助方法及装置 | |
CN112114812A (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 |