使用 Modelsim 和 TCL 脚本递归编译目录中的文件

Recursively compile files in a directory using Modelsim and a TCL script

我使用 modelsim 来模拟我的 HDL 设计。我想构建一个基于脚本的工作流程,这样我就不必使用 GUI 并且可以更快地模拟。

我的典型目录树是:

rtl/
  includes/
  module1/
  module2/

我需要做的是编译可能在 rtl 文件夹中的所有 .sv 和 .vhd 文件,并将设计加载到 modelsim 中。

我的脚本有一个框架,它是:

quit -sim
vdel -all -lib work
vlib work
vmap work work

# compile systemverilog
vlog -work work -svinputport=net rtl/file1.sv
vlog -work work -svinputport=net rtl/module1/file2.sv

# compile vhdl
vcom -work rtl/file3.vhd
vcom -work rtl/module2/file4.vhd

# Load design
vsim work.top_name -voptargs=+acc

run -all

我想做的是自动搜索 .sv 和 .vhd 文件并以正确的顺序编译它们。 我尝试过的一个基本解决方案是使用 foreach 循环:

 foreach file [fileutil::findByPattern $basepath *.sv] {
    vlog -work work -svinputport=net $file
  }

但是 modelsim 对此并不满意,因为文件可能并不总是以正确的顺序编译。 任何提示将不胜感激,提前致谢。

安德里亚

除非您建立一些编码约定,否则无法自动排序 SystemVerilog 文件。 宏和其他编译器指令对编译顺序很敏感,在太多情况下,唯一的方法是使用明确排序的文件列表来处理它。对于宏,您通常会在需要宏的地方使用 `include "file.svh",并且 file.svh 不会出现在命令行上。

包引用需要解析文件,如果对包的唯一引用是通过 import 语句,您可以编写一个脚本来通过解析所有文件来构建依赖项列表。

但大多数人只是手动创建具有正确顺序的必要文件的文件。这总是会更有效率,因为文件只需要按正确的顺序解析一次。

在 VHDL 中,可以根据源文件中的信息自动构建有效的编译顺序:依赖项在源代码中指定,而不是像 makefile 那样的其他地方。

不幸的是,Modelsim 没有利用这一点,所以您只能自己构建编译顺序,或者像使用 SV 一样编写 makefile。