Quartus® II Tcl 示例:打开项目

author-image

作者

几乎每个 Quartus II Tcl 脚本都会打开一个项目。有多种打开项目的方法,本页包含打开项目的代码示例。

编写脚本以便在运行时将项目和修订版名称作为命令行参数传递给脚本是很有用的。这使得在不同项目中重用脚本变得容易。借助 Quartus II 软件附带的 cmdline Tcl 包,可以轻松将命令行参数传递给脚本。

以下代码示例打开一个项目名称和修订版名称被指定为命令行参数的项目。

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

project_open $opts(project) -revision $opts(revision)

在 DOS 或 shell 提示符下,您可以运行包含该代码的脚本,如下所示:

quartus_sh -t script.tcl -project top -revision first

改进示例代码

可以通过多种方式修改示例代码以添加检查和改进。

简单的错误检查

如果指定的项目不存在,project_open 命令会生成一个错误。打开项目之前,使用 project_exists 命令检查项目是否存在,如本示例所示:

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

if { ![project_exists $opts(project)] } {
    post_message -type error "Project $opts(project) does not exist"
    exit
}

project_open $opts(project) -revision $opts(revision)

处理未指定的修订版名称

您还可以修改示例代码以处理未将修订版名称指定为命令行参数的情况。对于下面的一些代码示例,仅当项目中存在多个时才需要指定修订版名称。对于其他,即使您的项目中有多个修订版,代码也可以自动打开某些默认修订版。

Quartus II Tcl 命令 project_open 默认为打开一个与指定项目同名的修订版,前提是没有用 -revision 选项指定修订版名称。此示例说明了 project_open 命令的默认功能。

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

if { [string equal "" $opts(revision)] } {
    project_open $opts(project) -revision $opts(project)
} else {
    project_open $opts(project) -revision $opts(revision)
}

您可以使用以下代码示例以各种方式修改该行为,从而在运行脚本时节省时间。这些例子确定了在没有指定修订版名称作为命令行参数的情况下,使用其他方法通过 project_open 命令的 -revision 选项来确定要使用的修订版名称。

默认为修订版名称

当未将修订版名称指定为命令行参数时,您可以使用以下代码打开只有一个修订版的项目。具有单个修订版的项目通常具有相同的修订版名称和项目名称,但这不是必需的。当项目的修订版名称与项目名称不匹配时,使用 project_open 命令而不使用 -revision 选项会生成一个错误。

此示例使用 get_project_revisions 命令检索指定项目的所有修订版列表。如果只有一个修订版(列表长度为 1),脚本将使用该修订版名称打开项目。使用修订版名称列表可保证项目正确打开,即使修订版名称与项目名称不同。

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

if { [string equal "" $opts(revision)] } {
    set revisions [get_project_revisions $opts(project)]
    if { 1 == [llength $revisions] } {
        set opts(revision) [lindex $revisions 0]
    } else {
        post_message -type error \
            "More than one revision in project \
            $opts(project)."
        exit
    }
}

project_open $opts(project) -revision $opts(revision)

默认为当前修订版

如果未将修订版名称指定为命令行参数,则可以使用以下代码打开项目并默认为当前修订版。当前修订版是您在上次关闭项目之前最后使用的修订版。在具有一个修订版的项目中,该修订版始终是当前修订版。此示例使用 get_current_revision 命令检索指定项目的当前修订版名称。

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

if { [string equal "" $opts(revision)] } {
    set opts(revision) [get_current_revision $opts(project)]
}

project_open $opts(project) -revision $opts(revision)

打印修订版名称

在某些情况下,如果项目中有多个修订版,您可能需要一个修订版名称,如果没有提供,请参阅修订版名称列表。当未将修订版名称指定为命令行参数,并且项目中存在多个修订版时,您可以使用以下代码打印出所有修订版。此示例使用 get_project_revisions 命令检索项目的所有修订版列表。

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

if { [string equal "" $opts(revision)] } {
    post_message "You did not specify a revision name.
    set revisions [get_project_revisions $opts(project)]
    if { 1 == [llength $revisions] } {
        set opts(revision) [lindex $revisions 0]
        post_message "There is one revision $opts(revision)"
    } else {
        post_message "These revisions exist in the project:"
        foreach revision $revisions {
            post_message "$revision"
        }
        exit
    }
}

project_open $opts(project) -revision $opts(revision)

组合示例

这些示例说明了如何合并上述某些改进。

示例 1

以下的简单示例验证了指定的项目是否存在。如果没有将修订版名称指定为命令行参数,则会打开当前修订版。否则,将使用指定为命令行参数的修订版名称打开项目。

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

if {[project_exists $opts(project)]} {
    if {[string equal "" $opts(revision)]} {
        project_open $opts(project) -revision \
            [get_current_revision $opts(project)]
    } else {
        project_open $opts(project) -revision $opts(revision)
    }
} else {
    post_message -type error "Project $opts(project) does not exist"
    exit
}

从 Quartus II 软件的 4.1 版(::quartus::project 包的 3.0 版)开始,project_open 命令支持 -current_revision 选项。如果您使用的是 4.1 或更高版本的 Quartus II 软件,您可以将上面脚本中的以下命令

project_open $opts(project) -revision \
            [get_current_revision $opts(project)]

替换为以下命令

project_open $opts(project) -current_revision

示例 2

下面的示例结合了上面说明的许多改进。示例验证了指定的项目是否存在,如果只有一个修订版,则将其打开。如果有多个修订版,则会打印一份修订版列表并退出。

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

if { ![project_exists $opts(project)] } {
    post_message -type error "Project $opts(project) does not exist"
    exit
}

if { [string equal "" $opts(revision)] } {
    post_message "You did not specify a revision name.
    set revisions [get_project_revisions $opts(project)]
    if { 1 == [llength $revisions] } {
        set opts(revision) [lindex $revisions 0]
        post_message "There is one revision $opts(revision)"
    } else {
        post_message "These revisions exist in the project:"
        foreach revision $revisions {
            post_message "$revision"
        }
        exit
    }
}

project_open $opts(project) -revision $opts(revision)