SV 仿真的常识

文章目录

  • SV对verilog的扩展
      • 📘 标准文档名称:
  • 从SV到仿真
    • 通用过程解读
    • 实例解读
  • SV的仿真过程
    • 并行
    • 仿真颗粒度
    • SV仿真调度
        • 调度区域

SV对verilog的扩展

SystemVerilog 和 Verilog 的语法标准由 **IEEE(美国电气和电子工程师协会)**制定,正式文档如下:


📘 标准文档名称:

名称简称最新版本标准编号是否免费
VerilogVerilog HDLIEEE 1364-2005IEEE Std 1364-2005❌ 付费
SystemVerilogSystemVerilog HDLIEEE 1800-2017IEEE Std 1800-2017❌ 付费
SystemVerilog 最新合并版Unified HDL (Verilog + SystemVerilog)IEEE 1800-2023IEEE Std 1800-2023❌ 付费
  • SystemVerilog(SV)相对于传统 Verilog 的主要扩展和增强,涵盖语法、数据类型、验证特性等方面。
类别Verilog 特性SystemVerilog 扩展说明参考文献
数据类型regwire新增 logicbitintbyteshortintlonginttimeenumstructunionstringchandle更强的类型安全、结构化数据、枚举和字符串支持(代码覆盖率原理简介原创 - CSDN博客) (see [1])
数组与集合连续向量 reg [7:0] a;动态数组 int da[];、关联数组 int aa[string];、队列 int q[$];支持可变长度和哈希索引结构(代码覆盖率原理简介原创 - CSDN博客) (see [2])
接口与包modulefunctiontaskinterfaceprogrampackageimport/export接口封装信号集合,package 封装共享声明(代码覆盖率原理简介原创 - CSDN博客) (see [3])
模块化 & 生成generategenerate 扩展语法、localparamtypedef更灵活的生成语法,本地参数和类型重命名(代码覆盖率原理简介原创 - CSDN博客) (see [4])
线程 & 时间控制alwaysinitialalways_ffalways_combalways_latchuniquepriority明确组合/时序/锁存块,优化仿真和综合(代码覆盖率原理简介原创 - CSDN博客) (see [5])
约束随机化classrandconstraintsolve...before面向验证的随机化对象支持(代码覆盖率原理简介原创 - CSDN博客) (see [6])
面向对象支持 class、继承 extends、多态、new() 构造函数引入面向对象编程,验证组件化(代码覆盖率原理简介原创 - CSDN博客) (see [7])
断言 & 覆盖率SVA 断言 assertcovergroupcoverpointcross内置断言和功能覆盖率建模(代码覆盖率原理简介原创 - CSDN博客) (see [8])
TLM 接口uvm_sequence_itemuvm_portuvm_exportuvm_analysis_port事务级建模接口,为 UVM 提供通信通道(代码覆盖率原理简介原创 - CSDN博客) (see [9])
并发扩展fork/joinfork...join_anyfork...join_none-多种 join 语义更灵活的并发控制(代码覆盖率原理简介原创 - CSDN博客) (see [10])

简要说明:

  1. 数据类型和数组:SV 增加了丰富的强类型和容器类型,解决了 Verilog 只有 reg/wire、固定向量的限制。
  2. 接口与包:通过 interfacepackage,SV 实现了代码重用与封装,提高了可维护性。
  3. 线程与时间控制:引入更语义化的 always_ff 等,帮助综合工具和仿真工具区分不同用途。
  4. 面向对象 & 约束随机:SV 将验证带入语言层面,结合 UVM 形成强大的验证生态。
  5. 断言 & 覆盖率:SystemVerilog Assertions (SVA) 和功能覆盖率让验证更加系统化。
  6. 事务级建模 (TLM):提供通用接口,让组件间事务通信高度解耦,支撑 UVM 框架。

从SV到仿真

通用过程解读

  • 编译
语法和语义分析 , 进行编译 , 编译出 中间文件
  • 建模
按照设计集成关系, 组成顶层模块1. 模块例化2. 接口例化3. 程序例化4. 层次集成5. 计算参数6. 解决层次信号引用7. 建立模块连接
// 类似C代码的link阶段
  • 仿真
建立RTL模型和参数验证环境, 以周期驱动(cycle-driven)或事件驱动(event-driven)的方式进行仿真

实例解读

  • Icarus Verilog(iverilog), VCS 和 Verilator 的典型使用流程
阶段vcsverilatoriverilog
编译(compilation).sv.o.sv.oiverilog -g2005-sv -o tb.vvp <files>.sv
建模(elaboration).osimv.oobj_dir/V$(TB_NAME)隐式在生成 tb.vvp 时完成,不再单独产物
仿真(simulation)./simv./obj_dir/V$(TB_NAME)vvp tb.vvp
与 VCS 和 Verilator 不同,
Icarus Verilog **不生成可执行 ELF**,也不生成 C++ 代码。
它在编译阶段就完成了 elaboration,将所有模块实例化和连接,并将结果编码进 `tb.vvp`。
无需单独生成可执行文件(`.o` 或 `simv`)。

