1. 为什么要了解SV Schedule

  • verilog是一个硬件描述语言,而硬件在现实中都是并行执行的,所以verilog描述的组合电路和时序电路都是并行执行的。
  • 而仿真器作为运行在CPU上的软件,只是按照SV LRM的仿真调度算法,开始仿真后,将仿真时间串行的一步步的向前推进。
  • 因此,实际DUT中同时发生的动作由模拟器建模为一组有序动作,依次执行。如果不能很好地撰写RTL代码和TestBench,那么仿真可能得到不匹配的结果:即DUT为正确,但是仿真却报告错误;或者DUT为错误,但是仿真却报告正确。
  • 依照已经非常成熟的Coding规则,可以避免90%~100%由Verilog RTL设计引起的问问题。此外,还需要了解Verilog / SystemVerilog Schedule才能更好地理解规则。

1.1 几个需要遵守的RTL编码规则

  1. 时序逻辑使用nonblocking assignments(<=)
  2. Latch 使用 nonblocking assignments (<=)
  3. always块描述组合逻辑时使用 blocking assignments (=)
  4. 在同一个always块中混用组合逻辑和时许逻辑时使用nonblocking assignments(<=)
  5. 在同一个always块中不要混用 (<=) 和 (=)
  6. 不能在不同的always块中对同一变量进行赋值
  7. 使用$strob函数来打印使用nonblocking assignments的变量
  8. 不要使用 #0 延时

2. Verilog的调度

  • IEEE Std 1364-2001将 Verilog 事件区域划分为四个有序区域: Active、Inactive、NBA、Postponed。
  • Verilog只有module,没有program,故所有的调度都是基于Module模块
  • Active region
    1. 执行blocking assignments
    2. 计算非阻塞赋值的右式(并不会更新左边)
    3. 连续赋值
    4. $display()函数
    5. 评估 Verilog 原语的输入和更新输出
  • Inactive region
    1. 执行带#0延时的阻塞赋值
  • NBA region(Nonblocking Assignments):
    1. 更新非阻塞赋值的左式(现在才被更新)
  • Postponed
    1. $monitor
    2. $strobe
  • 下图为Verilog的调度图,将Inactive画叉代表RTL Coding时不要使用#0延时

2.1 continue assignment

  • 几个连续赋值的例子
wire mynet ;
assign (strong1, pull0) mynet = enable;
assign {carry_out, sum_out} = ina + inb + carry_in;
assign data = (s == 0) ? bus0 : Zee,

2.2 使用Verilog进行设计和验证时的race

  • 下面为一个用verilog写的RTL和Testbench

  • DUT中,a和b应该时延后一拍的关系,但是仿真出来,a和b波形居然一致。
  • 问题在于DUT和Testbench之间的race,在第一个clk上升沿,a在Test中被赋值为1,DUT中计算NBA的RHS(Right-Hand-Side),a为1。随后在NBA region,DUT中Update LHS,此时b被更新为1。故波形就如上图所示。

  • 为了避免该问题,可以在Test中加入#0延时

  • 此仿真图得到DUT中a和b有一拍延时关系,符合设计预期。
  • 因为在第一个clk上升沿的时候,执行DUT中的RHS时,a还是初始值0,然后到了Inactive region,执行了Test中的 #0,此时Test中的a被赋值为1,然后在NBA region,更新DUT中b的值,b被更新为0,故复位上图波形。

3. 为什么需要SystemVerilog

  • 上面已经了解到单纯用Verilog很容易引起DUT和Test之间的race,故引入了SV。SystemVerilog中引入了Program,从而将module和Program的调度分开,达到减少race的目的。
  • IEEE Std 1800-2005的更新将 SystemVerilog 的timeslot分为17个有序区域、9个有序区域用于执行 SystemVerilog 语句和8个有序区域用于执行 PLI (Programming language interface)代码。
  • 暂时不考虑PLI,删除PLI后的SystemVerilog的时间区域划分如下:
  • 大致可以分为4个region:Preponed,Active(Active、Inactive、NBA),Observed,Reactive(Reactive、Re-Inactive、Re-NBA)
  • Preponed region
    1. 断言的信号采样(只是采样,并没有执行)
  • Active region
    1. 兼容Verilog调度(for module)
  • Observed region
    1. 执行断言的计算
    2. 断言可能还会引起块的计算,会调回到active(module中的断言)或reactive(program中的断言)中去,这也就是图中Observed下个可以往其他区域流转的原因。
  • ReActive region
    1. 类似Verilog中的调度,只不过是对于Program。(for program)
  • Postponed
    1. $monitor
    2. $strobe

3.1 Preponed和Postponed的说明

  • Preponed采样的值是该timeslot的最初的值,Postponed采样的值是该timeslot的最后更新了的值。
  • 上一个timeslot的Postponed采样到的值和下一个timeslot的Preponed采样到的值相同,只是timeslot不同而已。

