【数字IC设计】使用 VCS 与 Verdi 的前端仿真流程

前端仿真

首先,本地新建项目一般需要一个工程文件夹,其文件结构大致是:

Design(RTL,filelist),Flow(Syn,Lint等等),VRF(Verify)(tb,tc等等)

环境搭建

在这里,我们使用 VCS 和 Verdi 进行前端仿真和波形查看。

首先,我们需要保证环境变量里存在 vcsverdi 。例如,大部分环境下,可以使用 module load 来进行环境变量的加载。

文件结构

这里以我们实现一个 Adder 为例子

1
2
3
4
5
6
7
8
9
10
11
.
├── Design
│ ├── Filelist
│ │ └── filelist
│ └── RTL
│ └── Adder.v
├── Flow
├── Makefile
└── Verification
└── TestBench
└── tb_0.v
  • Design:设计文件夹
    • Filelist:用于向 VCS,Verdi 等
    • RTL:工程文件
  • Flow:执行流程,包括 Syn,Lint 等子文件夹
  • Verification:用于验证的文件夹
    • Testbench
    • Testcase
  • Makefile:脚本

Examples

Example 1:Adder

首先以一个简单的加法器为例子。这里的 Testbench 中的时钟纯属于摆设。

Adder.v

1
2
3
4
5
6
7
module Adder( 
input a,
input b,
output out
);
assign out = a + b;
endmodule

filelist

1
2
3
/home/heyx1/Demo/Design/RTL/Adder.v

/home/heyx1/Demo/Verification/TestBench/tb_0.v

tb_0.v

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
`timescale 1ns / 1ps    //时间单位1ns,精度1ps

module tb_0 ();
// Clock and reset
reg clk;
reg reset;

// Input and Output signal
reg in_a;
reg in_b;
wire out_q;

// 例化被测模块
Adder adder (
.a (in_a),
.b (in_b),
.out (out_q)
);

// Generate Clock
initial begin
clk = 1'b0;
forever #1 clk = ~clk;
end

// Generate Reset
initial begin
reset = 1'b1;
#10 reset = 1'b0;
end

// Generate signal
initial begin
$monitor("time=%3d, in_a=%b, in_b=%b, q=%2b \n",
$time, in_a, in_b, out_q);

in_a = 1'b0;
in_b = 1'b0;
#20
in_a = 1'b1;
#20
in_a = 1'b0;
in_b = 1'b1;
#20
in_a = 1'b1;


$finish;
end

initial begin
$fsdbDumpfile("tb_0.fsdb");
$fsdbDumpvars(0, "tb_0");
#10000

$finish;
end

endmodule

Makefile

我们把常见操作编写到脚本里,这样可以方便的进行操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
TC=OurTC
TB=tb_0

initialize:
module load synopsys/vcs/R-2020.12-SP
module load synopsys/verdi/R-2020.12-SP2
compile:
@echo $(TC)
mkdir log
vcs -f {BASE_PATH_TO_PROJECT}/Design/Filelist/filelist \
-l ./log/test.log \
-full64 \
-debug_acc+pp+dmptf \
-debug_region+cell+encrypt \
-debug_access \
-sverilog \
-top $(TB) \
-R \
-fgp \
-V -Mupdate -full64 -sverilog +v2k +notimingcheck +no_tchk_msg \
+lint=all \
-timescale=1ns/1ps -notice \
-cm line+cond+tgl+fsm+branch -cm_dir ../cov/$(TC).vdb \

verdi:
verdi \
-sv \
-f {BASE_PATH_TO_PROJECT}/Demo/Design/Filelist/filelist \
-ssf $(TB).fsdb &

clear:
rm -rf verdiLog
rm -rf simv.daidir
rm -rf log
rm -rf csrc
rm .fsm.sch.verilog.xml
rm novas_dump.log
rm cm.log
rm simv
rm ucli.key

clear_all:
make clear
rm tb_0.fsdb

【数字IC设计】使用 VCS 与 Verdi 的前端仿真流程
https://hypoxanthineovo.github.io/2024/03/02/数字电路设计与实践/前端仿真/
作者
贺云翔 | Yunxiang He
发布于
2024年3月2日
许可协议