05-逻辑仿真工具VCS-执行过程
Verilog Simulation Event Queue
主要了解VCS是如何处理交给它的代码的
Verilog的仿真事件队列,介绍VCS如何处理交给它的代码。VCS是Synopsys公司的,支持多种语言。
1.Verilog 仿真事件队列
Verilog内建仿真规范
- IEEE1364,Verilog语言的仿真基于分层的事件队列
- 执行事件的队列
- 仿真时间的计算
- Verilog仿真器先从没有延迟的事件开始,执行他们,然后把时间设为0,然后按照时间顺序依次执行各个事件。
- Verilog语言规范没有规定当多个事件被安排在同一时刻来调度时,因该执行哪个。
- 只要在同一层次的事件,什么执行顺序都是可以的
- 在CPU的环境下,或者是说在软件的环境下,指令的执行是串行的。单核CPU是串行的,多核CPU是并行的。硬件电路与软件的区别就是并发的执行性。如何通过软件模拟硬件的并发性非常重要,仿真器仿真的时候,相同的代码交给不同厂商生产的厂商出品的仿真器,结果可能不同。
- 仿真器设计出来有一定的算法,首先按照一定的标准去做,有自己的内建实现标准。
- 设计师必须理解Verilog的分层仿真事件队列
2.VCS处理代码的流程

VCS如何处理交给它的代码
- VCS会将模块代码读入,将代码中的always和assign读入,按照顺序放到一个队列中。
- 先执行一些没有延时的语句,比如初始化的语句(变量的初始化,initial)。执行了没有延时的语句之后,设置当前时间为0,current_time=0。
- 进入active region
- Verilog首先会执行一些源与,在Verilog中有简单的与门、或门、非门、PMOS、COMS,执行是没有时间的
- $display()--是没有任何延迟的
- assign--没有延迟的assign语句
- Blocking assign--阻塞赋值,=,首先将右边的表达式计算出来,同时赋值给左边的部分。阻塞赋值在active区的两步全部完成
- Nonblocking RHS--非阻塞赋值(<=),只计算出(<=)右侧表达式的结果,并不进行完成赋值。非阻塞赋值在inactive区只完成一部分
- 进入inactive region,在RTL代码中使用#0,虽然表示没有延迟,但是实际执行的时候是在inactive区(#0)--首先执行active区,inactive区执行#0延时的,虽然#0表示延迟为0,但是执行的区域是不同的。
- 进入Nonblocking assgin region--完成非阻塞赋值的赋值操作
- 进入monitor region--$monitor events系统函数与display相似,但是不同。
- $monitor系统函数在monitor region执行;display在active region
- $monitor后面跟几个变量,比如a,b,c,只有在变量发生变化的时候,monitor才会执行。也就是说,如果用monitor监测一个非阻塞赋值变量得到的是赋值之后的新值;用display监测非阻塞赋值变量,得到的是没有赋值之前的旧值。
- 进入future region处理其他的语句。
3.VCS事件队列例子

- 上升沿来的时候,#0延迟是执行在inactive区的。
- ifdef-条件编译,就是告诉编译器,如果CASE1宏定义了的话,执行下面的语句,没有定义执行else语句;

`timescale 1ns/1ns
`define CASE1
module sim_event;
reg clk,a,z,zin;
always @ (posedge clk) begin
a = 1'b1;
#0;
a = 1'b0;
end
`ifdef CASE1 // case1: z is inactive
always @ (a) #0 z = zin;
always @ (a) zin = a;
`else
always @ (a) z = zin;
always @ (a) #0 zin = a;
`endif
//generate clk
initial begin
#50 clk = 1'bz;
#50 clk = 1'b0;
#50 clk = 1'b1;
#50 $finish;
end
endmodule
3.1 不同仿真器的仿真结果
VSC仿真



- a z zin - 0 1 1
modelsim仿真

- a z zin - 0 0 0
相同的代码,在不同的仿真器,结果不同,严格来说是没有对错之分的,首先符合语法规范
3.2 问题
- 时序逻辑-always中是不建议使用阻塞赋值,要使用非阻塞赋值
- always中不允许使用#0
- 缺失reset复位信号
- 对于使用always语句生成组合逻辑,一般使用always(*)用于产生组合逻辑电路
4.数字逻辑仿真工具VCS
VCS支持数字逻辑仿真工具,不适用于逻辑


- 数字电路和verilog
- linux操作系统及GVIM(VI)文本编辑器

- Gate-Level regression -- 后仿
- coverage(覆盖率)--代码覆盖率和功能覆盖率


5.VCS仿真过程
VCS是编译型逻辑仿真工具
- 首先将RTL编译成二进制可执行文件
- 执行仿真


- 符合IEEE-1364标准
- 通过PLI接口调用C语言或者是C++写的程序
- 支持多个抽象级别的仿真(行为级描述(验证用的多),RTL级(设计用的多),门级(RTL级经过综合之后得到的,与具体的工艺库相关tsmc,smic,csmc))

6.VCS编译命令及选项


- 增量编译,如果现在设计有100个RTL.v文件,验证文件有1000个文件,如果要修改其中的一个文件,如果重新编译会花费很长的时间,使用增量编译,将修改的一个文件进行编译,和其他文件的.o文件做链接生成二进制执行文件
- -R -- 表示生成simv文件后自动执行
- -gui -- 表示产生DVE图形界面
- -l -- 编译的时候产生的信息记录到后面的文件中
- -sverilog -- 支持system verilog
- +v2k -- 支持verilog 2001语法

- -v lib_file -- -v 使用工艺库
- -y lib_dir -- 指定vcs寻找的路径
- +libext+lib_ext -- 在lib_dir路径中寻找文件的时候指明文件的后缀名
- +incdir+inc_dir -- 在rtl代码中使用`include的时候,指定include所指明文件所在的路径
- -f file -- 将很多源代码整合到一个filelist文件中去,通过-f调用
- -o foo -- 修改simv文件名称为foo


