电源门控设计验证--RTL仿真
接下来我们考虑在RTL级验证电源门控电路的问题。这是一个挑战,因为硬件描述语言没有在RTL级别提供描述电源连接的机制。为了模拟电源门控,我们需要扩展Verilog—通过修改代码或使用一组单独的命令来描述电源连接和电源切换。
统一功耗格式(UPF)定义了电源门控的语言格式和仿真语义。UPF标准的大部分内容都涉及到电源门控策略的实施:这方面在第11章实现电源门控中进行了讨论。在这里,我们将仅限讨论仿真电源门控的问题。
EDA公司正在迅速实施UPF并提供自动模拟电源门控的能力。对于那些正在使用不支持UPF的模拟器的人来说,可以通过在RTL中添加特殊代码来实现大部分UPF仿真语义,可以手动或通过脚本的方式。
在RTL级别模拟电源门控所需的关键功能包括:
- 电源门控的功能建模(包括在电源门控时强制输出X)
- 隔离单元的功能建模
- 保存和恢复的功能建模
- 电源门控/保持/复位优先级的功能建模
除仿真外,还应增加断言和功能覆盖,以验证控制网络的正确序列和极性。
在RTL中推断电源门控行为
第一步是模拟关闭一个区块的效果。
UPF提供了一种机制(一组tcl命令),用于定义电源域(一组Verilog模块)和电源域的一组电源(电源和地面电源网)。
图5-10显示了我们想要仿真的设计的电源连接。Verilog模块my_module (实例U1)有一个Header开关,用于控制模块中所有逻辑的电源。电源门控控制器下拉pwr_req信号以关闭模块,并确定pwr_req以使模块上电。信号pwr_ack是确认信号,表明交换机已完成上电/下电。在RTL级别,它只是一个pwr_reg的缓冲版本。在门级网表中,它将有真正的延迟。
上述设计的UPF描述可能如下所示:
如果在仿真时包含此UPF代码,则会发生以下情况:
当pwr_req拉低(请求断电)时,开关将关闭U1中的所有单元的电源。也就是说,所有的寄存器都将其输出设置为X,U1的所有输出端口都设置为X。所有进程都变为非活动状态。同时,pwr_ack设置为低,通知电源控制器电源完全关闭。UPF支持为确认信号分配延迟,但对于RTL仿真,我们使用默认的零延迟。
当pwr_req拉高(请求恢复供电),然后开关打开电源到U1中的所有单元。同时,pwr_ack设置为高值,通知电源控制器电源已完全打开。
在RTL中推断电源门控和保持行为
对于使用保留寄存器的设计,下一步是修改RTL以进行行为建模:
•对保持初始化保持状态变量到“X”以在 SAVE 操作之前捕获无效的 RESTORE。
•将寄存器状态采样到用于“SAVE”操作的额外推断保留状态变量
•上电时在所有寄存器输出上强制“X”
•从保留状态重新初始化状态“RESTORE”操作上的变量
•正确建模电源门控/保持/复位/时钟的优先级以确保正确排序
同样,我们可以通过添加到我们的UPF 代码或通过编写脚本来直接修改RTL 来做到这一点。
UPF 提供命令来为保留寄存器以及保存和恢复控制信号指定“始终开启”的电源网络。默认情况下,set_retention 命令会将电源域中的所有寄存器转换为保留寄存器。
UPF指定这些命令以下语义。我们从与之前相同的示例开始:
与添加UPF代码,将表现为如果我们添加了以下两个过程: