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. Scrapy框架架构

    ENGINE:引擎,负责各个组件的管理. SPIDERS:各个爬虫文件类.(我们一般要写的代码就是这个). SCHEDULER:调度器,ENGINE将爬虫任务分发给该组件,由该组件调度爬虫任务. DO ...

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

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

  3. Centos7——防火墙(Firewall)命令

    centos防火墙根据系统大致有2种,一种是centos6时代的iptables:一种是centos7时代的firewalld: CentOS 7中防火墙是一个非常的强大的功能,在CentOS 6.5 ...

  4. PHP中的反序列化漏洞理解

    序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象: class S{ public $test="pikachu"; } $s=n ...

  5. Weblogic获取端口IP

    Weblogic获取端口IP 获取端口IP只为了判断哪个节点 调用 private WebMBeanServer server=new WebMBeanServer(); synlog.info(&q ...

  6. CF650A Watchmen

    首先解释一下题目里面的两个概念: 曼哈顿距离:即 \(|x_a - x_b| + |y_a - y_b|\) 欧几里得距离:即 \(\sqrt{(x_a - x_b) ^ 2 + (y_a - y_b ...

  7. 教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  8. 这项评测,华为云GaussDB(for MySQL)顺利通过

    摘要:近日,中国信息通信研究院(简称"中国信通院")公布了第十五批"可信数据库"评测结果.华为云GaussDB(for MySQL)凭借过硬的技术实力顺利通过& ...

  9. 标准物模型:设备无缝对接,IOT界的福音

    摘要:信息模型是解决IoT产业发展一系列挑战的关键,在信息模型的基础上可以推进行业标准/架构的统一,进而实现产业链生态的协同. 本文分享自华为云社区<[云驻共创]标准物模型,物联网的福音> ...

  10. 业务并发度不够,数仓的CN可以来帮忙

    摘要: CN全称协调节点(Coordinator Node),是和用户关系最密切也是DWS内部非常重要的一个组件,它负责提供外部应用接口.优化全局执行计划.向Datanode分发执行计划,以及汇总.处 ...