0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

systemverilog中的assertion用法整理

冬至子 来源:Bug记录 作者:woodfan 2023-06-06 11:51 次阅读

时序电路讲究建立时间、保持时间需要留有裕量。这也说明了,在电路中信号的顺序以及之间的时序关系十分重要

如果激励的输入输出不满足设计的要求,那么测试的结果也是不可靠的。同样,如果设计内部不满足要求,输入输出的关系也不正确。为了检验这之间的关系,便引入了assertion.

参考资料可知几点,非时序逻辑时,assertion的形式如下:

ASSERTION_TEST:
 assert (condition)
 else
  $error("check failed");

而对于时序逻辑的assertion,形式如下:

ASSERTION_TEST:
 assert
  property(
  @(posedge clk) disable iff (rst)
   condition
  )
  else
   $error("check failed");

property ASSERTION_TEST:
  @(posedge clk) disable iff (rst)
   condition
  )
endproperty

ASSERTION_ACTION: assert property (ASSERTION_TEST)

其它的一些系统函数,操作符作用如下,可以进参考资料查看:

图片

那么,接下来我们就做个小测试,使用req ack的握手过程作为检测过程。

图片

信号的时序图要求如上图,握手过程为:

  1. req信号拉高,此时ack信号还是低电平
  2. 在req信号拉高后,ack信号拉高
  3. req端检测到ack拉高,拉低req信号
  4. ack端的处理结束,检测到req信号拉低,ack信号拉低

那么,我们简单写一个ack应答的模块,内容如下:

module req2ack(
  input  clk ,
  input  rst ,

  input  en  ,
  input  req ,
  output reg ack 
);

reg [7:0] req_arr;

always @ (posedge clk or posedge rst)
begin
 if (rst)
  req_arr <= 'd0;
 else if (en)
  req_arr <= {req_arr[5:0], {2{req}}};
end

always @ (posedge clk or posedge rst)
begin
 if (rst) 
  ack <= 1'b1;
 else if (en)
  ack <= req_arr[7] ; 
end

endmodule

req经过8个时钟周期和使能信号的延迟后,ack做出应答。

tb简单写为:

module tb;

reg clk ;
reg rst ;
reg en  ;
reg req ;
wire ack;

initial begin
 clk = 0;
 rst = 1;
 en  = 0;
 req = 0;
 #100
 rst = 0;
 en  = 1;
 #100
 req = 1;
 wait(ack);
 req = 0;
 #50
 req = 1;
 #20
 req = 0;
 #50
 $finish;
end

initial begin
 $fsdbDumpfile("tb.fsdb");
 $fsdbDumpvars;
 $fsdbDumpSVA;
end

always #10 clk = ~clk;

req2ack req_inst(
  .clk(clk) ,
  .rst(rst) ,
  .en (en ) ,
  .req(req) ,
  .ack(ack) 
);

`ifdef ASSERTION_ENABLE
 `include "tb_assertion.v"
