#!/bin/bash # Copyright lowRISC contributors. # Licensed under the Apache License, Version 2.0, see LICENSE for details. # SPDX-License-Identifier: Apache-2.0 # This script drives the experimental Ibex synthesis flow. More details can be # found in README.md set -e set -o pipefail error () { echo >&2 "$@" exit 1 } teelog () { tee "$LR_SYNTH_OUT_DIR/log/$1.log" } if [ ! -f syn_setup.sh ]; then error "No syn_setup.sh file: see README.md for instructions" fi #------------------------------------------------------------------------- # setup flow variables #------------------------------------------------------------------------- source syn_setup.sh #------------------------------------------------------------------------- # use sv2v to convert all SystemVerilog files to Verilog #------------------------------------------------------------------------- LR_DEP_SOURCES=( "../vendor/lowrisc_ip/ip/prim_generic/rtl/prim_generic_buf.sv" ) mkdir -p "$LR_SYNTH_OUT_DIR/generated" mkdir -p "$LR_SYNTH_OUT_DIR/log" mkdir -p "$LR_SYNTH_OUT_DIR/reports/timing" # Convert dependency sources for file in ${LR_DEP_SOURCES[@]}; do module=`basename -s .sv $file` sv2v \ --define=SYNTHESIS --define=YOSYS \ -I../vendor/lowrisc_ip/ip/prim/rtl \ $file \ > $LR_SYNTH_OUT_DIR/generated/${module}.v done # Convert core sources for file in ../rtl/*.sv; do module=`basename -s .sv $file` # Skip packages if echo "$module" | grep -q '_pkg$'; then continue fi sv2v \ --define=SYNTHESIS --define=YOSYS \ ../rtl/*_pkg.sv \ ../vendor/lowrisc_ip/ip/prim/rtl/prim_ram_1p_pkg.sv \ ../vendor/lowrisc_ip/ip/prim/rtl/prim_secded_pkg.sv \ -I../vendor/lowrisc_ip/ip/prim/rtl \ -I../vendor/lowrisc_ip/dv/sv/dv_utils \ $file \ > $LR_SYNTH_OUT_DIR/generated/${module}.v # Make sure auto-generated primitives are resolved to generic primitives # where available. sed -i 's/prim_buf/prim_generic_buf/g' $LR_SYNTH_OUT_DIR/generated/${module}.v done # remove tracer (not needed for synthesis) rm -f $LR_SYNTH_OUT_DIR/generated/ibex_tracer.v # remove the FPGA & register-based register file (because we will use the # latch-based one instead) rm -f $LR_SYNTH_OUT_DIR/generated/ibex_register_file_ff.v rm -f $LR_SYNTH_OUT_DIR/generated/ibex_register_file_fpga.v yosys -c ./tcl/yosys_run_synth.tcl |& teelog syn || { error "Failed to synthesize RTL with Yosys" } sta ./tcl/sta_run_reports.tcl |& teelog sta || { error "Failed to run static timing analysis" } ./translate_timing_rpts.sh python/get_kge.py $LR_SYNTH_CELL_LIBRARY_PATH $LR_SYNTH_OUT_DIR/reports/area.rpt