1.本发明涉及数字芯片设计技术领域,特别涉及一种寄存器间接访问的验证模型实现框架。
背景技术:2.在数字芯片设计中常常需要实现寄存器间接访问(register indirect access)的逻辑,我们可以对其工作原理及过程进行抽象,如图1所示,索引者:用来提供索引位置(index);被索引者:根据索引者提供的索引位置找到的被索引的存储单元。协调者:即通常所说的间接访问的寄存器,用来协调上面两者进行工作,即对协调者进行读写,然后最终协调者会去对被索引的存储单元进行读写操作;首先我们对索引者提供的索引位置进行设置,从而标识被索引者的位置,然后发起对协调者的读写操作,此时相当于通过之前设置的位置索引来间接的完成对最终的被索引者的读写访问操作。
3.通常我们会基于uvm(universal verification methodology)方法学来搭建验证平台,其提供了寄存器模型的一些类库文件供验证开发人员来对dut(device under test)中的寄存器进行建模。对于这种寄存器间接访问的行为,uvm针对性的提供了寄存器类uvm_reg_indirect_data作为协调者以供验证开发人员来使用建模,但是索引者和被索引者必须都是寄存器类型,验证人员通过对寄存器uvm_reg_indirect_data进行派生从而创建协调者,然后调用其configure配置方法,从而设置需要协调链接的索引者(寄存器idx)和被索引者(寄存器数组reg_a),对寄存器idx进行写操作以设置索引值,并对寄存器uvm_reg_indirect_data进行读写从而最终实现使用寄存器idx的数值作为索引来对被索引的寄存器数组reg_a中的某个目标单元寄存器进行读写访问操作。
4.采用上述uvm提供的现有方案在一般的情况下是可行的,但这会有一个限制,即索引者和被索引者必须都是寄存器的数据类型。也就是说,uvm并没有给用户提供一个灵活的寄存器间接访问实现方式,即由用户去定义使用什么来作为索引者以及使用什么来作为被索引者,而实际的芯片项目中这种间接访问的场景千变万化,索引者和被索引者往往不一定是某个寄存器,其可能是寄存器中的某个域段,也可能是多个寄存器域段的组合,还可能是存储,甚至可能是直接的线网,这个时候现有方案就不再可行,也就导致了验证开发人员需要重新对这种间接寄存器访问行为进行建模实现,存在重复性的工作。
[0005]
技术实现要素:[0006]
根据本发明实施例,提供了一种寄存器间接访问的验证模型实现框架,包含如下步骤:搭建uvm验证平台,并对uvm验证平台的寄存器进行建模,获得寄存器模型;在uvm验证平台中创建索引者与被索引者,索引者获取索引位置,被索引者获取被索引的存储单元;
在uvm验证平台中创建索引链接者,用于将索引映射到具体的硬件;在uvm验证平台中创建被索引链接者,用于将被索引者映射到具体的硬件;在uvm验证平台中创建协调者,用于封装索引链接者与被索引链接者;在uvm验证平台中创建前门访问序列,并在前门访问序列中创建配置方法configure与序列执行任务body,用于完成对寄存器的间接访问的过程的转换;寄存器模型对索引者与协调者进行读写操作,用于实现对寄存器的间接访问。
[0007]
进一步,协调者派生于寄存器类uvm_reg。
[0008]
进一步,在uvm验证平台中创建索引链接者,用于将索引映射到具体的硬件,包含如下子步骤:在uvm验证平台中创建参数化的抽象类index_worker并在抽象类index_worker中创建get_index方法与set_index方法,get_index方法用于获取索引值,set_index方法用于设定索引值;继承抽象类index_worker并对抽象类index_worker进行派生,获得派生子类my_index_worker;定义具体硬件的变量类型;创建set方法将索引映射到具体的硬件,并编写实现get_index方法与set_index方法。
[0009]
进一步,抽象类index_worker的索引值的数据类型默认为无符号整型。
[0010]
进一步,在uvm验证平台中创建被索引链接者,用于将被索引者映射到具体的硬件,包含如下子步骤:在uvm验证平台中创建参数化的抽象类indexed_worker;将被索引的存储单元声明为索引队列,并在索引队列中创建get_object_entry方法与get_index_of_entry方法,get_object_entry方法用于获取目标被索引的存储单元的,get_index_of_entry方法用于获取存储单元的索引队列位置;继承并派生抽象类indexed_worker,获得派生子类my_indexed_worker;创建set方法将索引的存储单元映射到具体的硬件,并编写实现get_object_entry方法与get_index_of_entry方法。
[0011]
进一步,抽象类indexed_worker的索引值的数据类型为默认为无符号整型,抽象类indexed_worker的被索引对象的数据类型为默认寄存器类型,抽象类indexed_worker的子类可通过传入不同的参数设定为其他数据类型。
[0012]
进一步,前门访问序列派生于父类uvm_reg_frontdoor,父类uvm_reg_frontdoor用于提供对寄存器和存储的自定义前门访问。
[0013]
进一步,寄存器模型对索引者与协调者进行读写操作,用于实现对寄存器的间接访问,包含如下子步骤:声明例化索引链接者、被索引链接者、索引者、被索引者、协调者与前门访问序列;调用索引链接者set方法设置索引;调用被索引链接者的set方法设置被索引的存储单元;调用协调者,间接访问寄存器的set_index_worker方法与set_indexed_worker方法,设置索引链接者与被索引链接者;
遍历被索引者的存储单元,并调用配置方法configure与uvm验证平台的set_frontdoor方法配置前门访问序列,用于完成寄存器间接访问过程的序列转换。
[0014]
根据本发明实施例的寄存器间接访问的验证模型实现框架,避免了现有技术中存在的寄存器间接访问的应用场景限制,即索引者和被索引者必须是寄存器类型的限制,提供了对于寄存器间接访问的验证模型实现框架,方便验证开发人员参照进行开发,提升了验证人员的开发效率。
[0015]
要理解的是,前面的一般描述和下面的详细描述两者都是示例性的,并且意图在于提供要求保护的技术的进一步说明。
[0016]
附图说明
[0017]
图1为现有技术的结构示意图;图2为根据本发明实施例寄存器间接访问的验证模型实现框架的结构示意图;图3为根据本发明实施例寄存器间接访问的验证模型实现框架的原理图;图4为根据本发明实施例寄存器间接访问的验证模型实现框架的步骤流程图;图5为图4的步骤s3的子步骤的流程图;图6为图4的步骤s4的子步骤的流程图;图7为图4的步骤s7的子步骤的流程图。
[0018]
具体实施方式
[0019]
以下将结合附图,详细描述本发明的优选实施例,对本发明做进一步阐述。
[0020]
首先,将结合图2~7描述根据本发明实施例的寄存器间接访问的验证模型实现框架,用于访问芯片,其应用场景广阔。
[0021]
如图2~7所示,本发明实施例的寄存器间接访问的验证模型实现框架,包含如下步骤:在s1中,如图2~4所示,搭建uvm验证平台,并对uvm验证平台的寄存器进行建模,获得寄存器模型。
[0022]
在s2中,如图2~4所示,在uvm验证平台中创建索引者与被索引者,索引者获取索引位置,被索引者获取被索引的存储单元。
[0023]
在s3中,如图2~4所示,在uvm验证平台中创建索引链接者,用于将索引映射到具体的硬件。
[0024]
在s4中,如图2~4所示,在uvm验证平台中创建被索引链接者,用于将被索引者映射到具体的硬件。
[0025]
在s5中,如图2~4所示,在uvm验证平台中创建协调者,用于封装索引链接者与被索引链接者。
[0026]
在s6中,如图2~4所示,在uvm验证平台中创建前门访问序列,并在前门访问序列中创建配置方法configure与序列执行任务body,用于完成对寄存器的间接访问的过程的转换,配置方法configure用于将传递数据的寄存器,即之前的协调者,以及索引链接者,被索
引链接者还有被索引的存储单元设置传递给本地的成员变量;序列执行任务body主要用于完成寄存器间接访问的过程转换,大致过程为先将最终要访问的被索引存储单元写入队列,然后调用被索引链接者的get_index_of_entry方法来获取该被索引存储单元的索引位置,接着调用索引链接者的set_index方法来设置要寄存器间接访问的存储队列的索引位置,以上都设置完毕之后,最后根据寄存器间接访问的读写操作类型来调用协调者,也即间接访问寄存器的寄存器读写访问方法来完成整个间接访问的过程转换,相当于完成了对原本dut中实现的寄存器间接访问过程的建模。
[0027]
在s7中,如图2~4所示,寄存器模型对索引者与协调者进行读写操作,用于实现对寄存器的间接访问。
[0028]
进一步,协调者派生于寄存器类uvm_reg。
[0029]
进一步,在uvm验证平台中创建索引链接者,用于将索引映射到具体的硬件,包含如下子步骤:在s31中,如图2~3、5所示,在uvm验证平台中创建参数化的抽象类index_worker并在抽象类index_worker中创建get_index方法与set_index方法,get_index方法用于获取索引值,set_index方法用于设定索引值。
[0030]
在s32中,如图2~3、5所示,继承抽象类index_worker并对抽象类index_worker进行派生,获得派生子类my_index_worker,比如对于将索引映射为某个寄存器的域段的情况来说,可以调用寄存器模型的get_mirrored_value()方法来获取该域段的值,即获取到索引值,而对于设定索引值,即相当于写该寄存器域段的值,那么调用write方法即可完成对索引值的设置。
[0031]
在s33中,如图2~3、5所示,定义具体硬件的变量类型。
[0032]
在s34中,如图2~3、5所示,创建set方法将索引映射到具体的硬件,并编写实现get_index方法与set_index方法。
[0033]
进一步,抽象类index_worker的索引值的数据类型默认为无符号整型。
[0034]
进一步,在uvm验证平台中创建被索引链接者,用于将被索引者映射到具体的硬件,包含如下子步骤:在s41中,如图2~3、6所示,在uvm验证平台中创建参数化的抽象类indexed_worker。
[0035]
在s42中,如图2~3、6所示,将被索引的存储单元声明为索引队列,并在索引队列中创建get_object_entry方法与get_index_of_entry方法,get_object_entry方法用于获取目标被索引的存储单元的,get_index_of_entry方法用于获取存储单元的索引队列位置,get_object_entry方法与get_index_of_entry方法由其派生子类进行实现,即由验证开发人员根据项目的实际情况进行编写实现。
[0036]
在s43中,如图2~3、6所示,继承并派生抽象类indexed_worker,获得派生子类my_indexed_worker。
[0037]
在s44中,如图2~3、6所示,创建set方法将索引的存储单元映射到具体的硬件,并编写实现get_object_entry方法与get_index_of_entry方法,类似的,首先新增set方法来将被索对象,即被索引的存储单元引映射到具体的硬件,并且需要根据项目的实际情况编写实现get_object_entry和get_index_of_entry方法以分别用于获取目标被索引的存储
单元和获取目标被索引的存储单元的索引队列位置,该过程可以通过数组队列方法来实现,比如对于将被索引的存储单元映射为某个存储的情况来说,可以通过输入的index数值作为索引,来索引数组storage中的元素,然后将其赋值给声明的空间大小为1的队列并返回,即可得到目标被索引的存储单元,而对于获取目标被索引的存储单元的索引队列位置,则可以通过调用数组队列方法find_first_index,根据元素的item内容,即输入的存储单元来找到其对应到被索引存储单元的索引位置。
[0038]
进一步,抽象类indexed_worker的索引值的数据类型默认为无符号整型,抽象类indexed_worker的被索引对象的数据类型默认为寄存器类型,抽象类indexed_worker的子类可通过传入不同的参数设定为其他数据类型。
[0039]
进一步,前门访问序列派生于父类uvm_reg_frontdoor,父类uvm_reg_frontdoor用于提供对寄存器和存储的自定义前门访问。
[0040]
进一步,寄存器模型对索引者与协调者进行读写操作,用于实现对寄存器的间接访问,包含如下子步骤:在s71中,如图2~3、7所示,声明例化索引链接者、被索引链接者、索引者、被索引者、协调者与前门访问序列。
[0041]
在s72中,如图2~3、7所示,调用索引链接者set方法设置索引。
[0042]
在s73中,如图2~3、7所示,调用被索引链接者的set方法设置被索引的存储单元。
[0043]
在s74中,如图2~3、7所示,调用协调者,间接访问寄存器的set_index_worker方法与set_indexed_worker方法,设置索引链接者与被索引链接者。
[0044]
在s75中,如图2~3、7所示,遍历被索引者的存储单元,并调用配置方法configure与uvm验证平台的set_frontdoor方法配置前门访问序列,用于完成寄存器间接访问过程的序列转换,最终即可实现直接对被索引的存储单元进行读写,从而通过自定义的前门访问序列自动发起如下的操作:即先调用寄存器模型的寄存器读写访问方法,对索引寄存器中提供索引值的域段进行写操作,从而确定要对被索引的存储数组队列中的哪个位置单元进行间接的读写访问操作,然后调用协调者,即间接访问寄存器的读写访问方法来完成对被索引的存储单元的间接读写访问操作,当然也可以直接使用间接访问的这种方式来发起对目标。
[0045]
如图3所示,我们调用寄存器模型的接口方法来发起对目标寄存器或存储的一次读写访问操作会被转换成一个通用的寄存器事务请求类型,包括读写访问类型,访问地址,访问数据以及读写访问操作的状态信息,该通用的寄存器事务请求类型的数据信息会被适配器(adapter)转换为寄存器总线上的事务类型的请求数据,然后该总线事务类型的请求数据会被相应的代理(agent)处理并驱动到dut的接口上,从而完成对该目标寄存器或存储的一次读写访问。可以看到图上既可以通过调用寄存器模型的接口方法来直接发起对寄存器或存储的读写访问操作,又可以直接在对应的寄存器总线代理上启动寄存器或存储的读写访问序列从而完成对寄存器或存储的读写访问操作。采用自定义的寄存器访问序列应对特殊的寄存器访问场景,即通过自定义的寄存器访问序列来构造任意复杂的寄存器访问行为,最终实现直接对被索引的存储单元的读写操作,即在自定义的前门访问序列里相当于实现了先对提供索引的具体硬件进行设置,即给定一个要访问的索引值,然后对协调者,即间接访问寄存器进行读写,从而最终完成对被索引的存储单元目标的读写访问操作。
[0046]
以上,参照图2~7描述了根据本发明实施例的寄存器间接访问的验证模型实现框架,避免了现有技术中存在的寄存器间接访问的应用场景限制,即索引者和被索引者必须是寄存器类型的限制,提供了对于寄存器间接访问的验证模型实现框架,方便验证开发人员参照进行开发,提升了验证人员的开发效率。
[0047]
需要说明的是,在本说明书中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包含
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0048]
尽管本发明的内容已经通过上述优选实施例作了详细介绍,但应当认识到上述的描述不应被认为是对本发明的限制。在本领域技术人员阅读了上述内容后,对于本发明的多种修改和替代都将是显而易见的。因此,本发明的保护范围应由所附的权利要求来限定。