SystemVerilog scheduler

文章目录

  • 简介
  • 调度器
    • simulation region
      • Preponed region
      • Active region
      • Inactive region
      • NBA(Non-blocking Assignment Events region)
      • Observed region
      • Reactive region
      • Re-Inactive Events region
      • Re-NBA Region
      • Postponed Region
    • PLI region:
      • Pre-active region
      • Pre-NBA region
      • Post-NBA region
      • Post-observed region
  • 参考

简介

verilog 作为一种 HDL (Hardware Description Language) 用来描述电子硬件的结构,SystemVerilog 是在 verilog 基础上扩展而来的,它不仅可以用来描述电子硬件,新增的扩展主要用于 verification,称为 HVL(Hardware Verification Language)。 我们知道硬件和普通程序的最大的区别:硬件是完全并行的,而程序本质上是串行的,所以 Verilog 和 SystemVerilog 仿真本质上是用串行的程序来描述硬件的并行行为。

调度器

为了解决串行模拟并行的问题,SystemVerilog 引入了 event 调度以及根据时间片划分成多个 region 的方式调度,下面主要就是看这两个概念怎么解决并行问题的。

SV 的事件是离散的模型。在设计中所有语言都有左值和右值两个元素,每次右值的变化都会引起左值的变化,每次左值和右值的变化都被视为更新事件,所有对这些事件敏感的表达式都会被考虑进行评估,称为评估事件。

表达式的通常包括:initial, always, always_comb, always_latch, and always_ff procedural blocks, continuous assignments(assign), procedural assignment statements.
verilog 中主要就是有两种赋值方法,Continuous assignment(连续赋值)适用于 net 类型,Procedural assignment(过程赋值)使用于variable 类型;其中过程赋值中有两种,阻塞赋值和非阻塞赋值。另外主要的就是 task 和 function,里面也是用这两种赋值。

systemverilog 中新增了 program, assertion,clocking 会影响调度器,其他的 package,class,interface,constraint 等并不会影响调度器,暂且不提。

// procedural blockinitial, always, always_comb, always_latch, always_ff, final, task, function// block 里面可以使用 block 和 non-blocking 赋值[ delay ] register_name = [ delay ] expression;     // blocking[ delay ] register_name <= [ delay ] expression;    // non-blocking//还可以使用if、case跳转, forever、 repeat、for等循环
// continuous assignmentswire out;   wire in1, in2;assign out = in1 & in2;

对于事件的定义在原来延时和始终变化上新增了event

  1. 延时 ,例如 #1 a = b
  2. 等待时钟变化,例如 @(posedge clk)
  3. event,例如 @(b); wait(b.triggered) #10 -> a;

Note:

  1. 术语“仿真时间”用于指仿真器维护的时间值,用于对被仿真的系统描述所需的实际时间进行建模。
  2. 时间片包括每个仿真时间在事件区域中处理的所有仿真活动 SystemVerilog 事件区域 开发新的 SystemVerilog 事件区域是为了支持新的 SystemVerilog 构造,并防止在 RTL 设计和新验证构造之间创建竞争条件 。

systemverilog scheduler region
SystemVerilog 时间片划分为 17 个有序区域:

a) Preponed
b) Pre-Active 
c) Active
d) Inactive
e) Pre-NBA
f) NBA
g) Post-NBA
h) Pre-Observed 
i) Observed
j) Post-Observed 
k) Reactive
l) Re-Inactive 
m) Pre-Re-NBA 
n) Re-NBA
o) Post-Re-NBA
p) Pre-Postponed 
q) Postponed

兼容 SystemVerilog 的模拟器应维护某种形式的数据结构,允许事件随着模拟器时间的推移动态地调度、执行和删除。 数据结构通常作为一组按时间排序的链表来实现,这些链表以明确定义的方式进行划分和细分。第一个划分是按时间划分。 每个事件都有且仅有一个模拟执行时间,在任意时刻执行时间可以是当前时间或未来的某个时间。 所有需要被调度的事件都会创建一个time slot,开始执行这17个region的event。 通过执行和删除当前模拟中的所有事件,当所有时间都被调度完之后移动到下一个 time slot 中。 程序通过类似的方式保证了模拟器永远不会出现模拟时间倒退的现象。

