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. 【内核】基于 LSM 框架的 ELF 校验控制

    欲实现操作系统对正在加载的 ELF 文件的校验控制,需要借助 LSM 框架. LSM 框架介绍 LSM 全称 Linux Security MOdule,是 Linux 的一个安全模块框架.LSM 为 ...

  2. 专业的字节码查看工具——jclasslib

    下载地址: GitHub地址:点击下方蓝色链接即可. https://github.com/ingokegel/jclasslib/releases/download/6.0.4/jclasslib_ ...

  3. SpringCloud OpenFeign的使用

    SpringCloud OpenFeign的使用 是什么: 声明式http客户端. 目的: 使远程调用更简单 作用: 提供了http请求模板,仅需编写简单接口和插入注解,就可以定义好原始http请求的 ...

  4. CENTOS docker拉取私服镜像

    概述 docker的应用越来越多,安装部署越来越方便,批量自动化的镜像生成和发布都需要docker镜像的拉取. centos6版本太老,docker的使用过程中问题较多,centos7相对简单容易. ...

  5. ACTF flutter逆向学习

    参考了许多大佬的博客,在此特别诚挚感谢oacia大佬和其他大佬的博客和指导! 1.flutter和apk基础结构介绍 首先下载附件,是一个apk文件,用jadx打开 可以看见flutter字样,而fl ...

  6. 让 sdk 包静默升级的 SAO 操作,你见过几种?

    拓展阅读 让 sdk 包静默升级的 SAO 操作,你见过几种? 业务背景 有时候为业务方提供了基础的 sdk 包,为了保证稳定性,一般都是 release 包. 但是每一次升级都非常痛苦,也不可能写一 ...

  7. 事件Event:带你体验鸿蒙轻内核中一对多、多对多任务同步

    摘要:本文通过分析鸿蒙轻内核事件模块的源码,深入掌握事件的使用. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十二 事件Event>,原文作者:zhushy . 事件(Event)是一 ...

  8. 跟我读论文丨ACL2021 NER BERT化隐马尔可夫模型用于多源弱监督命名实体识别

    摘要:本文是对ACL2021 NER BERT化隐马尔可夫模型用于多源弱监督命名实体识别这一论文工作进行初步解读. 本文分享自华为云社区<ACL2021 NER | BERT化隐马尔可夫模型用于 ...

  9. hadoop put 强制覆盖文件

    若hdfs上已经存在文件,要强制覆盖,用 -f 命令 如: hadoop fs -put -f file.name /home/test/

  10. 乐高式扩展:在Seal软件供应链防火墙中轻松集成代码规范工具

    上个月,Seal 软件供应链防火墙 v0.2(以下简称"Seal")正式发布,这一版本实现了可扩展架构,用户可以根据自身需求插件式集成原生或第三方解决方案,灵活扩展扫描能力. 在前 ...