system verilog学习记录3--线程及通信和覆盖率

system verilog学习记录3–线程及其通信和覆盖率

一、线程及其通信

  1. fork…join
    在这里插入图片描述
    fork join: 等待所有线程都执行完成才会进行下一步;
    fork join_any: 只要有一个结束了,就会跳出进行下一步,其他的还会继续进行;
    fork join_none: 相当于点个火,不等待任何一个,点个火后直接进行下一步,里边的几个线程会继续同步运行。
    注意还没执行fork中的任何代码呢,就直接退出了先执行join_none后面的这一行代码,再执行fork里边的代码

    1) 如果结束时,有的进程还没结束,怎么办呢?
    ==> 用wait fork.
    会检查是否有进程没有结束,如果没有结束,会等待所有进程结束后,再退出。
    在这里插入图片描述
    2 ) 停止线程
    ① 停止单个线程
    disable + 线程名字
    在这里插入图片描述
    ==》 只要1或2有一个进程结束了,就退出,并把timeout_block的进程关闭;

    ② 停止多个线程
    disable fork 可以停止当前线程中最大的父fork。
    在这里插入图片描述
    但这样往往很容易有歧义,稍不留神就认为是把最近的fork关掉了。其实不是。
    ==> 给fork后面取个名字,我要关哪个的时候直接指定名字。关闭父fork的时候,相应的子fork也会被关闭。
    在这里插入图片描述
    在这里插入图片描述
    但这个有时候也无法达到我们想要的效果
    一个线程,你在同一个时间单位里把它连续执行了三次(fork…join),那么接下来你要disable时,它到底disable哪个线程?
    答案是所有同名的线程都会停止掉。这不是我们希望看到的

看下面的例子。
在这里插入图片描述
这三个任务是同时执行的,为什么呢?
因为这个任务里都是fork…join_none。相当于在0时刻,点火了三个任务。
==> 在#2之后,看起来是要关闭第一个任务(id=0,延迟2之后关闭任务),但实际上这3个同名的线程都被关闭了。而这明显不是我们想要的。

< 这里路桑没有给出解决方案,让我们先思考?看后面的答疑会不会给出答案。>

  1. 线程之间的通信
    1 ) event 事件
    即 -> 和 @
    在这里插入图片描述
    event不需要new(), 但是仍然可以把它认为是一个对象,因为它有方法,并且拷贝的时候都是拷贝的是同一个event的句柄
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    小结
    wait: 只要e1被触发过,e1.triggered()返回值就为1,而wait是电平敏感信号,只要检测到电平为1就往下走,并不会像@一样,一定要在前面等,错过了之后就等不到了。缺点:无法检测到是否多次触发了。在同一时刻,可以捕捉到,即默认先等待,避免竞争问题。
    @: 如果要实现多次触发,那只能用@。我们需要将@一复位就一直在等待即可,用forever。缺点:@一定要安排好顺序,先@,再触发。在同一时刻,@无法捕捉到,即默认先触发。

2 ) semaphore 旗语
对于共享的资源,都应该通过一些手段,完成一些访问互斥在同一个时间段,只能有一个对象可以访问它
==> semaphore 需要new()。可以在new()中给1个或者多个钥匙。
在这里插入图片描述
try_get : 不会等,不管有没有数据立即返回;一般不用;但是try_ 是有返回值的,放进去了就是1,没放进去就是0;
而不带try的是个阻塞的,他可以耗时的,没有返回值。
在这里插入图片描述
在这里插入图片描述
3 ) mailbox 邮箱
线程之间传递信息,mailbox需要用new()
mbx = new(0) 或者mbx = new(); ==> 表示存储数量无限大
在这里插入图片描述
与之对应,也有非阻塞
try_get() try_put() try_peek()
在这里插入图片描述
==》优点:尽量让内存小一点。
mailbox也可以用队列来代替,队列在使用时,如果要取出,一定要确保队列里边有东西。
在这里插入图片描述
如果要用队列,需要加上ref
我的理解是:不加ref只能进,加了ref类似于inout,但也不完全是。相当于传进来一个队列的句柄,在display任务中取出东西后,tmp_q这些队列中确实少了一个数。什么意思呢?
就是假如把ref去掉,默认为input,传进来的形参并不会影响外部的tmp_q。即外部的队列中的数并没有改变。ref的意义在于传进来的形参的作用结果也会相同的作用到外部的对象上,这点是单纯的input,output等无法想象的。
在这里插入图片描述
在这里插入图片描述

线程的通信-小结
event:解决同步==>握手;
semaphore:解决同一个资源的访问;
mailbox:解决进程间的通信和数据缓存以及数据传输。
在这里插入图片描述

二、 覆盖率
1 )代码覆盖率
代码覆盖率收集的是设计代码的覆盖率而非验证代码,会自动收集,不需要额外代码。用于权衡你执行了多少设计的代码
在这里插入图片描述
在这里插入图片描述
2 )功能覆盖率
收集覆盖率会降低仿真性能,那么什么时候开始收集呢?
A. 当设计比较稳定的时候,当回归测试都能通过的时候开始收集覆盖率;
B. 只收集那些能够完成我需要的功能点的映射。

② 功能覆盖策略
在这里插入图片描述
在这里插入图片描述

代码覆盖率100%,而功能覆盖率不足100%?
A. 代码都覆盖到了,但是相应的一些功能还没有测试到,我们需要在验证计划了加相应的功能测试点;
B. 还有可能是设计中可能就没有实现相应的功能,此时我们功能覆盖率可能列出来了。

3 ) covergroup 和 coverpoint 覆盖组和覆盖点
① covergroup要点
A. covergroup和class类似,一次定义后可以多次实例化;
B. covergroup可以包含多个coverpoint;
C. covergroup可以定义在class,interface,module中;一个类中可以包含多个covergroup;每个covergroup可以根据需要自行使能和禁止;
D. covergroup可以采样任何可见变量。
E. 每个covergroup可以定义单独的触发采样事件,允许从对个源头收集数据;
F. covergroup必须被例化后才能用来收集数据。
② 哪些可以用使能来打开或者关闭的呢?
A. 约束const
B. 随机randmozie
C. 覆盖组 covergroup
③ 步骤:
A. 定义;
B. 例化;
C. 采样;
在这里插入图片描述
④ 例化可以用两种方式:
covergroup CovPort;
coverpoint tr.port;
endgroup
xxx
(1) CovPort = new();
(2) CovPort cg1 = new(); 推荐这一种

⑤ 采样也有两种方式:
(1) 当满足了某些条件,再手动去采样 ==> .sample()
在这里插入图片描述

(2) 借助已有的事件,并且是周期性的 ==> 用@或者wait
在这里插入图片描述
4 ) 数据的采样
① 当你在coverpoint指定采样一个变量,sv会创建很多的仓(bin)来记录每个数值被捕捉的次数。
bin是衡量功能覆盖率的基本单位。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意
① 如果范围过大则默认分配64个bin,将值域范围平均分配给这64个bin
coverpoint定义使用花括号{}而不是begin end,且不带分号;而covergroup定义时候是用endgroup结束

==》针对不同的covport实例可以用.stop()停止,用.start()开始。

② 条件覆盖率和反正翻转覆盖率
在这里插入图片描述
在这里插入图片描述 ③ 关键词wildcard 配合?? 成为通配符在这里插入图片描述
④ ignore_bins:忽略一些没意义的值,最终他们不会计入覆盖率。
在这里插入图片描述
在这里插入图片描述
⑤ 交叉覆盖率:我们经常去检测在某一个时刻多个变量之间的组合情况 —> cross
在这里插入图片描述
在这里插入图片描述
==> 更合适的不是去排除,而是去指定感兴趣的状态

在这里插入图片描述
如果没有排除,默认会有8x11=88种组合;
若没有bins misc =default这句话,即没有涵盖所有的组合,工具会帮忙补全,会补上4,5,6,7的值,那么kind就会有1+1+8+4=14个。那么一共会有8x14种组合。
所以更推荐去指定自己感兴趣的状态,排除法容易出错,因为多,很多东西想不到。
在这里插入图片描述

注意:下面这个是错的。
在这里插入图片描述
如果你的bin涵盖了所有可能的值,那这个结果是对的。
在这里插入图片描述
但是如果kind中最后一行bins misc = default没有。那么cross出来的结果是8x10嘛?
不是
仿真器会默认把剩余的4,5,6,7四个bin添加进来cross出来的额结果应该是8x14.
这里容易出错。所以在写coverpoint时,要把default加进去

⑥ 覆盖选项
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ethan_WC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值