• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Custom IC Design
  3. How to pass fuse resistance in ADE-L

Stats

  • Locked Locked
  • Replies 4
  • Subscribers 125
  • Views 13519
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

How to pass fuse resistance in ADE-L

chrisindallastx
chrisindallastx over 4 years ago

I have a fuse circuit with an efuse element that has a CDF Parameter called "value of fuse" where you can put the resistance of the efuse. In the past I have had a seperate schematic for blown fuses and un-blown fuses. I set the un-blown fuses to FUSE0 and the blown fuses to FUSE1. Then I instantiate the circuits with the blown fuses where I need them. In ADE-L I set the value of FUSE0 to a low value and FUSE1 to a high value. 

What I'd really like to do is just have one fuse circuit and pass FUSE0 or FUSE1 into the symbols similar to how I might do a netset. 

How do I set this up? In the symbol for the efuse I changed the value of the fuse to FUSEVAL, but I haven't found the right place in the fuse circuit symbol to equate FUSEVAL with FUSE0 or FUSE1.

Thanks, Chris

  • Cancel
  • ShawnLogan
    ShawnLogan over 4 years ago

    Dear chrisindallastx,

    Is there a reason you could not use a single symbol with its schematic containing a resistor of value "rfuse" and change the value of the design parameter between that of an open fuse and that of a closed fuse? It seems this might be easier from a simulation perspective in Assembler or Explorer. In addition, if the fuse has reactive impedance (i.e., some coupling capacitance for example), you could change its reactive impedance as well as its real impedance. I suppose you could use the variable in to set your nodeset. Just as a check, I assigned a variable as the initial condition for a net, generated a spectre netlist and was able to simulate it. The attached netlist contains the ic statement in line 35. It did initialize the node to the value of the variable I chose.

    The thought came to mind as I read your problem description...so I wanted to at least ask the question! Sorry if it is not appropriate for your issue!

    Shawn

    Fullscreen netlist_with_variable_for_ic.scs.txt Download
    // Point Netlist Generated on: Jan  7 14:36:07 2021
    // Generated for: spectre
    // Design Netlist Generated on: Jan  7 14:35:46 2021
    // Design library name: sdd5e_TB
    // Design cell name: test_triangular_modulated_current
    // Design view name: schematic
    simulator lang=spectre
    global 0
    parameters rload=100 vdda_val=1 rleakage=10000 c_charge_pf=100 imax_uA=50 \
        delay_i=0 ttran=10e-12 freq_MHz=1 init_val=0 period_i=(1 / (1000000.0 * \
        freq_MHz)) tstop=(1000 * period_i) per_multiplier=(tstop / 4) \
        delay_multipler=(0.1 * tstop)
    include "$CDS_WORKAREA/src/simCases/apdser_spectre_model.scs" section=typicalmid
    parameters  sorting_num=1e9 area_predictn_core=1e7 area_predictp_core=1e7 \
        area_predictn_io=1e6 area_predictp_io=1e6
    
    // Library name: sdd5e_TB
    // Cell name: test_triangular_modulated_current
    // View name: schematic
    C0 (vout 0) capacitor c=c_charge_pf*1e-12
    iout (vbias n5) iprobe
    ileak (n2 n3) iprobe
    isource (n1 vout) iprobe
    V0 (n1 0) isource type=pulse val0=-imax_uA*1e-06 val1=imax_uA*1e-06 \
            period=period_i delay=delay_i rise=ttran fall=ttran width=0.50*period_i - ttran \
            
    R0 (vout n2) resistor r=rleakage
    V3 (vbias 0) vsource dc=vdda_val/2 type=dc
    V1 (n3 0) vsource type=dc
    F0 (n5 0) cccs gain=10 probe=V1
    V2 (n4 0) vsource dc=0 type=pulse val0=0 val1=vdda_val \
            period=per_multiplier delay=delay_multipler rise=ttran fall=ttran \
            width=0.50*per_multiplier - ttran
    W0 (vout 0 n4 0) relay vt1=0 vt2=vdda_val ropen=1T rclosed=1.0
    ic vout=init_val 
    simulatorOptions options psfversion="1.4.0" temp=25 tnom=25 scalem=1.0 \
        gmin=1e-12 rforce=1 \
        nportirfiledir="/project/sdd5e/users/smlogan/cds/.cadence/mmsim" \
        maxnotes=5 maxwarns=5 digits=5 cols=80 pivrel=1e-3 \
        sensfile="../psf/sens.output" checklimitdest=psf \
        disk_check_autoresume=yes 
    tran tran stop=tstop write="spectre.ic" writefinal="spectre.fc" \
        annotate=status 
    finalTimeOP info what=oppoint where=rawfile
    modelParameter info what=models where=rawfile
    element info what=inst where=rawfile
    outputParameter info what=output where=rawfile
    designParamVals info what=parameters where=rawfile
    primitives info what=primitives where=rawfile
    subckts info what=subckts where=rawfile
    save vout isource:in n1 n2 n3 ileak:in n4 vbias n5 iout:in 
    saveOptions options save=selected subcktoppoint=yes
    

    • Cancel
    • Vote Up +1 Vote Down
    • Cancel
  • chrisindallastx
    chrisindallastx over 4 years ago in reply to ShawnLogan

    Hi Shawn, yes I just need a technique to set the value of each efuse from the symbol instance in the schematic above. That way if there are eight fuses, I can select each and determine whether they are blown or not-blown. You can see in this spectre file that the efuse is a resistor and I have it set value=FUSEVAL, which I can set as a parameter at the top similar to how I did FUSE0, etc., but what I'd like to do when I instantiate each fuse is equate FUSEVAL to either FUSE0 or FUSE1.

    Chris

     

    Fullscreen 0284.test.txt Download
    // Generated for: spectre
    // Generated on: Jan  7 14:01:51 2021
    // Design library name: my_lib
    // Design cell name: sim_fuse
    // Design view name: schematic
    simulator lang=spectre
    global 0
    parameters FUSEVAL=0 FUSE0=95 FUSE1=2k VDD=1.8 VP=1.8
    
    
    // Library name: my_lib
    // Cell name: fuse_cell
    // View name: schematic
    subckt fuse_cell GND OUT VIO VP read sense write
        M7 (net26 SB OUT VP) p5p0fets wf=2u lf=600n nf=1 slices=1 cur=0 m=1 \
            as=1.22p ad=1.22p ps=5.22u pd=5.22u
        M11 (net31 RB VP VP) p5p0fets wf=15u lf=600n nf=1 slices=1 cur=0 m=6 \
            as=9.15p ad=9.15p ps=31.22u pd=31.22u
        M6 (net26 WB VP VP) p5p0fets wf=15u lf=600n nf=1 slices=1 cur=0 m=12 \
            as=9.15p ad=9.15p ps=31.22u pd=31.22u
        M0 (net26 S OUT GND) n5p0fets wf=1u lf=600n nf=1 slices=1 cur=0 m=1 \
            as=610f ad=610f ps=3.22u pd=3.22u
        M10 (net27 W GND GND) n5p0fets wf=10u lf=600n nf=1 slices=1 cur=0 m=6 \
            as=6.1p ad=6.1p ps=21.22u pd=21.22u
        M15 (net30 R GND GND) n5p0fets wf=10u lf=600n nf=1 slices=1 cur=0 m=6 \
            as=6.1p ad=6.1p ps=21.22u pd=21.22u
        I13 (GND W WB VIO VP write) fuse_ls
        I12 (GND R RB VIO VP read) fuse_ls
        I1 (GND S SB VIO VP sense) fuse_ls
        R2 (net26 net27) efuse value=FUSEVAL
        R3 (net31 net26 GND) rph3t w=2u l=(3.1u) m=1 strips=1
        R5 (net27 net30 GND) rph3t w=2u l=(2.5u) m=1 strips=1
    ends fuse_cell
    // End of subcircuit definition.
    
    // Library name: my_lib
    // Cell name: sim_fuse
    // View name: schematic
    V10 (ADDR GND) vsource type=pwl wave=[ 0 0 100u 0 100.001u VDD ]
    V0 (VIO GND) vsource type=pwl wave=[ 0 0 10u VDD 200u VDD ]
    V2 (VP GND) vsource type=pwl wave=[ 0 0 10u VP 200u VP ]
    M7 (OUT COLUMN VIO VIO) p5p0fets wf=15u lf=600n nf=1 slices=1 cur=0 m=1 \
            as=9.15p ad=9.15p ps=31.22u pd=31.22u
    V1 (GND 0) vsource dc=0 type=dc
    C11 (OUT GND) capacitor c=100f
    M8 (OUT COLUMN GND GND) n5p0fets wf=5u lf=1.2u nf=1 slices=1 cur=0 m=1 \
            as=3.05p ad=3.05p ps=11.22u pd=11.22u
    I57 (GND ADDR ADDRB VIO) inv_1X
    I22 (GND COLUMN VIO VP VIO ADDRB GND) fuse_cell
    I23 (GND COLUMN VIO VP VIO ADDR GND) fuse_cell
    simulatorOptions options reltol=1e-3 vabstol=1e-6 iabstol=1e-12 temp=25.0 \
        tnom=27 scalem=1.0 scale=1.0 gmin=1e-12 rforce=1 maxnotes=5 maxwarns=5 \
        digits=5 cols=80 pivrel=1e-3 sensfile="../psf/sens.output" \
        checklimitdest=both
    tran tran stop=200u errpreset=liberal write="spectre.ic" \
        writefinal="spectre.fc" annotate=status maxiters=5
    finalTimeOP info what=oppoint where=rawfile
    modelParameter info what=models where=rawfile
    element info what=inst where=rawfile
    outputParameter info what=output where=rawfile
    designParamVals info what=parameters where=rawfile
    primitives info what=primitives where=rawfile
    subckts info what=subckts where=rawfile
    saveOptions options save=allpub subcktprobelvl=2
    

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 4 years ago in reply to chrisindallastx

    Chris,

    In. your fuse_cell schematic, you probably just need to set value on the efuse instance to be pPar("FUSEVAL"). Provided you either do Create->CellView from CellView to update the symbol (e.g. modify it) which will force the CDF to be updated, or with the fuse_cell schematic open enter:

    artGenerateHierSymbolCDF(geGetEditCellView())

    (both will look for any pPar on the schematic and update the CDF). Then on any instance of the fuse_cell at the level above, you can specify the value of FUSEVAL and it will be set for that specific instance - so some you could set to FUSE0 and some to FUSE1

    Assuming I've understood your requirements correctly. The idea here is that you're passing a parameter through the hierarchy rather than having a global parameter value.

    Andrew.

    • Cancel
    • Vote Up +1 Vote Down
    • Cancel
  • chrisindallastx
    chrisindallastx over 4 years ago in reply to Andrew Beckett

    Genius! That worked perfectly. Having had to recreate a pPar string in an existing symbol that I broke a month or so ago, I had played around with how they work, but I hadn't run across the trick of creating the CellView to update the symbol which adds the field that gets passed through the hierarchy. Thank you very much! Chris

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information