扩大ARM SoC的验证覆盖缩短仿真时间
时间:07-20
来源:电子设计应用
点击:
软件代码作为激励
对于一个超过1034个组合的验证空间来说,让实际的设备操作执行所有必需组合是不太可能的。应当把重点放在设备会运行的那些操作上,对那些理论上可能不会使用的操作要减少花费时间。最简单快捷的方法是找到可驱动设备的现有代码。这可能是诊断代码,驱动程序代码或应用程序级算法。每个这样的代码均提供了不同的验证级别,并揭露了不同类型的问题,因此,应当尝试获得和使用所有类型的代码。对于新的设计,代码很可能不存在;但对于下一代产品的设计,一些代码常常可以得到。
如果这些代码存在,设计的激励在几乎不耗费精力或成本的情况下就可以得到。如果代码不存在,但合作方愿意在设计周期前期创建代码,那么也可以轻松地创建激励。最后,如果验证团队需要创建代码,通过编写C代码来为设计创建复杂多样的激励比使用任何其它语言都更容易。
假设显示
使用假设显示,需要运行描绘各种测试模式和色彩组合的诊断代码以确保连接。也可以运行驱动程序代码,它可以连接至一个简单的画图应用程序,该应用程序可使用一些代表样本的像素将驱动程序调整至适当位置。最后,采用最终使用这个设备的应用程序,并画出几幅图像。每种类型的代码会以不同的方式运用设计,从而能发现利用其他方法时不容易检测到的问题。
硬件/软件协同验证
很多硬件和验证工程师(甚至在某些方面软件工程师)认为,运行应用程序的任何部分不会加快设计验证。毕竟,如果针对设备测试驱动程序,并针对驱动程序测试了应用程序,就无需进行进一步验证。但是这些工程师不会考虑在尚未系统地测试所有软件的情况下发布产品,也不会接受在未经系统测试的情况下发布要去tapeou的硬件设计。系统级协同验证测试全部的可选组件,包括硬件、软件、或两者的组合,从而揭露在分离情况下不会被发现的问题。
软件覆盖范围
运行软件提供了一个切合实际的激励,但它不可能为验证空间提供足够宽的覆盖范围。软件通常是一遍一遍地重复只具有些微差别的相似操作。因此,这种方法应当结合其它现有验证技术一起使用。同时,运行大量的软件通常不会改善验证效果。在不牺牲验证结果的情况下,通过对软件进行少量修改,能够缩短较长的代码操作。例如,在上述显示设备实例中,向所有位置写数据的诊断程序能够被缩短为只写前3行和最后3行。这样做不会减少覆盖范围,却能使测试速度加快45倍。
划分内存系统
将代码作为设计激励运行时,无疑会令人增加对设计被全面验证的总体信心。并且,在大多数情况下,它能暴露其它验证方法遗漏的设计缺陷。但是,在逻辑仿真中运行代码是非常慢的。逻辑仿真器通常以10Hz到100Hz的速度执行操作。在这样的性能水平条件下,只有少量的代码能够运行。
以执行代码时产生的电路行为为例,连续的九条ARM指令会产生15个总线周期。在这15个总线周期中,只有2个和硬件操作有关。剩余的13个只支持代码的执行,不会对测试的设备产生任何影响。当然,基于处理器高速缓存和缓冲区的设定,并非所有的这些总线周期都能获得处理器上的外部信号。但是,即使总线周期不通过外部驱动,它们也需要由整个电路的仿真器来处理的时钟。降低仿真性能的不是总线周期的电路行为,而是设计中附加的时钟驱动。
把处理器的内存系统分割为I/O空间、代码空间和数据空间时,可分隔这些总线周期,只将I/O周期加入到逻辑仿真中。通过过滤逻辑仿真器中的代码和数据周期,他们能够在不占用仿真时间的情况下得到处理。这使得仿真速度加快。尽管全功能处理器模型执行所有的总线周期和指令,但逻辑仿真只在总线周期处于某一特定范围内时才会进行。这样,逻辑仿真只关注专门针对被验证设备的总线周期。
不参与逻辑仿真的分区内存可以描述为已被软件图像预先初始化的"超级高速缓存"。这种"超级高速缓存"足够大,能容纳全部的软件图像和所有数据,并提供无限的快速访问。能够放置在普通高速缓存中而不影响设计操作的内存,都可以安全地放置在这个"超级高速缓存"中。直接由硬件访问的内存区域是不可缓存的,且必须建模为硬件仿真的一部分,以向硬件提供访问这些内存区域的权限。
增强的性能
回到假设显示模块,使用AMBA总线周期驱动寄存器输入和读取寄存器输出。结果,诊断和驱动程序代码的仿真时间减少了10倍以上,小型画图程序的仿真时间减少了30倍。程序所作的计算不只是将像素复制到屏幕上。它将像素和以前的图像进行比较,只有当数值变化时才写入像素和地址。当软件的复杂性增加时,性能因素也随着提高。仿真吞吐量的增加是由于不需要运行与总线周期相关的时钟。如果软件完成更大的计算量,性能提高会更大。
对于一个超过1034个组合的验证空间来说,让实际的设备操作执行所有必需组合是不太可能的。应当把重点放在设备会运行的那些操作上,对那些理论上可能不会使用的操作要减少花费时间。最简单快捷的方法是找到可驱动设备的现有代码。这可能是诊断代码,驱动程序代码或应用程序级算法。每个这样的代码均提供了不同的验证级别,并揭露了不同类型的问题,因此,应当尝试获得和使用所有类型的代码。对于新的设计,代码很可能不存在;但对于下一代产品的设计,一些代码常常可以得到。
如果这些代码存在,设计的激励在几乎不耗费精力或成本的情况下就可以得到。如果代码不存在,但合作方愿意在设计周期前期创建代码,那么也可以轻松地创建激励。最后,如果验证团队需要创建代码,通过编写C代码来为设计创建复杂多样的激励比使用任何其它语言都更容易。
假设显示
使用假设显示,需要运行描绘各种测试模式和色彩组合的诊断代码以确保连接。也可以运行驱动程序代码,它可以连接至一个简单的画图应用程序,该应用程序可使用一些代表样本的像素将驱动程序调整至适当位置。最后,采用最终使用这个设备的应用程序,并画出几幅图像。每种类型的代码会以不同的方式运用设计,从而能发现利用其他方法时不容易检测到的问题。
硬件/软件协同验证
很多硬件和验证工程师(甚至在某些方面软件工程师)认为,运行应用程序的任何部分不会加快设计验证。毕竟,如果针对设备测试驱动程序,并针对驱动程序测试了应用程序,就无需进行进一步验证。但是这些工程师不会考虑在尚未系统地测试所有软件的情况下发布产品,也不会接受在未经系统测试的情况下发布要去tapeou的硬件设计。系统级协同验证测试全部的可选组件,包括硬件、软件、或两者的组合,从而揭露在分离情况下不会被发现的问题。
软件覆盖范围
运行软件提供了一个切合实际的激励,但它不可能为验证空间提供足够宽的覆盖范围。软件通常是一遍一遍地重复只具有些微差别的相似操作。因此,这种方法应当结合其它现有验证技术一起使用。同时,运行大量的软件通常不会改善验证效果。在不牺牲验证结果的情况下,通过对软件进行少量修改,能够缩短较长的代码操作。例如,在上述显示设备实例中,向所有位置写数据的诊断程序能够被缩短为只写前3行和最后3行。这样做不会减少覆盖范围,却能使测试速度加快45倍。
划分内存系统
将代码作为设计激励运行时,无疑会令人增加对设计被全面验证的总体信心。并且,在大多数情况下,它能暴露其它验证方法遗漏的设计缺陷。但是,在逻辑仿真中运行代码是非常慢的。逻辑仿真器通常以10Hz到100Hz的速度执行操作。在这样的性能水平条件下,只有少量的代码能够运行。
以执行代码时产生的电路行为为例,连续的九条ARM指令会产生15个总线周期。在这15个总线周期中,只有2个和硬件操作有关。剩余的13个只支持代码的执行,不会对测试的设备产生任何影响。当然,基于处理器高速缓存和缓冲区的设定,并非所有的这些总线周期都能获得处理器上的外部信号。但是,即使总线周期不通过外部驱动,它们也需要由整个电路的仿真器来处理的时钟。降低仿真性能的不是总线周期的电路行为,而是设计中附加的时钟驱动。
把处理器的内存系统分割为I/O空间、代码空间和数据空间时,可分隔这些总线周期,只将I/O周期加入到逻辑仿真中。通过过滤逻辑仿真器中的代码和数据周期,他们能够在不占用仿真时间的情况下得到处理。这使得仿真速度加快。尽管全功能处理器模型执行所有的总线周期和指令,但逻辑仿真只在总线周期处于某一特定范围内时才会进行。这样,逻辑仿真只关注专门针对被验证设备的总线周期。
不参与逻辑仿真的分区内存可以描述为已被软件图像预先初始化的"超级高速缓存"。这种"超级高速缓存"足够大,能容纳全部的软件图像和所有数据,并提供无限的快速访问。能够放置在普通高速缓存中而不影响设计操作的内存,都可以安全地放置在这个"超级高速缓存"中。直接由硬件访问的内存区域是不可缓存的,且必须建模为硬件仿真的一部分,以向硬件提供访问这些内存区域的权限。
增强的性能
回到假设显示模块,使用AMBA总线周期驱动寄存器输入和读取寄存器输出。结果,诊断和驱动程序代码的仿真时间减少了10倍以上,小型画图程序的仿真时间减少了30倍。程序所作的计算不只是将像素复制到屏幕上。它将像素和以前的图像进行比较,只有当数值变化时才写入像素和地址。当软件的复杂性增加时,性能因素也随着提高。仿真吞吐量的增加是由于不需要运行与总线周期相关的时钟。如果软件完成更大的计算量,性能提高会更大。
- 高带宽嵌入式应用中SoC微控制器的新型总线设计 (02-02)
- SoC前段(ARM)嵌入式系统开发实作训练(上) (02-28)
- SoC前段(ARM)嵌入式系统开发实作训练(下)(02-28)
- 采用灵活的汽车FPGA 提高片上系统级集成和降低物料成本(04-28)
- 开放源码硬件简史(05-21)
- 可配置处理器技术优势详解(05-15)