Navigation
|
BottomUp DesignIntroductionThis document contains most of the small details used while designing the LASP sensor chip at EPFL. I hope this information will be useful. All the illustrations and examples are taken from the LASP design. They should be general enough to be applied to other designs. Probably I forgot to mention many details.SetupThe environment setup described here is specific to EPFL. At the moment of this writing here is my .cshrc:---------- .cshrc ---------- source /softs/site/pre_cshrc -n set amshk = v3.70 set cadence_ic = 5.0.33 set synopsys_dc = 2005.09 set modelsim = v6.1b set cadence_soce = 4.1 set mentor_calibre = 2005.1 source /softs/site/post_cshrc ---------- .cshrc ---------- The design was made on AMS h35b4d3 technology. TopDownIn a bottom-up design flow, the design is split into separate block which are implemented separately in top-down fashion. I recommend following Alain Vachoux's document on top-down design. I followed the directory structure and scripting described there. Note also you must think of the top-level design when design the blocks. Especially when doing place and route (P&R), you must place pins to facilitate routing but also think about power distribution.Putting all togetherOnce all your blocks have been P&R, you can start the design of the top-level. The flow is very similar to a top-down flow. I present here some random piece of information to be take care of during this process. Keep in mind that the rest of the discussion is focused on the top-level and might not apply to low-level blocks.SynthesisIn Synopsys you have the choice to make the tools see your blocks as blackboxes and/or inform it of their timing. I choose to inform the synthetizer about the subdesigns. To do so you need to do the following:
In this way Synopsys will see the timing of your subdesigns. You need also to use the "propagate_constraints" command. If you have "generic" for which you input '0' or '1' values, you have two choices. Either you let synopsys map the '0' and '1' to a tie_hi or tie_low cell or you can force them to remain '0' and '1' and take care of them in the place and route which can be configure to connect them to ground and vdd respectively. In the first case you don't have to do anything. In the latter, you must set a dont_touch on the _logic_0 and _logic_1 entities. In encounter you must use the globalNetConnect described below. P&RPadsIn my design I have separated the design core from the pads and synthetized the top_level (contained core and pads instance blocks, note this is hierachical design in encounter). The pads instance file being written in vhdl, doesn't contain gnd! or vdd! net. Therefore the core power pads nor the IO power pads are not instantiated there. To insert pads you can use the IO placement file (which will also place existing pads). Here is an example:==================== IO file example ==================== Version: 2 ### WEST SIDE ### Orient: R270 Offset: 340.4000 Pad: IO_GND_0 W GND3OP <= power pad instantiated and placed Skip: 0.0000 Pad: IO_GND_0B W GND3OP Skip: 0.0000 Pad: PADS/BLOCKOUT1 W <= regular pad placed Skip: 0.0000 Pad: PADS/BLOCKOUT0 W Skip: 0.0000 Pad: C_GND_0 W GND3RP Skip: 0.0000 Pad: C_VDD_0 W VDD3RP Skip: 0.0000 Pad: PADS/TCKPAD W Skip: 0.0000 Pad: PADS/TMSPAD W Pad: CORNERSW SW CORNERP <= corner instantiated and placed ### SOUTH SIDE ### Orient: R0 Offset: 340.4000 Skip: 0.0000 Pad: IO_VDD_0 S VDD3OP Skip: 0.0000 Pad: PADS/VALIDPAD_0 S Skip: 0.0000 Pad: PADS/DATAPAD_0_0 S Skip: 0.0000 Pad: PADS/DATAPAD_0_1 S ... =========================================================== Power PadsSRoute can route the power nets to the power pads inserted like the example above. To do so you need to tell encounter to connect the pads pins the corresponding global net. Here is how I did it:globalNetConnect gnd! -type pgpin -pin A -inst C_GND_* -module {} -verbose globalNetConnect vdd! -type pgpin -pin A -inst C_VDD_* -module {} -verbose note that in my case all the instances of core power pads where named C_GND/VDD_* and for this library the pad had a pin named A. Also you need to have defined previously the global net (normally done in Vachoux's top-bottom design example): globalNetConnect vdd! -type pgpin -pin vdd! -inst * -module {} -verbose globalNetConnect gnd! -type pgpin -pin gnd! -inst * -module {} -verbose TieHi/LoWhen your design contains '0' and '1' logic value to your blocks you might want the router to connect to the power ring/stripes. You do so yet again with the globalNetConnect command.globalNetConnect vdd! -type tiehi globalNetConnect gnd! -type tielo Routing with NanorouteI route my design with nanoroute. You might succeed in using wroute but i got stuck with wroute because it doesn't accept blackbox in the design. Also if wroute inserts antenna diodes I didn't find a way to import these.Finally, nanoroute might try to route all the signals in routing channels you don't want it to. To prevent it use routing blockages. Note on wroute: use it on SUN for best results. Saw differences in clock route results especially on process antenna. Process antennasProcess antennas can occur especially when you have long wire lines. The problem also arises when you have a hierarchical design and you don't specify the ANTENNAGATEAREA for all the blocks' pin. Ideally you would extract these values from each design directly from encounter and export it at the same time you do a lefOut. I didn't find a way to extract this information and I resorted to manually modify all the lef files. Here is what you should add for each pin:PIN n_reset DIRECTION INPUT ; USE SIGNAL ; ANTENNAGATEAREA 0.5 LAYER MET2 ; <= add this PORT LAYER MET2 ; RECT 3172.8000 0.0000 3173.4000 0.6000 ; END END n_reset You'll have to play with the values. DRC/LVSDRC and LVS where run with Mentor Calibre. You might also use Cadence Assura.GDSThe gds exported from encounter doesn't contain the physical cells. To have a physical gds, I imported Encounter's gds in a Virtuoso'slibrary where I previously copies all the cells backends from AMS. Then exported the GDS. Note that you can do the import/export on the command line with the "pipo" command. To do so you also need to pass pipo a config file as argument [strmin example] > pipo strmin streamIn.il [strmin config file] ===streamIn.il=== streamInKeys = list(nil 'runDir "." 'inFile "/home/cfavi/projects/lasp2/sandbox/lasp2/PAR/DEX/mux.gds" 'primaryCell "mux" 'libName "FULLLIB" 'techfileName "" 'scale 0.001000 'units "micron" 'errFile "./DRC/mux/streamIn.log" 'refLib nil 'hierDepth 20 'maxVertices 1024 'checkPolygon t 'snapToGrid nil 'arrayToSimMosaic t 'caseSensitivity "preserve" 'zeroPathToLine "lines" 'convertNode "ignore" 'keepPcell nil 'skipUndefinedLPP t 'ignoreBox nil 'mergeUndefPurposToDrawing nil 'reportPrecision nil 'keepStreamCells nil 'attachTechfileOfLib "" 'runQuiet nil 'noWriteExistCell t 'NOUnmappingLayerWarning nil 'genListHier nil 'cellMapTable "" 'layerTable "/softs/dkits/ams/v3.70/artist/HK_H35/TECH_H35B4/strmInOut.layertable" 'textFontTable "" 'restorePin 0 'propMapTable "" 'propSeparator "," 'userSkillFile "/softs/dkits/ams/v3.70/artist/HK_H35/skill/ams_sdl.il" 'rodDir "" 'refLibOrder "" ) ================= [strmout example] > pipo strmout streamOut.il [strmout config file] ===streamOut.il=== streamOutKeys = list(nil 'runDir "." 'libName "FULLLIB" 'primaryCell "mux" 'viewName "layout" 'outFile "./DRC/mux/mux.gds" 'scale 0.001000 'units "micron" 'compression "none" 'hierDepth 20 'convertToGeo nil 'maxVertices 200 'refLib nil 'libVersion "3.0" 'checkPolygon nil 'snapToGrid nil 'simMosaicToArray t 'caseSensitivity "preserve" 'lineToZeroPath "path" 'convertDot "ignore" 'rectToBox nil 'convertPathToPoly nil 'keepPcell nil 'useParentXYforText nil 'reportPrecision nil 'runQuiet nil 'errFile "./DRC/mux/streamOut.log" 'NOUnmappingLayerWarning nil 'techFileChoice nil 'pcellSuffix "DbId" 'respectGDSIILimits nil 'dumpPcellInfo nil 'genListHier nil 'cellMapTable "" 'layerTable "/softs/dkits/ams/v3.70/artist/HK_H35/TECH_H35B4/strmInOut.layertable" 'textFontTable "" 'convertPin "geometry" 'pinInfo 0 'pinTextMapTable "" 'propMapTable "" 'propSeparator "," 'userSkillFile "/softs/dkits/ams/v3.70/artist/HK_H35/skill/ams_sdl.il" 'rodDir "" ) ================== DRC / AntennasOnce you have a "physical" GDS, you can run DRC. You need several configuration files for it:
You run calibre either with a gui (try calibre -gui) or from the command line: > calibre -drc -hier -turbo -turbo_all drc_rule_file Note that you can import Calibre result file directly in Encounter. You just have to go to the Verify menu. LVSYou might need to modify the layout to match lvs. I had to do the following in Virtuoso:
Importing a verilog file: > ihdl -param paramfile verilog_file.v Exporting a CDL: > si $DIR -batch -command netlist where $DIR is a directory containing the si.env configuration file. AnnexesSynthesis scriptP&R scripts |