In low power design, power-off modules have their output ports isolated to comply power flow spec. The isolation gate can be 'AND' type or 'NAND' type, depending on the signal's required state in power-off mode. The use case shows how to add isolation cells to a power-off module's output ports in different scenarios.
Isolation cells are inserted on all output ports. The isolation type is 'AND' or 'NAND'. The enable signal has level high to enable the output signals of the block.
There are two choices for isolation cells location. They can be inside the power off block for the IP re-usability. Or they can be outside of the power off block. Physical wise, it's easier to implement outside isolation gates, since Enable path and isolation gates can stay in always on domain as the top level.
undo_eco; setup_eco("pd_iso"); # Setup ECO name so that new added instances/wires have the prefix read_library("libdir/hvt.lib", "libdir/rvt.lib"); read_design("-imp", "netdir/netlist.v"); set_top("parent_mod"); # The parent module that has the power-off instance my @outpins = get_pins("-output", "u_power_down_inst"); foreach my $pin (@outpins){ # Make sure the pin is not output floating, otherwise dont do the following # AND's A pin connects to the original wire, B pin connects to power_up signal change_pin($pin, "AND2X1", "", ".A(-),.B(power_up)"); } write_verilog("iso_netlist.v");
undo_eco; setup_eco("pd_iso"); # Setup ECO name so that new added instances/wires have the prefix read_library("libdir/hvt.lib", "libdir/rvt.lib"); read_design("-imp", "netdir/netlist.v"); set_top("parent_mod"); # The parent module that has the power-off instance my @outpins = get_pins("-output", "u_power_down_inst"); foreach my $pin (@outpins){ my $isolation = "AND2X1"; # Assume the ports have naming convention to tell the power-off state, like '*_stay_1', or '*_stay_0' if($pin =~ m/stay_1/){ $isolation = "NAND2X1"; } # AND's A pin connects to the original wire, B pin connects to power_up signal change_pin($pin, $isolation, "", ".A(-),.B(power_up)"); } write_verilog("iso_netlist.v");
DFT flow may add new output ports to the power-off module. Functional ECO may add new output ports without adding isolation gate. The script should check if output ports have already isolation gates inserted.
undo_eco; setup_eco("pd_iso"); # Setup ECO name so that new added instances/wires have the prefix read_library("libdir/hvt.lib", "libdir/rvt.lib"); read_design("-imp", "netdir/netlist.v"); set_top("parent_mod"); # The parent module that has the power-off instance my @outpins = get_pins("-output", "u_power_down_inst"); foreach my $pin (@outpins){ my $con_net = get_net_of($pin); my @conns = get_conns("-load", $con_net); # If the port has isolation gate added already, skip it if(scalar(@conns)==1 && $conns[0][0] =~ m/pd_iso_/){ next; } # AND's A pin connects to the original wire, B pin connects to power_up signal change_pin($pin, "AND2X1", "", ".A(-),.B(power_up)"); } write_verilog("iso_netlist.v");