Verilog Simulation Event Queue

主要了解VCS是如何处理交给它的代码的

Verilog的仿真事件队列,介绍VCS如何处理交给它的代码。VCS是Synopsys公司的,支持多种语言。

1.Verilog 仿真事件队列

Verilog内建仿真规范

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

2.VCS处理代码的流程



VCS如何处理交给它的代码

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

3.VCS事件队列例子

  1. 上升沿来的时候,#0延迟是执行在inactive区的。
  2. 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 问题

  1. 时序逻辑-always中是不建议使用阻塞赋值,要使用非阻塞赋值
  2. always中不允许使用#0
  3. 缺失reset复位信号
  4. 对于使用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-执行过程的更多相关文章

  1. 01-逻辑仿真工具VCS使用

    1 逻辑仿真工具VCS的使用 在书写完成RTL代码之后,确保自己书写的代码和自己想要的逻辑是一致的. VCS是synopsys公司下的的仿真工具. 1 VCS仿真过程 编译-->仿真--> ...

  2. 02-逻辑仿真工具VCS使用

    逻辑仿真工具VCS使用 1 Makefile执行VCS仿真 # Makefile for simulating the full_adder.v with the simulator VCS # -- ...

  3. 详细分析SQL语句逻辑执行过程和相关语法

    本文目录: 1.SQL语句的逻辑处理顺序 1.2 各数据库系统的语句逻辑处理顺序 1.2.1 SQL Server和Oracle的逻辑执行顺序 1.2.2 MariaDB的逻辑执行顺序 1.2.3 M ...

  4. 说说Python程序的执行过程

    1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言, ...

  5. MySQL 中一条 sql 的执行过程

    一条 SQL 的执行过程 前言 查询 查询缓存 分析器 优化器 执行器 数据更新 日志模块 redo log (重做日志) binlog (归档日志) undo log (回滚日志) 两阶段提交 为什 ...

  6. ASP.NET Web API 过滤器创建、执行过程(二)

    ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...

  7. ASP.NET Web API 控制器执行过程(一)

    ASP.NET Web API 控制器执行过程(一) 前言 前面两篇讲解了控制器的创建过程,只是从框架源码的角度去简单的了解,在控制器创建过后所执行的过程也是尤为重要的,本篇就来简单的说明一下控制器在 ...

  8. ORACLE数据库SQL语句的执行过程

    SQL语句在数据库中处理过程是怎样的呢?执行顺序呢?在回答这个问题前,我们先来回顾一下:在ORACLE数据库系统架构下,SQL语句由用户进程产生,然后传到相对应的服务端进程,之后由服务器进程执行该SQ ...

  9. Struts2执行过程解析

    说到Struts2执行过程就少不了一张图: 1 客户端初始化一个指向Servlet容器的请求: 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextClea ...

  10. MapReduce概述,原理,执行过程

    MapReduce概述 MapReduce是一种分布式计算模型,运行时不会在一台机器上运行.hadoop是分布式的,它是运行在很多的TaskTracker之上的. 在我们的TaskTracker上面跑 ...

随机推荐

  1. 文心一言 VS 讯飞星火 VS chatgpt (164)-- 算法导论13.1 4题

    四.用go语言,假设将一棵红黑树的每一个红结点"吸收"到它的黑色父结点中,使得红结点的子结点变成黑色父结点的子结点(忽略关键字的变化).当一个黑结点的所有红色子结点都被吸收后,它可 ...

  2. keycloak~从login-status-iframe页面总结如何跨域传值~续

    keycloak~从login-status-iframe相关文章,可阅读我的这两篇keycloak~从login-status-iframe页面总结如何跨域传值,keycloak~对接login-s ...

  3. 从零玩转Docker之docker-compose快捷部署中间件-dockercompose2

    title: 从零玩转Docker之docker-compose快捷部署中间件 date: 2023-04-04 17:35:18.035 updated: 2023-05-13 23:08:09.5 ...

  4. 【笔记】01 -- Spring-Cloud介绍

    第一章节我们主要是介绍微服务 springCloud的架构和分布式的区别 但是后面会主要介绍netflix公司与Alibaba公司的两套架构 系统架构 **概述** 随着互联网的发展,网站应用的规模不 ...

  5. Centos7安装高版本BIND9.16.41(DNS服务器)

    安装高版本BIND9.16.41或9.18.15 双数版本为稳定版如9.16.9.18 使用手册:https://bind9.readthedocs.io/en/v9_16_19/reference. ...

  6. 分享.Net 设计模式大全

    由于最近项目处于维护阶段,工作没有那么匆忙了.于是开始回头整理一下常用设计模式. 虽说设计模式大家都知道,但是在写代码过程中为了抓项目进度有时候写着写着就变成面向过程开发了--后面维护起来将会相当的悲 ...

  7. Linux发行版的基础目录名称、命名法则及功能规定

    罗列Linux发行版的基础目录名称命名法则及功用规定 目录描述 /主层次 的根,也是整个文件系统层次结构的根目录 /bin存放在单用户模式可用的必要命令二进制文件,所有用户都可用,如 cat.ls.c ...

  8. Programming Abstractions in C阅读笔记:p196

    <Programming Abstractions in C>学习第63天,p196总结.涉及到编程之外的知识,依然是读起来很费劲,需要了解作者在书中提到的人物(Edouard Lucas ...

  9. 文心一言 VS 讯飞星火 VS chatgpt (18)-- 算法导论4.1 5题

    五.使用如下思想为最大子数组问题设计一个非递归的.线性时间的算法.从数组的左边界开始,由左至右处理,记录到目前为止已经处理过的最大子数组.若已知 A[1..j]门的最大子数组,基于如下性质将解扩展为 ...

  10. Flume快速入门

    Flume快速入门 一.简介 高可用.高可靠,分布式的海量日志采集.聚合和传输系统,基于流式架构,灵活简单. event:事件 source:数据源 sink:目标 channel:数据管道 通过获取 ...