CN112597064B - 对程序进行仿真的方法、电子设备及存储介质 - Google Patents
对程序进行仿真的方法、电子设备及存储介质 Download PDFInfo
- Publication number
- CN112597064B CN112597064B CN202110227090.8A CN202110227090A CN112597064B CN 112597064 B CN112597064 B CN 112597064B CN 202110227090 A CN202110227090 A CN 202110227090A CN 112597064 B CN112597064 B CN 112597064B
- Authority
- CN
- China
- Prior art keywords
- code
- probe module
- program
- probe
- memory
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3676—Test management for coverage analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本公开提供一种对程序进行仿真的方法、电子设备及存储介质。该方法包括:获取所述程序的源代码,其中,所述源代码包括要监测的第一代码;编译所述源代码以生成目标代码,其中,所述编译包括将探针模块关联到所述第一代码,所述目标代码包括所述探针模块;运行所述目标代码;以及在所述目标代码运行时,响应于所述探针模块已经被执行,将所述探针模块禁用。
Description
技术领域
本公开涉及计算机软件技术领域,尤其涉及一种对程序进行仿真的方法、电子设备及存储介质。
背景技术
作为进行软件测试的一种重要手段,代码覆盖率测试是为了检测一个程序中的有多少代码可以被执行。在相关技术中,代码覆盖率测试往往是与程序的仿真一起进行的,但代码覆盖率测试会影响仿真的效率。
发明内容
有鉴于此,本公开的目的在于提出一种对程序进行仿真的方法、电子设备及存储介质。
本公开第一方面,提供了一种对程序进行仿真的方法,包括:获取所述程序的源代码,其中,所述源代码包括要监测的第一代码;编译所述源代码以生成目标代码,其中,所述编译包括将探针模块关联到所述第一代码,所述目标代码包括所述探针模块;运行所述目标代码;以及在所述目标代码运行时,响应于所述探针模块已经被执行,将所述探针模块禁用。
本公开第二方面,提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如第一方面所述的方法。
本公开第三方面,提供了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机的一组指令,该组指令用于使所述计算机执行第一方面所述的方法。
本公开提供的对程序进行仿真的方法、电子设备及存储介质,在运行程序的目标代码以进行仿真的时,在确定探针模块已经被执行后,便将探针模块禁用。如此,使得在仿真过程中,探针模块均仅被执行一次,这样能够在实现代码覆盖率测试的同时,提升仿真效率。
附图说明
为了更清楚地说明本公开或相关技术中的技术方案,下面将对实施例或相关技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1A示出了本公开实施例所提供的一种示例性电子设备的结构示意图。
图1B示出了根据本公开实施例的示例性编译器的示意图。
图2示出了根据本公开实施例的示例性仿真工具的示意图。
图3A示出了一段示例性代码的示意图。
图3B示出了另一段示例性代码的示意图。
图3C示出了又一段示例性代码的示意图。
图3D示出了再一段示例性代码的示意图。
图3E示出了根据本公开实施例的禁用探针模块的示例性代码的示意图。
图3F示出了根据本公开实施例的禁用探针模块后的示例性目标代码的示意图。
图4示出了本公开实施例所提供的示例性方法的流程示意图。
具体实施方式
为使本公开的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本公开进一步详细说明。
需要说明的是,除非另外定义,本公开实施例使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本公开实施例中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。
在相关技术中,根据不同的监测对象,代码覆盖率测试(Code Coverage)可以分为:函数覆盖率测试(Function Coverage)、行覆盖率测试(Line Coverage)、分支覆盖率测试(Branch Coverage)、条件覆盖率测试(Condition Coverage)等。可以理解的是,这里的监测对象是指待测试的软件设计、程序设计等。其中,程序设计可以是逻辑系统设计的仿真程序。而逻辑系统设计在一些实施例中可以是芯片系统设计。
在代码覆盖率测试中,对于不同的监测对象,一般是通过在程序的源代码中要监测的代码处(也称为插桩位置)关联探针模块(probe)来实现代码覆盖率测试。其中,该探针模块可以在编译前直接插入程序的源代码,也可以由编译器在编译过程中插入到程序的目标代码中。在仿真时,探针模块与程序的目标代码一起运行。
例如,在函数覆盖率测试中,程序经过编译得到的目标代码,而其中的每个函数均会关联探针模块。这使得程序的目标代码中会包含大量的探针模块。在程序的目标代码运行时探针模块会一起运行,并且同一个函数会被反复调用,其关联的探针模块也相应的会被多次的执行。然而,函数覆盖率有如下定义:函数覆盖率=(至少被执行一次的函数数量)/(函数的总数量)。可见,对于任一函数,其关联的探针模块只需被执行一次便已经可以实现函数覆盖率测试,探针模块多次执行无谓地增加了仿真时间和算力,造成了仿真效率的下降。
需要说明的是,其他类型的代码覆盖率测试均有与函数覆盖率测试类似的定义,即:(至少被执行一次的监测对象)/(监测对象的总数量)。也即,通过相关技术进行代码覆盖率测试时,均会造成仿真效率的下降。
有鉴于此,本公开实施例提供了一种对程序进行仿真的方法、电子设备及存储介质。该方法包括:获取所述程序的源代码,其中,所述源代码包括要监测的第一代码;编译所述源代码以生成目标代码,其中,所述编译包括将探针模块关联到所述第一代码,所述目标代码包括所述探针模块;运行所述目标代码;以及在所述目标代码运行时,响应于所述探针模块已经被执行,将所述探针模块禁用。本公开实施例在运行程序的目标代码以进行仿真的时,在确定探针模块已经被执行后,便将探针模块禁用。如此,使得在仿真过程中,探针模块均仅被执行一次,这样能够在实现代码覆盖率测试的同时,提升仿真效率。
可以理解的是,上述的程序可以是能够被运行以实现任意功能的程序,也可以是与逻辑系统设计关联的程序。其中,当一个包括一个或多个模块的程序用硬件语言描述之后,可以利用仿真器对其进行调试,该程序可以是逻辑系统设计,所述逻辑系统设计可以是,例如,用于供专门应用的集成电路(Application Specific Integrated Circuit,简称ASIC)或者片上系统芯片(System-On-Chip,简称SOC)的设计。因此,在仿真器中被测试的逻辑系统设计又可以称为被测试设计(Design Under Test,简称DUT)。仿真器可以通过一个或多个可配置组件(例如,现场可编程逻辑门阵列(Field Programmable Gate Array,简称FPGA)来仿真该DUT,包括执行该DUT的各种操作,从而在制造之前就测试并验证DUT的各个模块的功能。
图1A示出了本实施例所提供的一种电子设备100的结构示意图。电子设备100例如可以是计算机主机。该电子设备100可以包括:处理器102、存储器104、网络接口106、外围接口108和总线110。其中处理器102、存储器104、网络接口106和外围接口108通过总线110实现彼此之间在设备内部的通信连接。
处理器102可以是中央处理器(Central Processing Unit,CPU)、图像处理器、神经网络处理器(NPU)、微控制器(MCU)、可编程逻辑器件、数字信号处理器(DSP)、应用专用集成电路(Application Specific Integrated Circuit,ASIC)或者一个或多个集成电路。处理器102可以用于执行与本公开描述的技术相关的功能。在一些实施例中,处理器102还可以包括集成为单一逻辑组件的多个处理器。如图1A所示,处理器102可以包括多个处理器102a、102b和102c。
存储器104可以配置为存储数据(例如,指令集、计算机代码、中间数据等)。例如,如图1A所示,存储的数据可以包括程序指令(例如,用于实现本公开的技术方案的程序指令)以及待处理的数据(例如,存储器104可以存储在编译过程产生的临时代码)。处理器102也可以访问存储的程序指令和数据,并且执行程序指令以对要处理的数据进行操作。存储器104可以包括易失性存储装置或非易失性存储装置。在一些实施例中,存储器104可以包括随机访问存储器(RAM)、只读存储器(ROM)、光盘、磁盘、硬盘、固态硬盘(SSD)、闪存、存储棒等。
网络接口106可以配置为经由网络向电子设备100提供与其他外部设备的通信。该网络可以是能够传输和接收数据的任何有线或无线的网络。例如,该网络可以是有线网络、本地无线网络(例如,蓝牙、WiFi、近场通信(NFC)等)、蜂窝网络、因特网、或上述的组合。可以理解的是,网络的类型不限于上述具体示例。在一些实施例中,网络接口106可以包括任意数量的网络接口控制器(NIC)、射频模块、接收发器、调制解调器、路由器、网关、适配器、蜂窝网络芯片等的任意组合。
外围接口108可以配置为将电子设备100与一个或多个外围装置连接,以实现信息输入及输出。例如,外围装置可以包括键盘、鼠标、触摸板、触摸屏、麦克风、各类传感器等输入设备以及显示器、扬声器、振动器、指示灯等输出设备。
总线110可以被配置为在电子设备100的各个组件(例如处理器102、存储器104、网络接口106和外围接口108)之间传输信息,诸如内部总线(例如,处理器-存储器总线)、外部总线(USB端口、PCI-E总线)等。
需要说明的是,尽管上述设备仅示出了处理器102、存储器104、网络接口106、外围接口108和总线110,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本公开实施例方案所必需的组件,而不必包含图中所示的全部组件。
图1B示出了根据本公开实施例的示例性编译器120的示意图。
编译器120可以基于待编译的计算机代码来生成目标代码的计算机程序。待编译的计算机代码又可以称为源代码。通常,编写源代码的源语言是高级编程语言。高级编程语言可以例如是C++、Java等软件编程语言或VHDL、Verilog、SystemVerilog等硬件描述语言。目标代码则可以是例如汇编代码、机器码等。
编译器120例如可以存储在图1A所示的存储器104中,并且由处理器102执行。
如图1B所示,编译器120可以包括前端122、中端124以及后端126。
前端122可以用于根据具体的源语言来分析源代码的词法、语法、语义。
在源代码的词法、语法、语义分析完成后,中端124可以将源代码转换为中间表示(或中间代码),并可以优化该中间表示。例如,中端124可以移除无用的代码、移除不可访问的代码、清除未使用的变量等。优化后的中间表示则可以被传递给后端126进行进一步处理。
后端126可以根据目标处理器(例如,图1A的处理器102)的架构来进一步优化中间表示,并生成目标代码。通常,目标代码是机器码。
可以理解的是,编译器的结构不限于图1B的示例。例如,前端122和中端124可以被合称为编译器的前端,或者,中端124和后端126可以被合称为编译器的后端。
图2示出了根据本公开实施例的仿真工具200的示意图。仿真工具200可以是运行在电子设备100上的计算机程序。
在芯片设计领域,通常可以利用仿真工具对一个设计进行仿真。仿真工具例如可以是芯华章科技股份有限公司出品的GalaxSim仿真工具。图2示出的示例性仿真工具200可以包括编译器120和仿真器210。编译器120可以将设计202编译为目标代码204,仿真器210可以根据目标代码204进行仿真,并将仿真结果206输出。例如,仿真工具200可以将仿真结果(例如,仿真波形图)经由图1A的外围接口108输出到输出设备上(例如,显示在显示器上)。
可以理解的是,程序的仿真工具可以是业内任何适用的仿真工具而不限于图2的示例。
图3A示出了程序的示例性代码300的示意图。
如图3A所示,该程序的示例性代码300可以通过Verilog硬件描述语言实现。作为程序的源代码,该代码300可以由仿真工具的编译器进行编译。其中,编译器的中端可以将该代码300转换为中间代码。该代码300描述了一个名为DUT的模块。
图3B示出了程序的示例性中间代码310的示意图。中间代码310可以是通过C语言实现的。
如图3B所示,中间代码310可以包括探针模块312。该探针模块312在图3B中显示为LineCoverageProbe(1)。可以理解的是,在一些实施例中,探针模块312可以包括更多的代码。
其中,LineCoverageProbe()为预先定义的探针函数。该探针函数可以是在仿真工具的编译器中预先定义的库函数,用于记录要探测的对象的执行情况。如上所述,根据不同类型的代码覆盖率测试的需要,要探测的对象可以是代码行、函数、分支、条件等。相应地,用于不同类型的代码覆盖率测试的多种探针函数可以被定义,诸如用于行覆盖率测试的探针函数、用于函数覆盖率测试的探针函数、用于分支覆盖率测试的探针函数等。
探针模块312还包括编码参数“1”。程序中要检测的对象(例如,各个代码行或函数)在经过编码后可以分配对应的编码,用于指示该代码行或函数。在图3B的示例中,该编码为“1”,用于指示与图3A的模块DUT对应的函数。在仿真过程中,当探针模块312被执行时,其对应的该编码会作为输入被传递给探针函数。
图3C示出了示例性的探针函数320的示意图。
在一些实施例中,探针函数320可以利用计数的功能来记录要探测的对象的执行情况。
如上所述,程序中要检测的对象可以被分配一个编码(图3C中的“id”),而该编码可以对应到数组gLineCoverageArray中的一个元素。当探针函数320被执行后,可以在gLineCoverageArray中将与“id”对应的元素加1。通过判断该元素是否为0,可以确定要检测的对象是否在执行中被覆盖。通过读取该元素的具体数值,可以确定要检测的对象被执行了多少次。可以理解的是,在一些实施例中,当探针函数320被执行后,可以在gLineCoverageArray中将与“id”对应的元素设置为1,用于指示对应的要检测的对象已经被执行了。
如图3C所示,该探针函数320可以包括数组定义322和探针函数定义324。其中,数组定义302可以定义用于记录代码行被执行次数的数组gLineCoverageArray。探针函数定义324可以定义探针函数320所执行的具体动作。例如,每当获得代码行对应的编码id时,将该编码id对应的代码行的计数值加1。在进行覆盖率测试时,当编码id对应的元素的数值为0时,则表明该代码行未被执行过。当编码id对应的代码行的计数值不为0时,则表明该代码行已经被执行。这样,对于不同的探针模块而言,只需要传递不同的编码id就可以记录下对应要检测的对象的执行情况,而无需单独提供探针函数。
图3D示出了程序的示例性目标代码330的示意图。
如上所述,代码300在经过编译器编译后可以被加入探针模块312,并编译得到目标代码330。该目标代码330可以包括探针模块312对应的表达332。如图3D所示,目标代码330可以包括一个调用指令“callq”。通过该调用指令“callq”,可以执行在另一个地址中存储的探针函数LineCoverageProbe。
在运行目标代码330(例如,由图2的仿真器210运行)时,目标代码330通常是保存电子设备100的内存中。如上所述,现有技术中探针模块会被反复执行,以至于劣化程序在仿真阶段的表现。由于执行目标代码330仅需要访问内存,因此对目标代码330的优化也可以在仅在内存中进行而无需对代码300进行改动。
在一些实施例中,仿真器210可以将探针模块(例如,探针模块312)禁用。
图3E示出了根据本公开实施例的禁用探针模块的示例性代码340。如图3E所示,该代码340可以包括赋值语句342和替换语句344。
赋值语句342可以用于将数组gLineCoverageArray中与参数“id”对应的一个元素设置为true。当数组gLineCoverageArray中的一个元素为true时,指示与该参数“id”对应的要检测的对象已经被执行。当探针模块被执行时,与赋值语句342对应的目标代码表达(例如,图3D的332)被执行。
替换语句344可以用于将内存中的探针模块(例如,图3D的332)禁用。替换语句344可以包括一个fill_with_nop()函数和对应的两个参数。其中,fill_with_nop()函数用于从地址为第一参数开始将第二参数个字节填充为空白指令(NOP)。
例如,仿真器210可以确定探针模块332在内存中的起始地址(例如,return_address-sizeof_probe_call)作为第一参数,并且确定探针模块的长度(例如,sizeof_probe_call)作为第二参数。然后,仿真器210可以将该第一参数和第二参数传递给fill_with_nop()函数并且调用该fill_with_nop()函数。
如上所述,此时fill_with_nop()函数可以从探针模块332的起始地址开始,将sizeof_probe_call个字节填充为空白指令。也就是说,将探针模块322的所有操作指令填充为空白指令,从而实现探针模块的禁用。
图3F示出了根据本公开实施例的禁用探针模块后的示例性目标代码350。如图3F所示,该代码350可以包括空白指令352,该空白指令352替换了原目标代码330中的探针模块332。如上所述,和代码330一样,代码350也是图3A的模块DUT的目标代码,所以在仿真过程中,当再次执行模块DUT时,代码350已经不再包括探针模块332。这样,当再次调用模块DUT时,仿真器210可以不必再次重复执行探针模块332。由于探针模块332已经被执行过,因此相关记录得以在数组gLineCoverageArray中保存。
在一些实施例中,仿真器210可以将存储于内存的目标代码中的探针模块332删除,以实现禁用探针模块332。例如,仿真器210可以确定探针模块332的起始地址和代码长度。然后,从探针模块332的起始地址开始,将内存中与探针模块332的代码长度相等长度的数据删除。这样,在后续仿真过程中,不会再次重复执行探针模块,以实现提升仿真效率的效果。
本公开实施例提供的对程序进行仿真的仿真工具,在运行程序的目标代码以进行仿真的时,在确定探针模块已经被执行后,便将探针模块禁用。如此,使得在仿真过程中,探针模块均仅被执行一次,这样能够节省仿真时间、降低算力消耗,在实现代码覆盖率测试的同时,提升仿真效率。
图4示出了本公开实施例所提供的对程序进行仿真的方法400的流程示意图。方法400可以由图1A的电子设备100执行。该方法400可以具体包括以下步骤。
在步骤402,电子设备100可以接收程序(例如,图2中的设计202),并获取该程序的源代码(例如,图3A的代码300)。其中,代码300包括要监测的第一代码(例如,图3A中的$display(“xin hua zhang”)),该第一代码为代码覆盖率测试需要监测的对象。可以理解的是,第一代码可以包括一行代码、一个功能、一个分支、或一个条件等。
在步骤404,电子设备100可以通过例如仿真工具200编译该源代码以生成目标代码(例如,图2的204)。例如,电子设备100可以通过仿真工具200先将代码300转换为中间代码,再将该中间代码进一步优化并生成目标代码(例如,图3D的330)。其中,仿真工具200对代码300的编译包括将探针模块(例如,图3B的312或图3D的332)关联到第一代码。因此,在经过编译后,目标代码330可以包括与第一代码关联的探针模块332。
在一些实施例中,探针模块332可以是在仿真工具200对代码300进行编译的过程中生成并关联至目标代码330中的。这样能够在仿真过程中,使得程序的源代码不被修改,能够降低仿真过程的算力消耗。
在得到目标代码330后,在步骤406,仿真工具200可以运行目标代码330以对设计202进行仿真。在一些实施例中,仿真工具200可以将探针模块332插入到第一代码之前。在目标代码330运行时,探针模块332和第一代码将会被连续地执行。其中,当探针模块332运行时,仿真工具200可以调用探针函数。并在探针模块332执行之后,执行第一代码。可以理解的是,本公开的实施例并不限于这样的插入顺序或执行顺序,只需要探针模块332和第一代码能够被关联地执行即可。
在步骤408,仿真工具200可以在目标代码330运行时,响应于探针模块332已经被执行,将探针模块332禁用。其中,在运行目标代码330时,目标代码330是保存电子设备100的内存中的,基于内存能够快速读写的特点,可以对内存中的目标代码330进行修改,以实现禁用探针模块332。
在一些实施例中,仿真工具200可以执行例如图3E的344以将探针模块332替换为空白指令。
例如,仿真工具200可以调用探针模块332在内存中的起始地址(例如,return_address-sizeof_probe_call)作为第一参数,并且确定探针模块332的长度(例如,sizeof_probe_call)作为第二参数。然后,仿真工具200可以根据第一参数和第二参数,从地址为第一参数开始将第二参数个字节填充为空白指令。在后续仿真过程中,当再次执行该处代码时,其中已经不再包括探针模块332。这样,使得每个被监测的第一代码对应的探针模块均仅会执行一次,额外的算力开销仅仅为若干空白指令,可以在实现代码覆盖率测试的同时,有效的提升仿真效率。
在一些实施例中,响应于判定探针模块332已经被执行,仿真工具200可以将存储于内存的目标代码中的探针模块332删除,以实现禁用探针模块332。例如,仿真工具200可以调用探针模块332在内存中的起始地址(例如,return_address-sizeof_probe_call)作为第一参数,并且确定探针模块332的长度(例如,sizeof_probe_call)作为第二参数。然后,仿真工具200可以根据第一参数和第二参数,从地址为第一参数开始将第二参数个字节删除。这样,被监测的第一代码对应的探针模块在执行一次后便会被删除,后续仿真过程中,不会再重复的执行探针模块332,以实现提升仿真效率的效果。
需要说明的是,本公开的方法可以由单个设备执行,例如一台计算机或服务器等。本实施例的方法也可以应用于分布式场景下,由多台设备相互配合来完成。在这种分布式场景的情况下,这多台设备中的一台设备可以只执行本公开的方法中的某一个或多个步骤,这多台设备相互之间会进行交互以完成所述的方法。
需要说明的是,上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
基于同一发明构思,与上述任意实施例方法相对应的,本公开还提供了一种非暂态计算机可读存储介质,该非暂态计算机可读存储介质存储计算机的一组指令,该组指令用于使所述计算机执行如上任一实施例所述方法。
本实施例的计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
上述实施例的存储介质存储的计算机指令用于使所述计算机执行如上任一实施例所述方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本公开的范围(包括权利要求)被限于这些例子;在本公开的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,步骤可以以任意顺序实现,并存在如上所述的本公开实施例的不同方面的许多其它变化,为了简明它们没有在细节中提供。
另外,为简化说明和讨论,并且为了不会使本公开实施例难以理解,在所提供的附图中可以示出或可以不示出与集成电路(IC)芯片和其它部件的公知的电源/接地连接。此外,可以以框图的形式示出装置,以便避免使本公开实施例难以理解,并且这也考虑了以下事实,即关于这些框图装置的实施方式的细节是高度取决于将要实施本公开实施例的平台的(即,这些细节应当完全处于本领域技术人员的理解范围内)。在阐述了具体细节(例如,电路)以描述本公开的示例性实施例的情况下,对本领域技术人员来说显而易见的是,可以在没有这些具体细节的情况下或者这些具体细节有变化的情况下实施本公开实施例。因此,这些描述应被认为是说明性的而不是限制性的。
尽管已经结合了本公开的具体实施例对本公开进行了描述,但是根据前面的描述,这些实施例的很多替换、修改和变型对本领域普通技术人员来说将是显而易见的。例如,其它存储器架构(例如,动态RAM(DRAM))可以使用所讨论的实施例。
本公开实施例旨在涵盖落入所附权利要求的宽泛范围之内的所有这样的替换、修改和变型。因此,凡在本公开实施例的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本公开的保护范围之内。
Claims (9)
1.一种对程序进行仿真的方法,包括:
获取所述程序的源代码,其中,所述程序是逻辑系统设计的仿真程序,所述逻辑系统设计是芯片系统设计,所述源代码包括要监测的第一代码;
编译所述源代码以生成目标代码,其中,所述编译包括将探针模块关联到所述第一代码,所述目标代码包括所述探针模块,包括所述探针模块的目标代码存储在电子设备的内存中;
在所述电子设备上运行所述目标代码;以及
在所述目标代码运行时,响应于所述探针模块已经被执行,在所述内存中将所述探针模块禁用。
2.根据权利要求1所述的方法,其中,将所述探针模块禁用进一步包括:
在所述目标代码中将所述探针模块替换为空白指令。
3.根据权利要求2所述的方法,其中,在所述目标代码中将所述探针模块替换为空白指令进一步包括:
确定所述探针模块的起始地址;
确定所述探针模块的代码长度;以及
根据所述探针模块的起始地址和代码长度,将所述探针模块替换为空白指令。
4.根据权利要求2所述的方法,其中,所述探针模块包括调用指令,所述调用指令被配置为调用预先定义的探针函数,并且在所述目标代码中将所述探针模块替换为空白指令进一步包括:
将所述调用指令替换为所述空白指令。
5.根据权利要求4所述的方法,其中,所述探针函数包括计数器,所述计数器被配置为每当所述第一代码被执行后,其计数值加一。
6.根据权利要求1所述的方法,其中,将探针模块关联到所述第一代码进一步包括:
将所述探针模块插入到所述第一代码之前,以使得所述探针模块和所述第一代码被连续地执行。
7.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如权利要求1至6任意一项所述的方法。
8.根据权利要求7所述的电子设备,其中,所述目标代码存储在所述电子设备的运行内存中。
9.一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机的一组指令,该组指令用于使所述计算机执行权利要求1至6任一所述方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110227090.8A CN112597064B (zh) | 2021-03-02 | 2021-03-02 | 对程序进行仿真的方法、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110227090.8A CN112597064B (zh) | 2021-03-02 | 2021-03-02 | 对程序进行仿真的方法、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112597064A CN112597064A (zh) | 2021-04-02 |
CN112597064B true CN112597064B (zh) | 2021-06-29 |
Family
ID=75207632
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110227090.8A Active CN112597064B (zh) | 2021-03-02 | 2021-03-02 | 对程序进行仿真的方法、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112597064B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114168142A (zh) * | 2021-10-12 | 2022-03-11 | 芯华章科技股份有限公司 | 代码覆盖率的计算方法、电子设备及存储介质 |
CN114707444B (zh) * | 2022-02-09 | 2023-04-28 | 芯华章科技股份有限公司 | 编译验证系统的方法、电子设备及存储介质 |
CN114790982B (zh) * | 2022-03-25 | 2024-03-05 | 浙江迪远医疗器械有限公司 | 血泵运行状态的监测方法、装置、电子设备及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102521123A (zh) * | 2011-11-24 | 2012-06-27 | 西安邮电学院 | 一种基于逻辑执行块的嵌入式软件测试插桩方法 |
CN103970659A (zh) * | 2014-05-16 | 2014-08-06 | 刘玉光 | 基于插桩技术的安卓应用软件自动化测试方法 |
CN105224460A (zh) * | 2015-10-23 | 2016-01-06 | 浪潮电子信息产业股份有限公司 | 一种基于插装技术统计测试覆盖率的方法 |
CN105868626A (zh) * | 2016-03-25 | 2016-08-17 | 中国人民解放军信息工程大学 | 基于控制流粗粒度完整性的监控软件业务行为的方法 |
CN110580226A (zh) * | 2019-09-23 | 2019-12-17 | 上海创景信息科技有限公司 | 操作系统级程序的目标码覆盖率测试方法、系统及介质 |
-
2021
- 2021-03-02 CN CN202110227090.8A patent/CN112597064B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102521123A (zh) * | 2011-11-24 | 2012-06-27 | 西安邮电学院 | 一种基于逻辑执行块的嵌入式软件测试插桩方法 |
CN103970659A (zh) * | 2014-05-16 | 2014-08-06 | 刘玉光 | 基于插桩技术的安卓应用软件自动化测试方法 |
CN105224460A (zh) * | 2015-10-23 | 2016-01-06 | 浪潮电子信息产业股份有限公司 | 一种基于插装技术统计测试覆盖率的方法 |
CN105868626A (zh) * | 2016-03-25 | 2016-08-17 | 中国人民解放军信息工程大学 | 基于控制流粗粒度完整性的监控软件业务行为的方法 |
CN110580226A (zh) * | 2019-09-23 | 2019-12-17 | 上海创景信息科技有限公司 | 操作系统级程序的目标码覆盖率测试方法、系统及介质 |
Non-Patent Citations (1)
Title |
---|
嵌入式软件覆盖测试的插桩技术研究;范海霞;《中国优秀硕士学位论文全文数据库信息科技辑》;20120815(第8期);第1、14-38、55-56页 * |
Also Published As
Publication number | Publication date |
---|---|
CN112597064A (zh) | 2021-04-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112597064B (zh) | 对程序进行仿真的方法、电子设备及存储介质 | |
CN111931445B (zh) | 用于调试逻辑系统设计的方法、仿真器及存储介质 | |
US8121825B2 (en) | Method and apparatus for executing a hardware simulation and verification solution | |
US9836379B2 (en) | Method and system for generating a memory trace of a program code executable on a programmable target | |
CN112287569B (zh) | 用于仿真逻辑系统设计的方法、电子设备及存储介质 | |
CN112100957B (zh) | 用于调试逻辑系统设计的方法、仿真器、存储介质 | |
US10592703B1 (en) | Method and system for processing verification tests for testing a design under test | |
CN115422866A (zh) | 用于在仿真器上仿真逻辑系统设计的方法及相关设备 | |
CN112434478B (zh) | 仿真逻辑系统设计的虚拟接口的方法及相关设备 | |
US10528691B1 (en) | Method and system for automated selection of a subset of plurality of validation tests | |
CN114548027A (zh) | 在验证系统中追踪信号的方法、电子设备及存储介质 | |
CN117910398A (zh) | 仿真逻辑系统设计的方法、电子装置和存储介质 | |
CN112506806B (zh) | 用于调试程序的方法、电子设备及存储介质 | |
CN114328062B (zh) | 校验缓存一致性的方法、装置和存储介质 | |
CN115828805A (zh) | 分割逻辑系统设计的方法、设备及存储介质 | |
CN112131806A (zh) | 验证设计的编译方法、电子设备及存储介质 | |
CN114239445A (zh) | 一种信号采集方法及芯片验证平台 | |
CN112989736B (zh) | 用于检测修改设计的错误实例的方法、设备及存储介质 | |
CN112580297B (zh) | 一种编解码数据的方法、电子设备及存储介质 | |
CN113065302B (zh) | 用于仿真逻辑系统设计的方法、仿真器及可读存储介质 | |
US20240241809A1 (en) | Methods, electronic devices and storage media for executing assertions | |
CN114169287B (zh) | 生成验证环境的连接示意图的方法、电子设备及存储介质 | |
CN114168142A (zh) | 代码覆盖率的计算方法、电子设备及存储介质 | |
CN110321574B (zh) | 一种打印波形的方法和装置 | |
CN114662430B (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 |