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上面跑 ...
随机推荐
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-36-处理web页面定位toast-下篇
1.简介 按理说,现在这种一闪而过的toast的已经相当普及或者是见怪不怪了,应该网上的大网站会用到的,偶然的在一次租房中,看到了这种场景,所以宏哥决定将其拿来主义,进行演示实践一下. 2.租房网站 ...
- PersistenceException、ReflectionException、IllegalArgumentException、wrapException持久性异常 反射异常 非法参数异常 包装异常
PersistenceException.ReflectionException.IllegalArgumentException.wrapException wrapException 持久性异常 ...
- cp {,bak}用法(转载)
cp filename{,bak} cp filename{,.bak} 这个命令是用来把filename备份成filename.bak的 等同于命令 cp filename filename.bak ...
- 浅谈6种流行的API架构风格
前言 API在现代软件开发中扮演着重要的角色,它们是不同应用程序之间的桥梁.编写业务API是日常开发工作中最常见的一部分,选择合适的API框架对项目的成功起到了至关重要的作用.本篇文章将浅谈一下当前6 ...
- 从Bitcask存储模型谈超轻量级KV系统设计与实现
Bitcask介绍 Bitcask是一种"基于日志结构的哈希表"(A Log-Structured Hash Table for Fast Key/Value Data) Bitc ...
- 2023-06-30:给你一个 rows * cols 大小的矩形披萨和一个整数 k, 矩形包含两种字符: ‘A‘ (表示苹果)和 ‘.‘ (表示空白格子), 你需要切披萨 k-1 次,得到 k 块披
2023-06-30:给你一个 rows * cols 大小的矩形披萨和一个整数 k, 矩形包含两种字符: 'A' (表示苹果)和 '.' (表示空白格子), 你需要切披萨 k-1 次,得到 k 块披 ...
- CUDA C编程权威指南:1-基于CUDA的异构并行计算
什么是CUDA?CUDA(Compute Unified Device Architecture,统一计算设备架构)是NVIDIA(英伟达)提出的并行计算架构,结合了CPU和GPU的优点,主要用来 ...
- 解读顶会CIKM'21 Historical Inertia论文
摘要:本文(Historical Inertia: An Ignored but Powerful Baseline for Long Sequence Time-series Forecasting ...
- 详解4种微服务框架接入Istio方案
摘要:使用k8s和lstio网格进行开发,将服务发现.服务治理留给基础设施,可以将开发人员从复杂的服务中解脱出来,专注于业务开发,是当前来说比较好的解决方案. 本文分享自华为云社区<传统微服务框 ...
- storybook 编写stories的story基础语法
编写 stories story 用于展示组件某个状态,每个组件可以包含任意多个 story,用来测试组件的各种场景.根据默认配置,只需要在组件的文件夹中,以 **.component.stories ...