21.2.1 HDL to Programming Flow
(Ask a Question)This section describes how the HDL to programming flow is executed in the Libero SoC Design Suite using Tcl. The following figure shows the Libero SoC HDL to programming flow.
As a best practice, the following resources are recommended in the top-level Tcl folder for building a Libero SoC project.
parameters.tcl
: This Tcl file contains project variables as shown in the following snippet.set prj_family "PolarFire"; set prj_die "MPF100T"; set prj_package "FCG484"; set prj_speed "-1"; set prj_root "top";
Tip: Libero SoC tools profile can also be configured in theparameters.tcl
file.src
: This folder contains all the required HDL, constraints, memory configuration, and stimulus source files required for a project.design.tcl
: This Tcl file imports all the HDL, constraints, memory configuration, and stimulus sources files. The following snippet shows a sampledesign.tcl
file.import_files -hdl_source {./src/rtl_1.v} -library {work}; import_files -hdl_source {./src/rtl2.v} -library {work}; . . import_files -hdl_source {./src/top.v} -library {work}; import_files -sdc {./src/constraint/timing_user_constraints.sdc}; import_files -pdc {./src/constraint/io_constraints.pdc}; import_files -pdc {./src/constraint/fp_constraints.pdc}; import_files -stimulus {./src/stimulus/testbench_presynth.v} -library {stimulus}; import_files -stimulus {./src/stimulus/testbench_postsynth.v} -library {stimulus}; organize_tool_files -tool {SYNTHESIZE} \ -file ./src/constraint/timing_user_constraints.sdc \ -module {$prj_root} \ -input_type {constraint} organize_tool_files -tool {PLACEROUTE} \ -file ./src/constraint/timing_user_constraints.sdc \ -file ./src/constraint/io_constraints.pdc \ -file ./src/constraint/fp_constraints.pdc \ -module {$prj_root} \ -input_type {constraint} organize_tool_files -tool {VERIFYTIMING} \ -file ./src/constraint/timing_user_constraints.sdc \ -module {$prj_root} \ -input_type {constraint} organize_tool_files \ -tool {SIM_PRESYNTH} \ -file {./src/stimulus/testbench_presynth.v} organize_tool_files \ -tool {SIM_POSTSYNTH} \ -file {./src/stimulus/testbench_postsynth.v} configure_ram -cfg_file {./src/src_cfg/RAM.cfg} configure_tool \ -name {GENERATEPROGRAMMINGFILE} \ -params {program_fabric:true} \ -params {program_security:false} \ -params {sanitize_snvm:false} associate_stimulus -file testbench.v -mode new -module stimulus
libero.tcl
: This Tcl file executes the HDL to programming flow in Libero SoC.
design.tcl
file,
parameters for all the Libero SoC tools can be configured using the configure_tool command.21.2.1.1 Importing HDL Files
(Ask a Question)- Creating a Libero SoC project.
- Importing all the HDL, constraints, and stimulus source files that are required for the project.
- Building the design hierarchy by defining the top module.
In libero.tcl
, use the following commands to execute these tasks.
source ./parameters.tcl;
set libero_cmd "new_project \
-location {./exprj} -name {exprj} \
-family {$prj_family} -die {$prj_die} -package {$prj_package} \
-speed {$prj_speed} \
-hdl {VERILOG}";
eval file delete -force ./exprj;
eval $libero_cmd;
source ./design.tcl;
build_design_hierarchy;
set_root $prj_root;
For more information about HDL commands, see the HDL Tcl Commands.
21.2.1.2 Deriving Constraints
(Ask a Question)In this step, timing constraints are derived. In libero.tcl
, use the
following command to derive timing constraints.
derive_constraints_sdc
For more information about applying constraints, see the Derive Constraints Tcl Commands.
21.2.1.3 Running Pre-Synthesis Simulation
(Ask a Question)In this step, the functionality of the HDL is verified before Synthesis using a test bench. In
libero.tcl
, use the following command to run pre-synthesis
simulation.
run_tool -name {SIM_PRESYNTH}
As a best practice, use this command with the catch
statement as shown
in the following snippet.
if {[catch {run_tool -name {SIM_PRESYNTH} }] } {
puts "SIM_PRESYNTH FAILED \n"
} else {
puts "SIM_PRESYNTH PASSED \n"
}
For more information about adding pre-synthesis simulation parameters, see the run_tool command.
21.2.1.4 Running Synthesis
(Ask a Question)In this step, HDL is synthesized according to constraint files. In libero.tcl
,
use the following command to run Synthesis.
run_tool -name {SYNTHESIZE}
Use this command with the catch
statement as shown in the following
snippet.
if {[catch {run_tool -name {SYNTHESIZE} }] } {
puts "SYNTHESIZE FAILED \n"
} else {
puts "SYNTHESIZE PASSED \n"
}
For more information about adding Synthesis parameters, see the run_tool command.
21.2.1.5 Running Post-Synthesis Simulation
(Ask a Question)In this step, the functionality of the HDL is verified after Synthesis using a test bench. In
libero.tcl
, use the following command to run post-synthesis
simulation.
run_tool -name {SIM_POSTSYNTH}
Use this command with the catch
statement as shown in the following
snippet.
if {[catch {run_tool -name {SYNTHESIZE} }] } {
puts "SIM_POSTSYNTH FAILED \n"
} else {
puts "SIM_POSTSYNTH PASSED \n"
}
For more information about adding Synthesis parameters, see the run_tool command.
21.2.1.6 Running Place and Route
(Ask a Question)In this step, HDL is placed and routed according to constraint files. In
libero.tcl
, use the following command to run Place and Route.
run_tool -name {PLACEROUTE}
Use this command with the catch
statement as shown in the following
snippet.
if {[catch {run_tool -name {PLACEROUTE} }] } {
puts "PLACEROUTE FAILED \n"
} else {
puts "PLACEROUTE PASSED \n"
}
For more information about adding Place and Route parameters, see the run_tool command.
21.2.1.7 Verifying Timing Closure
(Ask a Question)In this step, HDL is verified for timing closure. In libero.tcl
, use the
following command to run Timing Verification.
run_tool -name {VERIFYTIMING}
Use this command with the catch statement as shown in the following snippet.
if {[catch {run_tool -name {VERIFYTIMING} }] } {
puts "VERIFYTIMING FAILED \n"
} else {
puts "VERIFYTIMING PASSED \n"
}
For more information about adding Verify Timing parameters, see the run_tool command.
21.2.1.8 Verifying Power
(Ask a Question)In this step, power verification is executed before generating the programming bit
stream. In libero.tcl
, use the following command for verifying the
power consumption.
run_tool -name {VERIFYPOWER}
Use this command with the catch
statement as shown in the following
snippet.
if {[catch {run_tool -name {VERIFYPOWER} }] } {
puts "VERIFYPOWER FAILED \n"
} else {
puts "VERIFYPOWER PASSED \n"
}
For more information about adding Verify Power parameters, see the run_tool command.
21.2.1.9 Programming
(Ask a Question)- Generating the FPGA Array Data
- Configuring memories
- Generating initialization clients for configured memories
- Generating design initialization data
- Generating and exporting the
programming bit stream (
.stp
and.job
)
In libero.tcl
, use the following commands to execute these tasks.
run_tool -name {GENERATEPROGRAMMINGDATA}
generate_design_initialization_data
run_tool -name {GENERATEPROGRAMMINGFILE}
export_bitstream_file \
-file_name {test} \
-format {STP DAT PPD } \
-limit_SVF_file_size 0 \
-limit_SVF_file_by_max_filesize_or_vectors {SIZE} \
-svf_max_filesize {1024} \
-svf_max_vectors {1000} \
-trusted_facility_file 1 \
-trusted_facility_file_components {FABRIC SNVM} \
-zeroization_likenew_action 0 \
-zeroization_unrecoverable_action 0
export_prog_job \
-job_file_name {test} \
-bitstream_file_type {TRUSTED_FACILITY} \
-bitstream_file_components {FABRIC SNVM} \
-zeroization_likenew_action 0 \
-zeroization_unrecoverable_action 0 \
-program_design 1 \
-program_spi_flash 0 \
-design_bitstream_format {PPD}
close_project -save 1
Use these commands with the catch
statement as shown in the following
snippet.
if {[catch {run_tool -name {GENERATEPROGRAMMINGDATA} }] } {
puts "GENERATEPROGRAMMINGDATA FAILED \n"
} else {
puts "GENERATEPROGRAMMINGDATA PASSED \n"
}
if {[catch {generate_design_initialization_data} }] } {
puts "DESIGN INITIALIZATION FAILED \n"
} else {
puts "DESIGN INITIALIZATION PASSED \n"
}
if {[catch {run_tool -name {GENERATEPROGRAMMINGFILE} }] } {
puts "GENERATEPROGRAMMINGFILE FAILED \n"
} else {
puts "GENERATEPROGRAMMINGFILE PASSED \n"
}
For more information about adding programming parameters, see the following.