【问题标题】:Recursively compile files in a directory using Modelsim and a TCL script使用 Modelsim 和 TCL 脚本递归编译目录中的文件
【发布时间】:2020-12-11 16:40:48
【问题描述】:

我使用 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 对此并不满意,因为文件可能并不总是以正确的顺序编译。 任何提示将不胜感激,在此先感谢。

安德烈亚

【问题讨论】:

  • 什么定义了“正确”的顺序?
  • modelsim 报错,如果导入包的模块在包之前编译,例如
  • 那么你将需要一个拓扑排序。
  • 听起来很复杂。我在尝试做一些不寻常的事情吗?我不是专家,但我认为我的方法很简单。
  • 您可以使用诸如“make”之类的工具,并在 Makefile 中定义依赖项,或者使用更动态/编程的方法,这需要查找所有导入,创建所有模块的列表和具有依赖关系的包并进行拓扑排序。可能值得在互联网上四处寻找,看看是否有人以前做过。

标签: tcl vhdl verilog system-verilog modelsim


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】: