在本文中,我们将介绍五个广泛使用的特殊寄存器,即:别名、影子、间接、锁定和触发缓冲寄存器。
在当今的 SoC 中,我们看到了系统架构、节点大小、互连、安全、编程语言和开发工具等领域的许多创新。有时,我们低估了作为 SoC 架构师、验证工程师、硬件设计师或软件/固件开发人员在日常工作中使用的简单创新的重要性和影响。
特别是,让我们检查与硬件/软件接口层相关的创新——软件应用程序与硬件外围设备通信。具体来说,在寄存器空间中,视频编解码器、蓝牙或 Wi-Fi 等硬件外围设备从处理器上执行的软件应用程序接收配置、控制和功能。十年前在设计寄存器时,我们只需要RO、WO、RW、RC、RS、WS等的组合。但今天的SoC已经变得如此复杂,以至于我们不得不创新并想出更多创造性的方式来设计寄存器。在本文中,我们将介绍五个广泛使用的特殊寄存器,即;别名、影子、间接、锁定和触发缓冲寄存器。
别名寄存器
这是一种可从同一地址映射中的多个地址访问的寄存器类型,但在物理上它是一个寄存器。别名寄存器中的字段根据用于访问它们的地址具有不同的行为。如图 1 所示,RegA 中的字段在使用 0x1000 地址访问时是可读写的,但在从 0x2000 地址访问时是 write-1-to-clear。创建别名寄存器时应应用的一些指导:别名寄存器的硬件访问为 NA;字段不能是已别名字段的别名;并且别名字段的父寄存器不能是外部的。
影子寄存器
当您的软件应用程序需要覆盖所有寄存器但数据需要稍后恢复时,解决方案是使用影子寄存器。通过寄存器总线写入寄存器的数据应自动复制或映射到地址映射中的另一个寄存器。如图 2 中的示例所示,将 OriginalReg 中的数据复制到 ShadowReg。ShadowReg 可以从总线访问,但对原始寄存器没有影响。几个影子寄存器可以影子一个原始寄存器。
间接寄存器
一些寄存器或内存位置不能通过专用地址直接访问,它们被称为间接寻址寄存器或简称为间接寄存器。两个寄存器用于访问一个间接寄存器。
为了将值存储到间接寄存器数组中,使用基址寄存器来保存实际地址。该指令检查基址寄存器,将其值解释为寄存器数组中的地址位置,并将保存在数据寄存器中的值放入该位置。为了从间接寄存器数组加载一个值,还使用了一个基址寄存器。该基址寄存器保存实际地址。该指令检查基址寄存器,将其值解释为地址,获取存储在该位置的值,然后将其加载到数据寄存器中。
如图 3 中的示例所示,Reg1 指定了内存数组的索引。Reg2 指定要写入的数据或存储从内存中读取的值。Reg2 需要一个用于间接寄存器大小的“深度”属性。
锁定寄存器
如果状态机保护在寄存器后面,只能由存储在另一个寄存器中的密钥启动,锁定寄存器可能是解决方案。根据某个其他寄存器的字段值,任何可写寄存器或字段都可以被保护/锁定不被写入。这样的寄存器称为锁定寄存器。锁定寄存器和保护/密钥寄存器可以在不同的寄存器组中,但不能在不同的块中。如图 4 中的示例所示,由属性“lock”指定的锁定寄存器由一个简单的表达式lock=RegA.f1 定义,这意味着寄存器 Lockreg 根据字段“f1”的值被锁定而不能写入寄存器“RegA”,关键寄存器。锁定机制也可以通过更复杂的表达式来定义,例如锁定 = regA.FldA || regB.Lock_fld == 8‘b00000001 && regA.FldA == 4’b0011。这个复杂的表达式由不同的寄存器字段组成。在这种情况下,如果锁定表达式中的每个条件在运行时都为真,则寄存器的软件写访问被锁定。
触发缓冲寄存器
有时需要从硬件侧将大小大于总线宽度的寄存器作为一个原子单元写入和读取。这样的寄存器是从软件侧顺序写入/读取的。这可以通过在与触发事件相关的内存空间中创建一个 N 寄存器缓冲区来实现。当触发事件发生时,写入/读取发生在/从缓冲区到硬件端可用的实际寄存器。触发事件可以是对最低有效位或最高有效位寄存器的读/写。例如,如图 5 所示,RegA 是宽硬件寄存器,宽寄存器 Reg.A1 的 MSB 是触发器。Reg.A2 和Reg.A3 是对应宽硬件寄存器字段的缓冲区。
下一步是学习如何在 IP-XACT 或 SystemRDL 中定义这些特殊寄存器。还需要学习如何在 RTL 中对其进行编码,并创建 UVM 寄存器模型并完成 UVM 测试平台以进行验证。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !