第一范文网 - 专业文章范例文档资料分享平台

SystemVerilog断言学习笔记 - 图文 (3)

来源:用户分享 时间:2020-06-21 本文由似如千厥歌 分享 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

property name_of_property; ; or

; endproperty

步骤四、断言属性

关键词断言‖assert‖可以用来检查属性。 断言基本语法:

assertion_name: assert property(property_name);

【SystemVerilog断言学习笔记4】边沿检测内嵌函数

SVA中内嵌了信号边沿检测函数,方便用户监视信号从一个时钟周期到另一个时钟周期的跳变。其中,有三个非常有用的内嵌函数如下: (1)$rose(boolean expression or signal_name):当表达式/信号的最低位由0变为1时返回真; (2)$fell(boolean expression or signal_name):当表达式/信号的最低位由1变为0时返回真; (3)$stable(boolean expression or signal_name):当表达式/信号不发生变化时返回真。 针对上述的描述,可以得出两个结论: (1)这三个内嵌函数是工作在时钟边沿上的;

(2)这三个内嵌函数只检测信号的最低位,而忽略其他位。

接下来,带着这两个结论以及运用上一篇博客对SVA块的建立步骤对三个内嵌函数进行验证。 1、$rose()函数的验证

为了验证内嵌函数$rose()是工作在时钟边沿上的,这里给出一个简单的反例即不受时钟控制:

/******************************************************* 作者 : CrazyBird 文件 : rose_test.sv 日期 : 2015-5-6 功能 : $rose()函数的验证 ********************************************************/ `timescale 1ns/1ps module rose_test( output reg clk, output reg [1:0] a ); // 时钟的产生 parameter PERIOD = 10; initial begin clk = 0; forever #(PERIOD/2) clk = ~clk; end // 激励的产生 initial begin a = 0; repeat(20)@(negedge clk) begin a = {$random()}%2**2; end @(negedge clk); $stop; end // 断言 always_comb begin a_ia : assert($rose(a)); end endmodule 对该程序进行编译将出现以下错误: 从错误中可以看出,$rose()函数是时钟敏感的。改正后的代码如下所示: /******************************************************* 作者 : CrazyBird 文件 : rose_test.sv 日期 : 2015-5-6 功能 : $rose()函数的验证 ********************************************************/ `timescale 1ns/1ps module rose_test( output reg clk, output reg [1:0] a ); // 时钟的产生 parameter PERIOD = 10; initial begin clk = 0; forever #(PERIOD/2) clk = ~clk; end // 激励的产生 initial begin a = 0; repeat(20)@(negedge clk) begin a = {$random()}%2**2; end @(negedge clk); $stop; end // 序列的建立 sequence s1; @(posedge clk) $rose(a); // 受时钟边沿控制,正确 //$rose(a); // 不受时钟控制,错误 endsequence // 属性的建立 property p1; s1; endproperty // 断言属性 a_cc: assert property(p1); endmodule 对改正后的代码进行仿真,可得到如下的时序图: 其中,红色光标所在处表示断言成功,而红色下三角表示断言失败。可以很容易分析到,断言成功的地方肯定是当前时刻信号的最低位是高电平,上一时刻信号的最低位是低电平。断言失败的地方信号的最低位要么当前时刻是低电平,上一时刻是高电平,要么当前时刻和上一时刻的电平没有发生变化,不管其他位是如何变化的。从而验证了内嵌函数$rose()只检测信号的最低位,而忽略其他位。

对于内嵌函数$fell()和$stable()的验证与$rose()类似,同样可以验证―内嵌函数是工作在时钟边沿上的‖和―内嵌函数只检测信号的最低位,而忽略其他位‖这两个结论的正确性。下面只给出他们的仿真结果。 2、$fell()的验证

3、$stable()的验证

先介绍到这吧,待续~~

【SystemVerilog断言学习笔记5】―##‖的解读与运用

有时候,我们需要检查几个时钟周期才能完成的事务。在SVA中,可以用―##‖表示时钟周期延迟,如― a ##2 b‖即当a为高电平时,2个时钟周期之后b应为高电平。下面举个简单的例子来说明: 测试代码:

/******************************************************* 作者 : CrazyBird 文件 : assert_test2.sv 日期 : 2015-5-7 功能 : 时钟周期延时“##”的测试 ********************************************************/ `timescale 1ns/1ps module assert_test2( output reg clk, output reg a, output reg b ); // 产生时钟 parameter PERIOD = 10; initial begin clk = 0; forever #(PERIOD/2) clk = ~clk; end

搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新小学教育SystemVerilog断言学习笔记 - 图文 (3)全文阅读和word下载服务。

SystemVerilog断言学习笔记 - 图文 (3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/wenku/1092488.html(转载请注明文章来源)
热门推荐
Copyright © 2018-2022 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top