一种基于OOP编程的NVMe模型的制作方法

文档序号:17772129发布日期:2019-05-28 19:33阅读:210来源:国知局
一种基于OOP编程的NVMe模型的制作方法

本发明涉及计算机技术领域,特别涉及一种基于oop编程的nvme模型。



背景技术:

oop(objectorientedprogramming,面向对象的程序设计)是一种面向对象的编程,是当今程序设计比较流行的编程思想。oop编程思想的关键概念在于将数据以及对数据的操作行为集成,作为一个不可分割的整体——对象。而描述相同类型对象的集合即为类,oop编程就是定义这些类。对象之间通过公共接口进行通信,这些接口也可以用类声明,从而完成系统功能。建模是对一个模块设计的功能性描述,主要在于设计的抽象,用于研究这个硬件协议的具体实现方式,以及在系统中进行上下游整体的功能验证。

nvme(non-volatilememoryexpress,非易失性内存主机控制器接口规范)系统中协议的主要实现部分是nvmehost,它完成nvme命令的生成以及与上下层通信的功能,上层是用户层(user),会下发读写命令,下层为控制器(controller),主要解析nvme命令以及完成数据的存储。现有技术中,往往采用verilog语言建立如nvmehost的功能模型(nvmehost模型)的nvme模型,由于verilog语言(一种硬件描述语言)是面向过程的编程设计,注重细节,对于具体的总线接口设计复杂冗余,在系统集成时费时费力,不利于建模设计和nvme模型的使用。

因此,如何能够提供一种基于oop的编程思想的nvme模型,使模型内部的各个功能模块均使用类(class)实现,将复杂的总线接口设计定义成结构体再封装成类,利用信箱完成nvme中的host与user和controller的通信,简化模块和接口的设计,提高建模中接口集成的效率,是现今急需解决的问题。



技术实现要素:

本发明的目的是提供一种基于oop编程的nvme模型,以基于oop的编程思想,利用类简化nvme模型中模块和接口,提高建模中接口集成的效率。

为解决上述技术问题,本发明提供一种基于oop编程的nvme模型,包括:

生成模块,用于生成待发送命令或待发送数据;

封装模块,用于将所述待发送命令或所述待发送数据封装成对应的接口类,并发送到对应的信箱;其中,所述生成模块和所述封装模块均为类。

可选的,所述nvme模型为nvmehost模型时,所述生成模块,包括:

读写命令生成子模块,用于将第一处理子模块发送的读写命令转换为对应的nvme读写命令,并将所述nvme读写命令返回给所述第一处理子模块;其中,所述待发送命令包括所述nvme读写命令;

对应的,所述封装模块,包括:

所述第一处理子模块,用于对用户层发送信箱中的接口类进行解析,获取所述读写命令;将所述读写命令发送到所述读写命令生成子模块,接收返回的所述nvme读写命令,并将所述nvme读写命令封装成对应的接口类发送到控制器接收信箱。

可选的,所述nvme模型为nvmehost模型时,所述生成模块,还包括:

fabric命令生成子模块,用于生成fabric命令;

admin命令生成子模块,用于生成admin命令;所述待发送命令包括所述fabric命令和所述admin命令;

对应的,所述封装模块,包括:

所述第二处理子模块,用于接收所述fabric命令和所述admin命令,并将所述fabric命令和所述admin命令封装成对应的接口类发送到所述控制器接收信箱。

可选的,所述用户层发送信箱中的每个接口类均包括:命令类型、id信息标识、读写地址和写数据。

可选的,所述控制器接收信箱中的每个接口类均包括:id信息标识、自定义命令类型、标准nvme命令和传输数据。

可选的,所述nvme模型为nvmehost模型时,还包括:

解析封装模块,用于对控制器返回的接口类进行解析,得到响应数据和/或响应命令。

可选的,所述解析封装模块还用于将所述响应数据和/或所述响应命令封装成对应的接口类,并发送到用户层接收信箱。

可选的,所述解析封装模块,包括:

数据解析子模块,用于对控制器数据发送信箱中的接口类进行解析,得到所述响应数据,并将所述响应数据放入缓存信箱;

命令解析子模块,用于对控制器命令发送信箱中的接口类进行解析,得到所述响应命令;根据所述响应命令判断是否需要返回到用户层;若是,则将所述响应命令和所述缓存信箱中对应的响应数据封装成对应的接口类,并发送到所述用户层接收信箱。

