加载中…
个人资料
赵中民的博客
赵中民的博客
  • 博客等级:
  • 博客积分:0
  • 博客访问:2,425
  • 关注人气:18
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
博文
(2020-12-12 13:58)
标签:

fsdb

dump

二维数组

verdi

fsdbdumpmda

杂谈

分类: 芯片设计验证

Dump fsdb时,Defaut情况下只会dump 变量/向量,若要想查看多维数组以及memory中的数据,还需要多一道工序(call fsdbDumpMDA)。用法如下:

$fsdbDumpMDA的第一个参数是dump的层级,第二个参数为需要dump层级的Hierarchy,上面的例子,第一个参数取值不同,需要dump的内容也不同。

  0:  当前级及其下面所有层级,如top.A, top.A.a,所有在top下面的多维数组均会被dump

  1: 仅仅dump当前组,也就是说,只dump top这一层的多维数组。

上面的例子,随能达到预期,但会使仿真速度变慢,原因是需要dump top下面所有多

(2020-12-06 17:37)
标签:

verdi

glitch

vcs

fsdb

分类: 芯片设计验证

当你看到一个不可思议的waveform时,有可能是glitch惹的祸。

通常glitch default并看不到,所以如果想用洞察万物的眼睛发现它,需要借助工具,以VCS仿真工具为例子,需要在VCS simv命令后面加上对应的option:

 

  • Before Verdi/1509, simv +fsdb+sequential +fsdb+glitch=0 +fsdb+region
  • After Verdi/1509, simv +fsdb+delta

如:

%>  simv +fsdb+sequential +fsdb+glitch=0 +fsdb+region

重新simulation之后,通常就可以使用Verdi看到glitch的存在,但可能只能看到一个pluse,若想放大看,可以在Verdi菜单中选择“view->Expand Delta->Expand/Collapse Time at Cursor”就可以放大光标所在区域,更仔细查看信号的变化。


Reference: 

- ​https://www.it610.

标签:

systemverilog

timescale

timeformat

override_timescale

分类: 芯片设计验证

使用SystemVerilog搭建的Testbench,仿真过程离不开仿真时间单位,使用'`timescale 单位/精度'可以指定本次仿真过程的仿真时间单位/精度。

