自动实现半导体器件系统强化测试的方法
将任意数据样式填充到随机源地址的任意大小的存储器块中,然后任意选择一个存储器---存储器DMA通道,编程为将源地址的数据样式复制到随机选择的目的地址。当DMA结束中断发生时,检查两个存储器区域是否匹配。
3) DMA---外设(TE_DMA_M2P):
将任意数据样式填充到随机源地址的任意大小的存储器块中,然后任意选择一个存储器---存储器DMA通道,编程为将数据样式复制到特定外设的任意端口号中。当DMA结束中断发生时,检查外设的FIFO中是否包含了正确的数据(或者被发送到外设)。
4) 高速缓存切换(TE_CACHE):
将高速缓存从1切换到0或从0切换到1并退出。这个测试模块是一个纯事件测试模块,运行时不执行检验操作。
假设框架有三个时隙定时器用来启动测试事件模块,那么启动它的main( )例程位于时隙0,具体运行时可能与列表2所示类似。
(列表2)
运行开始时执行存储器复制测试。执行过程中,时隙2定时器在复制中途定时截止。此时,高速缓存测试事件模块被启动,它切换高速缓存的状态并退出。复制测试在 高速缓存处于新设置的状况下继续执行。在测试完成之前,时隙1定时器又截止,此时一个DMA存储器---端口测试模块被启动,它设置任意的DMA通道并退 出。现在,DMA已在后台执行,而原来的复制测试又重新运行。随后又发生一个时隙3定时器中断,使用DMA通道5启动存储器---存储器传输并退出。这种 安排还可以继续下去,但已经可以看到,通过这个测试,可以让所有的DMA通道同时运行,高速缓存随机切换,而且CPU在测试过程中随机访问不同的存储器区 域。
测试参数
测试事件模块将使用一个或多个随机选择的测试参数来执行测试操作。常见的测试参数如:源和目的存储器地址、块大小、数据样式、读写宽度(如8、16或32位)、DMA通道和UART端口。
虽然随机地选择测试事件函数看起来比较简单,但究竟应当如何选择随机测试参数值,同时确保这些值对系统有效,而且不与其它测试发生交叠从而导致干扰呢?例 如,如果某个测试选择一个随机的存储器地址和大小,需要知道(1)存储器确实存在;(2)其它测试没有选择与这片存储器交叠的存储器区域(因为一个测试有 可能改写另一个测试的存储器并导致故障)。另一个资源竞争的例子是,两个测试都随机地选中同一个DMA通道来进行数据传输。
框架提供的支持功能使测试模块可以安全地选择任意测试参数。为了帮助理解这一点,这里举一个最常用的测试参数的例子:随机选择的系统存储器块。随机选择的存 储器块有一个起始地址值和一个大小值,它都是随机数值。这个存储器块可以位于CPU地址空间的任何位置,包括在SRAM、PCMCIA或Flash存储器 中。
在列表3所示的例子中,memPool数组中填入了存储器段的起始地址和大小,它位于系统的地址空间中,可供测试进行随 机选择。每个条目都有一个保留标志(inUse项)。为了选择一个随机存储器块,函数首先选择一个随机的指向存储器段数组的索引。然后在这个段中选择一个 随机的起始地址和大小。最大块的大小值是存储器段的结束地址减去所选的起始地址。一旦随机块的起始地址和大小选定了,整个存储器段就通过设置保留标志被标 记为保留。
列表3:随机存储器块选择
============================
typedef struct
{
uint32_t start_addr;
uint32_t size;
bool inUse;
} memSeg;
memSeg memPool[] =
{
/* start addr size inUse */
{ 0x10000000,0x00040000, 0},
{ 0x10040000,0x00040000, 0},
{ 0x10080000,0x00040000, 0},
{ 0x100c0000,0x00040000, 0},
{ 0x30000000,0x00040000, 0},
{ 0x30040000,0x00040000, 0},
{ 0x30080000,0x00040000, 0},
{ 0x300c0000,0x00040000, 0},
{ 0x30100000,0x00008000, 0},
{ 0x40004000,0x00004000, 0},
{ 0x40008000,0x00004000, 0},
{ 0x4000c000,0x00004000, 0},
{ 0xa0000000,0x00002000, 0},
{ 0xb0000000,0x00008000, 0},
{ 0xb0008000,0x00008000, 0},
{ 0xb0010000,0x00004000, 0}
};
int SelectAndReserveBlock(unsigned int *addr, unsigned int *size)
{
int retries=0; /* limit the number of times we try to get a segment */
int seg;
while(retries < MAX_RETRY_COUNT)
{
/* Select a random memory segment (index into memPool array) */
seg = GetRandomNumber(sizeof(memPool)/sizeof(memSeg));
if (memPool[seg].inUse)
{
retries++;
continue;
}
/* reserve the segment */
memPool[seg].inUse = 1;
/* select random block in segment, and don't let it run past the end
- 频宽、取样速率及奈奎斯特定理(09-14)
- 为什么要进行信号调理?(09-30)
- IEEE802.16-2004 WiMAX物理层操作和测量(09-16)
- 为任意波形发生器增加价值(10-27)
- 基于PCI 总线的高速数据采集系统(09-30)
- 泰克全新VM6000视频测试仪助力数字电视等产品测试 (10-06)