可选的,所述用户层接收信箱中的每个接口类均包括:命令完成状态、返回id信息、返回读写地址和读数据。

可选的,所述控制器命令发送信箱中的每个接口类均包括:返回id信息、返回命令类型和返回标准nvme命令。

本发明所提供的一种基于oop编程的nvme模型,包括:生成模块,用于生成待发送命令或待发送数据;封装模块,用于将待发送命令或待发送数据封装成对应的接口类,并发送到对应的信箱;其中,生成模块和封装模块均为类;

可见,本发明通过封装模块将生成模块生成的待发送命令或待发送数据封装成对应的接口类,并发送到对应的信箱,采用oop的编程思想,将nvme模型中的功能模块都使用类实现,并将复杂的总线接口定义成结构体,进而封装成类,利用信箱操作实现与上下游的通信,从而使模块间的通信和接口的通信变为类的调用,简化了模块和接口的设计,提高了建模中接口集成的效率。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为本发明实施例所提供的一种基于oop编程的nvme模型的结构框图;

图2为本发明实施例所提供的一种基于oop编程的nvmehost模型的结构框图;

图3为本发明实施例所提供的一种user与host之间的接口类定义的示意图;

图4为本发明实施例所提供的一种host与controller之间的接口类定义的示意图;

图5为图2中nvmehost模型中user与host之间的通信示意图;

图6为图2中nvmehost模型中host与controller之间的通信示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

请参考图1,图1为本发明实施例所提供的一种基于oop编程的nvme模型的结构框图;该nvme模型可以包括:

生成模块100,用于生成待发送命令或待发送数据;

封装模块200,用于将待发送命令或待发送数据封装成对应的接口类,并发送到对应的信箱;其中,生成模块100和封装模块200均为类。

可以理解的是,本实施例的目的利用由opp编程思想中的类实现的功能模块(生成模块100和封装模块200),并将复杂的总线接口定义成结构体,进而封装成类(接口类),利用信箱操作实现与上下游的通信,使nvme模型(如nvmehost模型、nvmeuser模型或nvmecontroller模型)中模块间的通信和接口的通信变为类的调用。对于本实施例所提供的nvme模型的具体编程实现方式,可以由设计人员自行设置,如可以通过systemverilog语言编程,也可以通过其他编程语言进行编程,只要可以实现上述目的,本实施例对此不做任何限制。

需要说明的是,本实施例中的生成模块100的具体结构设置,可以由设计人员根据实用场景何用需求自行设置,如本实施例所提供的nvme模型为nvmehost模型时,由于nvmehost的功能是完成命令的接收、生成以及发送,设计的命令可以主要分为两类:io命令、fabric/admin命令。io命令即是读写,user发送给host,host继而发送给controller;controller完成后返回响应或数据给host,host再将响应命令或响应数据返回给user。fabric/admin命令主要管理功能,由host生成并发送给controller,controller完成后返回响应或数据给host。因此,如图2所示(图2中矩形框表示利用类实现的功能模块,圆形框表示用于通信的信箱),生成模块100可以包括利用类实现的读写命令生成子模块(io_cmd)、fabric命令生成子模块(fabric_cmd)以及admin命令生成子模块(admin_cmd),以完成nvme协议中三种命令(io命令、fabric命令和admin命令)的生成,模块使用类实现,使在其他模块中调用该类可以生成相应的命令,本实施例对此不做任何限制。

对应的,由于读写命令生成子模块生成的nvme协议中的读写命令(nvme读写命令)需要与user发送的读写命令相对应,因此,如图2所示,本实施例中的封装模块200可以包括第一处理子模块(h2c_run),对用户层发送信箱(mailbox_utr)中的接口类进行解析,获取读写命令(io命令);将读写命令发送到读写命令生成子模块(io_cmd),接收返回的nvme读写命令,并将nvme读写命令封装成对应的接口类发送到控制器接收信箱(mailbox_pt0_sq)。即读写命令生成子模块可以用于将第一处理子模块发送的读写命令转换为对应的nvme读写命令,并将nvme读写命令返回给第一处理子模块。也就是说,第一处理子模块可以用于处理user与controller的命令转换,user下发的命令,主要为io(即读和写)命令,第一处理子模块从user接收到命令后,获取主要信息,通过读写命令生成子模块生成nvme读写命令,之后封装成相应的接口类(pto)发送给controller。

