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上面跑 ...
随机推荐
- OfficeWeb365任意文件读取
OfficeWeb365任意文件读取 OfficeWeb365 /Pic/Indexs接口处存在任意文件读取漏洞,攻击者可通过独特的加密方式对payload进行加密,读取任意文件,获取服务器敏感信息, ...
- springboot整合hibernate(非JPA)(一)
springboot整合hibernate(非JPA)(一) springboot整合hibernate,非jpa,若是jpa就简单了,但是公司项目只有hibernate,并要求支持多数据库,因此记录 ...
- Spring MVC 源码解析
本文的 MVC 基于传统的 Servlet 应用,所使用的 Spring Web 的环境为 Spring Boot 2.5.2 静态资源的加载 参考 Spring Boot 中给出的文档,原文如下: ...
- UE5:相机震动CameraShake源码分析
本文将会分析UE5中相机震动的调用流程,会简要地分析UCameraModifier_CameraShake.UCameraShakeBase等相关类的调用过程. 阅读本文,你至少需要使用或者了解过Ca ...
- Docker 使用及常见问题总结
一.使用 1.docker run -it 命令中的 it 参数是什么含义 在Docker中,-it是两个选项的组合,用于在交互式模式下运行容器.让我解释一下它们的含义: -i 或 --interac ...
- Llama2-Chinese项目:8-TRL资料整理
TRL(Transformer Reinforcement Learning)是一个使用强化学习来训练Transformer语言模型和Stable Diffusion模型的Python类库工具集, ...
- Nacos 本地单机版部署步骤和使用
本系列是 Spring Cloud 微服务实战系列教程.之前在 <Spring Cloud Eureka 入门 (一)服务注册中心详解> 聊过 Spring Cloud Eureka.那今 ...
- 聊聊Java的异常机制问题
摘要:java异常指在程序运行时可能出现的一些错误,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,中断了正在执行的程序的正常指令流. 本文分享自华为云社区<Ja ...
- 火山引擎DataLeap数据血缘技术建设实践
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 DataLeap是火山引擎数智平台VeDI旗下的大数据研发治理套件产品,帮助用户快速完成数据集成.开发.运维.治理 ...
- HanLP — HMM隐马尔可夫模型 -- 预测
https://www.bilibili.com/video/BV1aP4y147gA?p=8