OpenLane is a complete toolchain used for physical design in digital VLSI circuits. It is part of the broader open-source hardware initiative and is specifically designed to handle the RTL-to-GDSII flow, automating the steps between Register-Transfer Level (RTL) design and the final layout for chip manufacturing (GDSII). OpenLane is built on top of various other open-source tools to facilitate this process.
1. RTL to GDSII Automation: OpenLane automates the process of taking RTL designs (usually written in VHDL/Verilog) through the physical design flow, up to generating GDSII files that can be sent to a fabrication foundry.
- Yosys: For synthesis, translating RTL to a gate-level netlist.
- OpenROAD: For place-and-route, performing physical layout steps.
- Magic: For layout viewing and DRC (Design Rule Checking).
- Netgen: For LVS (Layout vs. Schematic) checking.
- KLayout: For GDSII manipulation and visualization.
- Synthesis: Translates RTL into a gate-level netlist.
- Floorplanning: Determines how the major blocks will be arranged on the chip.
- Placement: Places standard cells on the floorplan.
- Routing: Routes the wires that connect the standard cells.
- Timing Analysis: Ensures that the design meets timing requirements.
- Power and Ground Network (P/G): Establishes a network for power delivery and grounding.
- Design Rule Checking (DRC): Ensures the design conforms to the fabrication process rules.
- Layout vs. Schematic (LVS) Verification: Confirms that the layout matches the circuit's schematic.
4. Customizable Flow: Users can configure the tool to match different process technology nodes and design constraints.
5. Technology Compatibility: It supports different PDKs (Process Design Kits), including the open-source SkyWater 130nm process.
The PicoRV32 is a compact and efficient open-source implementation of a 32-bit RISC-V CPU, designed primarily for use in FPGAs (Field Programmable Gate Arrays) and other resource-constrained environments. It is fully compliant with the RISC-V RV32IMC instruction set architecture, which supports 32-bit instructions, integer arithmetic, multiplication/division, and compressed instructions (reduced-length instructions for improved code density).
The core is highly optimized for small area usage and low resource consumption, making it suitable for tasks where minimal power and resources are available.
cd Desktop/work/tool/openlane_working_dir/openlane
docker
./flow.tcl -interactive
prep -design picorv32a
run_synthesis
Flop Ratio
cd Desktop/work/tool/openlane_working_dir/openlane/designs/picorv32a
less config.tcl
FP_IO_VMETAL
FP_IO_HMETAL
run_floorplan
cd Desktop/work/tool/openlane_working_dir/openlane/configuration
cd Desktop/work/tool/openlane_working_dir/openlane/designs/picorv32a/08-09_14-03/results/floorplan
magic -T /home/vsduser/Desktop/work/tool/openlane_working_dir/pdks/sky130A/libs.tech/magic/sky130A.tech lef read ../../tmp/merged.lef def read picorv32a.floorplan.def &
run_placement
magic -T /home/vsduser/Desktop/work/tool/openlane_working_dir/pdks/sky130A/libs.tech/magic/sky130A.tech lef read ../../tmp/merged.lef def read picorv32a.placement.def &
Cloning custom inverter standard cell design from github repository
git clone https://github.com/nickson-jose/vsdstdcelldesign.git
Copying magic tech file to vsdstdcelldesign
cp sky130A.tech /home/vsduser/Desktop/work/tool/openlane_working_dir/openplane/vsdstdcelldesign
pwd
extract all
ext2spice cthresh 0 rthresh 0
ext2spice
vim sky130_inv.spice
Running and ploting the SPICE file
ngspice sky130_inv.spice
plot y vs time a
Rise Time = T(80%)−T(20%)
Rise Time = 0.05933ns
Fall Time = T(80%)−T(20%)
Fall Time = 0.02999ns
Rise Delay= Tout(50%) − Tin(50%)
Rise propagation delay = 0.05639ns
Fall Delay= Tout(50%) − Tin(50%)
Fall propagation delay = 0.0248ns
wget http://opencircuitdesign.com/open_pdks/archive/drc_tests.tgz
tar xfz drc_tests.tgz
cd drc_tests
gvim .magicrc
Open magic tool
magic -d XR &
load poly
DRC rule for poly.9 in skywater130A pdk
drc check
drc why
vi sky130A.tech
/drc
/poly.9
tech load sky130A.tech
drc check
drc why
DRC rule for poly.2 in skywater130A pdk
press g on the layout for the grid formate
Requirment_1.The input and output ports of the standard cell should lie on the intersection of the vertical and horizontal tracks.
% grid 0.46um 0.34um 0.23um 0.17um
Requirement_2: Width of the standard cell must be odd multiple of the Xpitch.
Requriement_3: Hight of the standard cell must be even multiple of the Ypitch
% write lef
copying sky130_vsdinv.lef from (openlane/vsdstdcelldesign) to (picorv32a/src)
cp sky130_vsdinv.lef /home/Desktop/work/tool/openlane_working_dir/openlane/designs/picorv32a/src
copying sky130_fd_sc_hd_*.lib file from (openlane/vsdstdcelldesign/libs) to (picorv32a/src)
cp sky130_fd_sc_hd_* /home/Desktop/work/tool/openlane_working_dir/openlane/designs/picorv32a/src
set ::env(LIB_SYNTH) "$::env(OPENLANE_ROOT)/designs/picorv32a/src/sky130_fd_sc_hd__typical.lib"
set ::env(LIB_FASTEST) "$::env(OPENLANE_ROOT)/designs/picorv32a/src/sky130_fd_sc_hd__fast.lib"
set ::env(LIB_SLOWEST) "$::env(OPENLANE_ROOT)/designs/picorv32a/src/sky130_fd_sc_hd__slow.lib"
set ::env(LIB_TYPICAL) "$::env(OPENLANE_ROOT)/designs/picorv32a/src/sky130_fd_sc_hd__typical.lib"
set ::env(EXTRA_LEFS) [glob $::env(OPENLANE_ROOT)/designs/$::env(DESIGN_NAME)/src/*.lef]
docker
./flow.tcl -interactive
package require openlane 0.9
prep -design picorv32a -tag 08-09_14-03 -overwrite
run_synthsis
total negative slack (tns) = -711.59
wrost negative slack (wns0 = -23.89
For reducing slack
set lefs [glob $::env(DESIGN_DIR)/src/*.lef]
add_lefs -src $lefs
echo $::env(SYNTH_STRATEGY)
set ::env(SYNTH_STRATEGY) "DELAY 1"
echo $::env(SYNTH_BUFFERING)
echo $::env(SYNTH_SIZING)
set ::env(SYNTH_SIZING) 1
echo $::env(SYNTH_DRIVING_CELL)
total negative slack (tns) = 0.00
wrost negative slack (wns0 = 0.00
run_floorplan
run_placement
magic -T /home/vsduser/Desktop/work/tools/openlane_working_dir/pdks/sky130A/libs.tech/magic/sky130A.tech lef read ../../tmp/merged.lef def read picorv32a.placement.def &
% expand
sta pre_sta.conf
The slack should be greater than or equal to 0
SLACK = (DATA REQUIRED TIME) - (DATA ARIVAL TIME)
write_verilog /home/vsduser/Desktop/work/tools/openlane_working_dir/openlane/designs/picorv32a/runs/08-09_14-03/results/synthesis/picorv32a.synthesis.v
run_floorplan
run_placement
run_cts
/home/vsduser/Desktop/work/tools/openlane_working_dir/openlane/designs/picorv32a/runs/08-09_14-03/results/synthesis
openroad
read_lef /openLANE_flow/designs/picorv32a/runs/08-09_14-03/tmp/merged.lef
read_def /openLANE_flow/designs/picorv32a/runs/08-09_14-03/results/cts/picorv32a.cts.def
write_db pico_cts.db
read_db pico_cts.db
read_verilog /openLANE_flow/designs/picorv32a/runs/08-09_14-03/results/synthesis/picorv32a.synthesis_cts.v
read_liberty $::env(LIB_SYNTH_COMPLETE)
link_design picorv32a
read_sdc /openLANE_flow/designs/picorv32a/src/my_base.sdc
set_propagated_clock [all_clocks]
report_checks -path_delay min_max -fields {slew trans net cap input_pins} -format full_clock_expanded -digits 4
Post-CTS OpenROAD timing analysis by removing 'sky130_fd_sc_hd__clkbuf_1' cell from clock buffer list variable 'CTS_CLK_BUFFER_LIST'.
exit
echo $::env(CTS_CLK_BUFFER_LIST)
set ::env(CTS_CLK_BUFFER_LIST) [lreplace $::env(CTS_CLK_BUFFER_LIST) 0 0]
echo $::env(CTS_CLK_BUFFER_LIST)
echo $::env(CURRENT_DEF)
set ::env(CURRENT_DEF) /openLANE_flow/designs/picorv32a/runs/08-09_14-03/results/placement/picorv32a.placement.def
run_cts
echo $::env(CTS_CLK_BUFFER_LIST)
openroad
read_lef /openLANE_flow/designs/picorv32a/runs/08-09_14-03/tmp/merged.lef
write_db pico_cts.db
read_db pico_cts.db
read_verilog /openLANE_flow/designs/picorv32a/runs/08-09_14-03/results/synthesis/picorv32a.synthesis_cts.v
read_liberty $::env(LIB_SYNTH_COMPLETE)
link_design picorv32a
read_sdc /openLANE_flow/designs/picorv32a/src/my_base.sdc
set_propagated_clock [all_clocks]
report_checks -path_delay min_max -fields {slew trans net cap input_pins} -format full_clock_expanded -digits 4
report_clock_skew -hold
report_clock_skew -setup
echo $::env(CTS_CLK_BUFFER_LIST)
set ::env(CTS_CLK_BUFFER_LIST) [linsert $::env(CTS_CLK_BUFFER_LIST) 0 sky130_fd_sc_hd__clkbuf_1]
echo $::env(CTS_CLK_BUFFER_LIST)
docker
./flow.tcl -interactive
package require openlane 0.9
prep -design picorv32a
set lefs [glob $::env(DESIGN_DIR)/src/*.lef]
add_lefs -src $lefs
set ::env(SYNTH_STRATEGY) "DELAY 1"
set ::env(SYNTH_SIZING) 1
run_synthesis
init_floorplan
place_io
tap_decap_or
run_placement
run_cts
gen_pdn
cd Desktop/work/tools/openlane_working_dir/openlane/designs/picorv32a/runs/17-09_05-11/tmp/floorplan/
magic -T /home/vsduser/Desktop/work/tools/openlane_working_dir/pdks/sky130A/libs.tech/magic/sky130A.tech lef read ../../tmp/merged.lef def read 14-pdn.def &
echo $::env(CURRENT_DEF)
echo $::env(ROUTING_STRATEGY)
run_routing
cd Desktop/work/tools/openlane_working_dir/openlane/designs/picorv32a/runs/17-09_05-011/results/routing/
magic -T /home/vsduser/Desktop/work/tools/openlane_working_dir/pdks/sky130A/libs.tech/magic/sky130A.tech lef read ../../tmp/merged.lef def read picorv32a.def &
openlane/designs/picorv32a/runs/17-09_05-11/tmp/routing
less 15-fastroute.guide
cd Desktop/work/tools/SPEF_EXTRACTOR
python3 main.py /home/vsduser/Desktop/work/tools/openlane_working_dir/openlane/designs/picorv32a/runs/17-09_05-11/tmp/merged.lef /home/vsduser/Desktop/work/tools/openlane_working_dir/openlane/designs/picorv32a/runs/17-09_05-11/results/routing/picorv32a.def
docker
./flow.tcl -interactive
package require openlane 0.9
prep -design picorv32a -tag 17-09_05-11
openroad
read_lef /openLANE_flow/designs/picorv32a/runs/17-09_05-07/tmp/merged.lef
read_def /openLANE_flow/designs/picorv32a/runs/17-09_05-07/results/routing/picorv32a.def
write_db pico_route.db
read_db pico_route.db
read_verilog /openLANE_flow/designs/picorv32a/runs/17-09_05-07/results/synthesis/picorv32a.synthesis_preroute.v
read_liberty $::env(LIB_SYNTH_COMPLETE)
link_design picorv32a
read_sdc /openLANE_flow/designs/picorv32a/src/my_base.sdc
set_propagated_clock [all_clocks]
read_spef /openLANE_flow/designs/picorv32a/runs/17-09_05-07/results/routing/picorv32a.spef
report_checks -path_delay min_max -fields {slew trans net cap input_pins} -format full_clock_expanded -digits 4
exit
- Kunal Ghosh, Co-founder, VSD Corp. Pvt. Ltd.
- Nickson P Jose, Physical Design Engineer, Intel Corporation.
- R. Timothy Edwards, Senior Vice President of Analog and Design, efabless Corporation.