多电源电压(MSV)设计为核心技术使用多个电源电压,如图1-1“MSV设计示例”所示。顶层设计和实例inst_A在电压VDD1下操作,而实例inst_B在电压VDD2下操作,实例inst_C在电压VDD3下操作。
在相同操作电压下运行(即使用相同的主电源)的设计部分属于对应于该操作电压的电源域。
设计的稳定状态称为电源状态。纯粹的MSV设计只有一个电源状态,因为假定电源域的操作电压不会改变。
要在操作于不同电压的设计部分之间传递信号,需要电平转换器。电平转换器是一种特殊单元,它有两个独立的电源供应,并把输入电压级别转换为输出电压级别。set_level_shifter命令定义了电平转换器的要求;这包括需要将哪些电源组连接到电平转换器的输入和输出电源引脚。
读取1801设计的工具可以自动推导出电平转换器的输入和输出电源。输入电源组将是驱动逻辑的电源组,输出电源组将是接收逻辑的电源(如果所有接收器都在同一电源上)。对于更复杂的情况,必须使用set_level_shifter命令显式指定输入和输出电源。
图1-1 "MSV设计示例" 展示了每个电源域的典型操作电压。
1.1 示例:完整的MSV IEEE 1801文件
upf_version 2.0
# 定义电源端口和网络
create_supply_port VDD
create_supply_net VDD
connect_supply_net VDD -ports VDD
create_supply_port VDD2
create_supply_net VDD2
connect_supply_net VDD2 -ports VDD2
create_supply_port VDD3
create_supply_net VDD3
connect_supply_net VDD3 -ports VDD3
create_supply_port VSS
create_supply_net VSS
connect_supply_net VSS -ports VSS
# 将电源网络连接到电源域电源组
create_supply_set ss_PD1 -function {power VDD} -function {ground VSS}
create_supply_set ss_PD2 -function {power VDD2} -function {ground VSS}
create_supply_set ss_PD3 -function {power VDD3} -function {ground VSS}
# 创建电源域
create_power_domain PD1 -include_scope -supply {primary ss_PD1}
create_power_domain PD2 -elements {inst_A inst_B} -supply {primary ss_PD2}
create_power_domain PD3 -elements {inst_C} -supply {primary ss_PD3}
# 为LD1创建电平转换器规则 -
# 其电压低于其他域
set_level_shifter LS_PD1_PD2 -domain PD2 -applies_to inputs \
-location self \
-source \
-input_supply_set \
-output_supply_set
set_level_shifter LS_PD1_PD3 -domain PD3 -applies_to inputs \
-location self \
-source \
-input_supply_set \
-output_supply_set
set_level_shifter LS_PD2_PD3 -domain PD3 -applies_to inputs \
-location self \
-source \
-input_supply_set \
-output_supply_set
# 定义每个域的电源状态
add_power_state \
-state ON {-supply_expr {power == `{FULL_ON, 0.8} && ground == `{FULL_ON, 0.0}} \
-simstate NORMAL}
add_power_state \
-state ON {-supply_expr {power == `{FULL_ON, 1.0} && ground == `{FULL_ON, 0.0}} \
-simstate NORMAL}
add_power_state \
-state ON {-supply_expr {power == `{FULL_ON, 1.2} && ground == `{FULL_ON, 0.0}} \
-simstate NORMAL}
add_power_state PD1 \
-state PM1 {-logic_expr { == ON && == ON && == ON}}
1.2 为MSV设计创建IEEE 1801文件的步骤
本节描述了在MSV设计的IEEE 1801文件中包含的信息。本节中始终使用图1-1所示的“MSV设计示例”。
以下与设计相关的信息捕获了电源意图和约束:
- 指定电源域
- 指定电源和地网络以及端口
- 指定供电组
- 将供电组与电源域关联
- 指定每个域允许的电压状态
- 定义系统级电源状态
- 指定创建电平转换器逻辑的规则
最后一个步骤对于物理实现是必需的:
- 指定全局连接
1.2.1 指定电源域
为了识别设计中在同一电压下运行的部分,使用`create_power_domain`命令来指定一个电源域:
create_power_domain power_domain [-elements elements_list]
对于图1-1中的“MSV设计示例”,指定三个域:
create_power_domain PD1 -include_scope -supply {primary ss_PD1}
create_power_domain PD2 -elements {inst_A inst_B} -supply {primary ss_PD2}
create_power_domain PD3 -elements {inst_C} -supply {primary ss_PD3}
*模块属于top域。可以使用`-include_scope`选项或`-elements {.}`来指定top域。
1.2.2 指定电源和地网络以及端口
对于IEEE 1801,可以定义设计中使用的供电端口和网络(电源和地)。供电端口是提供电压供应给设备的外部端口。供电网络是将用于连接设计中的域和各个组件的电源引脚的内部网络。一旦指定,这些电源或地供应可以与电源域关联,并作为特殊单元的连接。
使用以下语法定义电源和地供应:
create_supply_port supply_port_name
create_supply_net supply_net_name
然后,如下所示将供电端口连接到供电网络:
connect_supply_net supply_net_name -port supply_port_name
有关这些命令的完整描述,请参阅IEEE 1801-2013规范。
1.2.3 指定供电组
对于IEEE 1801,低功耗意图的一个基本构建块是供电组。由于供电组是供电网络的捆绑,可以使用供电组来简化供电网络与电源域和特殊单元的连接。也就是说,而不是单独指定每个供电网络,可以使用供电组。
使用以下语法为每个电源域定义供电组:
create_supply_set ss_name [-function {supply_function supply_net}]*
供电组定义了一组功能,如主电源和主地,然后定义哪些供电网络提供这些功能。例如,以下命令指定ss_PD1的主电源由供电网络VDD1提供,地功能由VSS提供:
create_supply_set ss_PD1 -function {power VDD1} -function {ground VSS}
1.2.4 将供电组与电源域关联
要将供电组与电源域关联,请使用`associate_supply_set`命令,如下所示:
associate_supply_set ss_name -handle power_domain.handle
例如:
associate_supply_set ss_PD1 -handle
关联的供电组定义了PD1中任何单元的所有主电源和地引脚将连接到ss_PD1供电组中定义的网络。在这种情况下,这意味着PD1域中的所有主电源引脚将连接到供电网络VDD1。
1.2.5 指定每个域允许的电压状态
对于IEEE 1801,建议为每个电源域使用`add_power_state`命令。使用此命令定义每个指定域允许的操作电压。虽然这不是必需的,但它确实为更复杂的设计提供了非常清晰的电源意图定义。
要指定设计中使用的操作电压,请使用`add_power_state`命令。例如:
add_power_state \
-state ON {-supply_expr {power == `{FULL_ON, 0.8} && ground == `{FULL_ON, 0.0}} \
-simstate NORMAL}
add_power_state \
-state ON {-supply_expr {power == `{FULL_ON, 1.0} && ground == `{FULL_ON, 0.0}} \
-simstate NORMAL}
add_power_state \
-state ON {-supply_expr {power == `{FULL_ON, 1.2} && ground == `{FULL_ON, 0.0}} \
-simstate NORMAL}
如果设计具有pmos或nmos偏置,也可以使用`-supply_expr`选项来指定这些偏置。
1.2.6 定义系统级电源状态
`add_power_state`命令还可以定义系统级的电源状态。系统级电源状态定义了域之间的交互,而不是每个域允许的状态。
通常,电源状态的使用如下:
- 用于IEEE 1801的验证。
- 用于仿真中的覆盖率和断言创建。
- 在运行低功耗设计检查时,验证所有电平转换和隔离要求是否符合电源意图。
纯MSV设计被认为只有一个电源模式,每个电源域应该与一个单一电压相关联。纯MSV设计是使用多个电源电压但没有其他低功耗技术的设计,例如PSO或DVFS方法。
要定义电源状态,请使用`add_power_state`命令:
add_power_state PD1 \
-state PM1 {-logic_expr { == ON && == ON && == ON}}
系统级的`add_power_state`命令应该只使用`-logic_expr`选项指定电源域状态,而不是单独的电源网络。在层次化的IEEE 1801流程中,`logic_expr`也可以引用其他较低级别的系统状态。这样,顶层就不需要指定所有较低级别的域。
1.2.7 指定创建电平转换器逻辑的规则
根据技术需求,当信号通过时,可能需要电平转换器:
- 从电压较低的电源域传递到电压较高的电源域。
- 从电压较高的电源域传递到电压较低的电源域。
在这两种情况下,要创建一个用于电源域之间或一组引脚的电平转换器策略,请使用`set_level_shifter`命令,其中最常见的选项和值包括:
set_level_shifter strategy_name \
-domain domain_name \
-applies_to <inputs|outputs|both> \
-location <parent|self|other> \
-input_supply_set supply_set_name \
-output_supply_set supply_set_name \
-threshold <value|list>
电平转换器策略通常适用于`-applies_to`选项指定的特定域的输入或输出。`-location`选项提供了实现工具应放置隔离单元的指导:要么在指定域的内部(`self`),要么在层次结构的外部(`other`)。
阈值`-threshold`定义了何时插入电平转换,这个选项通常用于避免在电压差异较小时进行电平转换。
对于图1-1所示的“MSV设计示例”,指定如下:
set_level_shifter LS_PD2_inputs \
-domain PD2 \
-applies_to inputs \
-location parent \
-input_supply_set \
-output_supply_set
set_level_shifter LS_PD1_PD3 \
-domain PD3 \
-applies_to inputs -pins {B} \
-location self \
-input_supply_set \
-output_supply_set
set_level_shifter LS_PD2_PD3 \
-domain PD3 \
-applies_to inputs -pins {a} \
-location self \
-input_supply_set \
-output_supply_set
请注意,示例中的`-pins {B}`和`-pins {a}`指定了应用电平转换策略的特定引脚。根据设计和需求,这些引脚名称可能需要调整。此外,`strategy_name`是为电平转换器策略定义的名称,而`domain_name`是应用该策略的电源域的名称。
1.2.8 指定全局连接
如果设计中包含具有非默认或多个电源和地连接的硬宏单元,则必须使用供电网络来指定如何连接全局网络,例如电源和地网络。在本节中使用的例子中,对设计没有特殊需求,因此不需要此命令。但在实践中,这通常用于存储器和其他宏单元。
要指定全局连接,请使用以下命令:
connect_supply_net net_name \
-ports pin_list \
-domain domain
在这个命令中:
- `net_name` 是要连接的供电网络的名称。
- `pin_list` 是一个列表,包含了要连接到该供电网络的引脚名称。
- `-domain domain` 是一个可选参数,用于指定应用此连接的特定电源域。如果省略此参数,连接将适用于所有域。
此命令的使用确保了设计中的硬宏单元能够正确地连接到电源和地网络,从而满足其特定的电源需求。这对于保证设计的整体功能和稳定性至关重要。