一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种指令集覆盖率测试方法及装置与流程

2022-03-26 02:37:11 来源:中国专利 TAG:


1.本发明涉及计算机技术领域,尤其涉及一种指令集覆盖率测试方法及装置。


背景技术:

2.risc-v(发音为“risk-five”)是基于精简指令集计算(risc)原理建立的开放指令集架构(isa),v表示为第五代risc(精简指令集计算机),表示此前已经四代risc处理器原型芯片。risc-v cpu技术作为一种开源新型指令集架构技术目前在业界较为流行。risc-v cpu的功能正确性极大程度上依赖risc-v cpu原型设计时的指令集覆盖率测试。risc-v cpu开源指令集技术,需要确保risc-v cpu的指令验证覆盖率,从而确保risc-v cpu的稳定性。
3.现有技术可以借助risc-v cpu扩展指令集测试源码覆盖率,如,测试源码中某一个逻辑功能分支是否有执行到,现有技术只针对risc-v cpu自定义扩展指令集,覆盖范围窄。且无法对risc-v cpu的具体指令集的执行情况进行测试统计,也不是针对risc-v cpu指令对应的二进制编码risc-v cpu指令的覆盖率。现有技术是面向risc-v cpu源码级别,通过指令插桩tout来实现。这就要求,必须要对risc-v cpu指令源码进行tout指令插桩处理,导致源码本身需要修改。该在源码中何处添加这条tout指令插桩处理比较合理,现有技术并没有给出合理判断。且源码逻辑功能越多,插桩就越多,会对源码执行性能造成影响,甚至有可能会影响源码功能本身。现有技术的通过插桩来测试覆盖率,因为严重依赖risc-v cpu扩展指令,故只能局限于risc-v cpu架构。如其他cpu架构出现根本不允许扩展指令集的情况,指令插桩tout便无法实现。
4.故需要一种涵盖范围更广,无需插桩,灵活性更高,既能用于验证risc-v cpu指令集高覆盖率,也能用于其他cpu架构的覆盖率测试方法。


技术实现要素:

5.基于此,有必要提供一种指令集覆盖率测试方法。
6.一种指令集覆盖率测试方法,包括以下步骤:
7.在处理器执行代码时,读取所述处理器的译码器,获取所述处理器执行的指令;
8.解析所述指令获得指令操作码;
9.根据预设映射关系,获取与所述指令操作码对应的统计存储单元的存储地址,其中,所述预设映射关系为各所述指令操作码与所述统计存储单元的各存储地址的对应关系;
10.对所述存储地址中的第一预设字段的值改写为第一预设值。
11.在本发明的实施例中,
12.所述对所述存储地址中的第一预设字段的值改写为第一预设值的步骤之后还包括:
13.当所述处理器的所述代码执行完成后,检测各所述存储地址的所述第一预设字段
的值是否被改写为所述第一预设值;
14.根据对各所述存储地址的所述第一预设字段的值是否被改写的检测结果,以及所述预设映射关系,统计被执行的各指令。
15.在本发明的实施例中,
16.所述根据对各所述存储地址的所述第一预设字段的值是否被改写的检测结果,以及所述预设映射关系,统计被执行的各指令的步骤包括:
17.当所述存储地址的所述第一预设字段的值被改写为所述第一预设值时,根据所述映射关系,确定所述存储地址对应的指令为被执行指令;
18.根据被执行的指令的数量和指令集内的所有指令的数量,计算出指令覆盖率。
19.在本发明的实施例中,
20.所述根据预设映射关系,获取与所述指令操作码对应的统计存储单元的存储地址的步骤之后还包括:
21.对所述存储地址中的第二预设字段的值进行一次加值操作,其中,所述加值操作为在所述第二预设字段当前的值加上第二预设值。
22.在本发明的实施例中,还包括:
23.读取所述处理器的寄存器,获取所述处理器执行的指令的指令地址;
24.所述根据预设映射关系,获取与所述指令操作码对应的统计存储单元的存储地址的步骤之后还包括:
25.将所述指令地址写入至所述统计存储单元的所述存储地址中的第三预设字段。
26.本发明提供了一种指令集覆盖率测试装置,包括指令识别单元和统计存储单元:
27.所述指令识别单元用于在处理器执行代码时,读取所述处理器的译码器,获取所述处理器执行的指令;解析所述指令获得指令操作码;根据预设映射关系,获取与所述指令操作码对应的统计存储单元的存储地址,其中,所述预设映射关系为各所述指令操作码与所述统计存储单元的各所述存储地址的对应关系;对所述存储地址中的第一预设字段的值改写为第一预设值。
28.所述统计存储单元用于根据所述指令识别单元的改写操作,将在所述预设映射关系中与所述指令操作码对应的所述存储地址的所述第一预设字段的值改写为所述第一预设值。
29.在本发明的实施例中,
30.所述指令识别单元包括指令识别模块、指令映射模块和记录模块,其中,
31.所述指令识别模块用于在处理器执行代码时,读取所述处理器的译码器,获取所述处理器执行的指令;解析所述指令获得指令操作码;根据预设映射关系,获取与所述指令操作码对应的统计存储单元的存储地址;对所述存储地址中的第一预设字段的值改写为第一预设值;以及用于将指令地址写入至所述统计存储单元的所述存储地址中的第三预设字段;
32.所述指令映射模块用于构建所述预设映射关系,其中,所述预设映射关系为各指令操作码与所述统计存储单元的各所述存储地址的对应关系;
33.所述记录模块用于读取所述处理器的寄存器,获取所述处理器执行的指令的所述指令地址。
34.在本发明的实施例中,
35.所述统计存储单元还用于当所述处理器的所述代码执行完成后,检测各所述存储地址的所述第一预设字段的值是否被改写为所述第一预设值;用于根据对各所述存储地址的所述第一预设字段的值是否被改写的检测结果,以及所述预设映射关系,统计被执行的各指令;用于当所述存储地址的所述第一预设字段的值被改写为所述第一预设值时,根据所述映射关系,确定所述存储地址对应的指令为被执行的指令;以及用于根据被执行的指令的数量和指令集内的所有指令的数量,计算出指令覆盖率。
36.在本发明的实施例中,
37.所述统计存储单元还用于对所述存储地址中的第二预设字段的值进行一次加值操作,其中,所述加值操作为在所述第二预设字段当前的值加上第二预设值;以及用于将所述指令地址写入至所述统计存储单元的所述存储地址中的第三预设字段。
38.在本发明的实施例中,
39.所述指令集覆盖率测试装置为处理器,所述指令识别单元和所述统计存储单元内嵌于所述处理器内。
40.与现有技术相比,本发明的一个或多个实施例可以具有如下优点:
41.本发明提供了一种指令集覆盖率测试的方法,通过解析处理器执行的指令获得指令操作码,并把各指令操作码对应的存储地址中预设字段改写为预设值,再根据预设字段是否被改写统计执行的指令及指令集的指令,从而得到指令集覆盖率。本发明的方法克服了现有插桩技术只适合于risv-v cpu的扩展指令的缺点,适合risv-v cpu架构的所有指令集,且无需插桩,灵活性更高。
42.本发明的其它特征和优点将在随后的说明书中阐述,并且部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。
附图说明
43.附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例共同用于解释本发明,并不构成对本发明的限制。在附图中:
44.图1是本发明一实施例的指令集覆盖率测试方法的流程示意图;
45.图2是本发明另一实施例的risc-v cpu功能单元构成示意图;
46.图3是本发明另一实施例的risc-v cpu的指令识别单元功能模块构成示意图;
47.图4是本发明另一实施例的risc-v cpu的统计存储单元功能结构示意图;
48.图5是本发明另一实施例的指令识别单元中指令映射模块功能示意图;
49.图6是本发明另一实施例的risc-v cpu中指令识别单元和统计存储单元交互功能示意图。
具体实施方式
50.为使本发明的目的、技术方案和优点更加清楚,以下结合附图对本发明作进一步地详细说明,借此对本发明如何应用技术手段来解决技术问题,并达成技术效果的实现过程能充分理解并据以实施。需要说明的是,只要不构成冲突,本发明中的各个实施例以及各
实施例中的各个特征可以相互结合,所形成的技术方案均在本发明的保护范围之内。
51.第一实施例
52.图1是本实施例的指令集覆盖率测试方法的流程示意图;
53.图2是本实施例的risc-v cpu功能单元构成示意图;
54.图3是本实施例的risc-v cpu的指令识别单元功能模块构成示意图;
55.图4是本实施例的risc-v cpu的统计存储单元功能结构示意图;
56.图5是本实施例的指令识别单元中指令映射模块功能示意图;
57.图6是本实施例的risc-v cpu中指令识别单元和统计存储单元交互功能示意图。
58.在高安全、高可靠性领域,都有对应的标准要求源码覆盖率测试达到某个比例,从而确保系统的安全性。本实施例提供了一种指令集覆盖率测试方法,包括以下步骤:
59.在处理器执行代码时,读取处理器的译码器,获取处理器执行的指令;
60.解析指令获得指令操作码;
61.根据预设映射关系,获取与指令操作码对应的统计存储单元的存储地址,其中,预设映射关系为各指令操作码与统计存储单元的各存储地址的对应关系;
62.对存储地址中的第一预设字段的值改写为第一预设值。
63.如图3所示,传统的risc-v处理器由risc-v取指器、译码器、执行器及通用寄存器几大模块构成;取指器、译码器、执行器是risc-v处理器的重要单元,负责risc-v处理器的指令取指、译码、执行;指令存储区用于存放risc-v处理器所需执行代码,数据存储区用于存放risc-v处理器执行代码时用到的交互数据。在本实施例中,在传统的risc-v处理器中另外设置了指令识别单元(rv-iru)和统计存储单元(rv-ecm),其中指令识别单元包括指令识别模块、指令映射模块和记录模块,统计存储单元包括很多的存储地址,在本实施例中,存储地址也称为内存线。
64.一种指令集覆盖率测试方法,具体包括以下步骤:
65.s100,在处理器执行代码时,读取处理器的译码器,获取处理器执行的指令。
66.本实施例中,在risc-v处理器执行代码时,指令识别单元时刻监测risc-v译码器,从而捕获处理器的具体指令的执行情况,捕获到有指令被执行后,指令识别单元读取处理器的译码器,获取处理器执行的指令信息。
67.s110,解析指令获得指令操作码。
68.在本实施例中,由于对于每一条32bit的risc-v处理器指令,其中bit[0~6]位为此指令的操作码,且每一条指令具备唯一操作码,如lw,sw指令的指令码各不相同。
[0069]
risc-v处理器的译码器的功能是翻译、识别具体某一条二进制指令的操作码,即识别32bit指令中的bit[6~0],在本实施例中,指令识别单元再读取risc-v处理器的译码器识别出的指令操作码。故获得处理器执行的指令信息后,透过译码器解析此指令,从而获得该指令的指令操作码。由于每条指令拥有唯一的操作码,故通过操作码指令识别单元可以解析risc-v处理器当前执行的指令的具体名称,比如add,或lw,或sw指令。
[0070]
s120,根据预设映射关系,获取与指令操作码对应的统计存储单元的存储地址,其中,预设映射关系为各指令操作码与统计存储单元的各存储地址的对应关系。
[0071]
在本实施例中,由于指令操作码为每个指令所独有,可以视为指令映射中的唯一标识符,每个指令操作码与每一个统计存储单元的存储地址存在一一对应的关系,建立了
映射关系,根据预设映射关系,指令识别单元中的指令映射模块可以获取与指令操作码对应的统计存储单元的存储地址。指令映射关系不做具体规定,只要能确保每一个统计存储单元的存储地址与具体的指令存在一一对应关系即可。
[0072]
其中,统计存储单元中存储地址数量等于risc-v处理器支持的各指令集指令总数,比如只支持rv-i,rv-m指令集的存储地址数量少于支持rv-i,rv-m,rv-f指令集的存储地址数量数目,但是,当risc-v处理器支持的指令集确定后,那么存储地址数量也就随之确定了。
[0073]
s130,对存储地址中的第一预设字段的值改写为第一预设值。
[0074]
在本实施例中,统计存储单元中存储地址也称为内存线(memory line),本步骤的存储地址采用内存线来说明,每条内存线由8个双字节数据位(dword)组成,每个双字节数据位由4个字节(byte)组成,正常情况下单字节数据位为2个字节组成,比如1个汉字为2个字节,每个字节又是8位,故一个双字节数据位就是32位。所有内存线的内容会在risc处理器译码第一条指令前,由指令识别单元先进行清零。每条内存线中,双字节第1数据位为第一预设字段,设置为存储指令命中(hit,即指令被执行)情况。一旦有指令被命中,则双字节数据位第一预设字段改写为第一预设值,在本实施例中,则被记录0x49484954,为ascii码中ihit 4个字母对应的十六进制数字组合,即0x49,0x48,0x49,0x54的组合,ihit意为instrution hit,指令命中,且双字节数据位第一预设字段中每一位(bit)只能由0变为ascii码4个字母ihit对应的二进制数字,对于十六进制数字来说,即要么为0x49484954,要么为0x00000000。
[0075]
根据预设映射关系,获取与指令操作码对应的统计存储单元的存储地址(也称为内存线)的步骤之后还包括:对存储地址(也称为内存线)中的第二预设字段的值进行一次加值操作,其中,加值操作为在第二预设字段当前的值加上第二预设值。
[0076]
具体地,在本实施例中,统计存储单元中内存线的双字节第2和第3数据位设为第二预设字段,共有64位,第二预设字段的范围可达0~2
64-1,第二预设字段设置为用于累加记录某条指令命中次数。根据预设映射关系,指令识别单元获取与指令操作码对应的统计存储单元的存储地址之后,每当相同的指令被执行一次,则统计存储单元中内存线的第二预设字段的值进行加值操作,其中加值操作为在第二预设字段当前的值上加上第二预设值,第二预设值在本实施例中设置为1,通过第二预设字段的值,可以获取某条指令被执行的次数。
[0077]
进一步的,在本实施例中还读取处理器的寄存器,获取处理器执行的指令的指令地址。根据预设映射关系,获取与指令操作码对应的统计存储单元的存储地址(也称为内存线)的步骤之后还包括:将指令地址写入至统计存储单元的存储地址(也称为内存线)中的第三预设字段。
[0078]
具体地,指令识别单元中记录模块监测risc-v通用寄存器中的内容,从而读取处理器的寄存器,辨识出当前被执行的指令处于risc-v处理器中具体存储空间中的具体地址,记录模块则从寄存器中获取到处理器执行的指令的指令地址。
[0079]
在本实施例中,统计存储单元中内存线的双字节第4至第8数据位设为第三预设字段。根据预设映射关系,指令识别单元获取与指令操作码对应的统计存储单元的存储地址(也称为内存线)的之后,指令识别单元中的指令识别模块把从记录模块获得的当前处理器
执行的指令的指令地址写入至该指令对应的内存线的第三预设字段中,第三预设字段的这5个数据位用于依次记录当前指令最近5次运行时所在的地址,即当双字节第4至第8数据位被写满后,又从双字节第4至第8数据位依次记录。
[0080]
s140,当处理器的代码执行完成后,检测各存储地址的第一预设字段的值是否被改写为第一预设值。
[0081]
在本实施例中,正常情况下由测试人员来控制处理器代码执行完成情况。如,可以通过调试工具让risc-v处理器开始执行,也可以通过调试工具让risc-v处理器停止执行,还可以在验证代码中加入一条ebreak指令,当处理器执行ebreak时,即可认为risc-v处理器停止执行,方法上不做限制。当指令集中的所有指令停止执行时,则认为risc-v处理器代码执行完成,统计存储单元或专用工具或人工检测各存储地址的第一预设字段的值是否被改写为第一预设值,在本实施例中,第一预设值优选为0x49484954,或者第一预设字段的值没有被改写仍然为0x00000000。
[0082]
s150,根据对各存储地址的第一预设字段的值是否被改写的检测结果,以及预设映射关系,统计被执行的各指令。
[0083]
根据上一个步骤s140中对各存储地址的第一预设字段的值是为0x49484954,还是0x00000000进行检测的结果,再结合指令映射模块中的各存储地址和对应指令的预设映射关系,对被执行的各指令进行统计。
[0084]
在本实施例中,当存储地址的第一预设字段的值被改写为第一预设值时,根据映射关系,确定存储地址对应的指令为被执行指令;根据被执行的指令的数量和指令集内的所有指令的数量,计算出指令覆盖率。
[0085]
具体地,当存储地址的第一预设字段的值被改写为0x49484954时,根据各存储地址和对应指令的预设映射关系,确定存储地址对应的指令为被执行指令,而存储地址的第一预设字段的值被改写为0x00000000时,确定存储地址对应的指令为未被执行指令;统计被执行的指令的数量,指令集内的所有指令和对应的存储地址的数量都是确定的数量,计算出被执行的指令的数量和指令集内的所有指令的数量的比值,从而得到这个测试指令集的指令覆盖率,也可以多个测试指令集一起进行覆盖率验证。
[0086]
由于本实施例是对指令对应的二进制编码,而非源码,进行直接统计,完全不需要指令插桩,也不用限制测试源码具体采用哪些编程语言来实现,灵活性很大。
[0087]
本实施例克服了现有插桩技术只适合于risv-v处理的扩展指令的缺点,适合risv-v处理架构的所有指令集,且无需插桩,灵活性更高。
[0088]
本实施例的指令集覆盖率测试方法,通过解析处理器执行的指令获得指令操作码,并把各指令操作码对应的存储地址中预设字段改写为预设值,再根据预设字段是否被改写统计执行的指令及指令集的指令,从而得到指令集覆盖率的设计思想完全可以用于其他处理器架构,不仅仅局限于risc-v处理器架构。
[0089]
此外,本实施例在处理器中设置指令识别单元和统计存储单元的方法,可以用于处理器原型设计时使用,还能用于处理器芯片流片开发,进而使得能在终端芯片上完成指令集覆盖率的统计,确保处理器功能的正确性,保证处理器的性能稳定性。
[0090]
第二实施例
[0091]
图2是本实施例的risc-v cpu功能单元构成示意图;
[0092]
图3是本实施例的risc-v cpu的指令识别单元功能模块构成示意图;
[0093]
图4是本实施例的risc-v cpu的统计存储单元功能结构示意图;
[0094]
图5是本实施例的指令识别单元中指令映射模块功能示意图;
[0095]
图6是本实施例的risc-v cpu中指令识别单元和统计存储单元交互功能示意图。
[0096]
risc-v cpu技术日益盛行,但其在risc-v cpu高覆盖率的指令验证方面却没有提供解决方案。本实施例解决如下技术问题:
[0097]
1、在risc-v cpu原型设计阶段,提出了一种基于risc-v cpu硬件电路的指令集统计方案,解决risc-v cpu运行指令集统计的问题;
[0098]
2、在risc-v cpu原型设计阶段,提出了内存线(memory line)解决方案,用于记录cpu指令运行情况,方便指令统计分析。
[0099]
本实施例的技术有益效果:本实施例从risc-v cpu原型设计阶段入手,在设计cpu的同时,从硬件级别自动统计所设计的risc-v cpu运行指令的情况,在不借助外部资源的情况下实现对指令覆盖率的统计,从而确保risc-v cpu指令指令功能的正确性。同时,本实施例也可在最终流片后的芯片中使用,在终端芯片上完成指令集覆盖率的统计。
[0100]
本实施例的的发明点在于:
[0101]
1.设计了一种risc-v cpu指令集辨识单元(rv-iru),该单元能够对cpu译码器译码的i、m、a、c、f、d等指令以及risc-v cpu通用寄存器pc寄存器进行辨识;在本实施例中,指令识别单元也称为指令辨识单元。
[0102]
2.设计了一种risc-v cpu内嵌统计单元(rv-ecm),该单元能够通过内部的内存线(memory line)记录指令集辨识单元分析得出的具体指令以及运行地址信息,为指令集运行情况解析提供基础信息;在本实施例中,统计存储单元也称为内嵌统计单元。
[0103]
本实施例中,risc-v指令辨识单元为instruction recognize unit,即rv-iru;risc-v内嵌统计单元为ebedded coverage macrocell,即rv-ecm;内存线为memory line。
[0104]
具体地,结合图2至图6阐述实施方式:
[0105]
a.如图2所示,risc-v cpu由risc-v cpu取指器、译码器、执行器及通用寄存器几大单元构成;取指器、译码器、执行器是risc-v cpu的重要单元,负责risc-v cpu指令取指、译码、执行;指令存储区存放risc-v cpu所需执行代码,数据存储区用于存放risc-v cpu执行代码时用到的交互数据。
[0106]
b.如图2所示,risc-v指令辨识单元(rv-iru)与内嵌统计单元(rv-ecm)是本发明中的核心单元,在本实施例中,同上述取指器、译码器、执行器及通用寄存器单元一起构成risc-v cpu内部数字逻辑。rv-iru以及rv-ecm两者协同作用,完成对risc-v cpu指令集执行情况的统计功能。
[0107]
c.如图3所示,risc-v指令辨识单元(rv-iru),细分为指令辨识模块、指令映射模块以及pc记录模块三个功能模块。本质上,指令辨识单元同译码、执行器单元一样,在risc-v cpu中是一段功能数字逻辑,可理解为硬件。
[0108]
指令辨识模块具体工作原理,指令辨识模块在risc-v cpu执行代码时,时刻监测risc-v cpu译码器,从而捕获cpu具体指令执行情况。对于任何一条32bit的risc-v cpu指令,bit[0~6]为其操作码,且每一条指令具备唯一操作码,如lw,sw指令的指令码各不相同,由于每条指令拥有唯一的操作码,rv-iru指令辨识模块能够解析risc-v cpu当前执行
的指令为add或者lw或者sw指令。risc-v cpu译码器的功能是翻译、识别具体某一条二进制指令的操作码,就是识别32bit指令中的bit[6~0],而指令辨识模块的功能是读取risc-v cpu译码器识别出的指令码,从而判定具体某条被执行的指令需要对应哪一条内存线(memory line)。
[0109]
同时,指令辨识模块也监测risc-v通用寄存器pc的内容,从而辨识出当前被执行的指令处于risc-v cpu具体存储空间(memory space)的具体地址。指令辨识模块在读取指令操作码时,同时读取通用寄存器pc的内容,该内容即是当前指令被执行时所处于的存储空间(memory space)的具体地址。结合由指令码对应的内存线(memory line),指令辨识模块将通用寄存器pc的内容写入到某一条内存线(memory line)的双字节第4至第8数据位(dword)中。
[0110]
d.如图4所示,risc-v cpu内嵌统计单元rv-ecm功能结构图,该模块由多条内存线(memory line)组成。内存线(memory line)的具体条数等于risc-v cpu支持的具体指令集数决定,如,只支持rv-i,rv-m指令集的memory line数目少于支持rv-i,rv-m,rv-f指令集的memory line数目;但,当risc-v cpu支持的指令集一旦确定,那么,内存线(memory line)数目也就随之确定。
[0111]
e.如图4所示,每一条内存线(memory line)由8个双字节数据位(dword)组成,每个双字节数据位(dword)由4个字节(byte)组成。所有内存线(memory line)的内容会在risc-cpu译码第一条指令前,由rv-iru进行清零。每条内存线(memory line)中,双字节第1数据位(dword)存储指令命中(hit,即指令被执行)情况。一旦某条指令被命中,则双字节第1数据位(dword)被记录为0x49484954(ascii:ihit,意为instrution hit,指令命中),且该双字节第1数据位(dword)中每一位(bit)只能由0变为ascii码4个字母ihit对应的二进制数字,对于十六进制数字来说,即要么为0x49484954,要么为0x00000000。双字节第2及第3数据位(dword)则共有64位,则用于累加记录该指令命中次数,即,每当相同指令被执行一次,那么对双字节第2及第3数据位(dword)进行加1处理(其范围可达0~2
64-1)。双字节第4、5、6、7、8数据位(dword)则用以依次记录当前指令最新5次运行时所在的地址,即,当双字节第4至第8数据位(dword)被写满后,又从双字节第4至第8数据位(dword)开始依次记录。
[0112]
f.如图5所示,该图为rv-iru的指令映射模块功能结构图。指令操作码由译码器得到,可以视为指令映射中的唯一标识符(unique id),指令操作码与rv-ecm中的每一条内存线(memory line)为一一对应关系。如,内存线1(line 1)对应于sw指令,内存线2(line 2)对应于sh指令,等等。指令映射不做具体规定,只要确保每一条内存线(memory line)与具体指令对应即可。
[0113]
如图3所示,pc记录模块的功能,pc记录功能模块监测risc-v通用寄存器pc的内容,从而辨识出当前被执行的指令处于risc-v cpu具体memory space的具体地址。第e点中,有提到:每一条memory line中的dword 4,5,6,7,8,可以记录当前指令最新5次运行时所在的地址。这个地址,其实就来自于pc记录这个功能模块。
[0114]
g.如图6所示,risc-v cpu在运行指令的过程中,指令辨识单元rv-iru监测译码器以及pc寄存器的内容。每当有指令被执行,rv-iru辨识出该条指令的操作码以及该条指令的pc寄存器的内容,通过指令映射模块,确定该条指令所在rv-ecm中所在内存线(memory line)。对内存线(memory line)的所有字节按e步骤中设定的规则进行写入。当risc-v cpu
代码执行完成,只要确定每一条内存线(memory line)的双字节第1数据位(dword)是否为0x49484954,再根据rv-iru中指令映射模块中映射情况,即可判断出哪些指令被命中,哪些指令没有在代码中被执行到。由于内存线(memory line)的总数是确定的,通过双字节第1数据位(dword)中的内容,即可确定出当前指令执行覆盖情况。
[0115]
本实施例中,rv-iru以及rv-ecm可以用于risc-v cpu指令集验证、以及可以用于risc-v cpu芯片流片开发;使得可以在终端芯片上完成对risc-v cpu指令集的覆盖率统计,确保risc-v cpu功能正确性。
[0116]
综上所述,本发明实施例具有以下优点:
[0117]
1、本发明提供了一种指令集覆盖率测试的方法,通过解析处理器执行的指令获得指令操作码,并把各指令操作码对应的存储地址中预设字段改写为预设值,再根据预设字段是否被改写统计执行的指令及指令集的指令,从而得到指令集覆盖率。本发明的方法克服了现有插桩技术只适合于risv-v处理的扩展指令的缺点,适合risv-v处理架构的所有指令集,且无需插桩,灵活性更高。
[0118]
2、本发明的指令集覆盖率测试方法既能用于验证risc-v处理器指令集高覆盖率,还能用于其他cpu架构的覆盖率测试方法。
[0119]
3、本发明的指令集覆盖率测试方法既能在处理器原型设计时使用,还能在最终流片后的芯片中使用,在终端芯片上完成指令集覆盖率统计。
[0120]
第三实施例
[0121]
图2是本实施例的risc-v cpu功能单元构成示意图;
[0122]
图3是本实施例的risc-v cpu的指令识别单元功能模块构成示意图;
[0123]
图4是本实施例的risc-v cpu的统计存储单元功能结构示意图;
[0124]
图5是本实施例的指令识别单元中指令映射模块功能示意图;
[0125]
图6是本实施例的risc-v cpu中指令识别单元和统计存储单元交互功能示意图。
[0126]
一种指令集覆盖率测试装置,包括指令识别单元和统计存储单元。
[0127]
在本实施例中,指令集覆盖率测试装置为处理器,指令识别单元和统计存储单元内嵌于处理器内。
[0128]
指令识别单元用于在处理器执行代码时,读取处理器的译码器,获取处理器执行的指令;解析指令获得指令操作码;根据预设映射关系,获取与指令操作码对应的统计存储单元的存储地址,其中,预设映射关系为各指令操作码与统计存储单元的各存储地址的对应关系;对存储地址中的第一预设字段的值改写为第一预设值。
[0129]
指令识别单元包括指令识别模块、指令映射模块和记录模块,其中,
[0130]
指令识别模块用于在处理器执行代码时,读取处理器的译码器,获取处理器执行的指令;解析指令获得指令操作码;根据预设映射关系,获取与指令操作码对应的统计存储单元的存储地址;对存储地址中的第一预设字段的值改写为第一预设值;以及用于将指令地址写入至所述统计存储单元的所述存储地址中的第三预设字段;
[0131]
指令映射模块用于构建预设映射关系,其中,预设映射关系为各指令操作码与统计存储单元的各存储地址的对应关系;
[0132]
记录模块用于读取处理器的寄存器,获取处理器执行的指令的指令地址。
[0133]
统计存储单元用于根据指令识别单元的改写操作,将在预设映射关系中与指令操
作码对应的存储地址的第一预设字段的值改写为第一预设值。
[0134]
在本实施例中,统计存储单元还用于对存储地址中的第二预设字段的值进行一次加值操作,其中,加值操作为在第二预设字段当前的值加上第二预设值;以及用于将指令地址写入至统计存储单元的存储地址中的第三预设字段。
[0135]
在本实施例中,统计存储单元还用于当处理器的代码执行完成后,检测各存储地址的第一预设字段的值是否被改写为第一预设值;用于根据对各存储地址的第一预设字段的值是否被改写的检测结果,以及预设映射关系,统计被执行的各指令;用于当存储地址的第一预设字段的值被改写为第一预设值时,根据映射关系,确定存储地址对应的指令为被执行的指令;以及用于根据被执行的指令的数量和指令集内的所有指令的数量,计算指令出覆盖率。
[0136]
如图2所示,传统的risc-v处理器由risc-v取指器、译码器、执行器及通用寄存器几大模块构成;取指器、译码器、执行器是risc-v处理器的重要单元,负责risc-v处理器的指令取指、译码、执行;指令存储区用于存放risc-v处理器所需执行代码,数据存储区用于存放risc-v处理器执行代码时用到的交互数据。在本实施例中,在传统的risc-v处理器中另外设置了指令识别单元(rv-iru)和统计存储单元(rv-ecm),其中指令识别单元包括指令识别模块、指令映射模块和记录模块,统计存储单元包括很多的存储地址,在本实施例中,存储地址也称为内存线。
[0137]
具体的,在本实施例中,指令识别单元能够对cpu译码器译码的i、m、a、c、f、d等指令进行识别。在risc-v处理器执行代码时,指令识别单元时刻监测risc-v译码器,从而捕获处理器的具体指令的执行情况,捕获到有指令被执行后,指令识别单元读取处理器的译码器,获取处理器执行的指令信息。本质上,指令识别单元同译码、执行器单元一样,在risc-v处理器中是一段功能数字逻辑,可理解为硬件。指令识别单元包括指令识别模块、指令映射模块和记录模块。
[0138]
在本实施例中,由于对于每一条32bit的risc-v处理器指令,其中bit[0~6]位为此指令的操作码,且每一条指令具备唯一操作码,如lw,sw指令的指令码各不相同。
[0139]
risc-v处理器的译码器的功能是翻译、识别具体某一条二进制指令的操作码,即识别32bit指令中的bit[6~0]。在本实施例中,指令识别模块读取risc-v处理器的译码器识别出的指令操作码。故获得处理器执行的指令信息后,指令识别模块可以透过译码器解析此指令,从而获得该指令的指令操作码。由于每条指令拥有唯一的操作码,故指令识别模块通过操作码指令识别单元可以解析risc-v处理器当前执行的指令的具体名称,比如add,或lw,或sw指令。
[0140]
在本实施例中,由于指令操作码为每个指令所独有,可以视为指令映射中的唯一标识符,每个指令操作码与每一个统计存储单元的存储地址存在一一对应的关系,指令映射模块建立了映射关系,如存储地址1(也称为内存线1)对应于sw指令,存储地址2(也称为内存线2)对应于sh指令。根据预设映射关系,指令识别单元中的指令映射模块可以获取与指令操作码对应的统计存储单元的存储地址。指令映射关系不做具体规定,只要能确保每一个统计存储单元的存储地址与具体的指令存在一一对应关系即可。
[0141]
其中,统计存储单元中存储地址数量等于risc-v处理器支持的各指令集指令总数,比如只支持rv-i,rv-m指令集的存储地址数量少于支持rv-i,rv-m,rv-f指令集的存储
地址数量数目,但是,当risc-v处理器支持的指令集确定后,那么存储地址数量也就随之确定了。
[0142]
在本实施例中,统计存储单元中存储地址也称为内存线(memory line),本步骤的存储地址采用内存线来说明,每条内存线由8个双字节数据位(dword)组成,每个双字节数据位由4个字节(byte)组成,正常情况下单字节数据位为2个字节组成,比如1个汉字为2个字节,每个字节又是8位,故一个双字节数据位就是32位。所有内存线的内容会在risc处理器译码第一条指令前,由指令识别单元先进行清零。每条内存线中,双字节第1数据位为第一预设字段,设置为存储指令命中(hit,即指令被执行)情况。一旦有指令被命中,则双字节数据位第一预设字段改写为第一预设值,在本实施例中,则被记录0x49484954,为ascii码中ihit 4个字母对应的十六进制数字组合,即0x49,0x48,0x49,0x54的组合,ihit意为instrution hit,指令命中,且双字节数据位第一预设字段中每一位(bit)只能由0变为ascii码4个字母ihit对应的二进制数字,对于十六进制数字来说,即要么为0x49484954,要么为0x00000000。
[0143]
具体地,在本实施例中,统计存储单元中内存线的双字节第2和第3数据位设为第二预设字段,共有64位,第二预设字段的范围可达0~2
64-1,第二预设字段设置为用于累加记录某条指令命中次数。根据预设映射关系,指令识别单元获取与指令操作码对应的统计存储单元的存储地址之后,每当相同的指令被执行一次,则统计存储单元中内存线的第二预设字段的值进行加值操作,其中加值操作为在第二预设字段当前的值上加上第二预设值,第二预设值在本实施例中设置为1,通过第二预设字段的值,可以获取某条指令被执行的次数。
[0144]
具体地,指令识别单元中记录模块监测risc-v通用寄存器中的内容,从而读取处理器的寄存器,辨识出当前被执行的指令处于risc-v处理器中具体存储空间中的具体地址,记录模块则从寄存器中获取到处理器执行的指令的指令地址。
[0145]
在本实施例中,统计存储单元中内存线的双字节第4至第8数据位设为第三预设字段。根据预设映射关系,指令识别单元获取与指令操作码对应的统计存储单元的存储地址(也称为内存线)的之后,指令识别单元中的指令识别模块把从记录模块获得的当前处理器执行的指令的指令地址写入至该指令对应的内存线的第三预设字段中,第三预设字段的这5个数据位用于依次记录当前指令最近5次运行时所在的地址,即当双字节第4至第8数据位被写满后,又从双字节第4至第8数据位依次记录。
[0146]
在本实施例中,正常情况下由测试人员来控制处理器代码执行完成情况。如,可以通过调试工具让risc-v处理器开始执行,也可以通过调试工具让risc-v处理器停止执行,还可以在验证代码中加入一条ebreak指令,当处理器执行ebreak时,即可认为risc-v处理器停止执行,方法上不做限制。当指令集中的所有指令停止执行时,则认为risc-v处理器代码执行完成,统计存储单元或专用工具或人工检测各存储地址的第一预设字段的值是否被改写为第一预设值,在本实施例中,第一预设值优选为0x49484954,或者第一预设字段的值没有被改写仍然为0x00000000。
[0147]
在本实施例中,根据上一个步骤中统计存储单元对各存储地址的第一预设字段的值是为0x49484954,还是0x00000000进行检测的结果,再结合指令映射模块中的各存储地址和对应指令的预设映射关系,对被执行的各指令进行统计。
[0148]
具体地,在本实施例中,当存储地址的第一预设字段的值被改写为0x49484954时,统计存储单元根据各存储地址和对应指令的预设映射关系,确定存储地址对应的指令为被执行指令,而存储地址的第一预设字段的值被改写为0x00000000时,确定存储地址对应的指令为未被执行指令;统计存储单元统计被执行的指令的数量,指令集内的所有指令和对应的存储地址的数量都是确定的数量,计算出被执行的指令的数量和指令集内的所有指令的数量的比值,从而得到这个测试指令集的指令覆盖率,也可以多个测试指令集一起进行覆盖率验证。
[0149]
由于本实施例是对指令对应的二进制编码,而非源码,进行直接统计,完全不需要指令插桩,也不用限制测试源码具体采用哪些编程语言来实现,灵活性很大。
[0150]
本实施例克服了现有插桩技术只适合于risv-v处理的扩展指令的缺点,适合risv-v处理架构的所有指令集,且无需插桩,灵活性更高。
[0151]
综上所述,本实施例提供了一种指令集覆盖率测试的装置,在处理器中设置了指令识别单元和统计存储单元,指令识别单元用于解析处理器执行的指令获得指令操作码,并把各指令操作码对应的存储地址中预设字段改写为预设值,统计存储单元用于根据预设字段是否被改写统计执行的指令及指令集的指令,从而得到指令集覆盖率。本实施例的装置克服了现有插桩技术只适合于risv-v处理器的扩展指令的缺点,适合risv-v处理器架构的所有指令集,且无需插桩,灵活性更高。
[0152]
虽然本发明公开的实施方式如上,但所述的内容只是为了便于理解本发明而采用的实施方式,并非用以限定本发明。任何本发明所述技术领域内的技术人员,在不脱离本发明所公开的精神和范围的前提下,可以在实施的形式上及细节上作任何的修改与变化,本发明的保护范围并不局限于文中公开的特定实施例,而是包括落入权利要求范围内的所有技术方案。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献