前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[二十]Cracking Digital VLSI Verification Interview

[二十]Cracking Digital VLSI Verification Interview

作者头像
空白的贝塔
发布2020-07-01 16:25:45
1.9K0
发布2020-07-01 16:25:45
举报
文章被收录于专栏:摸鱼范式摸鱼范式

[381] 有几种方式为一个设计编写断言?

  • 可以直接在module内部编写断言。如果断言是由设计工程师为设计中的某些内部信号或接口编写的,则通常会采用这种方式
  • 断言也可以编写在单独的interface或module或program中,然后可以绑定到特定的module或实例,在断言中引用来自该特定module或实例的信号。这是使用SystemVerilog中的bind构造完成的。如果断言是由验证工程师编写的,会采用这种方式。
[382] SVA中的sequence的作用是什么?

sequence是编写property或断言的基本构建块。sequence可以认为是在单个时钟边沿求值的简单布尔表达式,也可以是在多个周期内求值的事件sequence。property可能涉及检查在不同时间开始的一个或多个sequence行为。因此,可以使用逻辑或sequence组合的多个sequence来构造property。

sequence的基本语法是:

代码语言:javascript
复制
sequence name_of_sequence;
    <boolean expression >
endsequence

例如,下面的sequence在检查每个周期的上升沿是否a和b始终相等

代码语言:javascript
复制
sequence s_a_eq_b;
    @posedge(clk) (a ==b);
endsequence
[383] $rose(tst_signal)和@posedge(tst_signal)有什么区别?

@posedge(tst_signal)会在每个上升沿进行采样,检查tst_signal是否为1。但是,rose()是一个系统任务,它检查信号的采样值在先前采样和当前采样之间(先前采样可能是0 / x / z)是否变为1。因此,rose()需要两个采样值进行判断,从原来的非1变成1。例如:在下面的sequence中,仅当信号“a”在时钟的两个正沿之间从0/x/ z的值变为1时,

代码语言:javascript
复制
sequence S1;
    @(posedge clk) $rose(a)
endsequence
[384] 下面的sequence在以下那种情况下会捕获成功?
代码语言:javascript
复制
sequence S1;
    @(posedge clk) $rose(a);
endsequence
  1. 当信号a”从0变为1时。
  2. 当信号“a”在clk的一个上升沿采样的值为“0”,而在下一个上升沿采样的值变为“1”。
  3. 当信号“a”在clk的一个上升沿采样的值为“1”,而在下一个上升沿采样的值变为“0”。

第二种情况下会捕获成功,$rose()检查的是两次采样,第一次非1,第二次为1,@(posedge clk)表示在上升沿时采样。

[385] sequence可以在下面那些地方定义?
  1. Module
  2. Interface
  3. Program
  4. Clocking Block
  5. Package

以上所有地方都可以

[386] 在类中是否可以实现并发断言?

不能,并发断言不能再类中实现

[387] 下面的sequence会匹配事件?
代码语言:javascript
复制
req ##2 gnt ##1 !req

当gnt信号在req信号为高电平后的两个周期变为高电平,然后一个周期后req信号被置为零时,该sequence的值为真。

[388] 什么是序列重复运算符?有哪三种?

如果需要对一个sequence表达式进行一次以上的迭代求值,则可以使用重复运算符来构造一个更长的sequence,而不是编写一个长sequence。SVA支持三种类型的重复运算符:

  • 连续重复([*const_or_range_expression]):如果sequence从一个迭代结束起以一个时钟单位进行有限次数的迭代,可以使用连续重复运算符。在下面的例子中,描述的是如果a为高,一个周期后,b连续五个周期为高的事件。
代码语言:javascript
复制
a ##1 b [*5]
  • 跟随重复([->const_or_range_expression]):和连续重复类似,不一样的是,并不要求重复是连续的,间断的也可以,并且要求在最后一次匹配时,立刻匹配后续表达式。下面的例子中,描述的是如果a为高,一个周期后b连续至少2个至多10个周期为高,然后一个周期后c为高的事件
