IEEE1801 UPF 编写指南-设计

时间:2024-11-18 06:59:31

使用电源关闭(PSO)的设计是一种设计,其中一些部分电源可以根据需要打开和关闭,以节省漏电和动态功耗。

逻辑块(层次实例)、叶实例和使用相同的主电源并且可以同时打开或关闭的引脚被认为属于同一电源域。图2-1,“带PSO的设计示例”,有三个电源域:

设计的*别,top,和层次实例,inst_C 和 pm_inst,始终处于开启状态:它们属于域PD1。

层次实例inst_A和inst_B始终同时被打开和关闭:它们属于电源域PD2。

层次实例inst_D可以独立于层次实例inst_A和inst_B被打开和关闭:它属于电源域PD3。

图2-1 PSO设计示例

电源域PD1永远不会被关闭电源。它被称为一个不可切换的域。

电源域PD2和PD3可以被关闭电源。它们被称为可切换域。

在设计的一个稳定状态下,有些电源域被打开,有些电源域被关闭,这被称为电源状态。在电源状态下,每个电源域在特定的电压下运行。表2-1,“电源状态”,展示了示例设计的三种电源状态。

表2-1 电源状态

为了防止关闭电源的电源域中出现的未知值传播到仍然供电的域,需要使用隔离单元。这些隔离单元通常放置在关闭电源的电源域的边界上,或者是接收关闭电源信号的域的输入边界。然而,根据需要,也可以在中间域边界插入隔离单元。

为了帮助关闭电源的块恢复正常操作,可以使用状态保持单元来保持一些顺序单元在关闭电源之前的先前状态。由于这些单元保留了它们的状态,它们在电源周期后不需要被重置或重新配置。这允许设备更快地恢复正常操作,在某些情况下,可以继续其在处理中的中断点

对于可切换域,需要指示电源是如何连接和断开门电路的。

- 对于内部可切换域,必须添加电源开关逻辑。

- 对于外部可切换域,电源开关逻辑不是芯片的一部分,因此可能没有控制信号。在IEEE 1801中,`add_power_states`命令将定义状态,以指示域是否可以关闭电源。在仿真中,测试台将驱动可切换引脚的电压。

对于这个示例,我们假设电源域PD2和PD3是内部可切换域。

使用特殊的控制信号来关闭电源域,启用状态保持,并控制电源开关逻辑的工作。表2-2,“控制电源域的信号”,显示了这个示例中使用的信号。

表2-2 控制电源域的信号

当一个域是可切换的时候,它通过内部或外部电源开关逻辑从另一个电源域获取电力。

在这个例子中,电源域PD2和PD3从电源域供电网络VDD获取电力,因此VDD将成为两个电源开关的输入电压。

电源域中的大多数实例由相同的电源供电。对于可切换域,它是(主要)电源域的主要电源和地网络。这个供电自动附加到该域所有实例的电源和地引脚(跟随引脚)。在IEEE 1801中,电源网络和连接是使用供电组定义的。

另一方面,隔离单元和状态保持单元由多个电源供电。

这些特殊的低功耗实例可以有两组电源和地引脚,并且每个的供电组可以在1801文件中明确定义。

使用`create_power_domain`命令时,隔离供电组定义了隔离单元的默认附加供电,而保持供电组定义了保持单元的附加供电。

这些可以通过在`set_isolation`和`set_retention`命令上明确定义的供电组来重写。

如果设计可以在不同的电源模式下运行,需要检查设计不仅在典型条件下,而且在稍微不同的操作条件适用时,是否在每种模式下都能正确功能。

IEEE 1801文件将只定义名义操作电压,并不指定任何相关的时序信息。

对于多模式、多角落时序分析,需要在特定于工具的设计文件中指定额外的视图和约束。

2.1 示例:完整的PSO IEEE 1801文件

upf_version 2.0

# 定义电源端口和网络

create_supply_port VDD

create_supply_net VDD

connect_supply_net VDD -ports VDD

create_supply_port VSS

create_supply_net VSS

