自动化modelsim仿真环境,使用perl+makefile构建【精】

动机

modelsim 同时具有编译(compile)和调试(debug)的功能。注意区分 compile 和 synthesis,很多 FPGA 工程师都习惯把 vivado 的 synthesis + implementation + bitstream gen 叫做“编译”。compile 是把 .v 文件转译为 .c 文件使用 gcc 进行编译进行仿真的过程,而 synthesis 是把 .v 文件翻译为 GTECH,再进行优化以及元件库映射的过程。

modelsim 具有很好的跨平台性能,相同的 do 脚本(mentor扩展的tcl脚本),既可以在 unix 下运行,也可以在 dos 下运行,如果开发环境设计多个平台,使用 modelsim 在 windows 平台做仿真也不失为一种好的选择。

但是 modelsim 的 work 库构建,源文件编译,新建目录结构,新建设计文件等操作浪费了大量的无效时间。

perl 是强大的脚本语言,在 windows 平台也可以使用: Strawberry Perl, 这个strawberry perl 有一点问题,但可以应付 99% 的情况。你也可以通过 scoop 包管理器进行安装:

scoop install perl

makefile 通过指定编译规则,从而进行自动化构建。windows 平台下 GNU 提供了相关的 make,你也可以通过 scoop 包管理器进行安装:

scoop install make

makefile

makefile 全部内容如下:

.PHONY: com sim clean

FLIST = ../bench/*.v ../rtl/*.v

all: 	clean com sim

com:
	vlib work
	vmap work work
	vlog -l com.log -work work +incdir+../rtl/ $(FLIST)

sim:
ifeq ($(wildcard wave.do),wave.do)
	vsim -l sim.log -t ns -do "run -all" -do wave.do
else
	vsim -l sim.log -t ns -do "run -all"
endif

clean:
	rm -rf 	./work/ transcript modelsim.ini vsim.wlf \
			*.vcd wlft* vish* *.log

首先,.PHONY 声明了后续的命令均为伪目标,make 不再检查当前目录下是否存在同名文件,而是每次都使用目标进行构建,如果不声明且当前目录存在同名文件,则构建不会发生。

紧接着,FLIST 定义了需要进行编译的 file list,该字段您可以自己定义,该 Makefile 中的此字段与我本人惯用的文件结构相一致。

all 指定了 make all 构建指令需要执行的操作,它是 clean, com, sim 三条构建指令的集合,依顺序执行。

com 指定了 compile 要进行的操作:

  1. 首先创建 modelsim library, 取名为 work
  2. 然后进行映射
  3. 使用 vlog 命令对 FLIST 中的文件进行编译,-work work 编译到 work 库中,同时 -l com.log 生成编译日志,+incdir+../rtl/ 添加 include 路径,即,您的 defines.vtimescale.v 等文件。

sim 指定了 simulate 需要进行的操作:

  1. 如果目录下存在 wave.do 文件,则执行 vsim 后再执行 wave.do 脚本
  2. 如果目录下不存在,则直接调起 modelsim,时间单位设置为 ns。

clean 指定了需要进行清理的内容,它会删除无用的临时文件,您可以手动修改。

在使用时,首先切换到 vsim 下,然后进行构建,例如

make com

perl

perl 脚本进行自动化仿真的内容如下:

#!/usr/bin/perl
use warnings;
use File::Copy qw(copy);
use File::HomeDir qw(home);

print "## ----------- Modelsim Init v1.0 -----------\n";
if( $#ARGV == -1 ){
    print "ERROR: [10] The argument must be assgined.\n";
	die;
} elsif( $#ARGV == 0 ){

} else {
    print "ERROR: [11] Too many arguments, ". ($#ARGV+1) ." arguments passed.\n";
	die;
}
my $path = $ARGV[0];

# create workspace
mkdir $path."/bench" unless(-e $path."/bench");
mkdir $path."/rtl" unless(-e $path."/rlt");
mkdir $path."/vsim" unless(-e $path."/vsim");
copy home().'/tb.v',$path.'/bench/tb.v' unless(-e $path.'/bench/tb.v');
copy home().'/.v',$path.'/rtl/top.v' unless(-e $path.'/rtl/top.v');
copy home().'/makefile',$path.'/vsim/' unless(-e $path.'/vsim/makefile');

print "## Initilization Success!\n";

perl 脚本主要做了以下几件事:

  1. 对参数进行判断,只有1个参数的情况是合法的;
  2. 创建标准文件结构 bench, rtl, vsim;
  3. 把您的 .v 模板及 makefile 复制进去;

如何使用?

请把该 vinit.pl 脚本放在您的 home 路径下,并在 home 下创建您的模板文件 tb.v 以及 .v

在您需要进行初始化的目录下,例如~/workspace/,执行以下命令

perl ~/vinit.pl .

或者您也可以给与 vinit.pl 可执行权限,

chmod +x vinit.pl

然后直接执行,注意,shebang line 是必须的。

~/vinit.pl .

而在 dos 环境下,powershell 和 cmd 均不支持 ~ (tilde symbol) 的展开。powershell 支持 cd ~ 的语法,但不能把 ~ 作为参数传递。

您可能需要

perl $HOME/vinit.pl .

脚本执行后的文件树如下:

image

(Powershell 真难用)

posted @ 2023-09-01 11:02  devindd  阅读(169)  评论(0编辑  收藏  举报