| **This synthesis flow is experimental and under development, it does not produce | 
 | tape-out quality netlists and area/timing numbers it generates are not | 
 | representative of what would be achievable with a tape-out quality flow** | 
 |  | 
 | # Yosys/OpenSTA Ibex Synthesis Flow | 
 |  | 
 | This is a synthesis-only implementation flow using Yosys for Synthesis and | 
 | OpenSTA to produce timing reports. Its outputs are: | 
 |  | 
 | * A pre-mapping netlist - Gate-level verilog using generic gates that hasn't | 
 |   been mapped to a standard-cell library yet | 
 | * A post synthesis netlist - Gate-level verilog after optimisation mapped to a | 
 |   standard-cell library | 
 | * An STA netlist - Logically equivilent to the netlist above but with changes to | 
 |   allow processing by OpenSTA | 
 | * Area/Cell Usage report - Total area consumed by utilised cells and counts of | 
 |   each cell instance used | 
 | * Timing reports - Overal timing report and reports broken down into various | 
 |   path groups (register to register paths and per IO reports) | 
 |  | 
 | Yosys doesn't yet support the full subset of SystemVerilog used by Ibex so the | 
 | sv2v tool is used to first convert the Ibex RTL into the SystemVerilog subset | 
 | Yosys can process. | 
 |  | 
 | # Synthesis flow requirements | 
 |  | 
 | The following must be installed: | 
 |  | 
 | * Python 3 (version >= 3.5) | 
 | * sv2v - https://github.com/zachjs/sv2v | 
 | * Yosys - https://github.com/YosysHQ/yosys | 
 | * OpenSTA - https://github.com/The-OpenROAD-Project/OpenSTA | 
 |  | 
 | The flow was tested with yosys 0.9 and OpenSTA 2.2 but may work with other | 
 | versions.  A standard cell library is also required in the liberty (.lib) | 
 | format. The following Open Libraries can be used: | 
 |  | 
 | * Nangate45 - https://github.com/The-OpenROAD-Project/OpenROAD-flow/tree/master/flow/platforms/nangate45 | 
 |  | 
 | # Synthesis flow setup | 
 |  | 
 | The synthesis flow is configured via environment variables. The `syn_setup.sh` | 
 | file is used to set the environment variables for the flow and any changes made | 
 | should be placed there.  An example `syn_setup.example.sh` is included. A copy | 
 | of this named `syn_setup.sh` must be made and the values in it set appropriately | 
 | for the flow to work. | 
 |  | 
 | The environment variables that must be set in `syn_setup.sh` are | 
 |  | 
 | * `LR_SYNTH_CELL_LIBRARY_PATH` - The path to the standard cell library, this | 
 |   should point to the absolute path of the Nangate45 library | 
 |   (`NangateOpenCellLibrary_typical.lib`). | 
 | * `LR_SYNTH_CELL_LIBRARY_NAME` - The name of the standard cell library, this is | 
 |   used to alter the flow configuration for the library, currently 'nangate' is | 
 |   the only supported value | 
 |  | 
 | # Running the synthesis flow | 
 |  | 
 | Once `syn_setup.sh` has been created, call `syn_yosys.sh` to run the entire | 
 | flow. All outputs are placed under the `syn/syn_out` directory with the prefix | 
 | `ibex_` with the current date/time forming the rest of the name, e.g. | 
 | `syn/syn_out/ibex_06_01_2020_11_19_15` | 
 |  | 
 | - `syn/syn_out/ibex_date` | 
 |   - `reports` - All of the generated reports | 
 |     - area.rpt - Total area used and per cell instance counts | 
 |     - `timing` | 
 |       - *.rpt - Raw reports from OpenSTA, gives full paths | 
 |       - *.csv.rpt - CSV reports gives start and end point and slack | 
 |     - `log` | 
 |       - syn.log - Log of the Yosys run | 
 |       - sta.log - Log of the OpenSTA run | 
 |     - `generated` | 
 |       - *.v - Ibex RTL after sv2v processing | 
 |       - ibex_top.pre_map.v - Pre-mapping synthesis netlists | 
 |       - ibex_top_netlist.v - Post-synthesis netlist | 
 |       - ibex_top_netlist.sta.v - Post-synthesis netlist usable by OpenSTA | 
 |       - ibex_top.[library-name].out.sdc - Generated .sdc timing constraints | 
 |         file | 
 |  | 
 | If you wish to change the results directory naming or location edit | 
 | `syn_setup.sh` appropriately. | 
 |  | 
 | # Timing constraints | 
 |  | 
 | Two files specify the timing constraints and timing related settings for the | 
 | flow. These are used to generate a single .sdc file | 
 |  | 
 | * `ibex_top_lr_synth_core.tcl` - This specifies the constraints on all inputs | 
 |   and outputs as a fraction of a clock cycle, the names of the clock and reset | 
 |   inputs and the desired clock period in ps | 
 | * `ibex.[library-name].sdc` - Header to include in generated .sdc file. Settings | 
 |   can be library dependent so the `LR_SYNTH_CELL_LIBRARY_NAME` environment | 
 |   varible is used to supply the `[library-name]` part of the name | 
 |  | 
 | # Timing reports | 
 |  | 
 | Timing reports are produced for the following path groups | 
 | * Overall - Every path in the design, WNS (worst negative slack) from this report is the design WNS | 
 |   that limits the frequency | 
 | * reg2reg - Paths from register to register | 
 | * in2reg - Paths from any input to any register | 
 | * reg2out - Paths from any register to any output | 
 | * in2out - Paths from any input to any output | 
 |  | 
 | They are available in two formats .rpt and .csv.rpt. The .rpt is the full output | 
 | from OpenSTA and gives the full path between the start and end points. The CSV | 
 | version contains the start-point, end-point and WNS (one path per line). CSV | 
 | reports have had their start and end points translated to human readable names | 
 | (though this isn't 100% reliable). The raw OpenSTA reports generally contain | 
 | only generated cell names so will require further netlist inspection (via Yosys | 
 | or simply looking at the netlist .v) to make sense of. | 
 |  | 
 | # Post-synthesis inspection | 
 |  | 
 | Both Yosys and OpenSTA can be run to perform further inspection on the generated | 
 | synthesis. TCL is provided to setup the tools appropriately. | 
 |  | 
 | First the environment variables must be setup for the flow and the directory | 
 | containing the synthesis output set. This can be done with `syn_setup.sh` | 
 |  | 
 | ``` | 
 | $ source syn_setup.sh syn_out_06_01_2020_11_19_15/ | 
 | ``` | 
 |  | 
 | Where `syn_out_06_01_2020_11_19_15/` is directory containing the synthesis | 
 | outputs. Then start Yosys or OpenSTA and run one of the provided TCL files | 
 |  | 
 | * `./tcl/yosys_pre_map.tcl` - Loads the pre-mapping netlist | 
 | * `./tcl/yosys_post_synth.tcl` - Load the post-synthesis netlist | 
 |  | 
 | So to load the post-synthesis netlist in Yosys: | 
 |  | 
 | ``` | 
 | $ yosys | 
 | yosys> tcl ./tcl/yosys_post_synth.tcl | 
 | ``` | 
 |  | 
 | To open the design in OpenSTA | 
 |  | 
 | ``` | 
 | $ sta | 
 | % source ./tcl/sta_open_design.tcl | 
 | ``` | 
 |  |