首页 > 其他分享 >SystemVerilog -- 11.0 Introduction

SystemVerilog -- 11.0 Introduction

时间:2024-05-07 22:14:12浏览次数:22  
标签:started failed -- 11.0 sv Introduction testbench property tb

SystemVerilog Assertions

系统的行为可以写成一个assertion,该assertion在任何时候都应该为真。因此,assertion用于验证定义为属性的系统的行为,也可用于功能覆盖。

What are properities of a design ?

如果assertion检查的设计属性未按预期方式运行,则assertion将失败。例如,假设设计请求授权,并期望在接下来的四个周期内收到确认。但是,如果设计在第五个周期上获得ack,则应在 4 个时钟内返回 ack 的属性被违反,并且assertion失败。

如果禁止由assertion检查的设计属性发生,则assertion将失败。例如,假设一个小型处理器解码从内存中读取的指令,遇到未知指令并导致致命错误。如果设计中从未预料到这种情况,则会违反只能从内存中读取有效指令的设计属性,并且assertion失败。

从上面的两个示例这可以明显看出,通过编写 SystemVerilog assertion 来检查给定设计的属性。

Why do we need assertions ?

assertion只不过是功能检查器的更简洁的表示。assertion表示的功能也可以编写为涉及更多代码行的SystemVerilog任务或检查器。下面列出了这样做的一些缺点:

  • SystemVerilog 冗长且难以维护和扩展属性数量的代码
  • 作为一种过程语言,很难编写在同一时间段内设计许多并行事件的检查器
// A property written in Verilog/SystemVerilog
always @(posedge clk) begin
  if (!(a && b))
    $display ("Assertion failed");
end

SystemVerilog assertion 是一种用于指定时态条件的声明性语言,非常简洁且易于维护。

// The property above written in SystemVerilog Assertions syntax
assert property (@(posedge clk) a && b);

Types of Assertion Statements

Assertion语句可以是以下类型:

Type Description
assert To specity that the given property of the design is true in simulation
assume To specity that the given property is an assumption and used by formal tools to generate input stimulus
cover To evaluate the property for functional converage
restrict To specity the property as a constraint on formal verification computations and is ignored by simulators

Building Blocks of Assertions

Sequence

多个逻辑事件的序列通常构成任何设计的功能。这些事件可能跨越多个时钟,也可能只存在于单个时钟周期内。为了简单起见,可以使用简单的assertion来描述较小的事件,然后可以使用这些assertions来构建更复杂的行为模式。

// Sequence syntax
sequence <name_of_sequence>
  <test expression>
endsequence

// Assert the sequence
assert property (<name_of_sequence>);

Property

这些事件可以表示为a,并且可以组合多个序列以创建更复杂的序列或属性。sequence
为了assert它,必须在 or 中包含时钟事件。sequence property

// Property syntax
property (<name_of_property>);
  <test expression> or
  <sequence expressions>
endproperty

// Assert the property
assert property (<name_of_property>);

有两种assertions,Immediate Assertion和Concurrent Assertions。

Immediate Assertion

Immediate Assertion的执行方式与过程块中的语句类似,并遵循模拟事件语义。这些用于在仿真期间验证直接属性。

always @ (<some_event>) begin
  ...
  // This is an immediate assertion executed only at this point in the execution flow
  $assert(!fifo_empty);   // Assert that fifo is not empty at this point
  ...
end

Concurrent Assertions

Concurrent assertions基于时钟语义,并使用其表达式的采样值。使用SystemVerilog属性描述电路行为,该属性每次都会在给定时钟上进行评估,仿真中的故障表明所述功能行为被违反。

// Define a property to specify that an ack should be returned for every grant within 
 1:4 clocks
property p_ack;
  @(posedge clk) gnt ##[1:4] ack;
endproperty  

assert property(p_ack); // Assert the given property is true always

Steps to create assertions

Following are the steps to create assertions:

  • Step 1: Create boolean expressions
  • Step 2: Create sequence expressions
  • Step 3: Create property
  • Step 4: Assert property

Example