具体的,如图2所示,本实施例中的封装模块200还可以包括第二处理子模块(h2c_run),用于接收fabric命令生成子模块(fabric_cmd)生成的fabric命令和admin命令生成子模块(admin_cmd)生成的admin命令,并将fabric命令和生成admin命令封装成对应的接口类发送到控制器接收信箱。也就是说,第二处理子模块可以用于处理host与controller的命令转换,由于nvme协议中有些命令是通过host发送给controller的,例如初始化和管理等,本模块通过fabric命令生成子模块和admin命令生成子模块生成这些nvme命令,封装成相应的接口类(pto)发送给controller。

可以理解的是,本实施例所提供的nvme模型为nvmehost模型时,由于controller在完成host发送的nvme协议中的命令(如nvme读写命令)后,会返回响应命令和/或响应数据对应的接口类,因此,nvmehost模型还可以包括解析封装模块,用于对控制器返回的接口类进行解析,得到响应数据和/或响应命令。进一步的,由于controller返回的响应命令可以指示这一次响应是否完成,若未完成,还需要进一步发送给user。因此,解析封装模块还可以用于将响应数据和/或响应命令封装成对应的接口类,并发送到用户层接收信箱。

对应的,如图2所示,解析封装模块可以包括数据解析子模块(recv_pt0),用于对控制器数据发送信箱(mailbox_pt0_rsp)中的接口类(pt0)进行解析,得到响应数据,并将响应数据放入缓存信箱(pt0_1);命令解析子模块(recv_pt1),用于对控制器命令发送信箱(mailbox_pt1_cq)中的接口类(pt1)进行解析,得到响应命令;根据响应命令判断是否需要返回到用户层;若是,则将响应命令和缓存信箱中对应的响应数据封装成对应的接口类,并发送到用户层接收信箱(mailbox_urx)。也就是说,数据解析子模块可以用于接收controller的响应数据,从controller接收其响应数据并放入缓存信箱中;命令解析子模块可以用于接收controller的响应命令,由于controller返回的响应命令指示这一次响应是否完成,命令解析子模块可以接收该响应命令并判断,决定本次传输完成或者是需要进一步发送给user;缓存信箱可以为host内部的信箱,由于controller的响应数据和响应完成命令是分开返回的,因此可以在host内部单独设置一个信箱(缓存信箱)用于存放返回的响应数据。

需要说明的是,上述用户层发送信箱和用户层接收信箱可以为user与host之间的信箱;这些信箱中存放的是user与host的接口类,user发送到host或host发送给user均需通过这两个信箱传输。上述控制器接收信箱、控制器数据发送信箱和控制器命令发送信箱可以为host与controller之间的信箱;这些信箱中存放的是host与controller之间定义的接口类,host发送到controller或controller返回给host均需通过这些信箱传输。具体的,对于本实施例中的各种信箱的具体设置位置,可以由设计人员自行设置,如图2所示,缓存信箱(pt0_1)可以设置在host内部,用户层发送信箱(mailbox_utr)和用户层接收信箱(mailbox_urx)可以设置在user内部,控制器接收信箱(mailbox_pt0_sq)、控制器数据发送信箱(mailbox_pt0_rsp)和控制器命令发送信箱(mailbox_pt1_cq)可以设置在controller内部;也可以将全部信箱均设置在host内部,只要每个信箱可以实现上述功能,本实施例对此不做任何限制。

对应的,对于本实例中的各种信箱中的接口类的具体定义设置,可以由设计人员自行设置,如图3所示的user与host的接口类定义,由于user与host之间只涉及读写命令,因此,用户层发送信箱(mailbox_utr)中user发送到host的接口类(utr)可以包括命令类型(cmd),为读或写;id信息标识(cmd_id);读写地址(addr);写数据(data)。用户层接收信箱(mailbox_urx)中host发送到user的接口类(urx)可以包括命令完成状态(status),成功或失败;返回id信息(cmd_id);返回读写地址(addr);读数据(data)。如图4所示的host与controller的接口类定义,控制器接收信箱(mailbox_pt0_sq)和控制器数据发送信箱(mailbox_pt0_rsp)中的host发送到controller或者controller返回给host的接口类(pt0)可以包括id信息标识(cmd_id);自定义命令类型(cmd_type),所有命令统一编码;标准nvme命令(nvme_cmd);传输数据(data)。控制器命令发送信箱(mailbox_pt1_cq)中controller返回给host的接口类(pt1)可以包括返回id信息(cmd_id);返回命令类型(cmd_type);返回标准nvme命令(nvme_cmd)。本实施例对此不做任何限制。

