目录

笔记

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

发布于 2024年3月2日 硬件与仿真

前端仿真

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

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

环境搭建

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

首先,我们需要保证环境变量里存在 vcsverdi 。例如,大部分环境下,可以使用 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