a为高电平时,第一个序列s_ab验证b在下一个时钟为高电平,第二个序列s_cd验证d在发现c为高电平后2个时钟为高电平。assert第二个序列位于第一个序列之后的下一个循环中。property

module tb;
  bit a, b, c, d;
  bit clk;

  always #10 clk = ~clk;

  initial begin
    for (int i = 0; i < 20; i++) begin
       {a, b, c, d} = $random;
       $display ("%0t a=%0d b=%0d c=%0d d=%0d", $time, a, b, c, d);
       @(posedge clk);
    end
    #10 $finish;
  end

  sequence s_ab;
    a ##1 b;
  endsequence

  sequence s_cd;
    a ##2 d;
  endsequence

  property p_expr;
    @(posedge clk) s_ab ##1 s_cd;
  endproperty

endmodule

请注意,使用statement assert的属性存在一些冲突。

模拟日志

Compiler version P-2019.06-1;Runtime version P-2019.06-1;Jan 8 05:02 2020
Warning : License for product VCSRuntime_Net(725) will expire within 10 days, on: 17-jan-2020.

If you would like to temporarily disable this message, set the VCS_LIC_EXPIRE_WARNINC environment variable to the number of days before expiration that you want this message to start (the minimum is 0).
0 a=0 b=1 c=0 d=0
10 a=0 b=0 c=0 d=1
"testbench.sv", 28: tb.unnamed$$_3: started at 10ns failed at 10ns 
    Offending 'a'
30 a=1 b=0 c=0 d=1
"testbench.sv", 28: tb.unnamed$$_3: started at 30ns failed at 30ns 
    Offending 'a'
50 a=0 b=0 c=1 d=1
70 a=1 b=1 c=0 d=1
"testbench.sv", 28: tb.unnamed$$_3: started at 70ns failed at 70ns 
    Offending 'a'
"testbench.sv", 28: tb.unnamed$$_3: started at 50ns failed at 70ns 
    Offending 'b'
90 a=1 b=1 c=0 d=1
110 a=0 b=1 c=0 d=1
130 a=0 b=0 c=1 d=0
"testbench.sv", 28: tb.unnamed$$_3: started at 130ns failed at 130ns 
    Offending 'a'
"testbench.sv", 28: tb.unnamed$$_3: started at 90ns failed at 130ns 
    Offending 'c'
150 a=0 b=0 c=0 d=1
"testbench.sv", 28: tb.unnamed$$_3: started at 150ns failed at 150ns 
    Offending 'a'
170 a=1 b=1 c=0 d=1
"testbench.sv", 28: tb.unnamed$$_3: started at 170ns failed at 170ns 
    Offending 'a'
190 a=0 b=1 c=1 d=0
210 a=1 b=1 c=0 d=1
"testbench.sv", 28: tb.unnamed$$_3: started at 210ns failed at 210ns 
    Offending 'a'
230 a=1 b=1 c=0 d=1
"testbench.sv", 28: tb.unnamed$$_3: started at 190ns failed at 230ns 
    Offending 'c'
250 a=1 b=1 c=0 d=0
270 a=1 b=0 c=0 d=1
"testbench.sv", 28: tb.unnamed$$_3: started at 230ns failed at 270ns 
    Offending 'c'
290 a=0 b=1 c=1 d=0
"testbench.sv", 28: tb.unnamed$$_3: started at 270ns failed at 290ns 
    Offending 'b'
"testbench.sv", 28: tb.unnamed$$_3: started at 250ns failed at 290ns 
    Offending 'c'
310 a=0 b=1 c=0 d=1
"testbench.sv", 28: tb.unnamed$$_3: started at 310ns failed at 310ns 
    Offending 'a'
330 a=1 b=0 c=1 d=0
"testbench.sv", 28: tb.unnamed$$_3: started at 330ns failed at 330ns 
    Offending 'a'
"testbench.sv", 28: tb.unnamed$$_3: started at 290ns failed at 330ns 
    Offending 'c'
350 a=1 b=1 c=0 d=1
370 a=1 b=1 c=1 d=1
"testbench.sv", 28: tb.unnamed$$_3: started at 370ns failed at 370ns 
    Offending 'a'
