SVA描述(一)

SystemVerilog Assertion(SVA):是一种描述性的语言,可以很容易的描述时序相关的情况,所以主要用在协议检查和协议覆盖。SVA在systemverilog仿真器中的

调度区间在RTL之后,Testbench之前。所以同一时钟断言只能采样到上一时刻的RTL值。由于是描述性语句,所以“;”用的比较多。

断言失败后会自动打印信息到log文件,用户也可以自定义打印内容。

assertion name: assert  xxxx;

$display("xxxxx");

else

$display("xxxxx");

SVA分为并发断言:基于时钟的,调度区间按assertion的调度区间,可以在过程块(always initial),模块(module),接口(interface),程序(program)中定义。

即时断言:基于事件的,本质不是时序关系,会立刻求值。进行检查。只能在过程块(always initial)中定义。

两者另一个区别是:并发断言会用property来声明,即时断言不需要。

always

begin

a_ia:  assert (a && b);  //即时断言

end

因为并发断言应用更多,所以一下均以并发断言来说:

并发断言可以自定义一个SVA块来描述自己要求的时序,两个关键字:sequence, property。

sequence  s1;             //sequence允许自己定义更小的时钟描述

a ##2 b;

endsequence

property   s2;            //property 一个assert只能有一个

@(posedg clk)  s1;

endproperty

s3 :assert property(s2);       //标准形式 name : assert property();

断言中内嵌的表示信号的上升沿和下降沿的函数:$rose(expression or signal)  $fell(expression or signal)  $stable(expression or signal)

sequence  s2;

@(posedge clk)    $rose(a);       //时钟的上升沿仍然用posedge, 信号的上升沿才用$rose();

endsequence

断言中时序延时的描述: ##表示延时,但是注意触发加.ended,否则SVA默认都是按起始时刻来对齐的,也就是说如果断言3时刻触发,5时刻succeed,但是断言

也是会报道3时刻的对错。

sequence  s2;

@(posedge clk)  a ##2 b;       //a为高电平延时2个时钟后如果b为高电平,则断言成功。

endsequence

property p12;

@(posedge clk)  (a && b) |-> ##[1:3] c;       //相当于(a && b) |-> ##1 c; 或 (a && b) |-> ##2 c;  (a && b) |-> ##3 c;

endproperty

断言中时钟的定义:一般情况下,在property中定义时钟,而保证sequence独立于时钟比较好。当然从语法角度来说,时钟可以定义在property,sequence,assert

中。但是当assert定义时钟之后,property不能再重新定义时钟。

sequence  s5a;

a ##2 b;

endsequence

property  p5a;

@(posedge clk)  s5a;      //在property中定义时钟

endproperty

a5a: assert property(p5a);    //assert不再定义时钟

断言通过蕴含操作符来作为断言的触发条件,交叠蕴含: “|->”来表示,表示在先行算子(蕴含前的表达式)有效的同一个时刻判断后续算子(蕴含后的表达式)。

非交叠蕴含: “|=>”来表示,表示在先行算子有效的下一时刻再判断后续算子。

property  p8;                                                          property  p9;

@(posedge clk)  a |-> b;     //同一时刻                        @(posedge clk)  a |=> b;     //延时一个时钟

endproperty                                                            endproperty

时间: 2024-10-27 13:01:41

SVA描述(一)的相关文章

数字IC学习之五(综合、SVA以及跨时钟域设计)

我们来说说综合,通常意义上的综合指的是,将RTL风格的描述转化为逻辑网标,通俗点说,就是把你的代码转化成真实的电路,我们以EDA工具Design Compiler为例来说说如何进行综合,对于综合我推荐的资料为<Design Compiler User Guide>(synopsys)(书1),<Optimization Reference Manual>(synopsys)(书2),<高级ASIC芯片综合>(书3),<专用集成电路设计实用教程>(虞)(书4)

查询字段描述sql-postgresql