7.VCS仿真命令


- -l logfile 记录仿真文件

8.库文件使用

9.回顾


- -Mupdate -- 增量编译
- -l compile.log -- 生成compile.log文件
05-逻辑仿真工具VCS-执行过程的更多相关文章
- 01-逻辑仿真工具VCS使用
1 逻辑仿真工具VCS的使用 在书写完成RTL代码之后,确保自己书写的代码和自己想要的逻辑是一致的. VCS是synopsys公司下的的仿真工具. 1 VCS仿真过程 编译-->仿真--> ...
- 02-逻辑仿真工具VCS使用
逻辑仿真工具VCS使用 1 Makefile执行VCS仿真 # Makefile for simulating the full_adder.v with the simulator VCS # -- ...
- 详细分析SQL语句逻辑执行过程和相关语法
本文目录: 1.SQL语句的逻辑处理顺序 1.2 各数据库系统的语句逻辑处理顺序 1.2.1 SQL Server和Oracle的逻辑执行顺序 1.2.2 MariaDB的逻辑执行顺序 1.2.3 M ...
- 说说Python程序的执行过程
1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言, ...
- MySQL 中一条 sql 的执行过程
一条 SQL 的执行过程 前言 查询 查询缓存 分析器 优化器 执行器 数据更新 日志模块 redo log (重做日志) binlog (归档日志) undo log (回滚日志) 两阶段提交 为什 ...
- ASP.NET Web API 过滤器创建、执行过程(二)
ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...
- ASP.NET Web API 控制器执行过程(一)
ASP.NET Web API 控制器执行过程(一) 前言 前面两篇讲解了控制器的创建过程,只是从框架源码的角度去简单的了解,在控制器创建过后所执行的过程也是尤为重要的,本篇就来简单的说明一下控制器在 ...
- ORACLE数据库SQL语句的执行过程
SQL语句在数据库中处理过程是怎样的呢?执行顺序呢?在回答这个问题前,我们先来回顾一下:在ORACLE数据库系统架构下,SQL语句由用户进程产生,然后传到相对应的服务端进程,之后由服务器进程执行该SQ ...
- Struts2执行过程解析
说到Struts2执行过程就少不了一张图: 1 客户端初始化一个指向Servlet容器的请求: 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextClea ...
- MapReduce概述,原理,执行过程
MapReduce概述 MapReduce是一种分布式计算模型,运行时不会在一台机器上运行.hadoop是分布式的,它是运行在很多的TaskTracker之上的. 在我们的TaskTracker上面跑 ...
随机推荐
- 关于WPF下用户登录后再启动主窗体的实现方法
/// <summary>App.xaml 的交互逻辑</summary> public partial class App : Application { private b ...
- EasyDO这么好用!别家的运维小哥都馋哭了
运维这份工作似乎总是被人误会- 修服务器的 接网线的 盯监控的 维护系统的 说啥的都有,平常人都不太知道运维是干啥的 跟小编来探一探云掣MSP服务线运维小哥的实际运维工作? 运维小哥一部分日常工作就是 ...
- 数据结构入门之单链表代码实现(java)
1:单链表是: 单链表是一种链式存取的 数据结构 用一组地址任意的 存储单元 存放线性表中的数据元素. 链表中的数据是以结点来表示的,每个结点的构成:元素 ( 数据元素 的映象) + 指针 (指示后继 ...
- quill富文本编辑器quill粘贴图片上传服务器
强大的富文本编辑器:quill github:32k start++,:https://github.com/quilljs/quill quill粘贴图片上传服务器 <link href=&q ...
- 开发篇1:使用原生api和Langchain调用大模型
对大模型的调用通常有以下几种方式:方式一.大模型厂商都会定义http风格的请求接口,在代码中可以直接发起http请求调用:方式二.在开发环境中使用大模型厂商提供的api:方式三.使用开发框架Langc ...
- 微信小程序卡片
1.1 效果 左右滑动 1.2 代码 <view class="container"> <swiper autoplay interval="4000& ...
- CartoonGAN论文复现:如何将图像动漫化
摘要:本案例是 CartoonGAN: Generative Adversarial Networks for Photo Cartoonization的论文复现案例. 本文分享自华为云社区<c ...
- 华为云SparkRTC面向低时延、大通量传输业务的技术探索
摘要:网络和移动设备高速发展的今天,人们开始思考如何用更短的时间下载更大的文件,追求更快的速度.当下在稳定的基础上有什么方法可以提升速度呢? 本文分享自华为云社区<华为云SparkRTC面向低时 ...
- 解读革命性容器集群CCE Turbo:计算、网络、调度全方位加速
摘要:CCE Turbo是华为云推出的一款革命性容器集群. 5月31日,在华为云Techwave云基础设施技术专题日上,华为云容器批量计算首席架构师马达对CCE Turbo的技术内幕进行了深度解读,C ...
- 云图说|数据仓库服务 GaussDB(DWS) 的“千里眼、顺风耳”—数据库智能运维
摘要:数据库智能运维(DMS)是GaussDB(DWS) 为客户数据库快速.稳定运行提供保驾护航的能力,对业务数据库所使用磁盘.网络.OS指标数据,集群运行关键性能指标进行收集.监控.分析.通过综合收 ...