vcs使用sv的configration功能

system verilog 标准中提到,支持configuration功能。就是当存在两个同名module,但实现却不同,可将他们通过configuration功能混合编进一个design里面。

demo目录文件如下。有两个mod.v,里面实现了一个名为mod的module。top里面想用这两个mod。

1
2
3
4
5
6
7
8
9
demo
|__ mod1
|__ mod.v
|__ mod2
|__ mod.v
|__ top.sv
|__ cfg.v
|__ libmap.v
|__ makefile

mod1/mod.v如下

1
2
3
4
5
module mod;
initial begin
$display("this is mod1");
end
endmodule

mod2/mod.v如下

1
2
3
4
5
module mod;
initial begin
$display("this is mod2");
end
endmodule

top.sv如下

1
2
3
4
module top;
mod mod1();
mod mod2();
endmodule

要支持这个功能,首先需要增加一个libmap.v,用来将两个mod分别放入不同的library里面

1
2
library lib1 ./mod1/mod.v
library lib2 ./mod2/mod.v

再增加一个cfg.v,来告诉编译器哪个实例用哪个lib。

1
2
3
4
5
config cfg;
design work.top;
instance top.mod1 liblist lib1;
instance top.mod2 liblist lib2;
endconfig

最后在编译参数里面指定-libmap,指定top为work.cfg。也可以增加-diag libconfig -libmap_verbose

1
2
3
4
5
6
7
8
9
10
cmp:
vcs +v2k +vcs+lic+wait -full64 -sverilog \
./mod1/mod.v ./mod2/mod.v ./cfg.v ./top.sv \
-top work.cfg -libmap ./libmap.v \
-l ./cmp.log -o ./simv \
-timescale=1ns/1ps -debug_access+all -assert enable_diag \
-diag libconfig -libmap_verbose

run:
./simv +vcs+lic+wait -l ./run.log

这里采用的是两步法编译,也可以使用vcs推荐的三步法。

参考

system verilog标准第33章P865

vcs user guide P152