查询字段描述sql SELECT 'comment on column ' || n.nspname ||'.'|| c.relname || '.' || a.attname ||' is '''|| col_description(a.attrelid,a.attnum) ||''';' FROM pg_class as c join pg_attribute as a on a.attrelid = c.oid join pg_namespace n on c.relnamespace=n

数据结构与算法C++描述学习笔记1、辗转相除——欧几里得算法

前面学了一个星期的C++,以前阅读C++代码有些困难,现在好一些了.做了一些NOI的题目,这也是一个长期的目标中的一环.做到动态规划的相关题目时发现很多问题思考不通透,所以开始系统学习.学习的第一本是<数据结构与算法C++描述>第三版,边学边做一些笔记.所以这些笔记中的代码有很多将会非常简单,甚至可能只有一个记录或者结论. 辗转相除法用来求两个整数的最大公约数,即能同时整除两个数的最大整数.程序如下: int gdc(int m,int n){ int rem; while(n!=0){ //

进程描述符

进程描述 广义上讲,所有进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合. 进程控制块 每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体. task_struct结构体 task_struct是Linux内核下的一种数据结构,它会被装载到RAM里并且包含着进程的信息,每个进程把它的信息放在task_struct结构体里task_struct包含了这些内容: 标示符:描述本进程的唯一标示符 状态:任务状

获取枚举类型Description特性的描述信息

C#中可以对枚举类型用Description特性描述. 如果需要对Description信息获取,那么可以定义一个扩展方法来实现.代码如下: public static class EnumExtensions { public static string GetDescription(this object value) { if (value==null) return string.Empty; Type type = value.GetType(); var fieldInfo = ty

设计模式-单例模式(Go语言描述)

这篇博客我们继续来看设计模式,今天带来的是一个最简单而且最常用的模式-单例模式.那什么是单例模式呢?相信大家最它最熟悉不过了,那我们就来快速的了解一下它的定义. 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 这个解释足够简单.说白了就是假如我们希望我们在我们的系统中该类仅仅存在1个或0个该类的实例.虽然单例模式很简单,但是熟悉java的同学可能了解,单例模式有很多写法,懒汉式.饿汉式.双重锁... 这么多形式,难道有什么目的?确实,不过他们的目的很明确,就是保证在一种特殊情况下的单例-

OpenCV4Android 提取特征点描述符(Feature Descriptor)

OpenCV4Android 提取特征点描述符(Feature Descriptor) 在得到keypoints之后(参考前面),通过使用相应的FeatureDescriptor就可计算得到关键点处的描述子. Native Code: JNIEXPORT void JNICALL Java_com_example_test_NativeUtil_computeDescripors( JNIEnv *env, jclass thiz, jlong mGrayAddr, jlong mRgbaAdd

USB 描述符

标准的USB设备有5种USB描述符:设备描述符,配置描述符,字符串描述符,接口描述符,端点描述符. 1 // Standard Device Descriptor 2 typedef struct 3 { 4 u8 bLength; 5 u8 bDescriptorType; 6 u16 bcdUSB; 7 u8 bDeviceClass; 8 u8 bDeviceSubClass; 9 u8 bDeviceProtocol; 10 u8 bMaxPacketSize0; 11 u16 idVe

文件描述符与文件指针等文件操作的几个问题

1.二者对比: 文件描述符就是open文件时产生的一个整数,直到一个索引作用,它用于UNIX系统中,用于标识文件.它是系统调用产生的. 文件指针是指向一个FILE的结构体,这个结构体里有一个元素就是文件描述符.它用于ANSI C标准的IO库调用中,用于标识文件.fopen是依赖于open的: 既然FILE中包含文件描述符元素,可以用fopen()直接获取指针fp,然后使用fp获得fp中所包含文件描述符fd的信息. 文件描述符应该是唯一的,但文件指针(值)却不是唯一的,但指向的对象却应该是唯一的.