在嵌入式系统设计中,直接内存访问控制器(DMAC)作为数据搬运的核心组件,其可靠性直接影响整个系统的稳定性。ARM DMAC采用分层测试架构,包含功能验证和集成测试两个主要部分。测试架构的核心是通过专用寄存器实现对输入信号的捕获和输出信号的激励,这种设计使得工程师能够在系统集成阶段快速定位信号连接问题。
测试架构主要解决三类关键问题:
测试控制寄存器(DMACITCR)是整个测试架构的中枢,其bit0(T位)控制测试模式的切换:
重要提示:在切换测试模式前,必须确保所有DMA通道已停止工作,否则可能导致总线死锁。实际项目中我们通常先读取通道状态寄存器确认无活动传输后再进行模式切换。
DMACITCR寄存器(偏移地址0x500)是16位宽的可读写寄存器,复位时自动清零。寄存器布局如下:
| 比特位 | 名称 | 描述 |
|---|---|---|
| [31:1] | - | 读取值未定义,写入时必须为0 |
| [0] | T | 测试模式使能位:0=正常模式,1=测试模式 |
在BIST(内建自测试)场景下,我们需要按照特定序列操作该寄存器:
控制DMACCLR[15:0]输出信号,寄存器结构:
| 比特位 | 名称 | 描述 |
|---|---|---|
| [31:16] | - | 保留位 |
| [15:0] | DMACCLR | 可设置/读取DMACCLR输出信号值 |
在验证DMA清除信号时,典型测试流程包括:
控制DMACTC[15:0]终端计数信号,用法与DMACITOP1类似,但在实际测试中需注意:
特殊的中断请求控制寄存器,其bit[1:0]分别控制:
注意:由于DMACINTR信号是DMACINTERR和DMACINTTC的逻辑或,测试时若同时设置E和TC位,会导致DMACINTR持续有效。建议在中断测试时采用单bit验证方式。
非AMBA信号的测试通过以下软请求寄存器实现:
| 信号组 | 控制寄存器 | 读取寄存器 |
|---|---|---|
| DMACxBREQ[15:0] | DMACSoftBReq | DMACSoftBReq |
| DMACxSREQ[15:0] | DMACSoftSReq | DMACSoftSReq |
| DMACxLBREQ[15:0] | DMACSoftLBReq | DMACSoftLBReq |
| DMACxLSREQ[15:0] | DMACSoftLSReq | DMACSoftLSReq |
测试案例:验证外设请求信号线连接
c复制// 测试DMACBREQ0信号线
void test_dmacbreq0(void)
{
// 步骤1:设置测试模式
write_reg(DMAC_BASE + 0x500, 0x0001);
// 步骤2:通过软请求寄存器模拟信号输入
write_reg(DMAC_BASE + DMACSoftBReq_OFFSET, 0x0001);
// 步骤3:读取寄存器值验证信号状态
uint32_t val = read_reg(DMAC_BASE + DMACSoftBReq_OFFSET);
if((val & 0x01) != 0x01) {
printf("DMACBREQ0 line test failed!\n");
}
// 步骤4:恢复正常模式
write_reg(DMAC_BASE + 0x500, 0x0000);
}
输出信号测试需配合示波器或逻辑分析仪进行,关键步骤包括:
常见问题排查:
ARM DMAC为扫描测试提供了专用控制信号:
在芯片级DFT(可测试性设计)中,DMAC扫描链通常按以下原则集成:
采用ATPG(自动测试向量生成)技术时,需特别关注:
覆盖率提升技巧:
在实际项目中,我们总结出寄存器配置的黄金法则:
当DMAC工作在异步时钟域时,测试需特别注意:
建议将DMAC测试集成到芯片级自动化测试框架中,典型实现包括:
一个典型的测试用例结构:
python复制class DmacTest(unittest.TestCase):
def setUp(self):
self.dmac = DmacController()
self.analyzer = LogicAnalyzer()
def test_interrupt_signal(self):
# 配置测试模式
self.dmac.write_register(0x500, 0x0001)
# 设置中断测试
self.dmac.write_register(0x50C, 0x0001)
# 验证中断信号
result = self.analyzer.capture_signal('DMACINTR')
self.assertTrue(result, "Interrupt signal test failed")
def tearDown(self):
self.dmac.reset()
通过合理运用测试寄存器和系统化的验证方法,可以确保DMAC在各类数据传输场景下的稳定工作。在实际项目中,建议将本文介绍的测试方案纳入芯片验证计划,并在流片前完成至少三轮完整的测试循环。