SystemVerilog LRM 学习笔记 -- SV Scheduler仿真调度
1. 为什么要理解scheduler?
SystemVerilog是HDVL语言,相较与Verilog,除了面向HW design应用,也为了提高verif的效率。所以其仿真调度算法在向下兼容Verilog的同时,增加了不少新的‘Time region’,以便更好的支持program块等针对验证需求的新特性。
SV不同于C/C++等软件语言,为了对硬件进行仿真建模,所以有很多并行的process,而仿真器作为运行在CPU上的软件,只是按照SV LRM的仿真调度算法,开始仿真后,将仿真时间串行的一步步的向前推进。由于SV LRM并没有完全详细的规定并行的process以具体什么样的顺序来执行,这就引进许多不确定性(Nondeterminism), 不同厂家的仿真器可能有不同的仿真结果。
为了在coding时就消除这种不确定性,更好理解常见的design rule,需要对Verilog/SV的仿真调度算法进行深刻理解,并且涉及到VHDL的混合仿真,也要理解VHDL和Verilog/SV之间的差异。
常见的Design Rules:
- 时序逻辑中应使用非阻塞赋值(<=)
- 锁存器建模应使用非阻塞赋值(<=)
- 用always对组合逻辑建模,应使用阻塞赋值(=)
- 当需要在同一always中对组合逻辑和时序逻辑建模时,可以使用<=,不要使用=
- 不要在同一always块中混合使用<=和=
- 要避免在不同的always块中对同一变量进行赋值
- 使用$strobe来打印同一时刻下的非阻塞赋值
- 千万,千万不要使用0延时(#0)
2. Simulation模型
SV是基于离散事件执行驱动的仿真模型,event-driven仿真的基本概念:1)simulation time, 2)simulation regions,3 event processing。
2.1 事件(event)
模型中数值的变化,功能仿真是一种事件驱动的仿真,整个仿真过程都是围绕事件来组织的。具体地说,由于仿真器在cpu是串行执行,其需要将各个event放进事件队列中(event queue),这就叫scheduling an enent.
更新事件(update event):在被仿真的电路中,线网或寄存器的值在任何进程中的任何改变都被认为是一个更新事件。
求值事件(evaluation event):由于更新事件产生的,进程的计算,计算事件。另外也包含PLI调用。
计算事件和更新事件之间循环往复的互相触发,推动仿真时间的前进。
process: 进程是Verilog中的独立执行单元,包括:原语(Primitives), 模块(Moules), initial过程块, always过程块, 连续赋值语句(assign), 异步任务(task)。在仿真时,所有的进程都是仿真器按Verilog的语义来顺序执行的,效果是各个进程并行执行的效果,在未执行完当前所有的进程时,仿真时间不会向前推进。
//下面例子会hang在仿真时刻0,因为更新时间一直触发求值事件,计算事件一直触发更新事件。
initial beginclk = 0; forever clk = ~clk;
end
2.2 仿真时间(simulation time)
当然是指波形中看到的时间,不是仿真软件在host PC中运行的时间。是仿真时间维护的时间值,用来对仿真电路的真实时间进行建模,当仿真时间推进到某一个时间点时,该时间点就被称为当前仿真时间(current time),而以后的任何时间都被称为将来仿真时间(future time)。
2.3 仿真域(simulation region)
2.3.1 层次化事件队列(The stratified event queue)
一个timeslot下的事件队列可以划分为不同层次的域(region),这些域按照特定的优先级顺序执行,只有所有在优先级高的region内的事件执行完,才执行低优先级域的事件。仿真器首先按照仿真时间对事件进行排序,然后再在当前仿真时间里按照这些域的优先级顺序进行排序。在同一域里的事件,执行顺序是不确定的。
2.3.2 Verilog的事件调度器
Verilog的timeslot划分5个域:
Active region : 执行process语句,阻塞赋值,连续赋值,及非阻塞赋值的右侧求值事件,阻塞赋值和连续赋值会触发在该时刻的新事件。$display是在该region执行。
Inactive region : 执行 #0的阻塞赋值;
NBA region : 更新非阻塞赋值的LHS;
Monitor region : 执行$monitor 和 $strobe等,不会出发任何其他事件的read-only region
2.3.3 System Verilog的事件调度器
SystemVerilog增加到17个域,为assertion,design code和testbench code间交互作用减少race发生,其中9个顺序的域为了SV statement的执行,8个顺序的域为了PLI代码的执行。下图是略去了PLI region的SV scheduler。
Preponed region : 在timeslot开始时进行信号采样, assertion使用的signal也是在这个region进行采样。
observed region : 执行assertion evaluation.
Re-Active and Re-Inactive regions : 执行assertion action blocks 和 testbench programs
2.4 SV引入了新的代码块: program, final, clocking
program: 为了清晰的区分design和TB,SV引入program块,它可以包含TB的环境,目的是减少竞争冒险。program在Re-Active域执行。
final:final块用来在仿真末尾时打印summary info,它是在仿真隐式或显式的调用$finish后立即执行,没有delay,如:
program asic_with_ankit;int error, warning;initial begin//Main program activities…..endfinal begin$display (“Test is done with %d errors and %d warnings”, error, warning);end
endprogram
clocking: SV引入clocking用以解决TB和design间的timing及sychronisation的需求.
3. 确定性(Determinism)和不确定性(Nondeterminism)
3.1 确定性(Determinism)
SV标准规定了下面两种确定的scheduling顺序:
1. 在begin...end块中的语句要按其代码出现的先后顺序执行,为了支持模型中的其他过程,可以挂起特定的begin-end块中语句的执行。不管怎样,不允许begin-end块中的语句不按照代码中的顺序以任意顺序执行。
2.NBAs必须按照语句的顺序来执行。
3.2 不确定性(Nondeterminism)
SV并没有规定多个processes执行时的顺序,如果多个processes在同一时刻下触发,这些processes以什么样的先后顺序来执行,由于SV标准并没有规定,不同厂商的仿真器不一定相同。如下例,q在d变化后是变成d还是~d,其结果都符合SV规定,但不同的仿真器可能会得到不同的结果。
always @(d)q=d;assign q=~d;
4. 阻塞/非阻塞赋值(blocking/nonboclking assignment)
4.1 阻塞赋值
1、RHS的表达式计算和LHS的赋值更新,这两个动作之间不能插入其他动作,即所谓计算完毕,立即更新。
2、所谓阻塞赋值就是在一个”begin…end”块中的多个阻塞赋值语句,只有上一句完全执行完毕后,才会执行下一语句。
阻塞赋值属于active event,会立刻执行,这就是阻塞赋值“计算完毕,立即更新”的原因。此外,由于在分层事件队列中,只有将活跃事件中排在前面的事件调出,并执行完毕后,才能够执行下面的事件,这就可以解释阻塞赋值的第二个特点。
4.2 非阻塞赋值
非阻塞赋值分两个step执行:RHS的计算表达式和LHS的赋值更新。首先,应该是RHS表达式计算,得到新值后并不立即赋值,而是放在事件队列中等待,直到当前仿真时刻的后期才执行。
参考文献:
1. Verilog篇(三)仿真原理
2. SystemVerilog Simulation
3. Verilog and SV Event Scheduler
4. Verilog的分层事件队列
5. IEEE 1800-2017 - IEEE Standard for SystemVerilog
6. SystemVerilog Event Regions, Race Avoidance & Guidelines
本博客所有文章均同步发表于www.mx1980.cn/blog
SystemVerilog LRM 学习笔记 -- SV Scheduler仿真调度相关推荐
- HFSS学习笔记——Vivaldi天线仿真(一)
HFSS学习笔记--Vivaldi天线仿真(一) Vivaldi天线简介 Vivaldi 天线是一种行波天线,具有端射特性,其导体贴片上开有渐变.非周期性的开槽.其上电流沿槽线分布,不同的工作频率对应 ...
- #systemverilog# 之 event region 和 timeslot 仿真调度(二)
关于event region 和 timeslot的知识点,一直不清不楚的,虽然平时遇到的机会不是那么多,但总觉得心里有个疙瘩,需要解决.趁着最近稍微有点时间,爬爬网络,搜集搜集资料. 关于仿真软件在 ...
- Simscape Multiby学习笔记7——Multibody仿真实例2双曲柄瞄准系统
文章目录 一. 建立和封装零件 (一)建立杆件A (二)建立杆件B (三)建立滑块C (四)建立杆件D 二. 修改坐标系 (一)修改D的坐标系 (二)修改B的坐标系 (三)修改A的坐标系 (四)修改C ...
- 视觉学习笔记Week9 Gazebo仿真环境下相机焦距计算
第九周 仿真环境下相机焦距计算 这周更新了曲线,按照嘉元和建荣的新曲线,落点应在TR后方一个车身位左右,速度和效率以及容错率可以达到比较好的状态. 焦距计算: ...
- [学习笔记]操作系统(三)先到先得调度
参考网站:https://www.studytonight.com 文章目录 1 概念 2 计算平均等待时间 3 FCFS调度的一些缺点 4 实现FCFS 1 概念 在"先到先得" ...
- UVM入门与进阶学习笔记4——UVM仿真的开始与结束
目录 UVM的编译和运行顺序 UVM仿真开始 UVM世界的"诞生" UVM仿真结束 UVM的编译和运行顺序 下图是UVM的编译运行顺序,非常重要的知识点! 在加载硬件模型调用仿真器 ...
- SystemVerilog学习笔记
SystemVerilog学习笔记(会持续更新~) 文章目录 SystemVerilog学习笔记(会持续更新~) SV数据类型 固定数组 固定数组的声明格式 一维数组与二维数组 固定数组的一些操作 固 ...
- wyy课堂cmos模拟设计课学习笔记-bandgap电路设计3
wyy课堂cmos模拟设计课学习笔记-Bandgap可靠性仿真 温度影响 输入电压范围仿真 工艺偏差corner仿真 tran瞬态启动过程仿真 温度影响 先检查静态工作点,管子是否在工作状态,再看稳定 ...
- [SV]SystemVerilog学习笔记之struct union
SystemVerilog学习笔记(四) 一.结构体(struct) 1.1.结构体声明(struct) 结构体声明:结构体默认是变量,也可以声明为线网 var struct { // 通过var进行 ...
最新文章
- szucodeforce训练1081C组合数学lucas定理,div2 627的D dfs +剪枝优化,697D Puzzles{dfs序+概率}
- Microbiome:宏蛋白质组揭示健康人肠道菌群的功能,离真相更近了一步
- 用switch写收水费的c语言程序,超级新手,用switch写了个计算器程序,求指导
- 资深专家给.NET初学者的学习建议(转)
- LeetCode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)...
- html在分页功能中如何实现当前页面的页码样式与其他页面不同_如何使用word文档?word文档使用技巧教程?...
- 为什么你的提问没人解答?
- java jls8_GitHub - scmod/jls8
- django和scrapy创建项目命令
- CV Code | 本周新出计算机视觉开源代码汇总(含实例分割、行人检测、姿态估计、神经架构搜索、超分辨率等)...
- 一道基础 Java 面试题,但值得很多人反思!
- 大数据平台搭建及搭建过程出错解析
- 读书笔记-集体智慧编程
- 最新!!2018南京买房政策大全
- 阿拉伯数字 转 汉字大写
- 微前端框架qiankun之原理与实战
- 钉钉开放平台-小程序开发实战(钉钉小程序客户端)
- [APIO2009]采油区域 题解
- c语言 printf分栏输出,excel表格分栏打印输出的两种巧妙方法_excel教程
- 什么是捷径?踩在大佬的肩膀上就是捷径!
热门文章
- NLP课程-笔记-04
- 【ADRC】一. 线性跟踪微分器
- 魅族MX4升级包版本过旧,请使用最新的升级包升级
- k8s基于canel的网络策略
- springboot目录,端口,banner---2
- 解决:不能连接到MySQL服务器:“127.0.0.1“
- 电子电气架构——ECU升级(Bootloader)A/B分区策略汇总
- 小猿搜题如何发现竞品的阴谋?知情人这样说
- ICCV2019 | 旷视提出轻量级目标检测网络ThunderNet
- 关于新学期的计划(为了遇见更美好的自己)