systemVerilog 复习第一天——sv的仿真时间调度机制、enum、string、logic、数组、clock blocking

发布时间:2026/8/26 14:16:30

systemVerilog 复习第一天——sv的仿真时间调度机制、enum、string、logic、数组、clock blocking
文章目录sv的仿真时间调度机制Time literalformattimescaleEvents RegionsVerilog的赋值连续赋值过程赋值eventprocesstime-solt为什么要引入event region调度机制详解简要流程图表总结sv的一些语法特性自动推断长度支持string、real等logicstringarray定宽数组动态数组clock blockingenum结语sv的仿真时间调度机制Time literalformattype timestate 4 bit 3242ps3.13ns//no space1step//only 1在整个编译文件中使用timescale或者timeprecision定义时间精度中的最小的就是1step。使用#1step可以在进入当前的timeslot前进行采样等同于在当前timeslot的prepone上进行采样。在clocking block使用clocking endclocking作为关键字主要是在interface中使用input信号默认使用#1step来采样output信号默认delay为 0。在并发断言中断言中的变量的值在prepone进行采样断言在Observed region进行计算在Reactive region判断断言成功/失败。如果断言中的变量是clocking block中的输入信号则必须采样带有#1step的clocking block的输入信号。实际是无论信号是否在clocking block中断言采样在#1setp和prepone中没有任何区别如果所有编译文件定义了相同的时间精度那么#1 #1step但如果有新的时间精度文件加入#1就可能不等于#1step所以#1是局部时间精度的函数#1step是全局的。 注意2个time slot之间并不是只有1个step可能是多个。timescaletimescale 1ns/1ps //等效于 module test timeunit 1ns timeprecision 10ps endmodule //但是timeunit 1ns //timeprecision 10ps一定要放在module块里Events RegionsVerilog的赋值简单给大家复习一下吧可能有些人不太清楚这些具体的术语连续赋值连续赋值就是一旦赋值输出将随输入改变而变化一旦修改输入则立刻体现在输出上。input a,b;wire out;assign outab;常用于组合逻辑过程赋值过程赋值只会在赋值时刻进行改变其余时间保持不变而且根据使用的赋值符号和分为阻塞赋值和非阻塞赋值。阻塞赋值 //例1initial begin ai4d1;//(1)ai4d2;//(2)//ai 最此刻为 2#20;//(3)ai4d3;//(4)bi4d4;//(5)value_blkaibi;//(6)//value_blk 最终为7#40;end非阻塞赋值 //例1initial begin ai4d1;//(1)bi4d2;//(2)//ai和bi的初始值分别为12#20;//(3)//非阻塞赋值ai4d3;//(4)bi4d4;//(5)value_nonblkaibi;//(6)#40;//value_blk 最终为3end非阻塞赋值类似于物理电路中的时序电路其中可以这样理解代码执行顺序1-2-3之后其他的非阻塞赋值(4)(5)(6)不着急执行而是列入到事件队列中一直存到#40需要被执行前即下一个时刻需要执行前(4)(5)(6)将会被同时执行此时对于value_nonblk而言其对应的ai和bi依旧是1和2,因此结果为3可用于时序电路建模。非阻塞赋值是前一个赋值并不会阻塞后一个赋值而是将所有赋值放到“事件队列”中并在该时刻的“最后”同时执行也就是说赋值过程不会阻塞。event从数学建模的角度讲sv是一个基于离散事件仿真Discrete Event Simulation缩写为DES设计的语言。与之相反的是Continuous-Time Models在一些热力学、模拟电路、纳电子器件等系统的建模中一般采取这种建模方式一般使用微积分里面学的ode或者数理方程学的pde解决当然很多没有解析解的pde也是直接采用有限差分法等方法转换为DTMDiscrete-Time Models的问题会引入一定的误差。对于DTM的问题一种是简单的设定一个时间片time slot在早期的IEEE描述里面也叫做timestep只不过现在不这么叫了在程序里面写一个for循环每delay一个time slot就计算仿真一次更新一次状态。其实游戏里面的subtick就是这个我们玩联机游戏也大多是服务器每过多少ms计算更新一次状态游戏行业叫做subtick我们IEEE就叫做time slot。sv的DES还稍微有所不同只有在有事件触发的时候才进行仿真比如*就是任何变量的改变都会触发块内仿真语句的计算posedge clk就只有时钟的上升沿是触发事件。这样的好处是在没有什么信号变化或者系统空闲的时候我们可以仿真的很快有时你仿真几千ms但因为没什么数据变化其实仿真的耗时很短而且因为fsdb或者vcd的格式只会记录数据的变化所以占用的存储也很小process事件触发的系统任务就叫做进程Processes这是sv中用于模拟电路中并发调度的单元比如原语Primitives、initial过程块、always过程块、连续赋值continuous assign、异步任务asynchronous tasks、过程赋值procedural assignment等。进程是可以被执行的有相应的状态标志state比如挂起。进程会响应输入的变化并产生对应的输出。sv的描述的对象也正是这些进程。而event可以大概分为更新事件update event仿真中net或者variable上每次的变化被认为是一次更新事件。求值事件evaluation event进程对更新事件敏感当一个更新事件被执行时所有对该更新事件敏感的进程都会被求值但是顺序是任意的。进程的求值本身也被认为是一种事件即求值事件evaluation event。更新事件和求值事件的相互交替执行推动了仿真时间的前移。time-solt时间片time-slot后简称ts是EDA工具进行仿真进程中的抽象时间单位该时间点内所有线程被划分为相应的优先级进行调度。如果线程在同一ts内被调度从外部看他们仿佛属于同一时间点“并行”执行的但是实际上是有先有后因为软件行为中不存在绝对的并行。ts存在的主要价值是能够解决一部分仿真中的竞争与冒险使仿真行为尽量与实际电路行为保持一致。归结起来一句话通过一个ts中发生的行为可以认为是实际电路中同一时刻并行完成的而在仿真中是有先后顺序调度的。一般来说改变timescale能够减少我们的time slot数量或者总的事件量那么对仿真时间就是有收益的比如1ns/10ps一般比1ns/1ps快为什么要引入event regionRace竞争 就是结果依赖于事件执行的相对时间和相对顺序。Verilog/Systemverilog需要面对两种常见的Race是Hardware Race和simulation race。Hardware race是芯片工程师最熟悉的概念这里不做介绍。什么是simulation race仿真引入的race的是由于Verilog/SV采用的event-driven仿真算法产生的由于仿真器一次只能处理一个event因此必然会将同一个time slot的event进行排序。但在实际硬件中这些事件是同时发生的这种仿真与实际硬件的偏差会引起额外Race但在实际的design中并不存在因此可能导致仿真与实际design的mismatch。正是因为这个原因Verilog中规定了一个特定的event region必须以任意的顺序来处理但每个实现都有固定的顺序。调度机制详解这是event region在verilog-2005里的标准定义总共有17个Event Regions我感觉没必要全部掌握大家真有兴趣可以去知乎看秦旋的文章。比如8个PLIProgramming Language Interface用来调用其它语言的函数的接口比如C/C感觉基本用不到要用dpi还挺麻烦的反正我一般是直接使用initial begin $system(echo 仿真开始 log.txt);$system(timeout 30 python script.py)// 调用Python脚本end这种各种其他语言函数都可以通用而且$system函数会阻塞仿真进程直到脚本执行完毕才会继续执行后续仿真代码很好用。下面是一个我觉得需要掌握的——简要流程域名作用preponed 前置区域时间片入口断言数据的采样时间这时候采样数据active/inactive/NBAmodule中代码执行时间active1.阻塞赋值\2.计算非阻塞赋值的右侧表达式RHS即Right-Hand-Side。并且把相应的更新事件调度至NBA Region(NBA即nonblocking assignment非阻塞赋值。3.连续赋值。4.调用$display系统函数。5.primitive原语计算。Inactive Region#0延迟下的阻塞赋值。observed断言检查时间re-active/re-inactive/re-NBAprogram中代码执行时间顺序和active的差不多执行系统函数e x i t 及隐式的 exit及隐式的exit及隐式的exit命令postponed时间片出口调用m o n i t o r 和 monitor和monitor和strobe系统函数看图表我们发现图表总结1.非阻塞赋值其实是分成了两个步骤先计算RHS再更新LHS中间会去完成其它事件的调度和计算。而阻塞赋值两步同时执行不存在中间插入其它事件的情况。2.2005标准相对2001标准引入了program多了Reactive Region setReactive、Re-Inactive、Re-NBA将验证代码和设计代码区域区分开了减少了竞争冒险。3.图表中也看出来为什么我们一般推荐使用asign而不是always *因为连续赋值语句会在0时刻进行触发以便传递常值而always的阻塞赋值没有这个效果2.大家可能喜欢用#0延迟去消除对同一变量赋值所引起的竞争但是其实按照编码规范来你就不应该在多个always对同一个变量进行阻塞赋值所以理论上就不应该用到#0的阻塞赋值当时很多时候其实组合逻辑的赋值很难合到一个一个块内特别是仿真的时候在逻辑先后明确的时候使用Inavtive Region也无可厚非写设计的时候就别用了。虽然Inactive Region不推荐使用但是Re-Inactive Region还是有一些独特的价值的比如开一些后台fork时你希望新开的子进程优先于父进程执行就可以这样操作program test;initial begin fork process1;process2;process3;join_none #0;//todo parent process continuesend endprogram这样就巧妙的用#0 让父进程在re-inactive region再执行了是不是挺高级。还是挺复杂的如果你没有理解这几张图表你可能还需要再去了解一些概念sv的一些语法特性自动推断长度wire[7:0]signal1,signal2,signa13;assign signal11; // equal with assign test_ signal1 8b11111111 assign signal20;// equal with assign test_ signal2 8‘h00![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e8b4d8ab1965403eb1382cc921c82bf0.png)assign signal3x; // equal with assign test_ signal3 8 bxxXXXXXx支持string、real等logiclogic 不支持 multidriver如果要写三态门比如pad的那种inout端口还是需要wirestringstring s“sv”或者bit [7:0]d “sv”string arrayMethodDescriptionSyntax Usagelen()返回字符串长度function int len();str.len();putc()替换字符串中指定位置的字符task putc(int i, byte c);str.putc(i, c);getc()返回字符串指定位置的ASCII码值function byte getc(int i);str.getc(i);compare()字符串对比区分大小写function byte compare(string str);result str.compare(target_str);icompare()字符串对比不区分大小写function byte icompare(string str);result str.icompare(target_str);substr()返回从位置i到j的子字符串function string substr(int i, int j);sub_str str.substr(i, j);arrayint array[1:2]{3,4}定宽数组// 固定大小数组声明 int fix_arr[8]; // 8元素整型固定数组是简写方式完全写是int fix_arr[0:7]; bit [3:0] rd_arr[3] ‘{1,3,5,7}; // 4位宽数组初始化注意实际元素个数与声明大小不匹配 initial begin // 使用for循环遍历数组存在潜在越界风险 for(int i0; i4; i) begin // 数组大小声明为3但循环到i4会导致越界 rd_arr[i] 2; // 按索引访问 end // 使用foreach安全遍历数组 foreach(rd_arr[i]) begin // 自动适配数组维度 rd_arr[i] 2; // 按索引访问 end end动态数组int rd_arr[]; //dynamic array Int arr_size; initial begin rd_arrnew[4]; //create array : dimension 4. for(int i0; ird_arr.size; i) begin //using for and foreach trace array rd_arr[i]2; //access by index end arr_sizerd_arry.size; //size 4 rd_arrynew[16] (rd_arr) ; //resize to 16: keep values,直接括号里给一个定宽数组也可以 arr_sizerd_arry.size; //size 16 rd_arry.delete(); //size 0 endclock blocking为什么要使用clock blocking以下简称cb因为DV要假定该RTL将来综合后的电路在timing上没有问题因此我们可以考虑利用Clocking blocks来构造一个理想的驱动和采样interface的环境。语法示例clocking cb1 (posedge clk) default input #1step output (CYCLE * 0.2); input list of all inputs ; output list of all outputs; endclocking这里需要注意的是1.cb的input是dut的outputcb的output是dut的input验证的端口和设计的端口是相反的2.default的delay最好不要直接赋多少ns这样会和仿真时clk的时钟频率相媾和是不好的coding style错误示范interface dut_if (input clk); logic [15:0] dout; logic [15:0] din; logic ld, inc, rst_n; clocking cb1 (posedge clk); default input #1ns output #1ns ; input dout; output din; output ld, inc, rst_n; endclocking endinterface正确示范interface dut_if (input clk); logic [15:0] dout; logic [15:0] din; logic ld, inc, rst_n; clocking cb1 (posedge clk); default input #1step output Tdrive; input dout; output din; output ld, inc, rst_n; endclocking endinterface在SystemVerilog的clocking block中#1step和(\CYCLE * 0.2)分别控制输入采样和输出驱动的时序具体作用如下#1step输入采样偏移含义表示输入信号在时钟事件posedge clk前1个仿真时间步的Postponed区域采样[1][9]作用避免采样时的竞争条件RACE确保采样到的是时钟边沿前的稳定值1step是SystemVerilog特殊时间单位等于当前时间精度如timescale 1ns/1ps中为1ps[9](\CYCLE * 0.2)输出驱动偏移 含义表示输出信号在时钟事件posedge clk后0.2个时钟周期驱动[2][4] 作用 模拟实际电路中的信号传播延迟 确保DUT在时钟边沿后稳定阶段接收到信号 假设CYCLE是宏定义的时钟周期值如define CYCLE 10ns则实际驱动时间为2ns后[4][9] 配置对比 类型 偏移量 时序行为 典型应用场景 输入 #1step 时钟边沿前采样稳定值 避免亚稳态 输出 (\CYCLE*0.2)时钟边沿后延迟驱动 模拟物理延迟enumtypedefenum{busy,idle}st_e;//named enum typest_e st;enum{start,do,end}a_st_e;//un-name enum typeinitial begin stidle;a_st_edo;stst_e’(1);st0;//not legal 但其实至少vcs可以跑只是有个warning这种endenum会自动推断状态代号的值比如在以下代码中Start0; do1; end2;busy0, idle1typedefenum{busy,idle}st_e;//named enum typest_e st;enum{start,do,end}a_st_e;//un-name enum typeinitial begin stidle;a_st_edo;stst_e’(1);st0;//not legalend但是必须每个状态是唯一的typedefenum{start1,do,end6,re-start}st_e;//named enum typetypedefenum{start1,do,end2,re-start}st_e;//语法报错do和end都是2结语sv的复习就先到这啦还有写语法特性比如user define typequeue等以及后面的面向对象的class等的用法之后再介绍吧感觉这种语法的东西多写写就会了单独学学了也忘后面先介绍uvm和sva吧sv的知识点遇到了再发布。

