| #!/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 converts all SystemVerilog RTL files to Verilog and then | 
 | # runs Yosys. | 
 | # | 
 | # The following tools are required: | 
 | #  - sv2v: SystemVerilog-to-Verilog converter from github.com/zachjs/sv2v | 
 | #  - yosys: synthesis tool from github.com/YosysHQ/yosys | 
 | #  - Cadence Conformal | 
 | # | 
 | # Usage: | 
 | #   ./syn_yosys.sh 2>&1 | tee syn.std | 
 |  | 
 | #------------------------------------------------------------------------- | 
 | # use fusesoc to generate files and file list | 
 | #------------------------------------------------------------------------- | 
 | \rm -Rf build syn_out | 
 | fusesoc --cores-root .. run --target=syn \ | 
 |   --setup lowrisc:systems:top_earlgrey > /dev/null 2>&1 | 
 |  | 
 | # copy all files into directory "syn_out" | 
 | mkdir syn_out | 
 | cp \ | 
 |   build/*/src/*/*.sv* \ | 
 |   build/*/src/*/*/*.sv* \ | 
 |   build/*/src/*/*/*/*.sv* \ | 
 |   syn_out | 
 | cd syn_out | 
 |  | 
 | # copy file list, remove incdir and pins_if, and flatten pathnames | 
 | grep -Ev 'incdir|pins_if' ../build/*/*/*.scr | sed 's!.*/!!' > flist_gold | 
 |  | 
 | # generate revised flist by replacing '.sv' by '.v' and removing packages | 
 | sed -e 's/.sv/.v/g' flist_gold | grep -v "_pkg.v" > flist_rev | 
 |  | 
 | #------------------------------------------------------------------------- | 
 | # convert all RTL files to Verilog | 
 | #------------------------------------------------------------------------- | 
 |  | 
 | printf "\nSV2V VERSION:\n" | 
 | sv2v --version | 
 |  | 
 | printf "\nSV2V ERRORS:\n" | 
 |  | 
 | # drive strengths are not supported by Yosys | 
 | sed -i.bak -e "s/VERILATOR/SYNTHESIS/" prim_generic_pad_wrapper.sv | 
 |  | 
 | rm *.sv.bak | 
 |  | 
 | sv2v -DSYNTHESIS *.sv +RTS -N4 > combined.v | 
 | # split files up | 
 | modules=`cat combined.v | grep "^module" | sed -e "s/^module //" | sed -e "s/ (//"` | 
 | echo "$modules" > modules.txt  # for debugging | 
 | for module in $modules; do | 
 |   sed -n "/^module $module /,/^endmodule/p" < combined.v > $module.v | 
 | done | 
 | rm combined.v | 
 |  | 
 | #------------------------------------------------------------------------- | 
 | # run LEC (generarted Verilog vs. original SystemVerilog) | 
 | #------------------------------------------------------------------------- | 
 | printf "\n\nLEC RESULTS:\n" | 
 |  | 
 | # all of top_earlgrey's submodules | 
 | declare -a modules=( | 
 |   "rv_dm" | 
 |   "spi_device" | 
 |   "usbdev" | 
 |   "flash_ctrl" | 
 |   "tlul_adapter_sram" | 
 |   "prim_rom_adv" | 
 |   "prim_ram_1p_adv" | 
 |   "uart" | 
 |   "gpio" | 
 |   "aes" | 
 |   "hmac" | 
 |   "pinmux" | 
 |   "alert_handler" | 
 |   "pwrmgr" | 
 |   "rstmgr" | 
 |   "clkmgr" | 
 |   "rv_timer" | 
 |   "rv_plic" | 
 |   "rv_core_ibex" | 
 |   "xbar_main" | 
 |   "xbar_peri" | 
 |   "flash_phy" | 
 | ) | 
 |  | 
 | # TODO: top_earlgrey appears to be too large for verification under the currrent | 
 | # setup. Consider adding verification using `hier_compare`. | 
 |  | 
 | for module in "${modules[@]}"; do | 
 |   export LEC_TOP="$module" | 
 |  | 
 |   # run Conformal LEC | 
 |   lec -xl -nogui -nobanner \ | 
 |     -dofile  ../../hw/formal/lec_sv2v.do \ | 
 |     -logfile lec_${module}.log \ | 
 |     <<< "exit -force" > /dev/null 2>&1 | 
 |  | 
 |   # summarize results | 
 |   result=`grep "Compare Results" lec_${module}.log 2>&1` | 
 |   if [ $? -ne 0 ]; then | 
 |     result="CRASH" | 
 |   else | 
 |     result=`echo $result | awk '{ print $4 }'` | 
 |   fi | 
 |   printf "%-25s %s\n" $module $result | 
 | done | 
 |  | 
 | #------------------------------------------------------------------------- | 
 | # run yosys | 
 | #------------------------------------------------------------------------- | 
 | printf "\n\nYosys:\n" | 
 | yosys -QTqp " | 
 |   read_verilog *.v; | 
 |   hierarchy -check -top top_earlgrey; | 
 |   synth_xilinx; | 
 |   write_blif out.blif; | 
 |   write_edif out.edif; | 
 |   write_json out.json; | 
 | " | 
 |  | 
 | # TODOs: | 
 | #  - add full yosys synthesis for all modules | 
 | #  - add final LEC check (RTL-versus-netlist) |