3.2 采样Program后的仿真

  • 拥有了SV后,那么可以将设计代码写成Module模块,将test代码写成Program模块
  • Program中不能再层次化调用任何其他模块(program、module、interface)
  • 上面的例子中,当test使用program … endprogram后,不再需要加#0。

4. 参考文献

CummingsSNUG2006Boston_SystemVerilog_Events.pdf
IEEE Standard for SystemVerilog (Revision of IEEE Std 1800-2012)

SystemVerilog学习笔记5 ---《SV Schedule》相关推荐

  1. [SV]SystemVerilog学习笔记之struct union

    SystemVerilog学习笔记(四) 一.结构体(struct) 1.1.结构体声明(struct) 结构体声明:结构体默认是变量,也可以声明为线网 var struct { // 通过var进行 ...

  2. SystemVerilog学习笔记

    SystemVerilog学习笔记(会持续更新~) 文章目录 SystemVerilog学习笔记(会持续更新~) SV数据类型 固定数组 固定数组的声明格式 一维数组与二维数组 固定数组的一些操作 固 ...

  3. SystemVerilog学习笔记(可综合的部分)(一)

    SystemVerilog学习笔记(一) 1. Verilog-1995的数据类型 2. 网络(net)类型 3.变量(variable)类型 4.向量(packed arrays) 5.数组(unp ...

  4. [Systemverilog学习笔记] Thread Communication-Event、Semaphore、mailbox

    [Systemverilog学习笔记] Thread Communication-Event.Semaphore.mailbox 学习目标: 通过下文了解Event.Semaphore.mailbox ...

  5. SystemVerilog学习笔记1 ---《数据类型》

    1. 数据类型 1.1 logic 变量没有声明类型时,默认为logci verilog中有两种基本的数据类型:变量和线网(net).都为4状态(0.1.X.Z) SystemVerilog中将Ver ...

  6. SystemVerilog学习笔记 - 动态数组

    今天遇到了一个动态数组的问题,作一记录,区分开了动态数组与嘟列的区别,总是有些分不清,虽然接触sv三年有余,这种小问题还是没有能摸得很透彻,很惭愧,不在家没有vcs的环境,于是借用eda playgr ...

  7. SystemVerilog学习笔记5——随机约束和分布

    目录 随机约束和分布 为何需要随机? 为何需要约束? 需要随机什么? 声明随机变量的类 什么是约束? 权重分布 约束块控制 打开或关闭约束 内嵌约束 随机函数 数组约束 数组的属性约束 随机化句柄数组 ...

  8. SystemVerilog学习笔记4 ---《变量范围、lifetime、static和automatic》

    先明确下基本的概念 block:块.一些关键字组成的一个范围区间,就叫做块.如 module - endmodue / task - endtask / begin - end / fork - jo ...

  9. SV学习笔记—类型转换

    1.静态转换 静态转换操作不对转换值进行检查,格式是type'(value): program test;initial begin$display("int'(42+1.1) is&quo ...

最新文章

  1. 评价对象检测模型的数字度量:F1分数以及它们如何帮助评估模型的表现
  2. react-router的基础知识
  3. Centos调出图形化的网络管理
  4. 复制初始化和直接初始化
  5. java多维数组的指针_Java基础之二维数组
  6. linux 查看下挂磁盘,linux下磁盘挂载与查看
  7. 前端学习(2013)vue之电商管理系统电商系统之监听on-success事件
  8. Guitar Por如何演奏刮弦
  9. 计算机二级数据模型三要素,2017年计算机二级公共基础知识重点讲解:数据模型...
  10. java服务端异步处理机制_Java异步处理机制实例详解
  11. python 文件读写 newline_「Python」:文件读写
  12. 对于长时间装载的ASP.NET页面如何在客户端浏览器中显示进度?
  13. Android将库导入到build.gradle
  14. 快速排序C语言代码+辅助图+注释
  15. 键盘按键名键码对照表
  16. python提醒事件_利用python实现短信和电话提醒功能的例子
  17. 【Vue.JS】纯 Vue.js 制作甘特图
  18. echarts 5.x 版本词云无法正常显示问题
  19. chrome浏览器内存_如何在Google Chrome浏览器中清除内存
  20. PPT幻灯片中插入Flash动画

热门文章

  1. Linux学习(一)Ubuntu20.04 LTS (Focal Fossa)以及 Anaconda CUDA CuDNN PyTorch VisualStudioCode 的安装
  2. Module Federation在客服工单业务中的最佳实践
  3. javascript写字技巧_如何优雅地书写JavaScript
  4. 实时音视频技术难点及解决方案
  5. Vue3.0中如何引入jQuery并使用
  6. 归纳贴:武侠小说和游戏中的武功效果(转)
  7. 小米手环8和小米手环7的区别
  8. A First Look At Java
  9. 合作伙伴为创业打下坚实基础
  10. 多目标优化算法:多目标大猩猩部队优化算法MOGTO(提供Matlab源码)