VCS 工具学习笔记(1)

news2024/11/28 4:45:08


目录

引言

平台说明

关于VCS

能力

Verilog 仿真事件队列

准备

VCS工作介绍

工作步骤

支持

工作机理

 编译命令格式

 编译选项

示例 

 仿真命令格式

仿真选项 

 示例

 库调用 -y

 总结

实践

设计文件

仿真文件

编译

仿真

 关于增量编译

日志文件记录

编译仿真接续进行

-o 选项

 +define 选项





引言

VCS 是Synopsys公司的EDA软件,主要用于Verilog 的逻辑仿真。这里记录一下学习的过程。软件的安装可以参考下面的链接:

Synopsys EDA Tools 安装问题记录https://blog.csdn.net/qq_43045275/article/details/127630241软件的学习参考了如下的链接:

数字IC设计之仿真工具synopsys VCS

本系列的文章对此做一个整理,结合虚拟机内的的VCS工具进行实践。

平台说明

OS:Ubuntu 16.04

EDA Tool :Vcs2016


关于VCS

能力

 支持语言:Verilog HDL、VHDL、System Verilog、PLI(可编程语言接口)

PLI可以支持对C、C++、语言的编译仿真。

Verilog 仿真事件队列

1、Vcs读取所有的initial块、always块、连续赋值语句 assign等;

2、首先执行无延迟语句,如寄存器初始化;

3、将仿真时间设为 0 ;

4、进入 active 区域,首先执行原语,即UDP(用户自定义原语,如基本的逻辑门、CMOS、PMOS逻辑、上下拉);然后执行显示 display(是一个系统任务);然后执行assign连续赋值语句(无延迟);而后是阻塞赋值语句,即always块内部的组合逻辑 “=”;

最后是非阻塞赋值(always块的时序逻辑“<=”)右边表达式的计算

5、进入 inactive 区域,此处主要处理 #0 延迟。

6、进入非阻塞赋值(Nonblocking assign)区域。

7、进入 monitor 区域,可以监测到非阻塞赋值的新值。

8、进入 future 区域,处理其他逻辑。

准备

1、在工程路径下面创建该文件:

2、代码:

`timescale 1ns/1ps
`define CASE1
module TEST;
reg clk,a,z,zin;

always @ (posedge clk)
begin
     a = 1'b1;
  #0 a = 1'b0;
end

`ifdef CASE1
 always @ (a) #0 z=zin;
 always @ (a) zin=a;
`else
 always @ (a) z = zin;
 always @ (a) #0 zin = a;
`endif
initial
begin
 #50 clk = 1'bz;
 #50 clk = 1'b0;
 #50 clk = 1'b1;
 #50 $finish;
end
endmodule

操作

1、在创建 .v 仿真文件所在的文件夹,右键打开终端。

2、输入命令:

vcs +v2k TEST.v

其中  TEST.v  为文件名。

 完成界面:

3、按照视频中的步骤,此时应用下面命令直接打开 DVE:

./simv -gui

但是,我这边始终报错:

 按照错误的指示,我重新编译仿真文件,并且加入要求的选项:

 完成后,用上面的命令再次尝试,可以直接打开DVE

4、添加波形界面:

 5、开始仿真

 6、仿真结果

 但是我此处的结果和视频中的不一致。猜测是VCS版本不同

7、退出

准备

数字IC设计必备技能:

1、基础的数字IC设计知识,数电等;

2、熟悉linnux 或 Unix操作系统;

3、熟练使用文本编辑器 VI 或VIM;

VCS工作介绍

工作步骤

主要分为2步:

1、编译(将源代码转换为二进制可执行文件 simv)

2、仿真

支持

 PLI,程序语言接口,可以支持在HDL语言中调用 C、C++程序

多抽象级:行为级、RTL级、门级

工作机理

 编译命令格式

 编译选项

示例 

 仿真命令格式

仿真选项 

 示例

 库调用 -y

 总结

实践

由于视频作者并没有公布源码,所以这里演示实践的时候,我自己随便写一个设计文件(简单状态机)和一个仿真文件。源代码给出:

用状态机写一个计数器:

当抓取到开始信号的上升沿后,开始计数并且输出有效信号拉高。计数到计数器全1时,结束计数,返回IDLE状态。

设计文件

// |--------------------------------- VCS test design file ---------------------------------
// |Description : a simple fsm.
// |Author      : Xu Y. B.
// |Date		: 2022-11-06
// |
// |----------------------------------------------------------------------------------------


`timescale 1ns/1ns