相关新闻

家庭版 Windows 安装 Docker 没有 Hyper-V 问题

家庭版 Windows 安装 Docker 没有 Hyper-V 问题

2026/8/26 14:16:30

一、关联文章: 1、Docker Desktop 安装使用教程 2、安装 Windows Docker Desktop - WSL问题 3、打开 Windows Docker Desktop 出现 Docker Engine Stopped 问题 二、问题解析 安装Docker出现问题,如下: Installation failed:one pre-requ…

超级详细的 Ollama 搭建本地 DeepSeek大模型

超级详细的 Ollama 搭建本地 DeepSeek大模型

2026/8/26 14:16:30

一、Ollama 下载与安装 Ollama 是一个开源项目,专注于帮助用户本地化运行大型语言模型(LLMs)。它提供了一个简单易用的框架,让开发者和个人用户能够在自己的设备上部署和运行 LLMs,而无需依赖云服务或外部 API。这对于…

2026 上下文缓存:大模型账单暴增的“省钱密码“?MonkeyCode 免费上手

2026 上下文缓存:大模型账单暴增的“省钱密码“?MonkeyCode 免费上手

2026/8/26 14:16:30

2026 上下文缓存:大模型账单暴增的"省钱密码"?同样的提示词,为什么你的 API 账单越来越贵?你可能不知道,大模型里藏着一把"省钱钥匙"。故事:CTO 盯着账单血压升高 凌晨一点&#xff0c…