代码语言:javascript
复制
a ##1 b [->2:10] ##1 c
  • 非连续重复([=const_or_range_expression] ):和跟随重复类似,但是重复匹配后,并不要求后续立刻跟上,只要在之后能够匹配到即可。例如下面的例子中,可以在c有效匹配前一个时钟,并不需要b进行有效匹配。
代码语言:javascript
复制
a ##1 b [=2:10] ##1 c
[389] 下面的断言有什么错误?
代码语言:javascript
复制
module test (input clk, input a, input b);
    assert_1: assert ( a && b);
endmodule;

立即断言只能在程序块中使用

[390] 写一个断言,检查信号最少2个最多6个周期内为高电平
代码语言:javascript
复制
property a_min_2_max_6:
    @(posedge clk) $rose(a) |-> a[*2:6] ##1 (a==0)
endproperty 

assert property (a_min_2_max_6);
[391] 什么是蕴含操作符?

蕴含操作符用于指定检查的先决条件,描述当先决条件发生后,再继续匹配。蕴含操作符只能再property这一级别使用。蕴含操作符有两种

  • 交叠蕴含操作符
代码语言:javascript
复制
assert property prop_name ( sequence_expr |-> property_expr )
  • 非交叠蕴含操作符
代码语言:javascript
复制
assert property prop_name ( sequence_expr |=> property_expr )

当蕴含操作符左侧发生后,才会匹配右侧

[392]交叠蕴含操作符和非交叠蕴含操作符有什么不同?
  • 交叠蕴含操作符,先决条件的起点和后继事件的起点是同一个时刻。例如下面的例子中,再时钟上升沿是,a要为1,同时开始检查b是否为1,如果不是那么匹配不成功,不会进行后续的评估
代码语言:javascript
复制
assert property abc_overlap (@posedge clk (a==1) |-> b ##1 c )
  • 非交叠运算符,先决条件的终点是后继事件的起点,在下一个周期才会匹配后续。例如下面的例子中,时钟上升沿a为1,下个周期要匹配b为1,而不是同一时刻进行匹配。
代码语言:javascript
复制
assert property abc_overlap (@posedge clk (a==1) |=> b ##1 c )
[393] 蕴含操作符可以在sequence中使用吗?

不能,只能在property中使用

[394] 下面的两个断言是等效的吗?
代码语言:javascript
复制
1) @(posedge clk) req |=> ##2 $rose(ack);
2) @(posedge clk) req |-> ##3 $rose(ack);

是的,参考[392]

[395] SVA中允许嵌套蕴含吗?

允许,下面就是一个例子

代码语言:javascript
复制
a |=> b |=> c

匹配的就是a为高,下个周期b为高,再下个周期c为高

[396] 系统函数$past()的作用是什么?

这个系统函数能够从之前的时钟周期中获得信号

[397] 写一个断言,检查一个信号永远不会变成X

使用系统函数$isunknown(signal)可以进行此项检查。

代码语言:javascript
复制
assert property (@(posedge clk) ! $isunknown(mysignal));
[398] 写一个断言,检查一个变量保持独热码状态

使用系统函数isonehot()或者countones()可以进行此项检查

代码语言:javascript
复制
assert property (@(posedge clk) $isonehot(state));
assert property (@(posedge clk) $countones(state)==1);
[399] 写一个断言,检查主设备是否在发出有效请求后就在2到5个时钟周期内提供授权
代码语言:javascript
复制
property p_req_grant; @(posedge clk) $rose (req) |-> ##[2:5] $rose (gnt); endproperty
[400] 如何再复位期间禁止进行断言检查?

使用“disable iff”可以实现

代码语言:javascript
复制
assert property (@(posedge clk) disable iff (reset) a |=> b);
[401] systemverilog中的bind构造是什么意思?

SystemVerilog中的bind构造用于将checker于模块、模块的示例或者一个模块的多个示例进行绑定。通过绑定可以分离断言和设计diamagnetic。下面是示例语法

代码语言:javascript
复制
bind <target module/instance> <module/interface to be instantiated> <instance name with port map>

当我们有下面的一个接口,并且内嵌断言

代码语言:javascript
复制
interface range (input clk, enable, int minval, expr);
    
    property crange_en;
        @(posedge clk) enable |-> (minval <= expr);
    endproperty 
    
    range_chk: assert property (crange_en);
        