connect_supply_net VSS -ports VSS

create_supply_net VDD2

create_supply_net VDD3

# 将电源网络连接到电源域供电组

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}

set_port_attributes -ports [find_objects . -pattern * -object_type port] \

   -driver_supply -receiver_supply

# 指定可切换域输出的隔离约束

set_isolation iso2 \

-domain PD2 \

-applies_to outputs \

-isolation_supply_set \

-location parent \

-isolation_signal {pm_inst/ice_enable[0]} \

-clamp_value 0

set_isolation iso3 \

-domain PD3 \

-applies_to outputs \

-isolation_supply_set \

-location parent \

-isolation_signal {pm_inst/ice_enable[1]} \

-clamp_value 0

# 为可切换域指定保持

set_retention st2 \

-domain PD2 \

-save_signal {pm_inst/pge_enable[0] high} \

-restore_signal {pm_inst/pge_enable[0] low} \

-retention_supply_set

set_retention st3 \

-domain PD3 \

-save_signal {pm_inst/pge_enable[1] high} \

-restore_signal {pm_inst/pge_enable[1] low} \

-retention_supply_set

# 定义每个域的电源状态

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.0} && ground == `{FULL_ON, 0.0}} \

-simstate NORMAL} \

-state OFF { -supply_expr {power == `{OFF} && ground == `{FULL_ON, 0.0}} \

-simstate CORRUPT}

add_power_state \

-state ON { -supply_expr {power == `{FULL_ON, 1.0} && ground == `{FULL_ON, 0.0}} \

-simstate NORMAL} \

-state OFF { -supply_expr {power == `{OFF} && ground == `{FULL_ON, 0.0}}

-simstate CORRUPT}

# 添加系统级状态

add_power_state PD1 \

-state PM1 {-logic_expr { == ON && == ON && == ON }}

add_power_state PD1 \

-state PM2 {-logic_expr { == ON && == OFF && == ON }} \

-update

add_power_state PD1 \

-state PM3 {-logic_expr { == ON && == OFF && == OFF }} \

-update

add_power_state PD1 \

-state PM4 {-logic_expr { == ON && == ON && == OFF }} \

-illegal \

-update

# 创建电源开关

create_power_switch PD2_sw \

-domain PD2 \

-output_supply_port {vddo } \

-input_supply_port {vddi } \

-control_port {EN pm_inst/pse_enable[0]} \

-on_state {full_on vddi {!EN}} \

-off_state {full_off {EN}}

create_power_switch PD3_sw \

-domain PD3 \

-output_supply_port {vddo } \

-input_supply_port {vddi } \

-control_port {EN pm_inst/pse_enable[1]} \

-on_state {full_on vddi {!EN}} \

-off_state {full_off {EN}}

2.2 为使用PSO的设计创建IEEE 1801文件的步骤

本节描述了在为使用PSO(Power Shut-Off,电源关闭)方法的设计创建IEEE 1801文件时应包含的信息。由于这些单元保留了它们的状态,它们在电源周期后不需要被重置或重新配置。这允许设备更快地恢复正常操作,并且在某些情况下,可以从其处理中断的地方继续。本节中始终使用图2-1,“带PSO的设计示例”。

- 指定电源域

- 指定电源和地网络以及端口

- 指定供电组

- 将供电组与电源域关联

- 指定每个域允许的电压状态

- 定义系统级电源状态

- 指定创建隔离逻辑的规则

- 指定创建状态保持逻辑的规则

- 指定电源开关逻辑

- 使用实现信息更新规则

- 指定低功耗单元属性

2.2.1 指定电源域

为了识别设计中在同一电压下操作且可以同时打开或关闭的部分,使用以下语法的`create_power_domain`命令来指定电源域及其关联的实例:

create_power_domain -name power_domain

[-elements instance_list]

[-exclude_elements instance_list]

[-include_scope]

[-supply {supply_set_handle [supply_set_ref]}]

对于图2-1,“带PSO的设计示例”,指定三个电源域:

create_power_domain PD1 -include_scope

create_power_domain PD2 -elements {inst_A inst_B}

create_power_domain PD3 -elements {inst_C}

2.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规范。

2.2.3 指定供电组

对于IEEE 1801,低功耗意图的一个基本构建块是供电组。由于供电组是供电网络的捆绑,可以使用供电组来简化供电网络与电源域和特殊单元的连接。也就是说,而不是单独指定每个供电网络,可以使用供电组。

使用以下语法为每个电源域定义供电组:

create_supply_set ss_name [-function {supply_function supply_net}]*

供电组定义了一组功能,如主电源和主地,然后定义哪些供电网络提供这些功能。例如,要指定ss_PD1的主电源由供电网络VDD提供,地由VSS提供,使用以下`create_supply_set`命令:

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}

PD2和PD3将分别从VDD2和VDD3接收它们的电源功能。

2.2.4 将供电组与电源域关联

要将供电组与电源域关联,请使用`associate_supply_set`命令,命令语法如下:

associate_supply_set ss_name -handle power_domain.handle

例如:

associate_supply_set ss_PD1 -handle

此关联的供电组定义了PD1中任何单元的所有主电源和地引脚将连接到在ss_PD1供电组中定义的网络。在本例中,这意味着PD1域中的所有主电源引脚将连接到供电网络VDD。

2.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} \

-state OFF { -supply_expr {power == `{OFF} && ground == `{FULL_ON, 0.0}} \

-simstate CORRUPT}

add_power_state \

-state ON { -supply_expr {power == `{FULL_ON, 1.2} && ground == `{FULL_ON, 0.0}} \

-simstate NORMAL} \

-state OFF { -supply_expr {power == `{OFF} && ground == `{FULL_ON, 0.0}} \

-simstate CORRUPT}

域PD2的`add_power_state`定义了两个状态:

- `ON` 是通电状态,通过指定电源和地网络处于`FULL_ON`状态来定义。

- `OFF` 指定电源关闭,主电源网络处于`OFF`状态。

`FULL_ON` 和 `OFF` 是IEEE 1801的关键字,用于定义供电的功能状态。

注意:如果设计具有pmos或nmos偏置,可以使用`supply_expr`选项来指定这些偏置。

2.2.6 定义系统级电源状态

`add_power_state`命令还可以定义系统级的电源状态。系统级电源状态定义了域之间的交互,而不是每个域允许的状态。IEEE 1801规范允许存在合法和非法的电源状态。合法状态被检查和验证工具广泛用于确保设计中已正确插入隔离和电平转换。通常,非法状态被仿真工具用来检测电源管理逻辑中的错误。

对于PSO设计,`add_power_state`命令必须定义所有有效的电源状态组合(开和关)。表2-1,“电源状态”,展示了一个设计,尽管只有两个可关闭电源域,但具有三个有效状态:如果PD3在PD2始终关闭时也关闭,这一要求应被状态捕获。

示例:

add_power_state PD1 \

-state PM1 {-logic_expr { == ON && == ON && == ON }}

add_power_state PD1 \

-state PM2 {-logic_expr { == ON && == OFF && == ON }} \

-update

add_power_state PD1 \

-state PM3 {-logic_expr { == ON && == OFF && == OFF }} \

-update

add_power_state PD1 \

-state PM4 {-logic_expr { == ON && == ON && == OFF }} \

-illegal \

-update

2.2.7 指定创建隔离逻辑的规则

隔离用于防止未知状态从关闭电源的域传播到设计中通电的逻辑。在IEEE 1801中,插入隔离单元的电源意图称为隔离策略。隔离策略通常定义了当该引脚的驱动器关闭电源时引脚的值。要定义何时必须添加隔离单元或指定必须隔离哪些引脚,请使用`set_isolation`命令。下面的语法列出了常见的选项和值:

set_isolation strategy_name

    -domain domain_name

    -isolation_signal expression

    [{-applies_to {inputs|outputs|both}}]

    [-elements pin_list]

    [-clamp_value { 0 | 1 | latch | Z }]

    [{-isolation_supply_set supply_set_list}]

    [{-location {self | other | parent | fanout}}]

    [-diff_supply_only]

    [{-source <source_domain_name | source_supply_ref>}]

    [{-sink <sink_domain_name | sink_supply_ref>}]

隔离策略始终与电源域相关。默认情况下,它适用于策略中指定域的所有输入和输出,但可以根据多个参数进行过滤。

特定的引脚或实例列表:

- `-diff_supply_only` —— 仅当引脚的驱动器和接收器来自不同的电源供应时才进行隔离。此选项防止不必要的隔离插入。

- `-source/-sink` —— 基于引脚的驱动器或接收器指定约束。这些选项提供了更多的灵活性和对隔离的控制,但在大多数设计中不常见。

隔离的功能由`-clamp_value`和`-isolation_signal`选项定义。

- `-clamp_value`定义了引脚在隔离时应采取的逻辑值。最常见的参数是0、1和latch(保持)。

- `-isolation_signal`定义了隔离的控制信号。当隔离信号激活时,将指定的值驱动到引脚上。

- `-location`指定了在层次结构中应插入隔离的位置。通常,这将在指定域(self)内或指定域外的引脚上(other)。

参见图2-2,“使用位置选项”,以获取插图说明。

隔离始终适用于两个域之间的接口上的引脚。引脚A和B位于PDTOP和PD1之间的接口上。`-location`选项定义了隔离应放置在该引脚的哪一侧:

- Self(自身):在由-domain选项指定的同一域中放置单元。

- Other(其他):在另一个域中放置单元(即未由-domain选项指定的域)。

- Parent(父级):在层次结构的更高级别放置隔离单元。

图2-2 使用位置选项

- `isolation_supply_set` 定义了将连接到插入的隔离单元的次级电源引脚(如果有的话)的电源供应。

通常,需要隔离逻辑以防止未知信号从一个正在关闭电源的域传播到一个保持电源开启的域。在某些情况下,关闭电源域的输入需要一个稳定的输入值。在这种情况下,该输入引脚需要额外的隔离。这不是典型情况,但有时对某些类型的记忆体是必需的。

参考图2-1,“带PSO的设计示例”,在电源模式2和3中,将需要在从电源域PD2到PD1和PD3的任何网络,以及从电源域PD3和PD2到PD1的任何网络上使用隔离逻辑。例如:

set_isolation iso2 \

-domain PD2 \

-applies_to outputs \

-isolation_supply_set \

-location parent \

-isolation_signal {pm_inst/ice_enable[0]} \

-clamp_value 0

set_isolation iso3 \

-domain PD3 \

-applies_to outputs \

-isolation_supply_set \

-location parent \

-isolation_signal {pm_inst/ice_enable[1]} \

-clamp_value 0

在这些示例命令中:

- `set_isolation` 创建了一个隔离策略。

- `-domain` 指定了隔离策略适用的电源域。

- `-applies_to outputs` 指定了隔离策略适用于输出引脚。

- `-isolation_supply_set` 指定了隔离单元的次级电源引脚将连接到的电源供应。

- `-location parent` 指定了隔离单元应放置在父级层次结构中,即在PD2或PD3域的输出引脚的外部。

- `-isolation_signal` 定义了控制隔离单元的信号,当此信号激活时,将驱动指定的钳位值到引脚上。

- `-clamp_value 0` 定义了隔离时引脚应采取的逻辑值为0。

2.2.8 指定创建状态保持逻辑的规则

状态保持是一种设计方法,它允许一组寄存在上电/下电序列中被保留。状态保持有两个常见应用:

- 保留配置寄存器 — 通过电源序列保留特定一组配置寄存器。这允许域以相同的配置启动,并加快了上电周期。如果没有保持,设备需要重新配置,在许多情况下这会给系统软件增加开销。

- 域的完全恢复 — 允许设备以完全相同的状态启动,就像它被关闭电源时一样。也就是说,域中的任何操作在电源关闭期间基本上暂停,然后在电源上电后立即恢复。

在许多情况下,可以保存设计中的所有寄存器。这确保了设备完全已知的状态被恢复。然而,IEEE 1801不要求保留所有寄存器,可能尝试优化一组部分寄存器。这部分组提供的设计面积更小,但存在遗漏寄存器并有不完整或不正确恢复的风险。

要定义一个规则,用于替换指定电源域中选定的寄存器或所有寄存器为具有状态保持的寄存器,请使用`set_retention`命令。常见选项包括:

set_retention

    strategy_name

    -domain power_domain

    [-elements element_list]

    [{-exclude_elements element_list}]

    [-save_signal {logic_net <high | low | posedge | negedge>}]

    [-restore_signal {logic_net <high | low | posedge | negedge>}]

    [-restore_condition expr]

    [-save_condition expr]

    [-retention_condition expr]

    [{-retention_supply supply_set_ref}]

保持策略是每个域定义的,并指定应保留哪些元素以及对保持的控制。`-save_signal`和`-restore_signal`选项分别定义触发保存和恢复操作的控制信号。`-save_condition`、`restore_condition`和`-retention_condition`选项由仿真和静态检查使用,作为对保持操作的额外检查。例如,要确保在保存时钟保持低电平,指定`-save_condition {!clk}`。

保持单元有一个单独的保持电源,在域关闭时保持活动。这个保持电源用`-retention_supply_set`选项指定。

对于图2-1,“带PSO的设计示例”:

set_retention st2 \

-domain PD2 \

-save_signal {pm_inst/pge_enable[0] high} \

    -restore_signal {pm_inst/pge_enable[0] low} \

    -retention_supply_set

set_retention st3 \

-domain PD3 \

    -save_signal {pm_inst/pge_enable[1] high} \

    -restore_signal {pm_inst/pge_enable[1] low} \

    -retention_supply_set

在这些示例命令中:

- `set_retention` 创建了一个状态保持策略。

- `-domain` 指定了状态保持策略适用的电源域。

- `-save_signal` 定义了触发保存操作的控制信号。

- `-restore_signal` 定义了触发恢复操作的控制信号。

- `-retention_supply_set` 指定了保持单元使用的电源供应。

2.2.9 指定电源开关逻辑

在PSO(Power Shut-Off,电源关闭)设计中,必须定义控制域关闭行为的电源开关。这包括输入和输出电源网络、控制端口以及电源开关的每种允许状态。

要指定电源开关,请使用`create_power_switch`命令,并使用以下语法:

create_power_switch

    -domain power_domain

    -output_supply_port {port supply_net_name}

    {-input_supply_port {port supply_net_name}}*

    {-control_port {port_name [net_name]}*

    {-on_state {state_name input_supply_port {boolean_expression}}}*

    [{-off_state {state_name {boolean_expression}}]*

    [-ack_port {port_name net_name [logic_value]}]*

    [-ack_delay {port_name delay}]*

典型的电源开关将具有一个控制信号,该信号定义了何时将输入电源连接到输出电源。使用`-on_state`选项来定义控制逻辑。通过高级语法,`create_power_switch`命令允许定义更复杂的开关,例如多个输入电压和/或多个控制信号。

`-ack_port`选项定义了一个确认信号,当输出电源完全恢复时生成一个值。这通常用作其他电源开关的输入,或作为等待域完全恢复后再进入下一个状态的FSM(有限状态机)的输入。

对于图2-1,“带PSO的设计示例”:

create_power_switch PD2_sw \

-domain PD2 \

    -output_supply_port {vddo } \

    -input_supply_port {vddi } \

    -control_port {EN pm_inst/pse_enable[0]} \

    -on_state {full_on vddi {!EN}} \

    -off_state {full_off {EN}}

create_power_switch PD3_sw \

-domain PD3 \

    -output_supply_port {vddo } \

    -input_supply_port {vddi } \

    -control_port {EN pm_inst/pse_enable[1]} \

    -on_state {full_on vddi {!EN}} \

    -off_state {full_off {EN}}

在这些示例命令中:

- `create_power_switch` 创建了一个电源开关。

- `-domain` 指定了电源开关适用的电源域。

- `-output_supply_port` 定义了输出电源端口和网络。

- `-input_supply_port` 定义了输入电源端口和网络。

- `-control_port` 定义了控制电源开关的端口。

- `-on_state` 定义了电源开关接通时的状态和逻辑。

- `-off_state` 定义了电源开关断开时的状态和逻辑。

2.2.10 使用实现信息更新规则

用户可以可选地指定用于隔离、保持以及电源开关插入的确切单元集。为此,在IEEE 1801中使用`map_*`命令:

map_retention_cell st2 -domain PD2 -lib_cells DRFF

map_retention_cell st3 -domain PD3 -lib_cells DRFF

use_interface_cell iso1 -strategy iso2 -domain PD2 -lib_cells ISOLNX2M

use_interface_cell iso2 -strategy iso3 -domain PD3 -lib_cells ISOLNX2M

map_power_switch PD2_sw -domain PD2 -lib_cells {HEAD32M}

map_power_switch PD3_sw -domain PD3 -lib_cells {HEAD32M}

在这些示例命令中:

- `map_retention_cell` 用于将特定的保持策略(如`st2`和`st3`)映射到指定电源域(如`PD2`和`PD3`)的库单元(`lib_cells`)上。这里的`DRFF`可能是一个代表特定类型的寄存器文件的库单元。

- `use_interface_cell` 用于将特定的隔离策略(如`iso2`和`iso3`)映射到指定电源域的库单元上。`ISOLNX2M`可能是用于隔离的特定类型的库单元。

- `map_power_switch` 用于将电源开关(如`PD2_sw`和`PD3_sw`)映射到指定电源域的库单元上。`HEAD32M`可能是用于电源开关的特定类型的库单元。

这些命令允许设计者明确指定在实现阶段使用的确切单元,确保设计在综合和布局时使用预期的硬件资源。这有助于优化设计的性能和面积,并确保设计满足特定的技术要求。

2.2.11 指定低功耗单元属性

1801-2013规范允许以两种不同的方式定义库属性:

原生1801命令

技术Liberty定义中的属性

IEEE-2013的建议是使用原生1801命令,因为该格式完全在1801规范之内。虽然Liberty格式是库信息的事实标准,但它不是由IEEE标准协会或任何其他开放标准机构控制的格式。

对于PSO设计,常见的低功耗单元有:

- define_always_on_cell:定义始终开启的单元

- define_isolation_cell:定义隔离单元

- define_retention_cell:定义保持单元

1801低功耗单元的示例:

define_always_on_cell -cells LP_AON -power VDD -ground VSS

define_isolation_cell -cells ISO_ON \

    -power VDD -ground VSS \

    -enable EN \

    -valid_location on

define_isolation_cell cells ISO_OFF \

    -power VDD -ground VSS \

    -power_switchable VDD_SW \

    -enable EN \

    -valid_location off

define_retention_cell -cells RET1 \

    -power VDD -ground VSS \

    -power_switchable VDD_SW \

    -clock_pin CK \

    -always_on_pin Q \

    -save_function {SV posedge}

```

在这些示例命令中:

- `define_always_on_cell` 定义了一个始终开启的单元`LP_AON`,它使用`VDD`作为电源和`VSS`作为地。

- `define_isolation_cell` 定义了两个隔离单元`ISO_ON`和`ISO_OFF`,分别代表启用和禁用隔离的情况。这些单元指定了电源、地、使能信号`EN`,以及隔离单元的有效位置。

- `define_retention_cell` 定义了一个保持单元`RET1`,它使用`VDD`作为电源、`VSS`作为地,指定了可开关电源`VDD_SW`、时钟引脚`CK`、始终开启的引脚`Q`,以及保存功能的触发方式(例如,`SV`在上升沿保存)。