SV的仿真过程


并行

SystemVerilog 采用 模块(module 作为设计的基本单元,整个电路从 顶层模块 开始,逐层实例化与端口互联,最终形成完整的层次化结构。

在 SV世界中, 仿真一旦运行起来, 一个module 就类似于 软件世界中的 一个线程(不区分线程进程)
那么就必然有线程之间的同步与通信1. 信号的变化(事件触发)  //  @(posedge clk)2. 对特定事件的等待(时钟周期) // wait 3. 延时(固定延时) // #200
一般来说, module 中的语句都是顺序的, 但是如果你想 并行, 就需要用fork 关键字 来创建 并行结构(即创建新线程)即 软件世界中的 一个线程 在硬件世界中的类比为 // 拓展知识 请查看 https://blog.csdn.net/u011011827/article/details/1474447921. module2. initial 包围的 硬件代码 3. always  包围的 硬件代码2. fork 包围的 硬件代码

仿真颗粒度

仿真需要指定 仿真时的 时间单位和精度不管是 用户TB ,还是设计指定的 时间都要 以 timeprecision  算(四舍五入)出来.
搞 timeunit 这个关键字,只是为了 代码的可读性 : 让用户无需每次都写带单位的延时,只需写 #1 即可代表 #(1 * timeunit)
一般 timeprecision 指定的单位 比 timeunit 小
timeprecision 不是越小越好,太细反而开销大(调度器要管理的时间槽变多,导致仿真慢). // 这个要解读 调度, 来深入理解
合适的 timeprecision看设计的最快时钟——假如最高 500 MHz(周期 2ns),那么 timeprecision 设 100ps 就够(20 个步)。看需要模拟的最小延时——如果你要模拟 #0.5ns 这类延时,就要精度细于 500ps;否则会被舍入。按 10 的级数对齐——常用 1ns/100ps、1ns/10ps、100ps/10ps 这样的十倍关系,既好计算又利于读写。

SV仿真调度

sv代码中module是并行的,但是cpu(仿真sv代码的时候)是顺序执行
那么在 0 时刻 ,有很多 并行代码(假设有10条语句) 需要仿真那么 谁先做谁后做呢 , 这就是 仿真调度 要考虑的事情部分规则:时间片   : timeprecision指定的单位 // 如果 timeprecision = 100ps , 那么带 时间槽所在的时刻 只能是 100ps的倍数同槽不同事:同一槽位的多条语句,靠 “事件区域” + “申明顺序” 决定先后。效率至上  :调度器只跳到下一个有事的槽位,不会浪费时间检查空槽 // 即 存在一种可能, 200ps 时, 没有事件位于这一时刻, 那么 根本就不会 检查 200ps 是否有 事情要做 // 即 不会 在 200ps 这个刻度 浪费 一丁点cpu时间
  1. 同一时间槽内的执行次序就是“仿真调度”
    在每个离散的时间点(时间槽)上,仿真器会把所有待执行的事件分到几个“事件区域”(Active、Inactive、NBA、Monitor…),再在各区域内按声明顺序执行。这套从区域到区域、从语句到语句的调度机制,就称作仿真调度(event scheduling)。
  2. 仿真调度是为模拟并行硬件而设计的
    真实 CPU 是串行执行指令的,而硬件模块在同一时刻是并行更新欧。仿真器内部用“调度”来用顺序算法准确地再现硬件的并行行为——保证同时发生的并行事件能在同一个时间点“好像同时”地被执行,只是按照调度规则分批跑完。
  3. 实际硬件里没有“调度器”这层概念
    硬件的寄存器、门电路、互连网是真正同时更新的,不存在“先做 A 再做 B”的软件调度。调度只是仿真环境里用来序列化并行行为的实现细节。
  4. 仿真的时候 有 仿真调度, 但是硬件上没有, 怎么保证在仿真时能过的代码在硬件上一定没问题呢?
    • 可综合子集:设计时只用可综合的 SV/Verilog 语法(符合综合工具的语义),这样仿真行为和综合后硬件逻辑在功能上是等价的。
    • 静态时序分析 (STA):综合后用 STA 工具检查硬件的时序收敛,保证所有信号路径在目标时钟下都能按预期收敛。
    • 门级仿真:在部分关键场景下,还会跑门级网表加 SDF back-annotation 仿真,验证时序与 RTL 仿真的一致性。
      通过以上流程,仿真“看得见”的并行逻辑,以及综合后验证的时序约束,都能确保最终硅片上真实并行电路的正确性。
调度区域

SystemVerilog 离散事件调度器在每个时间槽(time slot)内依次执行的主要仿真调度区域(也称为“事件区域”)及其作用:

区域序号调度区域英文名 / 缩写执行内容示例说明
1ActiveActive Regionalwaysinitial 块中无延时语句之后的语句执行所有因为当前时间到达而“就绪”的过程后的第一批语句
2InactiveInactive Regiondisable fork@(事件触发)处理在 Active 区域产生的新就绪过程,但不再执行延时、NBATasks
3NBANon-Blocking Assigns所有<=非阻塞赋值更新收集并一次性更新非阻塞赋值,避免与 Active 中的顺序冲突
4MonitorMonitor Regionuvm_monitor$monitor、覆盖率采集、断言观察信号变化,不影响驱动;常用于更新覆盖率、断言检查
5ObservedObserved Region@(<signal>) 等带延时或事件触发的观察者用于“观察”在 Monitor 区域中改变的信号或变量
6ReactiveReactive RegionPLI/VPI/VHPI 回调、DPI-C 调用外部仿真接口的回调处理,保证与内部更新同步

调度流程简述:
在仿真器中,每到一个时间槽,依次从 Active → Inactive → NBA → Monitor → Observed → Reactive 执行对应区域的所有就绪事件;然后仿真时间跳到下一个有事件的槽位。

这样设计可以:

  • 将顺序、非阻塞赋值、监视、外部回调等不同种类的操作有序分隔,
  • 保证同一时间点内的并行硬件行为被准确、可预测地“序列化”执行。

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

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

相关文章

苏德战争前期苏联损失惨重(马井堂)

苏德战争前期&#xff08;1941年6月22日德国发动“巴巴罗萨行动”至1941年底至1942年初&#xff09;是苏联在二战中损失最惨重的阶段之一。以下是主要方面的损失概述&#xff1a; ‌一、军事损失‌ ‌人员伤亡与俘虏‌ 至1941年底&#xff0c;苏军伤亡约‌300万人‌&#xff…

联邦学习的收敛性分析(全设备参与,不同本地训练轮次)

联邦学习的收敛性分析 在联邦学习中,我们的目标是分析全局模型的收敛性,考虑设备异构性(不同用户的本地训练轮次不同)和数据异质性(用户数据分布不均匀)。以下推导从全局模型更新开始,逐步引入假设并推导期望损失的递减关系,最终给出收敛性结论。 1. 全局模型更新与泰…

多线程爬虫中实现线程安全的MySQL连接池

多线程爬虫中实现线程安全的MySQL连接池 在日常开发中&#xff0c;数据库操作频繁建立/关闭连接会带来性能损耗&#xff0c;尤其在多线程场景中更容易出现连接复用、阻塞等问题。因此&#xff0c;本文介绍如何使用 Python 封装一个 线程安全的 MySQL 连接池&#xff0c;并通过…

HTML:常用标签(元素)汇总

文章目录 一、标签分类1、块标签与行标签 二、排版标签三、文本标签1、常用2、不常用 四、图片标签五、超链接1、跳转页面2、跳转文件或下载文件3、跳转到锚点4、唤起本地应用 六、列表七、表格八、表单九、框架十、HTML实体十一、全局属性十二、meta元信息 一、标签分类 1、块…

20250430在ubuntu14.04.6系统上完成编译NanoPi NEO开发板的FriendlyCore系统【严重不推荐,属于没苦硬吃】

【开始编译SDK之前需要更新源】 rootrootubuntu:~/friendlywrt-h3$ sudo apt update 【这两个目录你在ubuntu14.04.6系统上貌似git clone异常了】 Y:\friendlywrt-h3\out\wireguard Y:\friendlywrt-h3\kernel\exfat-nofuse 【需要单线程编译文件系统&#xff0c;原因不明】 Y:…

【AI论文】CipherBank:通过密码学挑战探索LLM推理能力的边界

摘要&#xff1a;大型语言模型&#xff08;LLMs&#xff09;已经展现出非凡的能力&#xff0c;尤其是最近在推理方面的进步&#xff0c;如o1和o3&#xff0c;推动了人工智能的发展。尽管在数学和编码方面取得了令人印象深刻的成就&#xff0c;但在需要密码学专业知识的领域&…

艺术与科技的双向奔赴——高一鑫荣获加州联合表彰

2025年4月20日,在由M.A.D公司协办的“智艺相融,共赴价值巅峰”(Academic and Artistic Fusion Tribute to the Summit of Value)主题发布会上,音乐教育与科技融合领域的代表人物高一鑫,因其在数字音乐教育与中美文化交流方面的杰出贡献,荣获了圣盖博市议员Jorge Herrera和尔湾市…

【深度学习的灵魂】图片布局生成模型LayoutPrompt(1)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目…

Compose笔记(二十)--TextField

这一节主要了解一下Compose的TextField,TextField 是一个用于接收用户文本输入的 UI 组件,允许用户通过键盘输入、编辑或删除文本。简单用法总结如下: API value&#xff1a;当前输入的文本内容。 onValueChange 含义&#xff1a;当用户输入文本时触发的回调函数&#xff0c;参…

在Linux虚拟机下使用vscode,#include无法跳转问题

总结&#xff1a;需要通过Linux指令来添加编译器和压缩文件&#xff0c;解压&#xff0c;这样获得的编译器会具有可执行权限类似于 -rwxr-xr-x 1 user user 12345 Apr 26 14:22 myscript.sh 如果你直接从window中拖入文件到Linux文件下&#xff0c;你需要自己来再度开启可编译…

ArcGIS+GPT:多领域地理分析与决策新方案

技术点目录 AI大模型应用ArcGIS工作流程及功能prompt的使用技巧AI助力工作流程AI助力数据读取AI助力数据编辑与处理AI助力空间分析AI助力遥感分析AI助力二次开发AI助力科研绘图ArcGISAI综合应用了解更多 ——————————————————————————————————…

基础术语说明

车间&#xff1a;工厂内集中进行加工或装配的独立空间&#xff0c;配备设备、工具及人员&#xff0c;是生产活动的核心载体。 比如装配车间、总装车间、油漆车间等 生产线&#xff1a;以流水作业形式将原材料转化为成品的设备与人员的组合系统&#xff0c;强调连续性和效率。…

Splunk 使用Role 实现数据隔离

很多人知道 Splunk 有很多自带的Role, 今天我就要说说定制化的Role: 1: 在创建新role 的界面: 2: 在如下的界面,可以定制allow index name: 3: 创建好新Role 后,在SAML 添加新的group 的时候,就可以看到Role 给某个group: 4: 这样一个特定组的人来申请Splunk 权限,就可…

利用李雅普诺夫稳定性理论设计模型参考自适应系统(2.0)

上一篇介绍了利用李雅普诺夫稳定性理论设计模型参考自适应系统&#xff0c;通过在被控对象前面添加一个可调增益&#xff0c;然后利用李雅普诺夫稳定性理论设计增益的自适应率&#xff0c;使得被控对象输出与参考模型输出一致。本文将介绍在系统结构中引入前馈和反馈的结构&…

前端封装WebSocket工具n

Web API 提供的 WebSocket 类&#xff0c;封装一个 Socket 类 // socket.js import modal from /plugins/modal const baseURL import.meta.env.VITE_APP_BASE_WS; const EventTypes [open, close, message, error, reconnect]; const DEFAULT_CHECK_TIME 55 * 1000; // 心…

TCP和UDP传输层协议

TCP&#xff08;Transmission Control Protocol&#xff09;和 UDP&#xff08;User Datagram Protocol&#xff09;是两种常见的传输层协议&#xff0c;它们在网络通信中发挥着不同的作用。二者在连接建立、可靠性、传输效率等方面存在显著差异&#xff0c;适用于不同的应用场…

空域伦理与AI自主边界的系统建构

在AI无人系统逐步参与城市空域治理的过程中&#xff0c;系统的“自主性”已不再仅是技术指标&#xff0c;而是直接影响合规性、安全性与社会接受度的伦理边界议题。AI决策系统是否拥有“强干预能力”&#xff1f;行为触发责任应归属何方&#xff1f;算法可否调优至“自我纠偏”…

在原生代码(非webpack)里使用iview的注意事项

最近公司在做一个项目&#xff0c;使用的框架是iview,使用过程中同事遇到一些问题&#xff0c;这些问题对于有些同学来说根本就不是问题&#xff0c;但总会有同学需要&#xff0c;为了帮助不太会用的同学快速找到问题&#xff0c;做了如下整理&#xff1a; 下载vue,iview.min.j…

java代码混淆

生成jar的时候混淆 目前最常用的Proguard,网上有很多介绍的文章&#xff0c;这种安全性较低 对已经生成的jar进行加密 加密库:https://github.com/li571312729/classfinal 测试对jar进行加密 加密后如果正常调用的话会失败 加密后jar反编译查看不到代码 使用密码才能调用机…

【Linux】第十三章 访问Linux文件系统

目录 1. 存储设备是什么&#xff1f;怎么理解分区和格式化&#xff1f; 2. 文件系统是什么&#xff1f; 3. 挂载是什么&#xff1f;挂载点是什么&#xff1f; 4. 怎么理解块设备&#xff1f; 5. 在SATA附加存储中&#xff0c;第一磁盘上的第一个分区和第二磁盘的第二个分区…