DLX-Microprocessor / scripts / scripts_templates / synthesis_template.tcl
synthesis_template.tcl
Raw
#==============================================================================
#  Project     : DLX Processor Implementation
#  File        : synthesis_template.tcl
#  Description : TCL file used to run the synthesis of the DLX processor
#
#  Group Name  : Group 02
#  Members     : Sabina Sarcuni
#                Leonadro Gallina
#                Francesco Mignone
#
#  Supervisor  : Mariagrazia Graziano, Giavanna Turvani
#  Institution : Polytechnic of Turin, Italy
#
#  Created     : 11 July 2025
#  Last Edited : 11 July 2025
#
#  Notes       : - 5-stage pipeline (IF, ID, EX, MEM, WB)
#                - Supports basic instruction set: R-type, I-type, J-type
#                - Hazard detection and forwarding implemented
#                - Designed for simulation in ModelSim/Questasim
#
#==============================================================================
# Available variables from the bash script
#   WORK_DIR: Directory where the synthesis results will be stored
#     subfolders:
#     - /timing: timing reports
#     - /area: area reports
#     - /power: power reports
#     - /clk: clock reports
#     - /synthesized_constraints: synthesized constraints
#     - /structural: structural VHDL files
#   VHDL_FILES: List of VHDL files to be synthesized
#   TOP_LEVEL_ENTITY: Name of the top-level entity to be synthesized
#   ENTITY_CONF: Configuration of the top-level entity (e.g., architecture name)
# PS: if you need more info from the user given to
# the bash script you obv need to modify the
# bash script to export/eval those variables

# Set the libraries
set library WORK
define_design_lib WORK -path work
analyze -library WORK -format vhdl {${VHDL_FILES}}
elaborate ${TOP_LEVEL_ENTITY} -architecture ${ENTITY_CONF} -library work

# Without constraints
compile -map_effort high
# compile_ultra

# reporting timing and area after the first synthesis without constraints #
report_timing -nworst 10 > ${WORK_DIR}/timing/${TOP_LEVEL_ENTITY}-report-timing-no-opt.txt
report_area > ${WORK_DIR}/area/${TOP_LEVEL_ENTITY}-report-area-no-opt.txt
report_clock > ${WORK_DIR}/clk/${TOP_LEVEL_ENTITY}-report-clk-no-opt.txt
report_power > ${WORK_DIR}/power/${TOP_LEVEL_ENTITY}-report-power-no-opt.txt

write -hierarchy -format verilog -output ${WORK_DIR}/structural/${TOP_LEVEL_ENTITY}-structural-no-opt.v

write_sdc ${WORK_DIR}/synthesized_constraints/${TOP_LEVEL_ENTITY}-synthesized_constraints-no-opt.sdc

## Only with clock contraint
create_clock -name "clk" -period 2 clk
compile -map_effort high
# compile_ultra

report_timing -nworst 10 > ${WORK_DIR}/timing/${TOP_LEVEL_ENTITY}-report-timing-clkopt.txt
report_area > ${WORK_DIR}/area/${TOP_LEVEL_ENTITY}-report-area-clkopt.txt
report_clock > ${WORK_DIR}/clk/${TOP_LEVEL_ENTITY}-report-clk-clkopt.txt
report_power > ${WORK_DIR}/power/${TOP_LEVEL_ENTITY}-report-power-clkopt.txt

write -hierarchy -format verilog -output ${WORK_DIR}/structural/${TOP_LEVEL_ENTITY}-structural-clkopt.v

write_sdc ${WORK_DIR}/synthesized_constraints/${TOP_LEVEL_ENTITY}-synthesized_constraints-clkopt.sdc


## With both type of constraints
create_clock -name "clk" -period 2 clk
set_max_delay 2 -from [all_inputs] -to [all_outputs]
compile -map_effort high
# compile_ultra

report_timing -nworst 10 > ${WORK_DIR}/timing/${TOP_LEVEL_ENTITY}-report-timing-loose.txt
report_area > ${WORK_DIR}/area/${TOP_LEVEL_ENTITY}-report-area-loose.txt
report_clock > ${WORK_DIR}/clk/${TOP_LEVEL_ENTITY}-report-clk-loose.txt
report_power > ${WORK_DIR}/power/${TOP_LEVEL_ENTITY}-report-power-loose.txt

write -hierarchy -format verilog -output ${WORK_DIR}/structural/${TOP_LEVEL_ENTITY}-structural-loose.v
write_sdc ${WORK_DIR}/synthesized_constraints/${TOP_LEVEL_ENTITY}-synthesized_constraints-loose.sdc


## With strict constraints
create_clock -name "clk" -period 1 clk
set_max_delay 0.5 -from [all_inputs] -to [all_outputs]
compile -map_effort high
# compile_ultra

report_timing -nworst 10 > ${WORK_DIR}/timing/${TOP_LEVEL_ENTITY}-report-timing-strictopt.txt
report_area > ${WORK_DIR}/area/${TOP_LEVEL_ENTITY}-report-area-strictopt.txt
report_clock > ${WORK_DIR}/clk/${TOP_LEVEL_ENTITY}-report-clk-strictopt.txt
report_power > ${WORK_DIR}/power/${TOP_LEVEL_ENTITY}-report-power-strictopt.txt

write -hierarchy -format verilog -output ${WORK_DIR}/structural/${TOP_LEVEL_ENTITY}-structural-strictopt.v
write_sdc ${WORK_DIR}/synthesized_constraints/${TOP_LEVEL_ENTITY}-synthesized_constraints-strictopt.sdc


## With veri strict constraints
create_clock -name "clk" -period 0.5 clk
set_max_delay 0.5 -from [all_inputs] -to [all_outputs]
compile -map_effort high
# compile_ultra

report_timing -nworst 10 > ${WORK_DIR}/timing/${TOP_LEVEL_ENTITY}-report-timing-verystrictopt.txt
report_area > ${WORK_DIR}/area/${TOP_LEVEL_ENTITY}-report-area-verystrictopt.txt
report_clock > ${WORK_DIR}/clk/${TOP_LEVEL_ENTITY}-report-clk-verystrictopt.txt
report_power > ${WORK_DIR}/power/${TOP_LEVEL_ENTITY}-report-power-verystrictopt.txt

write -hierarchy -format verilog -output ${WORK_DIR}/structural/${TOP_LEVEL_ENTITY}-structural-verystrictopt.v
write_sdc ${WORK_DIR}/synthesized_constraints/${TOP_LEVEL_ENTITY}-synthesized_constraints-verystrictopt.sdc


## With lower bound constraints
create_clock -name "clk" -period 0 clk
compile -map_effort high
# compile_ultra

report_timing -nworst 10 > ${WORK_DIR}/timing/${TOP_LEVEL_ENTITY}-report-timing-lower-bound.txt
report_area > ${WORK_DIR}/area/${TOP_LEVEL_ENTITY}-report-area-lower-bound.txt
report_clock > ${WORK_DIR}/clk/${TOP_LEVEL_ENTITY}-report-clk-lower-bound.txt
report_power > ${WORK_DIR}/power/${TOP_LEVEL_ENTITY}-report-power-lower-bound.txt

write -hierarchy -format verilog -output ${WORK_DIR}/structural/${TOP_LEVEL_ENTITY}-structural-lower-bound.v
write_sdc ${WORK_DIR}/synthesized_constraints/${TOP_LEVEL_ENTITY}-synthesized_constraints-lower-bound.sdc

# Exit
exit