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上面跑 ...
随机推荐
- C++ Qt开发:StandardItemModel数据模型组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍Standar ...
- django模型不应该作为参数传递给task
Django 模型对象.它们不应该作为任务的参数传递.当任务运行时从数据库重新获取对象几乎总是更好,因为使用旧数据可能会导致竞争条件. 想象一下以下场景,您有一篇文章和一个自动扩展其中一些缩写的任务: ...
- postman——下载与安装
一.postman是什么? 那么,Postman是个什么东东呢?Postman的官网上这么介绍它:"Modern software is built on APIs,Postman help ...
- C语言使用dlfcn动态载入.so动态库
转载:https://mp.weixin.qq.com/s?__biz=Mzk0NDYzNTI1Ng==&mid=2247483722&idx=1&sn=09a9458b012 ...
- 使用WPF开发自定义用户控件,以及实现相关自定义事件的处理
在前面随笔<使用Winform开发自定义用户控件,以及实现相关自定义事件的处理>中介绍了Winform用户自定义控件的处理,对于Winform自定义的用户控件来说,它的呈现方式主要就是基于 ...
- osgEarth使用笔记2——推荐两个底图数据
目录 1. 概述 2. 详论 2.1. Blue Marble 2.2. Bright Earth eAtlas Basemap 3. 分享 1. 概述 可以通过osgEarth自带的world.ti ...
- Rasa初始化聊天机器人的配置
本文详细介绍了使用 rasa init 初始化聊天机器人项目的配置,包括 nlu.yml.rules.yml.stories.yml.test_stories.yml.config.yml.cre ...
- gitlab jenkins 安装笔记
gitlab gitlab ce是社区版本,ee是企业版本,称为gitee. https://packages.gitlab.com/gitlab/gitlab-ce/install 通过运行curl ...
- 一文带你了解Web前端发展历程
摘要:自互联网行业发展以来,web前端不断发展变化着.在前人的基础上,后人有幸能够站在前人的肩膀上行走.前端的发展变化不仅是继承式的迭代,同时也是不断的变革和创造. 一.前端到底是个什么? 简单点说, ...
- 人人都在聊的云原生数据库Serverless到底是什么?
摘要:华为云数据库营销专家Tony Chen和华为云数据库高级产品经理佳恩开展了一场关于云原生数据库与Serverless结合的直播对话. 云计算的迅猛发展推动了数据库的变革,云原生数据库成为当前数据 ...