
芯片前端验证
文章平均质量分 68
芯片前端验证,systemverilog/uvm/vmm/verdi
尼德兰的喵
这个作者很懒,什么都没留下…
展开
-
【IC前端虚拟项目】验证阶段开篇与知识预储备
前言尼德兰的喵:【芯片验证】年轻人的第一个systemVerilog验证环境全工程与解析之前的工程是基于modelsim来完成的,而后评论区有朋友想把工程移植到工作站的vcs环境下时一直有些小问题,所以我就说亲自来移植下:…这里也搞清楚了,就可以开始虚拟项目的验证阶段了,不要畏难验证的入门是比较费劲的但是只要入了门后面很快就能得心应手,比如我4年多不干验证的活了但是想写一个验证环境还是分分钟搞出来,这东西就是一劳永逸能吃经验的工作,大家加油吧!看完绿皮书之后,怎么知道到的到不到位了呢?原创 2024-04-10 11:13:57 · 842 阅读 · 0 评论 -
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(终)
前几天有朋友和我讨论,明明$cast函数的功能是修改句柄的指向,为什么我们总是称之为强制类型转换函数?下班的路上我想了一下,感觉还是因为句柄的指向规则和调用特性使得$cast看起来确实是在完成强制类型转换功能。从这一点看,实际上右侧的实例类型并没有被强制转换转换成左侧句柄的类型。但是呢,别忘了还有另外一个性质:父类句柄指向子类空间时,无法调用父类中不存在、子类拓展出来的方法,具体实验请参见系列文章的第四篇。从结果上看,仿佛是右侧的子类空间被强制转换为左侧父类句柄的数据类型了。原创 2023-07-13 15:37:11 · 376 阅读 · 0 评论 -
【前端验证】环境仿真中对于寄存器配置的随机策略讨论
本篇文章旨在讨论环境仿真中对于寄存器配置的随机。原创 2023-02-20 18:00:22 · 1741 阅读 · 0 评论 -
【前端验证】验证环境中random随机的特点和大位宽数值的随机
不同种子的仿真结果一样,不受种子控制。同一个用例中,同一变量随机多次值不相同。原创 2023-01-28 11:42:07 · 754 阅读 · 0 评论 -
【前端验证】对uvm_info宏的进一步封装尝试
没有公共环境和组件作为依托,徒手写验证环境真的是太难了。所以最近我一直在写环境的同时补充公共环境,这次的内容就是封装`uvm_info。system verilog环境中使用宏的学习笔记_尼德兰的喵的博客-优快云博客_systemverilog 宏。原创 2022-12-23 12:50:59 · 479 阅读 · 0 评论 -
【前端验证】记录将发包量作为传参以加速debug的环境优化记录
这个是好多年前做的一个优化了,最近因为在新的环境里又做了这个操作所以记录一下。先要说明一点,我没有点分离编译的技能点,这个优化也是大概在4年前做的了,所以如果有更好的建议请勿嫌弃。原创 2022-12-12 16:54:40 · 288 阅读 · 0 评论 -
【python脚本】用于生成简单握手接口与自测环境的gen_uvm_agent脚本
由于后续的工作需要,大概率会进行一些验证的工作,因此我非常机智的先把gen_uvm_agent脚本写好。gen_uvm_agent只用来生成简单的握手型接口的全套代码,同时也会生成一个自测环境用于行为确认。......原创 2022-08-29 08:00:00 · 982 阅读 · 2 评论 -
【前端验证】验证自动化脚本的最后一块拼图补全——gen_tb
在完成了【芯片前端】可能是定向验证的巅峰之作——auto_testbench_尼德兰的喵的博客-优快云博客【python脚本】用于生成简单握手接口与自测环境的gen_uvm_agent脚本_尼德兰的喵的博客-优快云博客gen_tb脚本脚本实现的功能相对比较简单,对生成model和connect功能暂时没有开发(connect严重依赖于gen_agent等公共环境的约定俗称,生成model单纯是我自己习惯先写model再集成),之后有进一步的需求之后再进行开发吧!原创 2022-12-01 16:01:59 · 1205 阅读 · 0 评论 -
【前端验证】fork-join_none线程立即执行的一次代码优化记录
【system verilog】fork-join_none与循环语句共同使用的行为探究很早之前写过关于fork-join_none的探究文章,最近被人指出了一些错误:我仔细理解了下他的意思,觉得确实使用#0来立刻进行进行阻塞,进而达到立即执行fork-join_none内语句的方式是比较合理的(当然了,其他阻塞行为一样会让fork-join_none内的语句执行,但不能达到立刻执行的效果)。经过这个勘误和指点后,我突然觉得又通彻了一些。原创 2022-11-24 15:13:53 · 1233 阅读 · 0 评论 -
【前端验证】uvm验证环境中的看门口watchdog机制探究
uvm中一般通过objection机制来控制仿真的结束时间,不过在这几机制之外,有时还需要通过看门狗来watchdog避免仿真环境挂死,watchdog配合objection一起来控制仿真的进行。原创 2022-11-10 18:14:20 · 1077 阅读 · 0 评论 -
【前端验证】通用型顺序比对的uvm scoreboard组件编写
最近在研究uvm环境的仿真结束机制,准备在现有的objection机制基础上补充看门狗操作。而看门狗操作中,scoreboard喂狗是重要的一环,因此这次先实现一下通用型顺序比对的scoreboard组件编写。原创 2022-11-06 00:16:36 · 1520 阅读 · 0 评论 -
【前端验证】被动响应型uvm_model环境搭建——以握手型ram_model为例
我最近的学习趋势,完全是在弥补之前一些没来得及探究的问题导致的遗憾。因为我是从vmm入门的,而vmm方法学是更加接近于朴素的systemverilog验证思路,因此环境搭建比较散当然也比较灵活。而之后转到uvm方法学后,我只是简单了解了下思路就直接转方向了,因此一直遗留几个问题没有搞清楚,今天的被动响应型uvm_model环境就是其中一个。原创 2022-10-29 19:10:30 · 1334 阅读 · 0 评论 -
【芯片前端】可能是定向验证的巅峰之作——auto_testbench
在完成这一版后,在实战中我发现,每次生成之后我需要有大量的修改,于是深思熟虑之后做了一版大的修改,并且重命名为auto_testbench,毕竟这才符合定向testbench的定义。原创 2022-09-18 01:31:47 · 1895 阅读 · 10 评论 -
【前端验证】关于那道经典概率题,用UVM环境来仿真下是男孩的概率
所以个人观点,就是把所有有两个孩子的家庭邀请过来,请两个女孩的家庭先回去,然后统计剩下这些有一个男孩的家庭数量a,再统计另外一个也是男孩的数量b,然后用b/a就得到了最终的概率。显然,真实的统计结果就是10000个满足“一个家庭有两个孩子,已知一个是男孩”的家庭里,有3331个家庭满足“另外一个也是男孩”,所以概率是1/3。统计什么也很简单,就统计“2'b11”的家庭数量看看另一个也是男孩的总数是多少,然后在仿真结束后把boy_boy_cnt的数量打出来!已经把自己说服了(*^▽^*)原创 2022-09-06 21:25:21 · 396 阅读 · 4 评论 -
xprop仿真选项对RTL X态传播的影响
前言vcs仿真时可以通过-xprop=tmerge/xmerge来扩散X态传播,借此来发现一些问题。对于这个选项,synopsys给出的解释是:“Verilog 和 VHDL 常用于数字设计建模。设计人员使用 RTL 构造描述硬件行为。然而,某些 RTL 仿真语义不足以准确地为硬件行为建模。因此,相比实际硬件行为,仿真结果要么太过乐观,要么太过悲观。因为这些语义限制,Verilog 和 VHDL RTL 仿真器会忽略掉控制信号上的X不定态,在输出上会分配一个固定的数值。这样造成的结果就是,由于缺原创 2021-08-04 23:58:56 · 4820 阅读 · 0 评论 -
testbench——文件读入输出
注:仿真工具为ISE自带simulation1.读入.txt中的文件待读入文件为photo.txt,位于所建工程文件夹中。代码:integer cnt,i;reg [7:0] mem[31:0];reg [5:0] address;integer fp;initialbegin fp = $fopen("photo.txt","rb"); address = 0;原创 2017-06-19 11:18:26 · 6697 阅读 · 0 评论 -
testbench——常用语句与函数(日常更新)
testbench的常用语句与函数原创 2017-09-05 00:11:04 · 1997 阅读 · 0 评论 -
testbench——双向端口的仿真
双向端口(inout)可以通过引脚复用来节省引脚。在控制信号控制下,inout既可作为输入input也可作为输出output,因此对其仿真描述不当可能会引起仿真错误。当然,不只在testbench中,在程序中对inout口一般也是要做特殊处理的。testbench:`timescale 1ns / 1ps///////////////////////////////////////原创 2017-07-11 11:17:02 · 1928 阅读 · 1 评论 -
testbench——信号的产生
在写testbench时候,需要对各种信号根据时间进行设置。注意所有需要输入被测试模块的信号均为reg型。module test();reg clk;reg sig1, sig2, sig3, sig4, sig5;常见信号设置方式时钟信号一般通过forever语句设置,产生连续时钟。initial begin clk = 1'b0; forever #原创 2017-04-06 19:55:04 · 7635 阅读 · 0 评论 -
【验证小bai】利用verdi让所有环境force现身
我刚开始入门的时候,有人和我讲宏、force和callback是验证环境的三个毒药 ,仿佛饮鸩止渴,虽然简洁快速,但是如果使用不当会使验证环境处于不可控的风险中。所以很长一段时间我都是避免使用force的,直到有一天我发现force是真的很爽\(^o^)/~不过呢还是得说,force确实有时会带来盲点,尤其是你忘了还有force这个事的时候。bdforce导致的问题通常都很隐蔽,比如我之前见到过得的封装uvm操作失误,在uvm_bd_read这类操作中误使用force,导致后门读取使得RTL挂死这种.原创 2022-04-11 20:57:35 · 1555 阅读 · 0 评论 -
【验证小bai】VCS仿真过程中出fsdb波形
ctrl + c进入ucli%ucil%fsdbDumpflush 即可dump当前时间点的波形当然了,前提你是带着波形跑的。原创 2022-04-01 20:34:57 · 4042 阅读 · 0 评论 -
【芯片前端】一键生成简易版本定向RTL验证环境的脚本——auto_verification
资源路径链接:https://pan.baidu.com/s/1N61m5CMEoc8lRP4yn0ppMg提取码:41e7使用示例下载解压于安装有vcs的虚拟机中,如安装路径为:/home/xiaotu/my_work/auto_verification/则执行脚本:/home/xiaotu/my_work/auto_verification/auto_verification -t xxx -f ./xxx.v-t:顶层名称;-f:顶层文件,或包含顶层文件的文件..原创 2022-03-26 19:07:57 · 2946 阅读 · 0 评论 -
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(5)
前言之前在几篇博客中提到了下$cast方法的原理和行为:【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(4)【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(3)【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(2)【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(1)今天发现之前的说法还是有原创 2022-03-23 20:50:48 · 1081 阅读 · 0 评论 -
【验证小bai】verdi中对数值信号进行模拟展开
这样的一道题:请编写一个信号发生器模块,根据波形选择信号wave_choise发出相应的波形:wave_choice=0时,发出方波信号;wave_choice=1时,发出锯齿波信号;wave_choice=2时,发出三角波信号。因为题目本身描述的并不清楚,行为上也不太明确因此做的意义不是太大,唯一有用的点就是:对数值信号的模拟波形展开需要知道如何做;第一种方式:Waveform - Analog wareform第二种方式:Analog - Convert to analog而以第原创 2022-03-13 17:19:03 · 2402 阅读 · 0 评论 -
【验证小bai】关于多个声明域变量名重名时如何取用的问题——还是以随机约束为例
前言前文就是这个:【验证小bai】randomize中的this.指的是哪个this呢然后发现还是说的不明白,因此在这篇里把情况掰开揉碎的说明下,因此标题就是:关于重叠声明域重名变量的取用问题;想想的描述...原创 2022-01-28 22:52:42 · 980 阅读 · 0 评论 -
【验证小bai】乐于助人·比特序列匹配电路RTL&验证环境笔试实操
题目几天前收到了这样一份笔试试题,希望能提供一份参考。恰好最近在家里没事做鼓捣鼓捣还看了点书,因此非常愉快的接下了这个笔试题。RTL这个rtl其实是比较容易实现的,单比特输入,只需要在rtl内部做移位寄存即可,当匹配上对应序列的时候即输出一个单比特脉冲的match信号。当然了,可以做一步参数化,把要匹配的序列作为parameter输入,我觉得也就差不多了吧:module bit_match #( parameter VALUE = 6'b101101)( input.原创 2021-12-27 23:36:06 · 895 阅读 · 2 评论 -
【验证小bai】soft constraint按域约束与整体约束的差异
提问:rand bit[31:0] value;constraint value_con{ foreach(value[i]) soft value[i] == 1; }constraint value_con{ soft value == '1; }这两种soft constraint有没有区别?回答:第一种方式是对每一比特进行软约束,第二种方式是增提软约束,当软约束生效时二者没有区别。但是当其中某一比特的与硬约束冲突时,比如在case中bit0约束原创 2021-12-18 15:47:19 · 2073 阅读 · 0 评论 -
【验证小bai】systemverilog constraint中,约束越界时可取区间的真实权重分布
简单来说,场景可以归纳为这样:对于一个8bit的值,如果做如下约束:data dist {[8'hAB:32'FFFFFFFF]:/10, 8'hAA:/10};那么数据落在蓝色区间,即8'hFF~8'hAB之间的真是权重是多少呢?50%,为了确定我的记忆没错,我跑了两千个包,最后的统计结果为:1015;可见constraint中有边界外的区间时,vcs应该是将边界外的区间去除,并将预定的权重加之于该区间的有效区间上。...原创 2021-12-16 01:51:06 · 367 阅读 · 0 评论 -
【验证小bai】一个简单可make run的uvm demo环境
因为最近偶尔看了一些uvm的知识,因此搭了一个uvm环境用来做各种实验:uvm_demo.tar解压后在sim目录进行操作,可以通过:make run seed=0 wave=on来查看运行结果和波形。具体的RTL行为就是个握手型输入输出均打拍的乘法器而已。...原创 2021-12-14 22:50:41 · 1069 阅读 · 4 评论 -
【验证小bai】randomize中的this.指的是哪个this呢
为啥小白是标题中的禁止词呢,有点摸不着头脑啊。今天一精神小伙突然发现一个问题,简化讲就是在seq中对某一transaction进行randomize时,this的含义竟然指的不是这个seq中的值,而是transaction中的值!示意代码如下:class my_transaction extends uvm_sequence_item; rand bit [8-1:0] data; rand bit par_err; bit [8 -1:0] test_value = 8原创 2021-12-14 22:24:24 · 1230 阅读 · 0 评论 -
【验证小白】随机中使用post_randomize的正确姿势
前言最近晚上没事就翻一下我之前的笔记和总结,还是感叹于当时自己的~~~勤劳勇敢有力气!这次是之前遇到的一次改了环境后回归时间直接拉满的大坑以及解决历程;案件回放事情的经过是这样的,原本我的环境呢是个自由烂漫的环境,里面的随机真的是非常的随机,就属于那种你们随便浪随机出事来我再看的状态(因此我一直觉得我验出来的RTL稳健性都很强,一般错误都冲不垮的那种)。但是因为太随机了,一直到锁代码都没能跑出来一个id之间耦合关系导致的bug。毕竟好几千id,耦合关系还挺复杂的,还涉及到内部逻辑判定和时序级原创 2021-08-10 23:03:39 · 1938 阅读 · 0 评论 -
【system verilog for design】verilog 1995/2001/system verilog标准语法的一些演进
前言最近在学习一些verilog/system verilog for design的基础知识,觉得有些东西总结总结还是挺好的,毕竟好记性不如烂键盘;正文开始verilog有1995和2001两个标准,之后便合入到system verilog标准中了,因此结合最近看的课总结一下语法的演进;verilog-1995module parameter function task always @ assign wire reg + = * /原创 2021-07-06 22:42:36 · 737 阅读 · 0 评论 -
【验证小白】只有SV+modelsim学验证(5)—— 完成reference model合入环境
前言【验证小白】只有SV+modelsim学验证(1)——把平台搭起来【验证小白】只有SV+modelsim学验证(2)——加monitor到环境中【验证小白】只有SV+modelsim学验证(3)——加checker到环境中【验证小白】只有SV+modelsim学验证(4)——想办法合理的结束仿真后,准备好了所有代码想想这个系列也是耗时最长的一个系列了。从18年毕业4月份开始接触IC前端验证一筹莫展,看SV完全不知道在说什么,看《SystemVerilog 验证方法学》看的想...原创 2021-05-23 17:58:21 · 2505 阅读 · 3 评论 -
sv验证环境中bus.mon.sig与@bus.mon同时使用的反面案例
initial begin forever begin wait (bus.mon.vld == 1'b1); @bus.mon; $display("%t, pop_front this cyc", $realtime); endend2010.000ns, pop_front this cyc2020.000ns, pop_front this cycinitial begin forever beg...原创 2020-12-09 00:01:34 · 457 阅读 · 1 评论 -
verdi直接打开list文件
前言没有验证环境时,需要看下代码层次,并且检查下空驱和空载的信号;解决可以直接通过verdi看代码层次,有list文件就可以,list文件内容如下:[xiaotu@xiaotu-eda ~/my_work/verdi_demo]$cat top.lst ../vcs_demo/rtl/mem.v直接指定list文件同时指定top层次即可:verdi -f top.lst -top mem &...原创 2020-11-23 23:31:11 · 3562 阅读 · 0 评论 -
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(4)
前言感觉这个标题可以作为小知识汇总的博文了,继续上次的写:【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(3)父类句柄的小疑问今天跟同事讨论父类和子类的问题,就是在(3)中讨论的那个指向问题,然后延伸出了另外一个问题:父类指向子类空间时,能否调用父类不存在的、子类拓展出来的方法?我坚持是可以的,我都指向子类空间了,空间里的东西还不是随便我用?于是乎压了一顿饭。回来之后做实验:class father; int flow_id;原创 2020-11-04 00:05:41 · 698 阅读 · 4 评论 -
【验证小白】编译、仿真与波形 —— 基于VCS的通用superbench平台搭建
前言之前初步的搭了一个仿真环境,用来做了几个小实验:【验证小白】无法忍受modelsim?阵地转移,虚拟机centOS+makefile+vcs+verdi继续验证学习——搭建简单的superbench后续我希望搭建一个完整的、融合vcs/verdi/spyglass/dc等工具的superbench平台,今天就来进行第一步,先基于VCS将通用的superbench平台做起来。...原创 2020-08-16 14:53:22 · 3435 阅读 · 0 评论 -
【验证小白】无法忍受modelsim?阵地转移,虚拟机centOS+makefile+vcs+verdi继续验证学习——搭建简单的superbench
前言之前的系列都是运行于windows+modelsim环境的,之所以这样运行呢,是因为我当时手头只有这个工具;【验证小白】系列前文但是今时不同往日,我终于找到了一个工具齐全的虚拟机centOS(忙猜很多人应该都是在用这个虚拟机),于是乎我决定把验证环境搬家,顺便也再好好的重构下;当然了那是以后的事,这次的任务是搭建一个基本的superbench平台。目标通过makefile搭建superbench平台,支持VCS仿真和verdi定位功能,包括如下指令:make cmp:VCS编原创 2020-07-16 00:42:44 · 2577 阅读 · 11 评论 -
【system verilog】孤陋寡闻了,原来覆盖率是可以对序列进行收集的
前言做了两年多的数字前端验证,尽然直到今天才知道原来覆盖率是可以对序列进行收集的,也就是说我不仅可以在横向收集组合情况,还可以纵向收集时间维度上信息的改变情景。参考详细的内容可以参照“IEEE System Verilog standard 1800-2017” “19.5.2 Specifying bins for transitions”,我之前也在优快云上上传过:https://download.youkuaiyun.com/download/moon9999/12139311举例cov原创 2020-06-18 00:07:48 · 955 阅读 · 0 评论 -
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(3)
前言接https://blog.youkuaiyun.com/moon9999/article/details/106748050,想到哪补充到哪。cast方法我们需要明确system verilog中的句柄指向规则,概括起来就是:本类句柄可以指向本类实例;父类句柄可以指向全体子类及再传子类实例;原则上子类句柄不可以指向父类句柄,但是当父类句柄指向子类实例时,子类句柄可以指向父类句柄;画一个示意图表示允许的情况如下:就如同,父类是“电器”,子类是“电冰箱”,你可以用“电器”指代任何.原创 2020-06-14 17:54:09 · 877 阅读 · 0 评论