笔记
【数字IC设计】使用 VCS 与 Verdi 的前端仿真流程
发布于 2024年3月2日 硬件与仿真
前端仿真
首先,本地新建项目一般需要一个工程文件夹,其文件结构大致是:
Design(RTL,filelist),Flow(Syn,Lint等等),VRF(Verify)(tb,tc等等)
环境搭建
在这里,我们使用 VCS 和 Verdi 进行前端仿真和波形查看。
首先,我们需要保证环境变量里存在 vcs 和 verdi 。例如,大部分环境下,可以使用 module load 来进行环境变量的加载。
文件结构
这里以我们实现一个 Adder 为例子
.
├── 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
module Adder(
input a,
input b,
output out
);
assign out = a + b;
endmodule
filelist
/path/to/project/Design/RTL/Adder.v
/path/to/project/Verification/TestBench/tb_0.v
tb_0.v
`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
我们把常见操作编写到脚本里,这样可以方便的进行操作。
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