如何将TradingView策略迁移到alpha-rptr:完整迁移实战指南

如何将TradingView策略迁移到alpha-rptr:完整迁移实战指南

2026/8/26 15:26:33

如何将TradingView策略迁移到alpha-rptr:完整迁移实战指南 【免费下载链接】alpha-rptr A trading bot for automated algorithmic trading on Binance Futures, Bybit, BitMEX and FTX written in python. 项目地址: https://gitcode.com/gh_mirrors/al/alpha-rp…

BioJava蛋白质结构叠加:CE、FATCAT与TM-align三种算法完整指南

BioJava蛋白质结构叠加:CE、FATCAT与TM-align三种算法完整指南

2026/8/26 15:26:33

BioJava蛋白质结构叠加:CE、FATCAT与TM-align三种算法完整指南 【免费下载链接】biojava :book::microscope::coffee: BioJava is an open-source project dedicated to providing a Java library for processing biological data. 项目地址: https://gitcode.com…

Jackett 部署教程:把上百个种子站装进一个搜索框

Jackett 部署教程:把上百个种子站装进一个搜索框

2026/8/26 15:26:33

Jackett 部署教程:把上百个种子站装进一个搜索框 【免费下载链接】Jackett API Support for your favorite torrent trackers 项目地址: https://gitcode.com/GitHub_Trending/ja/Jackett Jackett 是一个开源的种子搜索代理:它把上百个公共、半私…