这些 region 可以从不同的角度进行划分:

  1. 根据 active 它把 region 分成了两组 region :active group, reactive group。其中 active region 包括 Active, Inactive, Pre-NBA, NBA, and Post-NBA 。reactive region 包括 Reactive, Re-Inactive, Pre- Re-NBA, Re-NBA, and Post-Re-NBA。

  2. 根据是否在 simulation 中执行划分成 simulation region: Preponed, Active, Inactive, NBA, Observed, Reactive, ReInactive, Re-NBA and Postponed和 PLI region:Preponed, Pre-Active, Pre-NBA, Post-NBA, Pre-Observed, Post-Observed, Pre-Re-NBA, Post-Re-NBA, Pre-Postponed.

下面我们先只看 simulation region 的各个 region 需要完成的工作。

simulation region

Preponed region

主要用于验证环境下,在 assertion 中如果 clocking skew 中指定了输入 #1step 在该 region中进行采样。采样的结果和在上一个 time slot 中 postponed region 中采样的结果应该是相同的。 该 region 的 event 在每个 time slot 中仅执行一次,采样之后正式遍历 time slot 的各个region 调度 event。

Active region

包含了当前 active group 中所有需要评估的事件,事件被处理的顺序不提供任何保证,可以按任何顺序进行调度。

事件包括:

1. 所有的阻塞赋值
2. 非阻塞赋值表达式中右值的评估,它会在NBA中更新左值.
3. 所有的连续赋值.
4. 评估 verilog 的自定义源语UDP的输入和输出(一般用的很少).
5. Execute the $display and $finish commands.

Inactive region

保存所有active region 事件处理完毕后要评估的事件。

如果在 active region 中 执行 #0 a = 1 ,其中显示的使用 #0 延时的 blocking 赋值操作,在 active region 处理时会将该表达式的处理暂时挂起,然后在 inactive 中调度,之后再次从 inactive 到 active 跳转时再次调度处理该表达式。

这种方式在 RTL 中不推荐使用。

NBA(Non-blocking Assignment Events region)

NBA 中处理所有非阻塞赋值的更新事件,其中 Active region 中处理右值的更新,NBA 更新左值。

Observed region

concurrent assertion 的语句事件评估在该 region 中处理,另外 clocking 中 input skew #0 的输入也在这个 region 中进行采样。

Reactive region

它保存了在 reactive group 所有需要被评估的事件,和 active region 中一样并不对事件被处理的顺序做任何保证,可以按任何顺序进行调度。

1. concurrent assertion 的 action 块
2. 在 program block 中的 blocking 赋值
3. 评估所有 program 中 non-blocking赋值的右值,之后会在 Re-NBA region 更新左值
4. program block 中所有的连续赋值
5. 执行了 $exit 或者隐式的 $exit 命令

Re-Inactive Events region

这个 region 类似于 inactive region, 如果在 reactive region 中有使用 #0 赋值,这个表达式在 reactive region 中会被挂起并且在当前time slot 的 re-inactive region 中调度处理,所以这个表达式会在下一次进入 reactive region 中被处理。

Re-NBA Region

和 NBA region 类似,处理 program block 中 non-blocking 赋值的更新。另外 clock 中 output skew #0 的也会在该 region 中更新。

Postponed Region

该区域的主要功能是执行 $strobe 和 $monitor 命令,这些命令将显示当前 time slot 的最终更新值。 该区域还用于收集使用选通采样的项目的功能覆盖范围。

PLI region:

Pre-active region

预活动区域专门用于 PLI 回调控制点,允许用户代码在评估活动区域中的事件之前读取和写入值并创建事件

Pre-NBA region

Pre-NBA 区域专门用于 PLI 回调控制点,允许用户代码在评估 NBA 区域中的事件之前读取和写入值并创建事件

Post-NBA region

Post-NBA 区域专门用于 PLI 回调控制点,允许用户代码在评估 NBA 区域中的事件后读取和写入值并创建事件

Post-observed region

Post-observed 区域专门用于 PLI 回调控制点,允许用户代码在评估属性后读取值(在 Observed 或更早的区域中)。

参考

SystemVerilog 2012 specification Manual, Chapter 4 Schduling semantics

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/57206.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

空地协同智能消防系统——无人机、小车协同

1 题目 1.1 任务 设计一个由四旋翼无人机及消防车构成的空地协同智能消防系统。无人机上安装垂直向下的激光笔&#xff0c;用于指示巡逻航迹。巡防区域为40dm48dm。无人机巡逻时可覆盖地面8dm宽度区域。以缩短完成全覆盖巡逻时间为原则&#xff0c;无人机按照规划航线巡逻。发…