module FSM #(
// --------------module parameters specify ---------------- 
parameter 			P_DATA_WIDTH  	=	10

)(
// --------------input / output ports specify--------------
// input ports
input 									I_CLK_100M,
input									I_RSTN,
input 									I_FSM_START,
// output ports
output reg								O_DATA_VAL,
output reg  		[P_DATA_WIDTH-1:0]	O_DATA
	);
// --------------module internal parameters----------------
localparam 			LP_ST_IDLE 	=	2'b01;
localparam 			LP_ST_COUNT =   2'b10;
// --------------module internal signals-------------------
reg 			[1:0]				R_STATE;
reg 			[1:0]				R_I_FSM_START;	
wire								W_I_FSM_START_PDG;
// --------------module logic------------------------------
// grab the posedge of input signal I_FSM_START
always @ (posedge I_CLK_100M)
begin
	if(~I_RSTN)
	begin
		R_I_FSM_START <= 2'b00;
	end
	else
	begin
		R_I_FSM_START[0] <= I_FSM_START;
		R_I_FSM_START[1] <= R_I_FSM_START[0];	
	end
end
assign W_I_FSM_START_PDG = R_I_FSM_START[0] & (~R_I_FSM_START[1]);
always @ (posedge I_CLK_100M)
begin
	if(~I_RSTN)
	begin
		R_STATE <= LP_ST_IDLE;
		O_DATA_VAL <= 1'b0;
		O_DATA <= {P_DATA_WIDTH{1'b0}};
	end
	else 
	begin
		case(R_STATE)
		LP_ST_IDLE:
		begin
			O_DATA_VAL <= 1'b0;
			O_DATA <= {P_DATA_WIDTH{1'b0}};

			if(W_I_FSM_START_PDG)
			begin
				R_STATE <= LP_ST_COUNT;
			end
			else 
			begin
				R_STATE <= R_STATE;	
			end
		end
		LP_ST_COUNT:
		begin
			if(&O_DATA)
			begin
				O_DATA_VAL <= 1'b0;
				O_DATA <= {P_DATA_WIDTH{1'b0}};	
				R_STATE <= LP_ST_IDLE;			
			end
			else 
			begin
				O_DATA_VAL <= 1'b1;
				O_DATA <= O_DATA + 1;	
				R_STATE <= LP_ST_COUNT;	
			end
		end
		default:
		begin
			R_STATE <= LP_ST_IDLE;
		end
		endcase
	end
end
endmodule

仿真文件

// |--------------------------------- VCS test testbench file -------------------------------
// |Description : a simple fsm testbench.
// |Author      : Xu Y. B.
// |Date		: 2022-11-06
// |
// |----------------------------------------------------------------------------------------


`timescale 1ns/1ns

module TB();
// --------------module parameters specify ---------------- 
parameter 			P_DATA_WIDTH  	=	10;

// --------------input / output ports specify--------------
// input ports
reg 									I_CLK_100M;
reg										I_RSTN;
reg 									I_FSM_START;
// output ports
wire									O_DATA_VAL;
wire  		[P_DATA_WIDTH-1:0]			O_DATA;

// --------------clock setting-----------------------------
`define CLK_PRD 10
initial I_CLK_100M = 1'b0;
always #(`CLK_PRD/2) I_CLK_100M = ~I_CLK_100M;

// --------------control signals setting-------------------
initial 
begin
	I_RSTN = 1'b0;
	I_FSM_START = 1'b0;
	#(`CLK_PRD*10);
	I_RSTN = 1'b1;
	#(`CLK_PRD*5);
	I_FSM_START = 1'b1;
	@(negedge O_DATA_VAL);
	#(`CLK_PRD*10);
	$finish;
end

// --------------initiate module---------------------------
FSM #(
		.P_DATA_WIDTH(P_DATA_WIDTH)
	) FSM_INST (
		.I_CLK_100M  (I_CLK_100M),
		.I_RSTN      (I_RSTN),
		.I_FSM_START (I_FSM_START),
		.O_DATA_VAL  (O_DATA_VAL),
		.O_DATA      (O_DATA)
	);
	
endmodule

之前用惯了sublime text3写代码,于是就将sublime text3 搬到Linux系统下,具体方法:

1、较为简单:

ubuntu16.04安装sublime text3

2、较为详细:

Sublime text在Linux下的安装

安装完成后,直接在终端输入 subl 即可打开。

关闭更新提醒:关闭sublime更新提示

打开后图形操作界面以及方法和Windows下相同。

Ubuntu16.4 使用中文输入法:

ubuntu 16.04+中文输入法

编译

记得,虚拟机开机后,重新运行 lmg-scl,后面考虑将其放在启动文件内。

仿真

编译结束后执行仿真:

 添加信号进行波形仿真:

 

 

状态信号可以显示其状态名:

 关于增量编译

这里做一个对比,连续两次对源代码文件(未作修改)作增量编译,第二次就会有如下提示:

 

日志文件记录

 

 

编译仿真接续进行

 

-o 选项

 +define 选项

宏的定义:

由于我展示的实际文件没有宏定义,所以这里仅做方法介绍。

创建一个头文件,里面定义一个 NOTHING 的宏:

 

1、在源代码里定义;

2、通过 +define 选项指定;

 

3、通过头文件的形式;

        -1- 在源文件中包含头文件

        -2-编译时增加包含的路径

 



欢迎交流~~~~~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

链接脚本和可执行文件

几个重要的概念 摘取自知乎内容&#xff1a; 链接器与链接脚本 - 知乎 linker 链接器 链接器(linker) 是一个程序&#xff0c;这个程序主要的作用就是将目标文件(包括用到的标准库函数目标文件)的代码段、数据段以及符号表等内容搜集起来并按照 ELF或者EXE 等格式组合成一个…

【C++学习】string的使用

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《C学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; string的使用&#x1f640;模板&#x1f639;函数模板&#x1f639;类模板&#x1f640;string模板简…

【菜鸡读论文】Former-DFER: Dynamic Facial Expression Recognition Transformer

Former-DFER: Dynamic Facial Expression Recognition Transformer 哈喽&#xff0c;大家好呀&#xff01;本菜鸡又来读论文啦&#xff01;先来个酷炫小叮当作为我们的开场&#xff01; 粉红爱心泡泡有没有击中你的少女心&#xff01;看到这么可爱的小叮当陪我们一起读论文&am…

有了PySnooper,不用print、不用debug轻松查找问题所在!

PySnooper是一个非常方便的调试器&#xff0c;它是通过python注解的方式来对函数的执行过程进行监督的。 应用起来比较简单&#xff0c;不用一步一步的去走debug来查找问题所在&#xff0c;并且将运行过程中函数的变量值打印出来结果一目了然&#xff0c;相当于替代了print函数…

Boundary Loss 原理与代码解析

paper&#xff1a;Boundary loss for highly unbalanced segmentation Introduction 在医学图像分割中任务中通常存在严重的类别不平衡问题&#xff0c;目标前景区域的大小常常比背景区域小几个数量级&#xff0c;比如下图中前景区域比背景区域小500倍以上。 分割通常采用的交…

SpringBoot实践(三十三):Maven使用及POM详解

文章目录maven是什么maven怎么装settings.xml本地仓库地址&#xff1a;localRepository远程镜像&#xff1a;mirrorsJDK 版本&#xff1a;profile私服配置POM.xml中的常用标签projectmodelVersiongroupIdartifactIdversionpropertiesdependenciesbuild和pluginsresourcesdepend…

【学生管理系统】用户登录三种验证方式—图片验证、短信验证、邮件验证

目录 一、页面需求展示 二、验证方式—按钮组件 三、手机短信验证 四、邮件验证 五、图片验证邮件验证 &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、页面需求展示 二、验证方式—按钮组件 2.1前端 <el-form-item labe…

【Linux】第十章 进程间通信(管道+system V共享内存)

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

工作流的例子

工作流的例子目录概述需求&#xff1a;设计思路实现思路分析1.配置bean2.examples3.no bean4.activiti-api-basic-process-example5.taskspringweb参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c…

C++ 多态类型

多态 C在面向对象中&#xff0c;多态就是不同对象收到相同消息&#xff0c;执行不同的操作。在程序设计中&#xff0c;多态性是名字相同的函数&#xff0c;这些函数执行不同或相似的操作&#xff0c;这样就可以用同一个函数名调用不同内容的函数。简而言之“一个接口&#xff…

2022 国赛postgresql

安装postgresql配置postgresql [root@linux3 ~]# postgresql-setup --initdb //初始化数据库Initializing database in ‘/var/lib/pgsql/data’Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log[root@linux3 ~]# systemctl enable postgresql.service Created …

澳洲最热门职业,护士排第一,医生竟然不如程序员?

2022澳洲最新的职业紧缺名单出炉了&#xff0c;令人惊讶的是护士竟然排行第一名&#xff0c;可见澳洲的医疗人力资源紧缺的问题。 既然人力资源紧缺&#xff0c;那么首当其冲的医生作为高学历且同属医疗行业的代表理应收到重视&#xff0c;然而令人意外的是&#xff0c;通过榜单…

Linux一篇入门(以Ubuntu为例)

一、Linux与Windows区别 Linux&#xff1a;无盘符&#xff0c;只有一个根目录&#xff08;/&#xff09; Windows&#xff1a;有盘符 二、目录相关常见命令 Linux命令格式&#xff1a; cmd -option parameter cdm命令&#xff0c;就是一个操作 parameter一般是要做的对象…

韩国程序员面试考什么?

大家好&#xff0c;我是老三&#xff0c;在G站闲逛的时候&#xff0c;从每日热门上&#xff0c;看到一个韩国的技术面试项目&#xff0c;感觉有点好奇&#xff0c;忍不住点进去看看。 韩国的面试都考什么&#xff1f;有没有国内的卷呢&#xff1f; 可以看到&#xff0c;有8.…

抽象类和接口

文章目录 前言 一、今日回顾 1.《高等数学》 2.阅读&#xff1a; 3.英语&#xff1a; 二、编程的那些事 1.引入库 2.读入数据 总结 前言 一、今日回顾 1.《高等数学》 2.阅读&#xff1a; 3.英语&#xff1a; 二、编程的那些事 1.抽象类的描述 在java中&#xff0…

一次函数与二次函数的联系

首先&#xff0c;无论是一次函数还是二次函数&#xff0c;都是函数&#xff0c;所以便可以从表达式&#xff0c;图像&#xff0c;函数的四个性质&#xff08;即有界性&#xff0c;单调性&#xff0c;奇偶性&#xff0c;周期性&#xff09;去看他们之间的联系 一次函数与二次函…

2022第8届中国大学生程序设计竞赛CCPC桂林站, 签到题4题

文章目录A. LilyM.Youth FinaleC.Array ConcatenationE.Draw a triangleA. Lily A. Lily time limit per test1 second memory limit per test512 megabytes inputstandard input outputstandard output They serve the purpose of changing hydrogen into breathable oxygen,…

MySQL数据库 -- 库和表的操作

关于数据库方面&#xff0c;还是需要多多练习的&#xff0c;否则很多指令不容易记住&#xff0c;所以大家也要在自己的电脑上多写写&#xff0c;熟悉熟悉~ 目录 库的操作 创建数据库 操纵数据库 查看数据库 显示创建语句 修改数据库 数据库的删除 数据库备份和恢复 …

重学数据库基础

幸福找到我&#xff0c;幸福说&#xff1a;“瞧这个诗人&#xff0c;他比我本人还要幸福” 一、数据库相关概念 数据库 存储数据的仓库&#xff0c;数据是有组织的进行存储英文&#xff1a;DataBase&#xff0c;简称 DB 数据库管理系统 管理数据库的大型软件英文&#xff1a;Da…

CSI室内指纹定位——相关通信名词解释

目录 1、无线信道 2、时域与频域 3、信道频率响应&#xff08;Channel Frequency Response,CFR&#xff09; 4、信道冲激响应&#xff08;Channel Impulse Response, CIR&#xff09; 5、信道带宽 6、带宽 7、子载波 9、波长 10、频率 11、振幅 12、相位 13、相位差…