元宝    LeetCode 3.无重复字符的最长子串  Python3实现

元宝 LeetCode 3.无重复字符的最长子串 Python3实现

2026/8/26 15:26:33

这是 LeetCode 3:无重复字符的最长子串 的 Python3 实现,使用滑动窗口(双指针),时间复杂度 O(n),是最推荐的解法。 ✅ 思路(滑动窗口) 用两个指针 left 和 right 维护一个窗口 用一…

数据分析其实没那么难:吃透这8张图,搞定90%的分析问题

数据分析其实没那么难:吃透这8张图,搞定90%的分析问题

2026/8/26 15:26:33

做数据分析久了,我越来越觉得,很多人不是不会分析,而是一开始就把这件事想复杂了。一提到数据分析,就容易联想到统计模型、算法、SQL、Python,好像工具越多,分析能力就越强。但真正到了企业里,大…

RuoYi-flowable 高频问题速查:流程部署失败、中文乱码、字体不显示等10个坑一次解决

RuoYi-flowable 高频问题速查:流程部署失败、中文乱码、字体不显示等10个坑一次解决

2026/8/26 15:16:32

RuoYi-flowable 高频问题速查:流程部署失败、中文乱码、字体不显示等10个坑一次解决 【免费下载链接】RuoYi-flowable 基RuoYi-vue flowable 6.7.2 的工作流管理 右上角点个 star 🌟 持续关注更新哟 项目地址: https://gitcode.com/gh_mirrors/ru/Ru…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/26 1:50:39

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/26 1:49:16

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/24 21:16:09

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

2026/8/26 0:05:45

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

Hermes接入团队协作后,我推翻了三个效率假设

Hermes接入团队协作后,我推翻了三个效率假设

2026/8/26 0:05:45

聊《Hermes真能提效吗?先看流程里最慢的那一步》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要团队把 Hermes 接进项目三个月后,交付速度没有提升反而慢了。复盘后发现,最先…

免费AI大模型调教指南:打造专属网文写作助手

免费AI大模型调教指南:打造专属网文写作助手

2026/8/26 0:05:45

1. 先搞清楚“AI小说扩展模式”到底能帮你做什么如果你是一个刚开始写网文、或者卡在L3级别以下的作者,最头疼的可能是情节推进不下去、人物对话干瘪,或者世界观设定不够丰满。自己对着空白文档硬憋,效率很低。这时候,一个能理解你…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/22 4:13:47

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/22 1:32:34

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…