AHB 安全属性:HPROT 编码与 HNONSEC 安全态、TrustZone 桥接映射
更新时间:2026-09-25。本文是「集成电路大类 · 芯片设计」接口主题簇里的一篇长尾文。AHB5 传输协议 介绍了 HTRANS/HBURST/HRESP 的完整传输流程,但一笔访问除了「往哪传、传多少」,还带着一组「以什么身份、按什么内存类型传」的元信息。在 AHB 上它们分成两条线:
HPROT[3:0]描述内存类型与特权级,HNONSEC单独描述安全态。做 TrustZone 系统或跨协议桥接时,这两个信号的映射是绕不开的细节。
本文要回答的问题
HPROT[3:0]每一位分别编码什么,数据/指令、特权级、可缓存/可缓冲、可预取怎么对应?- 经典 AHB 的
HPROT[1:0]和 AHB5 的HPROT[3:0]是什么关系? HNONSEC=0/1各代表什么,为什么安全态不塞进 HPROT 而要单独一根线?- 一个非安全主设备和一个安全主设备发出的访问,在总线上有什么区别?
- AXI 的
ARPROT、APB 的PPROT与 AHB 的HPROT/HNONSEC之间怎么映射,桥接时哪里最容易错?
一、HPROT:地址相位上的保护属性总线
HPROT 是与 HADDR、HTRANS、HWRITE 同一组的地址相位控制信号,主机在地址相位驱动,slave 和互连在 HREADY 有效时采样,遇到等待态随地址一起保持。它不参与总线握手,也不改变数据拍的数量,作用是告诉下游「这笔访问是什么性质」:CPU 取指还是读写数据、内核态还是用户态、能不能进 cache、能不能写缓冲合并。下游据此决定能否缓存、能否预取、是否允许访问某些受保护的寄存器区间。
需要先建立一个版本概念:经典 AHB(AMBA 2)只有 HPROT[1:0],仅区分数据/指令和「可缓存可缓冲」这一组混合属性,没有特权位;AHB5 把它扩成 HPROT[3:0],拆开了可缓冲与可缓存、补上了特权级,同时引入 HNONSEC。因此看到代码里接口位宽是 2 还是 4,就能直接判断挂的是哪一代协议。AHB5 互连向下兼容时,老的 2 位主设备需要补齐缺失位的缺省驱动。
二、HPROT[3:0] 编码逐位拆解
AHB5 中四个位各自独立,低两位沿用经典定义、高两位为新增:
| 位 | 名称 | =0 | =1 | 典型用途 |
|---|---|---|---|---|
| HPROT[0] | Data/Instruction | 数据访问 | 指令取指 | slave 可对指令读做不同预取策略 |
| HPROT[1] | Bufferable | 不可缓冲 | 可缓冲 | 写经桥接器时允许缓冲、合并 |
| HPROT[2] | Privileged | 非特权(用户态) | 特权(内核态) | 保护模式寄存器、MPU 判定 |
| HPROT[3] | Cacheable/Prefetchable | 不可缓存、不可预取 | 可缓存(读可预取) | cache、预取器、推测访问闸门 |
几点解读。第一,HPROT[0] 描述的是访问的来源,不是地址内容:同一地址既可能被取指读、也可能被数据读,两条路径的属性可以不同。第二,HPROT[1] 与 [3] 必须分开理解——经典 AHB 把两者捆在一起,AHB5 拆开后,设备寄存器通常是不可缓冲也不可缓存(00),普通内存写可缓冲可缓存(11),而写透型内存可以「不可缓存但可缓冲」。可缓冲的核心含义是下游桥接器可以先收下写、稍后送达,因此写入顺序和错误回报都会被延迟,强序外设绝不能置位。第三,HPROT[2] 的特权级来自处理器的执行模式,slave 可以用它实现廉价的寄存器保护,但是否检查完全由 slave 自定,协议不强制。第四,对读访问,HPROT[3]=1 还隐含「允许预取」,互连和 slave 可以发起地址之外的推测读取;挂 FIFO 这类读一次就变化(read-sensitive)的外设必须让该位为 0。
三、HNONSEC:安全态的唯一携带信号
HNONSEC 同样在地址相位有效,但它独立于 HPROT,只有两种取值:HNONSEC=0 表示安全访问(Secure),HNONSEC=1 表示非安全访问(Non-secure)。注意信号是低电平有效语义的命名——0 才是安全,初学时最容易记反。
TrustZone 把系统地址空间在逻辑上切成 Secure 与 Non-secure 两个世界:安全主设备(如安全核、加解密引擎)可以发两种访问,访问安全外设时 HNONSEC=0,代表安全世界主动访问普通世界内存(例如处理器页表里的 NS 位)时发 HNONSEC=1;非安全主设备发出的永远是 HNONSEC=1,它的主接口上这根线通常被互连直接 tie 高、甚至不引出端口。下游的安全 slave 与安全过滤器(如 TZC 区域地址检查器)据此判定:非安全访问命中安全地址区间就被拦截,可返回 ERROR 或由解码器直接兜底到默认 slave。
为什么安全态不并进 HPROT?关键在于安全模型要求它不可被普通主机软件伪造。HPROT 各位由主机按访问类型自由驱动,而 HNONSEC 在非安全主接口上被硬件强制为 1,非安全软件无论如何配置都造不出一笔 HNONSEC=0 的访问。独立信号加上主接口级的硬件固定,构成了隔离的物理基础,这和 安全飞地入门 的隔离原则一致。
四、TrustZone 桥接映射:AXI、APB 与 AHB 的属性转换
跨协议桥(AXI 主设备挂 AHB 互连、AHB 下沉到 APB 外设)必须逐位搬移这组属性。AXI 的保护信号是 AxPROT[2:0],编码顺序与 AHB 完全不同;APB5 则有 PPROT[2:0]。
| 语义 | AHB5 | AXI AxPROT | APB5 PPROT |
|---|---|---|---|
| 非特权 / 特权 | HPROT[2] 0/1 | AxPROT[0] 0/1 | PPROT[0] 0/1 |
| 安全 / 非安全 | HNONSEC 0/1 | AxPROT[1] 0/1 | PPROT[1] 0/1 |
| 数据 / 指令 | HPROT[0] 0/1 | AxPROT[2] 0/1 | PPROT[2] 0/1 |
| 可缓冲 / 可缓存 | HPROT[1]/[3] | AxCACHE(独立编码) | 不携带(APB 不缓存) |
映射的坑非常集中。其一是位序:三根线语义相同但位号各异,AXI→AHB 桥里必须做 AxPROT[0]→HPROT[2]、AxPROT[1]→HNONSEC、AxPROT[2]→HPROT[0] 的交叉连接,直接按位号并接是桥接 RTL 最常见的低级错误。其二是安全语义的电平方向:三处都是 1=非安全,方向一致,但安全过滤的裁决点只能有一个——若桥和下游 TZC 都做检查,要明确各自的地址分工,避免安全访问被误杀。其三是缓存属性:AXI 用 4 位 AxCACHE 独立表达 bufferable/cacheable/allocate,需要按 AHB5 规约给的推荐表折算成 HPROT[1]/[3],反向(AHB→AXI)则要补出合理的 AxCACHE。其四是 APB 下沉:经典 APB 外设没有安全概念,AHB/APB 桥应把 HNONSEC 转成 PPROT[1] 并由支持安全检查的 APB slave 裁决,老外设直接忽略该位,此时安全过滤必须放在桥的上游。
五、RTL 与验证要点
RTL 层面:slave 若要使用 HPROT/HNONSEC,必须与其他地址相位信号一起寄存一拍,在数据相位按寄存值裁决,避免连续流水线访问时属性错位;非安全主接口显式 tie HNONSEC=1,不要悬空留下可被推断的空间。
验证层面至少覆盖四类定向场景:特权与非特权访问命中受保护寄存器,比对 HPROT[2] 与访问结果;安全主设备分别以 HNONSEC=0/1 访问两个世界的区间,确认越界访问被拦并返回约定的 ERROR;非安全主设备访问安全区间必须全部被过滤,且过滤器不得泄漏从机数据;跨桥用例在桥的两侧同步采样属性总线,逐拍核对位序映射。记分板应把「地址 + HPROT + HNONSEC」作为一笔事务的完整身份入队,而不能只记地址——同一地址在两种安全态下是两个不同的访问目标。协议传输与 ERROR 时序的配合见 AHB5 传输协议,桥接的整体设计可参考 AHB/APB 与桥接。
这一篇在知识体系里的位置
协议全貌见 AMBA 入门 与 AHB5 传输协议;AXI 一侧对应的属性信号见 AXI Cache 与 PROT 属性;下沉 APB 的时序与桥接见 AHB/APB 与桥接;安全隔离的整体概念见 安全飞地入门 与 硬件信任根;与安全态无关但同样属于地址相位控制的拍宽信号见 AHB HSIZE 与拍地址。
总结
AHB 在地址相位用 HPROT[3:0] 独立编码数据/指令、可缓冲、特权级、可缓存/可预取(经典 AHB 只有低两位),并用单独的 HNONSEC 表达安全态(0 安全、1 非安全),非安全主接口上该位被硬件强制为 1 从而不可伪造;跨协议桥接时特权/安全/指令三位要在 AXI AxPROT、AHB、APB PPROT 之间按位号交叉映射,缓存属性经 AxCACHE 折算,安全过滤的裁决点必须明确,验证则要把 HPROT 与 HNONSEC 作为事务身份的一部分逐拍核对。