Global training solutions for engineers creating the world's electronics

Create a simple Tcl script for Altera Quartus II

Tcl Implementation in Quartus

Altera Quartus II has a thorough implementation, with many extra Tcl commands added for Quartus. To allow easy access, they are organised into Tcl packages which may be imported when needed.

Altera Quartus II provides a Tcl prompt, so you can directly type in commands, or source (read in) Tcl commands from an external file.

Using Tcl to set pin locations

Let's look at using Tcl to set pin locations, using the Tcl command window in the Graphical User Interface (GUI).

You'll need a Tcl file with commands to set pin locations. Here is an example from the Doulos Comprehensive VHDL course:

###############################################################################
# tornado.tcl
#
# This script makes the pin assignments to ALSE Tornado Developement Board
#
# Unused pins are tristated
#
###############################################################################

puts "Tornado Board - Pin assignment ..."
# SW1
set custom_pins(42) SEL\[0\]
# SW2
set custom_pins(47) SEL\[1\]

# SW6/1
set custom_pins(5)  A
# SW6/2
set custom_pins(6)  B
# SW6/3
set custom_pins(7)  C
# SW6/4
set custom_pins(11) D

# LD1
set custom_pins(59) F

puts "Tornado Board - Pin assignment done!"

Let's assume you've already run Quartus, and synthesised your design. The next step is to set the pin constraints before place and route. To use the above Tcl file, you would need to follow these instructions:

  1. If you can't see the Tcl Console, open it using menu View > Utility Windows > Tcl Console
  2. In the Tcl Console, type the command
      source tornado.tcl
    

That's it! Now you can complete the compile for your design.

Well, that's almost it - the command will only work if the pin file is in your Quartus project folder. If it's in a different folder you will have to specify the path. The path can be a full path such as "c:/users/training/vhdlfpga/exo2/source/board_support/tornado.tcl" or it could be a relative path such as "../source/board_support/tornado.tcl" - Note that Tcl always uses the forward slash in paths, whether on Windows or Unix/Linux. Note also that you will need to surround the path in double quotes if it contains spaces.

Make your own script!

If you are new to Tcl, Quartus has a powerful feature which can get you started by creating a file of settings for you. It's then an easy job to turn that file into a simple script.

Firstly, now you've run your project using the GUI, you can store the settings using the menu:

Project > Generate Tcl File for Project...

A dialogue box will pop up allowing you to store the Tcl file. Here's what happened when we ran that command on Comprehensive VHDL exercise 2:

# Quartus II: Generate Tcl File for Project
# File: ex02proj.tcl
# Generated on: Wed Feb 11 17:56:59 2009

# Load Quartus II Tcl Project package
package require ::quartus::project

set need_to_close_project 0
set make_assignments 1

# Check that the right project is open
if {[is_project_open]} {
  if {[string compare $quartus(project) "ex02proj"]} {
    puts "Project ex02proj is not open"
    set make_assignments 0
  }
} else {
  # Only open if not already open
  if {[project_exists ex02proj]} {
    project_open -revision MUX4 ex02proj
  } else {
    project_new -revision MUX4 ex02proj
  }
  set need_to_close_project 1
}

# Make assignments
if {$make_assignments} {
  set_global_assignment -name FAMILY Cyclone
  set_global_assignment -name DEVICE EP1C6T144C6
  set_global_assignment -name ORIGINAL_QUARTUS_VERSION 8.1
  set_global_assignment -name PROJECT_CREATION_TIME_DATE "17:44:38  FEBRUARY 11, 2009"
  set_global_assignment -name LAST_QUARTUS_VERSION 8.1
  set_global_assignment -name USE_GENERATED_PHYSICAL_CONSTRAINTS OFF -section_id eda_blast_fpga
  set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144
  set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 6
  set_global_assignment -name VHDL_FILE ../source/mux4.vhd
  set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0
  set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85
  set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
  set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
  set_global_assignment -name LL_ROOT_REGION ON -section_id "Root Region"
  set_global_assignment -name LL_MEMBER_STATE LOCKED -section_id "Root Region"
  set_global_assignment -name RESERVE_ALL_UNUSED_PINS AS_INPUT_TRI_STATED
  set_global_assignment -name GENERATE_RBF_FILE ON
  set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top
  set_location_assignment PIN_5 -to IN0
  set_location_assignment PIN_6 -to IN1
  set_location_assignment PIN_7 -to IN2
  set_location_assignment PIN_11 -to IN3
  set_location_assignment PIN_59 -to OUT0
  set_location_assignment PIN_60 -to OUT1
  set_location_assignment PIN_61 -to OUT2
  set_location_assignment PIN_144 -to OUT3

  # Commit assignments
  export_assignments

  # Close project
  if {$need_to_close_project} {
    project_close
  }
}

So far so good... but this is only the project settings: how do we turn it into a compile script? It is actually surprisingly easy. Firstly, we must modify the end of the file as follows:

# Quartus II: Generate Tcl File for Project
# File: ex02proj.tcl
# Generated on: Wed Feb 11 17:56:59 2009

# Load Quartus II Tcl Project package
package require ::quartus::project

# ... lots of code cut out ...

  execute_flow -compile
  # Close project
  if {$need_to_close_project} {
    project_close
  }
}

This uses the Quartus execute_flow command to carry out the compile. However if you try and run this script, it won't work as it cannot find that command. We need to import an additional package at the top of the script, i.e.

# Quartus II: Generate Tcl File for Project
# File: ex02proj.tcl
# Generated on: Wed Feb 11 17:56:59 2009

# Load Quartus II Tcl Project package
package require ::quartus::project

# Add the next line to get the execute_flow command
package require ::quartus::flow

# ... lots of code cut out ...

  execute_flow -compile
  # Close project
  if {$need_to_close_project} {
    project_close
  }
}

Et voilà a Quartus script!

To run it, you can put it in the project directory and use the source command as above from the GUI. Or you can run it from the command line as follows:

  1. Open a terminal (Linux) or a cmd prompt (Windows)
  2. Change into the folder where the Tcl file is located
  3. Type the command:
    quartus_sh -t exo2proj.tcl

 

You'll find scripts like this used in our training course Comprehensive VHDL. 

Great training!! Excellent Instructor, Excellent facility ...Met all my expectations.
Henry Hastings
Lockheed Martin

View more references