面试热题(字符串相加)

给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库&#xff08;比如 BigInteger&#xff09;&#xff0c; 也不能直接将输入的字符串转换为整数形式。 输入&#xff1a;num1 "11"…

Linux下C/C++的gdb工具与Python的pdb工具常见用法之对比

1、gdb和pdb分别是什么&#xff1f; 1.1、gdb GDB&#xff08;GNU Debugger&#xff09;是一个功能强大的命令行调试工具&#xff0c;由GNU项目开发&#xff0c;用于调试C、C等编程语言的程序。它在多个操作系统中都可以使用&#xff0c;包括Linux、MacOS和Windows&#xff0…

SpringSecurity5.7+最新案例 -- 授权 --

一、前提 书接上回 SpringSecurity5.7最新案例 – 用户名密码验证码记住我 本文 继续处理SpringSecurity授权 … 目前由 难 -> 简&#xff0c;即自定义数据库授权&#xff0c;注解授权&#xff0c;config配置授权 二、自定义授权 0. 数据准备 SET NAMES utf8mb4; SET …

开窗积累之学习更新版

1. 开窗使用1之 count range between current row and current row 将相同排序字段的值进行函数计算 selectsku_id,substr(create_date,1,7) date_month,order_id,create_date,sku_num*price,sum(sku_num*price) over (partition by sku_id order by substr(create_date,1,7)…

js-3:DOM常见的操作有哪些?

1、DOM 文档对象模型&#xff08;DOM&#xff09;是HTML和XML文档的编程接口。 它提供了对文档的结构化的表述&#xff0c;并定义了一种方式&#xff0c;可以使从程序中对该结构进行访问&#xff0c;从而改变文档的结构&#xff0c;样式跟内容。 任何HTML和XML文档都可以用DOM表…

R语言3_安装SeurateData

环境Ubuntu22/20, R4.1 在命令行中键入&#xff0c; apt-get update apt install libcurl4-openssl-dev libssl-dev libxml2-dev libcairo2-dev libgtk-3-dev # libcairo2-dev :: systemfonts # libgtk :: textshaping进入r语言交互环境&#xff0c;键入&#xff0c; instal…

RaabitMQ(三) - RabbitMQ队列类型、死信消息与死信队列、懒队列、集群模式、MQ常见消息问题

RabbitMQ队列类型 Classic经典队列 这是RabbitMQ最为经典的队列类型。在单机环境中&#xff0c;拥有比较高的消息可靠性。 经典队列可以选择是否持久化(Durability)以及是否自动删除(Auto delete)两个属性。 Durability有两个选项&#xff0c;Durable和Transient。 Durable表…

CS 144 Lab Seven -- putting it all together

CS 144 Lab Seven -- putting it all together 引言测试lab7.ccUDPSocketNetworkInterfaceAdapterTCPSocketLab7main方法子线程 小结 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab Six 对应的PDF: Checkpoint 6: putting it all together 引言 本实验无需进行任何编…

绘制曲线python

文章目录 import matplotlib.pyplot as plt# 提供的数据 x= [1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,3,3.1,3.2,3.3,3.4,3.5,3.6,3.7,3.8,3.9,4,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8,4.9,5,5.1,5.2,5.3,5.4,5.5,5.6,5.7,5.8,5.9,6,6.1,6.2…

【网络编程】揭开套接字的神秘面纱

文章目录 1 :peach:简单理解TCP/UDP协议 :peach:2 :peach:网络字节序 :peach:3 :peach:socket编程接口 :peach:3.1 :apple:socket 常见API :apple:3.2 :apple:sockaddr结构:apple: 4 :peach:简单的UDP网络程序 :peach:4.1 :apple:基本分析:apple:4.2 :apple:udpServer.hpp(重点…

Pytorch Tutorial【Chapter 2. Autograd】

Pytorch Tutorial 文章目录 Pytorch TutorialChapter 2. Autograd1. Review Matrix Calculus1.1 Definition向量对向量求导1.2 Definition标量对向量求导1.3 Definition标量对矩阵求导 2.关于autograd的说明3. grad的计算3.1 Manual手动计算3.2 backward()自动计算 Reference C…