I've listed some useful flags to make Quartus synthesize faster if you don't care about fully optimizing your results:
set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT FAST
Specifies the amount of effort, in terms of compile time, physical synthesis should use. Fast uses less compile time but may reduce the performance gain that physical synthesis is able to achieve.
set_global_assignment -name FITTER_EFFORT FAST_FIT
Fast Fit decreases optimization effort to reduce compilation time, which may degrade design performance.
set_global_assignment -name SYNTHESIS_EFFORT FAST
Note that this has the caveat below, although I tend to see overall faster runs.
When set to Fast, some steps are omitted to accomplish synthesis more quickly; however, there may be some performance and resource cost. Altera recommends setting this option to Fast only when running an early timing estimate. Running a "fast" synthesis produces a netlist that is slightly harder for the Fitter to route, thus making the overall fitting process slower, which negates any performance increases achieved as a result of the "fast" synthesis.
And instead of
execute_flow -compile
Use:
execute_flow -implement
Option to run compilation up to route stage and skipping all time intensive algorithms after.
In a meeting with Intel/Altera engineers, using -implement
this was ball-parked to be about 20% faster than -compile
, and came recommended when iterating on timing-closure results.
If anyone has other recommended, please edit this comment so we can develop a list.
It takes a little bit more to get it working than that. The following template should work:
set module [lindex $quartus(args) 0]
set revision [lindex $quartus(args) 2]
if {[string match "quartus_asm" $module]} {
#Commands which are run after the Quartus Assembler
post_message "Running TCL after Quartus Assembler"
#Use Chain file to program sof.
qexec "quartus_pgm ProgramSof.cdf"
}
Place the template in a TCL script file of whatever name you choose, e.g. PostModule.tcl
, then in your projects .qsf
file, and the following line:
set_global_assignment -name POST_MODULE_SCRIPT_FILE quartus_sh:PostModule.tcl
The line in the .qsf
file will instruct Quartus to run the TCL script each time a module (e.g. fitter, assembler, timequest, etc.) finishes running.
In the script we get the current module that is being run, and can also get the corresponding project revision. Then we check whether the current module is the one that we want to run the script after - in this case Quartus Assembler (quartus_asm
).
Any commands you put within that if statement are now executed every time that the Quartus Assembler finishes.
The simplest way to achieve the programming is to use a chain file. If you open the Quartus programmer and set up everything - programming hardware, sof filename, device list, and so on. Then save that file as something like "ProgramSof.cdf". The template above will then execute the Quartus programmer using that chain file which will use all the settings you have saved.
You can also change the command to do it entirely via command line switches rather than a chain file, however if you are going to do this you need to specify the programming cable name, the devices in the JTAG chain if there is more than one (e.g. many dev kits have MAX V supervisors in the chain with the main FPGA), and so forth. It is easier to simply save a chain file and then if you need to change any settings you can just edit that chain file.
Best Answer
For doing FPGA development, you really don't want to synthesize your code until you have simulated it and verified that it works. From your comments about modelsim, it seems you are mostly doing that, so I'd recommend using modelsim to check for syntax errors in your code, and only move to quarts when you are satisfied that it's correct.