endinterface
  • 绑定到模块
代码语言:javascript
复制
bind cr_unit range r1(c_clk,c_en,v_low,(in1&&in2));
  • 绑定到模块的某个实例
代码语言:javascript
复制
bind cr_unit:cr_unit_1 range r1(c_clk,c_en,v_low,(in1&&in2));
[402] 如何关掉所有的断言?

使用$assertoff()系统函数可以实现,缺省情况下会关掉所有断言。也可以指定关闭哪些断言。

代码语言:javascript
复制
$assertoff[(levels[, list])]

第一个参数指定关闭哪个层次的断言,第二个参数指定关闭具体哪些property

[403] 有哪些方式为property指定时钟?
  • sequence中显式使用时钟,继承到property中
代码语言:javascript
复制
sequence seq1;
    @(posedge clk) a ##1 b;
endsequence

property prop1;
    not seq1;
endproperty 

assert property (prop1);
  • property中显示使用时钟
代码语言:javascript
复制
property prop1;
    @(posedge clk) not (a ##1 b);
endproperty

assert property (prop1);
  • 从过程块中推断当前使用的时钟
代码语言:javascript
复制
always @(posedge clk) assert property (not (a ##1 b));
  • 使用当前时钟块的时钟
代码语言:javascript
复制
clocking master_clk @(posedge clk);
    property prop1;
        not (a ##1 b);
    endproperty
endclocking 

assert property (master_clk.prop1);
  • 直接定义默认时钟,在没有上述方法指定时钟的条件下会使用默认时钟。
代码语言:javascript
复制
default clocking master_clk ; // master clock as defined above

property p4;
    not (a ##1 b);
endproperty 
    
assert property (p4);
[404] 对于深度= 32的同步FIFO,为以下情况编写断言。假设具有时钟信号(clk),写入和读取使能信号,满标志和计数器信号。1)如果计数器> 31,则设置FIFO已满标志。2)如果计数器为31,并且在没有同时读取的情况下发生了新的写操作,则FIFO满标志将置1。
代码语言:javascript
复制
assert property (@(posedge clk) disable iff (!rst_n) (wordcnt>31 |-> fifo_full));
assert property (@(posedge clk) disable iff (!rst_n) (wordcnt==31 && write_en && !read_en |=> fifo_full));

注意第二条,使用的是非交叠蕴含操作符,满标志位要在下个周期拉高。

本系列完结!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 摸鱼范式 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • [382] SVA中的sequence的作用是什么?
  • [383] $rose(tst_signal)和@posedge(tst_signal)有什么区别?
  • [384] 下面的sequence在以下那种情况下会捕获成功?
  • [385] sequence可以在下面那些地方定义?
  • [386] 在类中是否可以实现并发断言?
  • [387] 下面的sequence会匹配事件?
  • [388] 什么是序列重复运算符?有哪三种?
  • [389] 下面的断言有什么错误?
  • [390] 写一个断言,检查信号最少2个最多6个周期内为高电平
  • [391] 什么是蕴含操作符?
  • [392]交叠蕴含操作符和非交叠蕴含操作符有什么不同?
  • [393] 蕴含操作符可以在sequence中使用吗?
  • [394] 下面的两个断言是等效的吗?
  • [395] SVA中允许嵌套蕴含吗?
  • [396] 系统函数$past()的作用是什么?
  • [397] 写一个断言,检查一个信号永远不会变成X
  • [398] 写一个断言,检查一个变量保持独热码状态
  • [399] 写一个断言,检查主设备是否在发出有效请求后就在2到5个时钟周期内提供授权
  • [400] 如何再复位期间禁止进行断言检查?
  • [401] systemverilog中的bind构造是什么意思?
  • [402] 如何关掉所有的断言?
  • [403] 有哪些方式为property指定时钟?
  • [404] 对于深度= 32的同步FIFO,为以下情况编写断言。假设具有时钟信号(clk),写入和读取使能信号,满标志和计数器信号。1)如果计数器> 31,则设置FIFO已满标志。2)如果计数器为31,并且在没有同时读取的情况下发生了新的写操作,则FIFO满标志将置1。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档