Heterojuction n+-n barrier

Hello DEVSIM community!

I’d like to ask a question regarding the construction of a barrier at a heterojunction between two layers, n+ and n, where the n+ layer is intended to act as a unipolar barrier. This is part of an nBn structure.

Right now, I’m facing issues with how to properly define this barrier. As far as I understand, the barrier should be located at the interface between these two regions. It seems to block current to some extent, but I’m encountering two main problems:

First, the barrier I’ve defined doesn’t block current as effectively as expected — the difference can be several orders of magnitude. Second, it exhibits strange behavior near zero volts. For example, at 0.1 V the current is one or two orders of magnitude higher than at 0.5 V.

def CreateBarierElectronModel(device, interface, bias):

    if bias == "reverse":
        eq = "(Electrons@r1 - Electrons@r0*exp(-ElectronCharge * (Uc-top_bias+bot_bias + 2.038) / kT))"
        for name, equation in (
                ("BarrierElectrons", eq),
                ("BarrierElectrons2", "BarrierElectrons"),
                ("BarrierElectrons:Electrons@r0", "-exp(-ElectronCharge * (Uc-top_bias+bot_bias + 2.038)/ kT)"),
                ("BarrierElectrons:Electrons@r1", "1"),

                ("BarrierElectrons2:Electrons@r0", "BarrierElectrons:Electrons@r0"),
                ("BarrierElectrons2:Electrons@r1", "BarrierElectrons:Electrons@r1"),
        ):
            interface_model(
                device=device, interface=interface, name=name, equation=equation
            )
    else:
        eq = "(Electrons@r0 - Electrons@r1*exp(-ElectronCharge * (-Uc+top_bias-bot_bias + 2.038) / kT))"
        for name, equation in (
                ("BarrierElectrons", eq),
                ("BarrierElectrons2", "BarrierElectrons"),
                ("BarrierElectrons:Electrons@r0", "1"),
                ("BarrierElectrons:Electrons@r1", "-exp(-ElectronCharge * (-Uc+top_bias-bot_bias + 2.038) / kT)"),

                ("BarrierElectrons2:Electrons@r0", "BarrierElectrons:Electrons@r0"),
                ("BarrierElectrons2:Electrons@r1", "BarrierElectrons:Electrons@r1"),
        ):
            interface_model(
                device=device, interface=interface, name=name, equation=equation
            )
    return "BarrierElectrons"

The code above shows how I define the barrier between the two regions. The two different cases represent the situation when the polarity of the applied voltage is reversed — since the barrier should only block current in one direction.

The parameter Uc is the calculated barrier that can appear at the n±n junction, and it depends on doping levels:
Uc = kT/e * ln(Nd+ / Nd).
The value 2.038 corresponds to the conduction band offset between these two materials.

The reason I chose to define the barrier this way is because I still don’t fully understand how the interface equations work in DEVSIM. So I assumed that these values could be directly inserted into the continuity equations and the current density equations for these two regions.

def CreateInterface(device, interface, bias  = "reverse"):
    """
    Enforces potential, electron, and hole continuity across the interface
    """

    CreateSiliconOxideInterface(device, interface)

    if interface == "top_barrier_interface":
        if bias == "reverse":
            modelname = CreateBarierElectronModel(device=device, interface=interface, bias=bias)
            interface_equation(
                device=device,
                interface=interface,
                name="ElectronContinuityEquation",
                interface_model=modelname,
                type="fluxterm",
            )
        else:
            ename = CreateContinuousInterfaceModel(device, interface, "Electrons")
            interface_equation(
                device=device,
                interface=interface,
                name="ElectronContinuityEquation",
                interface_model=ename,
                type="continuous",
            )
    elif interface == "barrier_absorber_interface":
        if bias == "reverse":
            ename = CreateContinuousInterfaceModel(device, interface, "Electrons")
            interface_equation(
                device=device,
                interface=interface,
                name="ElectronContinuityEquation",
                interface_model=ename,
                type="continuous",
            )
        else:
            modelname = CreateBarierElectronModel(device=device, interface=interface, bias = bias)
            interface_equation(
                device=device,
                interface=interface,
                name="ElectronContinuityEquation",
                interface_model=modelname,
                type="fluxterm",
            )
    else:
        ename = CreateContinuousInterfaceModel(device, interface, "Electrons")
        interface_equation(
            device=device,
            interface=interface,
            name="ElectronContinuityEquation",
            interface_model=ename,
            type="continuous",
        )


    hname = CreateContinuousInterfaceModel(device, interface, "Holes")
    interface_equation(
        device=device,
        interface=interface,
        name="HoleContinuityEquation",
        interface_model=hname,
        type="continuous",
    )

This part of the code shows how I define the interface for the remaining regions.

The graph above shows how the electron and hole concentrations change when a voltage of 0.5 V is applied. The voltage is applied to the bottom contact, which is located at a position of 3.65 µm.

In the graph, you can see a linear change in hole and electron concentrations in the top contact layer. I overlooked this while modeling the barrier, and I’m not sure when it stopped generating the mesh in this region — even though I am explicitly creating it.