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上面跑 ...
随机推荐
- ElasticSearch快照备份、还原
快照备份 备份和还原的前提:在配置文件elasticsearch.yml中设置path.repo path.repo: ["D:\\elasticsearch-6.8.23\\elastic ...
- 春秋云镜 - CVE-2022-29464
WSO2文件上传漏洞(CVE-2022-29464)是Orange Tsai发现的WSO2上的严重漏洞.该漏洞是一种未经身份验证的无限制任意文件上传,允许未经身份验证的攻击者通过上传恶意JSP文件在W ...
- 火爆全网的Log4j 漏洞复现GetShell
目录: 一.搭建环境 1. 首先拉一个docker镜像 2. 然后启动环境 二.获取shell 首先,试验一下DNSLog 1. 准备JNDI注入工具 下载 进入目录打包成jar包 2. 利用 生成p ...
- ElasticSearch的简单api介绍
1:ElasticSearch是什么? Elasticsearch 是一个分布式的免费开源搜索和分析引擎 适用于包括文本.数字.地理空间.结构化和非结构化数据等在内的所有类型的数据 Elasticse ...
- Shiro 的基本使用
简介 Apache Shiro 是一个强大的.灵活的开源安全框架,可以干净地处理验证.授权.企业会话管理和加密等功能 相关特性 Apache Shiro 具有的主要特性如下图所示: 主要关注的地方在于 ...
- 使用bind搭建内网dns服务
dns服务端方案简介 dns服务有什么用呢,尤其是内网的dns服务,其实用处还蛮大的,我见过的典型使用,是数据库跨机房多活. 如某mysql主机搭建在深圳机房,为了保证高可用,那我们可以给这台主库,维 ...
- 未加载mscorlib.pdb
前言: 早上上班按照正常流程打开Visual Studio,调试本地项目,然后奇怪的是一直提示未加载mscorlib.pdb,导致项目无法正常运行,经过一番折腾最后解决了这个突如其来的bug! 问题重 ...
- LiteOS基于Sensorhub的超声波模组移植
摘要:本文为你带来LiteOS基于Sensorhub的超声波模组移植的应用. 1.Sensor Hub LiteOS传感框架即Sensor Hub,是一个基于Huawei LiteOS物联网操作系统的 ...
- 二进制SCA指纹提取黑科技:Go语言逆向技术
摘要:SCA(Software Composition Analysis)软件成分分析,指通过对软件源码.二进制软件包等的静态分析,挖掘其所存在的开源合规.已知漏洞等安全合规风险,是一种业界常见的安全 ...
- CANN5.0黑科技解密 | 高并发图片视频处理,为出行保驾,为生活添彩!
摘要:华为推出昇腾AI基础软硬件平台(昇腾AI处理器+异构计算架构CANN),不仅能高效承接各类人工智能计算任务,还可两招解决以上图像处理面临的诸多问题. 四通八达的路网和车水马龙的盛景诠释着城市的繁 ...