`endif

endmodule

提供20ns的周期时钟,使能信号;以及两次req信号拉高的模拟激励。

assertion定义在tb_assertion.v文件中,在仿真时定义ASSERTION_ENABLE的宏,可以调用assertion检查。

tb_assertion.v定义为:

check_req_ack_rise:
    assert property(
 @(posedge clk) disable iff (rst)
  $rose(req) |- > ##1 (req & ~ack)[*0:$] ##1 (req & ack)
 )
 else
   $error("req to ack rising edge is fail");

check_req_ack_fall:
    assert property(
 @(posedge clk) disable iff (rst)
  $rose(ack) |- > (req & ack)[*0:$] ##1 (~req & ack)[*0:$] ##1 (~req & ~ack)
 )
 else
  $error("req to ack falling edge is fail");

第一块内容,检查req-ack握手过程的1,2两步;第二块内容,检查req-ack握手过程的3,4步。

$rose(req)的意思是由上文或参考资料可知,等到req信号的上升沿有效;

|->操作符表示,LHS(左侧表达式)条件满足,则在同一时刻去检查RHS的表达式;

##1 代表延时1个时钟周期;

(req & ~ ack)[*0:$] 代表此时req信号为高,ack信号为低的情况满足0或多个时钟周期;周期不确定

第一块内容的意思是,等到req信号上升沿,过一个时钟周期检查req拉高,ack为低的情况是否满足,这个过程可能持续多个周期,不确定;然后就是ack信号拉高。检查结束

第二块内容的意思是,等到ack信号上升沿,检查req和ack的信号是否都拉高,这个过程可能持续多个周期,不确定;然后req信号拉低,ack保持,也会持续多个周期,最后ack信号也拉低。

最后,在运行vcs时,需要加入“+fsdb+sva_success -assert”

测试结果:

图片

图片

那么,我们对激励稍作修改下:

initial begin
 clk = 0;
 rst = 1;
 en  = 0;
 req = 0;
 #100
 rst = 0;
 en  = 1;
 #100
 req = 1;
 wait(ack);
 #20
 req = 0;
 wait(~ack);
 #50
 $finish;
end

Assertion的结果:

图片

这只是作为一个小例子,而且写的过于匆忙,我相信应该是有更好的assertion写法,所以权当是一次记录的草稿内容。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1351

    浏览量

    110143
  • 时序电路
    +关注

    关注

    1

    文章

    114

    浏览量

    21718
  • VCS
    VCS
    +关注

    关注

    0

    文章

    80

    浏览量

    9625
  • 时钟信号
    +关注

    关注

    4

    文章

    449

    浏览量

    28583
收藏 人收藏

    评论

    相关推荐

    SystemVerilog的Virtual Methods

    SystemVerilog多态能够工作的前提是父类的方法被声明为virtual的。
    发表于 11-28 11:12 713次阅读

    SystemVerilog的“const”类属性

    SystemVerilog可以将类属性声明为常量,即“只读”。目的就是希望,别人可以读但是不能修改它的值。
    发表于 11-29 10:25 2152次阅读

    SystemVerilog的联合(union)介绍

    SystemVerilog ,联合只是信号,可通过不同名称和纵横比来加以引用。
    的头像 发表于 10-08 15:45 1418次阅读
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>的联合(union)介绍

    SystemVerilog Assertion Handbo

    SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
    发表于 07-22 14:08 188次下载

    SystemVerilog的断言手册

    SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
    发表于 07-22 14:12 20次下载

    SystemVerilog枚举类型的使用建议

    SystemVerilog枚举类型虽然属于一种“强类型”,但是枚举类型还是提供了一些“不正经”的用法可以实现一些很常见的功能,本文将示例一些在枚举类型使用过程的一些“不正经”
    的头像 发表于 09-01 14:20 1728次阅读

    SystemVerilog可以嵌套的数据结构

    SystemVerilog除了数组、队列和关联数组等数据结构,这些数据结构还可以嵌套。
    的头像 发表于 11-03 09:59 1618次阅读

    SystemVerilog的package

    SystemVerilog packages提供了对于许多不同数据类型的封装,包括变量、task、function、assertion等等,以至于可以在多个module中共享。
    的头像 发表于 11-07 09:44 1277次阅读

    SystemVerilog的struct

    SystemVerilog“struct”表示相同或不同数据类型的集合。
    的头像 发表于 11-07 10:18 2475次阅读

    SystemVerilog的Shallow Copy

    SystemVerilog的句柄赋值和对象复制的概念是有区别的。
    的头像 发表于 11-21 10:32 926次阅读

    SystemVerilog的Semaphores

    SystemVerilogSemaphore(旗语)是一个多个进程之间同步的机制之一,这里需要同步的原因是这多个进程共享某些资源。
    的头像 发表于 12-12 09:50 3391次阅读

    SystemVerilogbind用法总结+送实验源码和脚本

    bind是systemverilog中一个重要的知识点,很多时候能够在验证中发挥重要的作用,今天就针对这个知识点做一个梳理,希望能帮助到大家。
    的头像 发表于 01-11 08:59 8871次阅读
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>bind<b class='flag-5'>用法</b>总结+送实验源码和脚本

    聊聊形式验证的SVA

    SVA,即SystemVerilog Assertion,在simulation和Formal都有极为广泛的应用,这里介绍一些基本的概念和常用的语法。
    的头像 发表于 06-14 09:31 1883次阅读
    聊聊形式验证<b class='flag-5'>中</b>的SVA

    Systemverilog的Driving Strength讲解

    systemverilog,net用于对电路连线进行建模,driving strength(驱动强度)可以让net变量值的建模更加精确。
    的头像 发表于 06-14 15:50 1616次阅读
    <b class='flag-5'>Systemverilog</b><b class='flag-5'>中</b>的Driving Strength讲解

    SystemVerilogifndef如何避免重复编译

    `ifndef是SystemVerilog/Verilog的一种条件编译命令,可以认为其是"if not defined"的缩写,其用法与`ifdef相反,他们主要用来根据其后
    的头像 发表于 06-25 15:59 3291次阅读
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>ifndef如何避免重复编译