如下面的例子,在testbench.sv中定义”`timescale 10ns/1ps“,就是向仿真器说明,本次仿真的​时间单位是10ns,精度是1ps。所以,line7的”#5“;实际指的就是delay 50ns;精度的最大用处,会被当成%t打印时默认的单位,所以我们看到line8用%t打印出来是50000ps。

timescale可以在多个位置指定,如compile options,任何一个文件中。优先级是后者生效,即后面的会覆盖前面的。如例子中,compile options中指定单位是1ns,由于testbench.sv中又重新指定,所以,compile options的1ns会被覆盖。也可以在多个文件中定义timescale,如先后include的两个文件,分别是module_A.v和module_B.v中都定义timescale,则module_A.v会使用自己定义的timescale,module_B.v由于会用自己的timescale覆盖前面timescale,所以,两个module都会用各自的timescale。

标签:

systemverilog

动态延时

随意延时

delay

分类: 芯片设计验证

说起delay函数,程序员应该都不陌生,我们今天以几个例子,讨论一下即好用,又高效的delay函数。

​先看第一个例子,在时间单位为1ns(timescale=1ns)时,#1000000为1ms,则repeat N次,即是delay Nms。

​​上面的例子,看似乎没毛病,但有风险,timescale是可以在多处定义的,你定义的单位是1ns,别人定义的有可能是1us,同样是#1000000; 单位不同,delay的时间当然不同。

怎样做到不受timescale的影响呢?看第二个例子:

标签:

systemverilog

disable-fork

disable

杀死线程

标签

分类: 芯片设计验证

上篇文章《SystemVerilog避坑指南之disable fork》将了disable fork可以杀死fork-join/join_any/join_none启动的进程。今天聊聊disable这个关键字。

从字面上看,不难理解,disable可以将某一个正在执行的代码块(进程)给disable掉,一个程序中,有那么多个代码块,到底disable哪一个呢?简单,加上lable就搞定了,直接上例子:​

上面的例子,通过加lable的方式,可以看到有3个代码块(thread_fork, thread1, thread2),disable可以对任意一个代码块操作。如里想在thread中kill thread1,可以采用上面的方法,disable fork,即将fork_join整个disabl

标签:

systemverilog

disable-fork

fork-join

fork-begin-end-join

分类: 芯片设计验证

SystemVerilog提供了fork-join/join_any/join_none三种方法可以启动新线程,既然有启动线程就必需有啥死线程的方法,disable fork就是其中之一,使用disable fork很容易出现线程被误杀的情况,废话不多说,直接上例子:

​这个比较简单,共有两个task,tick()目的是每10ns打印一次,所以用fork-join_none丢到后台执行。fork_join_any_test()中启动两个thread,其中thread-1预期10ns打印一次,最多共打印10次,thread-2则在30ns后打印1次并退出,当thread_2结束后,会用disable fork杀死进程。

从打印结果上看,​fork_join_any_test()中thread-1和thread-2打印结果符合预期,但是,tick task在20ns之

标签:

uvm

register

read

write

寄存器读写

分类: 芯片设计验证

前面两篇文章介绍了ral_model的生成,今天介绍一下如何使用ral_model访问register。

对于register的访问,无外乎读写,但是由于ral model的存在,register的操作会灵活一些,比如,uvm提供了多种register的操作,set/get, write/read, poke/peek, update,以及backdoor的操作,field的操作等。​在UVM中这些操作都对user开放,用法相对灵活,同时,如果user乱用,也会造成Testbench的杂乱,根据多年的经验,对些用法及应用场景总结如下:

1) 除非必须,最好不要用backdoor。backdoor的做法其实是反常规,在真实的IC上不会这样用,由于它不存在timing的消耗,在真实的IC上,无论如何也做不到无timing消耗,就能完成register操作。建议,user只能在checker中,想直接拿到某一个register的值,又不想用hierarchy的方式,可以少量使用该方法。除此之外,最好不要用。

2)如果只对某一个register中的某一个或者某几个field操作,可以使用field,会省点事。对于software在真实IC上的用法,通常会把整个register值读出来,然后再更改对应field的值,最后把更改后的值写入整个register中,达到只更改部分field的目的。由于ral model中有mirror的概念,

标签:

ic验证

register

ralgen

uvm

分类: 芯片设计验证

继续讨论UVM中Register的验证方法

上篇文章介绍了*.RALF文件,它是ralgen生成ral model的基石,想具体了解的,可以参考UVM中Register的验证方法-RALF

有了*.RALF文件,需要借助VCS的ralgen工具生成RAL model,ralgen通常在VCS的安装目录中,支持UVM和VMM两种语言。default是使用VMM语言,如果要使用UVM,需要加上'-uvm' option,即:

UVM: ralgen -uvm

VMM: ralgen​

ralgen支持多个option,举例说明,用uvm_mailbox_top.ralf生成uvm_mailbox_top_ral_model.sv的方法:

标签:

人性

安家

人物性格

分类: 视界

热播剧《安家》完美收官,辛辛苦苦从头追到尾,工作日下班追两集,周末早饭后就已经迫不及得再追两集,虽然我感觉这部电影的情节一般,但是安家天下-静宜门店的7位小伙伴性格引起深深吸引了我~ 一时兴起,和大家分享一下。

房似锦

高中毕业生,虽然在江海大学读完了所有课程,但是没拿到江海大学文聘,不过,依然凭借自己实力在事业上闯出一片天地。

房店长是个能吃苦的人。先不说其家境(抛开其它外界渲染的因素),出场就租了凶案房,只为能在房租上便宜一点点,并且还是独自一人居住。为了买房,工作也很拼命,客户随叫随

标签:

unknown

'bx

notcare

分类: 芯片设计验证

最近写一段程序,功能是对比两个4-bit的数据,其中bit[0]的值Not care。

这个功能用if--else肯定可以实现,但是总感觉太low, 就想找个写法, 首先就想到了‘bx, 那么就必须先搞清楚‘bx的异或运算,即'bx与任意值与, 或, 非, 异或的结果都是'bx

所以,结果为1表示不相等,结果为‘bx为Not care的bit, 结果为0表示相等。这样只需要判断结果为1表示mismatch, 非1表示match。

举例: A=4'b00x1, B=4'b0001, C=4'b0011, result=A^B=4'b00x0, result=A^C=4'b00x10, |result = 1'bx, 则可用如下判断逻辑表示’bx为Not care:

 if(|result !== 1'b1) match  (此处相当于1'b0 | 1'bx)

else mismatch​

[==/!=: 针对于二值逻辑, ===/!==: 针对于四值逻辑]​

-------------------------------------------​

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有