"testbench.sv", 28: tb.unnamed$$_3: started at 390ns failed at 390ns 
    Offending 'a'
$finish called from file "testbench.sv", line 13.
$finish at simulation time     400

标签:started,failed,--,11.0,sv,Introduction,testbench,property,tb
From: https://www.cnblogs.com/sys-123456/p/18176024

相关文章

  • QRCoderHelper-二维码的操作工具类
    /***┌──────────────────────────────────────────────────────────────┐*│描述:二维码QRCoder的操作工具类(QRCoder1.5.1)*│作者:执笔小白*│版本:1.0*│创建时间:2023-06-2216:21:56*......
  • m基于Q-Learning强化学习的迷宫路线规划策略matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要       Q-Learning是一种无模型的强化学习算法,它能够使代理(Agent)在与环境互动的过程中学习最优策略,无需了解环境的完整动态模型。在迷宫路线规划问题中,Q-Learning被用来指导代理找到从起......
  • Linux 系统目录和文件夹的区别
    Linux系统目录和文件夹的区别概念1.系统目录:在Linux系统中,目录是文件系统的一种特殊类型,用于组织和存储文件和其他目录。每个目录都包含零个或多个文件和其他目录,以及一些与之相关的属性,如权限、所有者等。目录在文件系统中以目录项的形式存在,每个目录项包含了文件或子目录的......
  • 随笔-调试-perf on-cpu off-cpu
    perfon-cpuxpid=$(cat/var/run/xx.pid);perfrecord-F99-p$xpid--call-graphdwarf--sleep60直接在控制台上查看:perfreport或者生成火焰图:perfscript--header>out.stacks/opt/FlameGraph/stackcollapse-perf.pl<out.stacks|/opt/FlameGraph/flamegraph.......
  • Garden
    Garden题目描述有一个\(n\timesm\)的花园,每一个地块给出一个高度。下了一场大雨,认为花园中每一个格子有无限格高积水。花园周围有排水渠,高度为\(0\)将水排走。水在四联通块中从高往底流。求最后的积水量。解题思路考虑如何求每一个格子最终的积水高度(包括地块高度)。其等......
  • 基于表面法线法的二维人脸图构建三维人脸模型matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022a  3.算法理论概述二维人脸图像获取表面法线 首先,我们需要从二维灰度或者彩色人脸图像中估计表面法线。通常这一过程包括以下几个步骤: 人脸检测与对齐:确保人脸图像被准确检测并进行标准化对齐,以便后续......
  • 项目冲刺——第 1 篇 Scrum 冲刺博客
    作业所属课程所属课程作业要求作业要求作业目标敏捷开发前的安排一、各个成员在Alpha阶段认领的任务二、明日各个成员的任务安排成员任务肖杨、梁丽贤搭建前端开发框架黄诃华、欧文杰编写数据库姚佳如、李慧娣不断根据需求完善功能设计,......
  • ATcoder ABC 352 F - Estimate Order 搜索
    很恶心的一个搜索,当然好像不用搜索也能做。没啥好讲的,一个联通块大小>=2就要搜索找位置,联通块大小等于1的不用搜。能调出来也是真不容易。#include<bits/stdc++.h>#defineintlonglong#defineDBdoubleusingnamespacestd;intn,m,tsiz,yinum;constintN=23;intfa[......
  • vs2022+Qt开发环境
    1.vs2022拓展安装拓展-》管理拓展,搜索qt,安装如下图所示两个拓展QtVSTools、QtVsCMakeTools(可选)。 安装拓展包需要关闭vs,在弹出来的installer窗口点击modify安装,可能需要endtask,问题不大,常规安装套路。2、设置参数再次打开VS后,看看下面提示,不要忘了安装Q......
  • 文件IO
    文件IO知识点补给1.FAT32与NTFS文件系统的区别?答:NTFS和FAT32是两种不同的文件系统格式,它们在功能、安全性和性能等方面存在一些区别。1、功能和性能:NTFS是一种高度可恢复的文件系统,具有许多高级功能,如数据恢复、加密、压缩、磁盘配额等。相比之下,FAT32文件系统在功能和性能方......