以图2所示的nvmehost模型为例,user与host通过信箱的通信可以如图5所示。当user发起一个读或写命令时,这个命令信息包含在接口类utr中,将这个接口类utr放入信箱mailbox_utr中,host将从信箱中获取这个接口类utr并解析,进一步获取这个命令;当这个命令完成时,完成的响应或数据信息包含在接口类urx中,host将这个接口类urx放入信箱mailbox_urx中,user从信箱中获取这个接口类urx,进一步获取完成信息。

以图2所示的nvmehost模型为例,host与controller通过信箱的通信可以如图6所示。当host发送一个命令到controller时,这个命令信息封装成接口类pt0,将这个接口类pt0放入信箱mailbox_pt0_sq中,controller将从信箱中获取这个接口类pt0解析并采取操作;当这个命令完成时,controller将返回响应数据或响应命令给host,响应数据信息封装成接口类pt0并放入信箱mailbox_pt0_rsp,host接收后再放入信箱pt0_1等待进一步处理,响应命令信息封装成接口类pt1并放入信箱mailbox_pt1_cq,host接收这个接口类pt1进一步处理。

具体的,下面分别以一个读命令和一个admin命令的操作为例来介绍图2所示的nvmehost模型的处理流程。

user发起一个读命令,生成一个接口类utr放入信箱mailbox_utr。nvmehost模型中的u2c_run从该信箱中接收这个接口类并解析,获取有效命令信息后调用io_cmd生成标准的nvme读命令。u2c_run将这个nvme读命令封装成接口类pt0放入信箱mailbox_pt0_sq中,controller将从该信箱中获取这个接口类解析出是一个读命令,读出相应地址的响应数据并封装成接口类pt0放入信箱mailbox_pt0_rsp,然后controller生成响应命令并封装成接口类pt1放入信箱mailbox_pt1_cq。nvmehost模型中的recv_pt0从mailbox_pt0_rsp中获取响应数据pt0,解析出具体数据后放入信箱pt0_1中;nvmehost模型中的recv_pt1从mailbox_pt1_cq中获取响应命令pt1,解析出是一个读命令,再从pt0_1中取出数据,将响应命令及数据封装成一个接口类urx,放入信箱mailbox_urx。user从mailbox_urx取出这个接口类urx,解析获取了响应数据和读响应信息,至此一个读命令完成。

nvmehost模型发起一个admin命令,h2c_run调用admin_cmd生成nvme协议中的admin命令,将这个命令信息封装成一个接口类pt0放入信箱mailbox_pt0_sq。controller从该信箱中获取这个接口类pt0并解析出是一个admin命令,采取对应的操作,如果这个命令需要返回响应数据,controller将响应数据封装成接口类pt0放入信箱mailbox_pt0_rsp,nvmehost模型中的recv_pt0获取这个接口类pt0并解析出具体数据放入信箱pt0_1,然后controller将响应命令封装成接口类pt1放入信箱mailbox_pt1_cq,nvmehost模型中的recv_pt1获取这个接口类pt1,解析后再从pt0_1中取得响应数据,至此一个admin命令完成;如果这个命令不需要返回数据,controller将只返回响应命令,将响应命令封装成接口类pt1放入信箱mailbox_pt1_cq,nvmehost模型中的recv_pt1获取这个接口类pt1,至此一个admin命令完成。

对应的,上述是以本实施例中nvme模型为nvmehost模型为例进行的具体展示,对于nvme模型为nvmeuser模型和nvmecontroller模型的情况,可以与采用nvmehost模型相对应的方式进行设置,本实施例对此不做任何限制。

本实施例中,本发明实施例通过封装模块200将生成模块100生成的待发送命令或待发送数据封装成对应的接口类,并发送到对应的信箱,采用oop的编程思想,将nvme模型中的功能模块都使用类实现,并将复杂的总线接口定义成结构体,进而封装成类,利用信箱操作实现与上下游的通信,从而使模块间的通信和接口的通信变为类的调用,简化了模块和接口的设计,提高了建模中接口集成的效率。

以上对本发明所提供的一种基于oop编程的nvme模型进行了详细介绍。本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1