在计算机体系结构中,寄存器访问是最基础也是最关键的操作之一。DTI-TBU协议定义了一套完整的寄存器访问机制,用于实现硬件模块间的信息交互与控制。这套机制在设计上兼顾了灵活性和安全性,是理解现代SoC设计中硬件加速器通信的基础。
DTI主设备(DTI master)提供了"实现定义"(IMPLEMENTATION DEFINED)的寄存器,这些寄存器通过特定的消息组进行访问。协议明确规定了几项关键设计原则:
位宽限制:仅支持32位寄存器访问。如果系统实现了64位寄存器,必须通过多个32位访问来完成更新。这种设计主要考虑到与旧系统的兼容性,同时也简化了硬件实现。在实际操作中,对64位寄存器的写入需要特别注意原子性问题,通常建议采用锁机制确保高低32位的写入连续性。
地址空间分配:DTI主设备可以在安全状态(Secure)和非安全状态(Non-secure)下各实现最多128KB的寄存器空间。这个空间被划分为两个64KB的页面:
这种划分方式使得性能监控相关的寄存器可以集中管理,同时也为其他功能寄存器留出了充足的空间。在系统初始化时,软件需要根据这个映射关系正确配置寄存器访问路径。
DTI-TBU协议定义了五种核心消息类型来实现可靠的寄存器访问:
这是由DTI从设备(DTI slave)发起的写寄存器请求。消息格式包含以下关键字段:
markdown复制| 比特位 | 字段名称 | 描述 |
|----------|-----------------|----------------------------------------------------------------------|
| [63:32] | DATA | 要写入的数据 |
| 23 | NS | 安全等级指示:0=安全(Secure),1=非安全(Non-secure) |
| [20:6] | ADDR | 寄存器地址,对未实现寄存器的写入必须被忽略 |
| [3:0] | SLV_MSG_TYPE | 消息类型标识,固定为0110表示DTI_TBU_REG_WRITE |
重要提示:从设备在发起写请求前必须确保没有未完成的寄存器读写操作,否则可能导致状态不一致。在实际硬件设计中,通常需要实现写请求队列和状态机来管理这一约束。
这是主设备对写请求的确认响应,表示写入操作已生效。这个消息非常简单,主要包含消息类型标识(固定为0110表示DTI_TBU_REG_WACK)。从设备只有在收到这个确认后,才能认为写入操作真正完成。
从设备发起的读寄存器请求,格式与写请求类似但有以下区别:
markdown复制| 比特位 | 字段名称 | 描述 |
|----------|-----------------|----------------------------------------------------------------------|
| 23 | NS | 安全等级指示 |
| [20:6] | ADDR | 寄存器地址,对未实现寄存器的读取必须返回0且无其他副作用 |
| [3:0] | SLV_MSG_TYPE | 消息类型标识,固定为0111表示DTI_TBU_REG_READ |
与写操作类似,从设备在发起读请求前也必须确保没有未完成的读写操作。这是防止状态混乱的重要约束条件。
主设备返回的读取数据响应,包含以下关键字段:
markdown复制| 比特位 | 字段名称 | 描述 |
|----------|-----------------|----------------------------------------------------------------------|
| [63:32] | DATA | 读取到的寄存器数据 |
| [3:0] | MST_MSG_TYPE | 消息类型标识,固定为0111表示DTI_TBU_REG_RDATA |
协议特别强调了死锁避免机制:DTI主设备必须能够在不依赖下游事务完成或其他DTI事务进展的情况下响应寄存器访问消息。这意味着:
在实际芯片设计中,这通常通过以下方式实现:
缓存模型是DTI-TBU协议中最复杂的部分之一,它直接影响到系统性能和一致性管理。该模型采用分层设计,通过多级缓存优化地址翻译效率。
TBU(Translation Buffer Unit)实现了三级缓存结构,查找顺序严格固定:
这种分层设计允许快速判断翻译是否全局禁用,然后逐步细化查找范围。协议允许实现上的灵活性——可以物理上合并多个缓存,只要满足以下条件:
每个缓存条目都包含三个关键部分:
全局条目缓存是最顶层的缓存,最多包含三种条目:
这些条目通过DTI_TBU_TRANS_REQ.SEC_SID和DTI_TBU_TRANS_REQ.ATS字段组合索引。
当翻译被全局绕过时使用的条目,包含以下字段:
Tag字段:
Scope字段:
Data字段:
当翻译被全局禁用时使用的条目,结构更简单:
Tag字段:
Scope和Data字段:无
当事务匹配GlobalDisabled条目时,事务必须被中止。这种设计为系统提供了全局禁用翻译的快速路径。
配置缓存是连接流上下文和TLB的关键桥梁,主要功能包括:
配置缓存的条目结构如下:
Tag字段:
Scope字段:
Data字段:
特别值得注意的是BYPASS字段,当该字段为1时表示这是StreamBypassNoSSV条目,即该流的翻译被绕过。
TLB(Translation Lookaside Buffer)是缓存模型的最后一级,也是性能最关键的部分。它使用配置缓存提供的信息来查找保存的指令翻译。
TLB条目包含:
Tag字段:
Scope字段:
Data字段:
TLB查找的特殊之处在于权限检查:即使TLB命中,TBU也必须确保存储的翻译满足新事务的权限要求。如果权限检查失败,则必须请求新的翻译。这种设计确保了即使缓存中存在翻译,也不会绕过权限检查。
ATS(Address Translation Services)是现代I/O设备高效访问内存的关键技术。DTI-ATS协议定义了完整的消息组来实现PCIe设备与SMMU之间的地址翻译服务。
ATS通道的状态管理通过连接与断开消息组实现,这是所有ATS操作的基础。
主设备发起的连接状态变更请求,关键字段包括:
markdown复制| 比特位 | 字段名称 | 描述 |
|----------|-----------------|----------------------------------------------------------------------|
| [23:20] | TOK_INV_GNT | 授予的无效化令牌数(值+1) |
| [19:12] | TOK_TRANS_REQ | 连接时为请求的翻译令牌数,断开时为返回的翻译令牌数 |
| [11:8] | VERSION | 请求的协议版本(目前仅支持DTI-ATSv1) |
| 4 | STATE | 0=断开请求,1=连接请求 |
| [3:0] | MST_MSG_TYPE | 消息类型标识,固定为0000 |
断开请求有严格条件:通道必须处于CONNECTED状态,且没有未完成的翻译请求、页面请求,所有下游事务必须完成,所有ATC必须禁用并无效化。
从设备对连接状态变更请求的响应,关键字段包括:
markdown复制| 比特位 | 字段名称 | 描述 |
|----------|-----------------|----------------------------------------------------------------------|
| [24:21] | OAS | 输出地址大小(32位到52位) |
| 20 | SUP_PRI | 是否支持PCIe ATS PRI消息 |
| [19:12] | TOK_TRANS_GNT | 授予的预分配翻译令牌数(值+1) |
| [11:8] | VERSION | 授予的协议版本 |
| 4 | STATE | 新连接状态(0=DISCONNECTED,1=CONNECTED) |
| [3:0] | SLV_MSG_TYPE | 消息类型标识,固定为0000 |
OAS字段特别重要,它定义了翻译后地址的最大位数,直接影响系统能支持的内存大小。
这是ATS协议最核心的部分,实现了PCIe设备的地址翻译请求流程。
主设备发起的翻译请求,关键字段包括:
markdown复制| 比特位 | 字段名称 | 描述 |
|----------|-----------------|----------------------------------------------------------------------|
| [159:108]| IA | 输入地址(IA[63:12]) |
| [95:76] | SSID | 子流ID(当SSV=1时有效) |
| [63:32] | SID | 流ID |
| 21 | SSV | 子流ID是否有效 |
| 19 | nW | 是否只读访问(0=读写,1=只读) |
| 18 | InD | 是否指令访问 |
| 17 | PnU | 权限级别(0=非特权,1=特权) |
| [15:8] | TRANSLATION_ID | 翻译ID(必须唯一) |
| [7:4] | QOS | 服务质量优先级 |
| [3:0] | MST_MSG_TYPE | 消息类型标识,固定为0010 |
这个请求将输入地址(IA)和流上下文信息发送给TCU(Translation Control Unit)进行翻译。
从设备返回的翻译结果,关键字段包括:
markdown复制| 比特位 | 字段名称 | 描述 |
|----------|-----------------|----------------------------------------------------------------------|
| [159:108]| OA | 输出地址(OA[63:12]) |
| [83:80] | TRANS_RNG | 翻译有效范围(当BYPASS=0)或系统最大地址大小(当BYPASS=1) |
| 72 | GLOBAL | 是否适用于所有子流ID |
| 66 | ALLOW_X | 是否允许指令读取 |
| 65 | ALLOW_W | 是否允许数据写入 |
| 64 | ALLOW_R | 是否允许数据读取 |
| 17 | BYPASS | 是否绕过翻译(0=正常翻译,1=绕过翻译,VA=PA) |
| 12 | UNTRANSLATED | 是否应使用ATS翻译(影响PCIe ATS完成消息中的U位) |
| [11:4] | TRANSLATION_ID | 对应的翻译请求ID |
| [3:0] | SLV_MSG_TYPE | 消息类型标识,固定为0010 |
TRANS_RNG字段特别关键,它定义了翻译的有效范围(4KB到128TB不等),直接影响翻译粒度选择。
当翻译过程中出现错误时返回的消息,关键字段包括:
markdown复制| 比特位 | 字段名称 | 描述 |
|----------|-----------------|----------------------------------------------------------------------|
| [18:17] | FAULT_TYPE | 错误类型(00=InvalidTranslation,01=CompleterAbort,10=UnsupportedRequest) |
| [11:4] | TRANSLATION_ID | 对应的翻译请求ID |
| [3:0] | SLV_MSG_TYPE | 消息类型标识,固定为0001 |
不同的错误类型会导致PCIe端点收到不同的翻译完成状态,影响后续处理流程。
完整的ATS翻译流程涉及多个硬件组件的协作:
SMMU可以配置为三种工作模式:
在实际系统设计中,模式选择需要权衡安全性和性能需求。对于可信的PCIe设备,模式3能提供最佳性能;而对于不可信设备,模式1或2能提供必要的保护。
基于对DTI-TBU协议和ATS协议的深入分析,在实际系统实现中需要注意以下几个关键方面:
批处理操作:对于需要多个32位访问的64位寄存器,建议实现硬件层面的自动批处理机制,减少软件开销。
安全状态处理:NS(Non-Secure)位的正确设置至关重要。建议在硬件设计时实现自动继承机制,避免软件错误配置导致的安全漏洞。
死锁预防:除了协议要求的基本措施外,建议实现:
TLB结构设计:
缓存一致性管理:
配置缓存优化:
令牌管理:
错误处理:
性能监控:
在实际芯片设计中,这些协议功能的实现通常需要RTL设计、验证和性能建模团队的紧密协作。建议采用模块化设计方法,确保各组件能独立验证和优化。同时,应建立全面的测试场景,覆盖各种边界条件和错误情况,确保实现的正确性和鲁棒性。