精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

何為斷言?斷言的作用有哪些?斷言的種類 斷言層次結構

jf_GctfwYN7 ? 來源:IC修真院 ? 2023-08-28 11:16 ? 次閱讀

01 何為斷言

斷言主要用來檢查仿真過程中存在的時序問題,如果存在異常情況,斷言會報警。一般在數字電路設計中都要加入斷言,斷言占整個設計的比例應不少于30%。

02 斷言的作用

· 使用斷言可以縮短研制周期;

· 使用斷言可以使設計中存在的各種問題更容易被動態監測觀察;

· 使用斷言內嵌的覆蓋率統計功能(cover)可以更加容易的獲得對于功能的覆蓋性;

· 斷言的可讀性較一般描述語言更容易理解;

· 通過全局控制實現設計中斷言的開關;

· 斷言可以加速形式驗證,提高形式驗證的效率;

03 斷言的種類

斷言分為立即斷言和并行斷言

3.1 立即斷言

立即斷言主要用來檢查當前仿真時間的條件,可以理解為if...else,放在過程塊中使用。

語法:

labels:assert(expression)action_block;

· action_block 操作塊在斷言表達式的求值之后立即執行;

· 操作塊指定在斷言成功或失敗時采取什么操作;

· action_block: pass_statement; else fail_statement;

例子:

assert(expression) $display("expression evaluates to true");

else $fatal("expression evaluates to false");

斷言失敗默認嚴重程度為error,error達到一定數量仿真會退出

立即斷言構建思路:

ee7d7810-4332-11ee-a2ef-92fbcf53809c.png

3.2 并發斷言

并發斷言檢 查跨越多個時鐘周期的事件序列 。

可以認為并發斷言是一個連續運行的模塊,為整個仿真過程檢查信號,所以需要在并發斷言內指定一個采樣時鐘。

· 并發斷言僅在有時鐘周期的情況下出現

· 測試表達式是基于所涉及變量的采樣值在時鐘邊緣進行計算的

· 可以在過程塊、module、interface和program塊內定義并發斷言

· 區別并發斷言和立即斷言的關鍵字是property

格式:

斷言名:assert property (判斷條件)

例子:

check_a_and_b:assert property (@(posedge clk) (a&&b))

$display("a&&b is true");

else

$error ("a&&b is false");

04 斷言層次結構

SVA中可以存在內建的單元,這些單元可以是以下的幾種:

Boolean expressions 布爾表達式

布爾表達式是組成斷言的最小單元,斷言可以由多個邏輯事件組成,這些邏輯事件可以是簡單的布爾表達式.在SVA中,信號或事件可以使用常用的操作符,如:&&, ||, !, ^,& 等;

Sequence序列

sequence是布爾表達式更高一層的單元,一個sequence中可以包含若干個布爾表達式,同時在sequence中可以使用一些新的操作符,如 ## 、重復操作符、序列操作符

Property 屬性

property是比sequence更高一層的單元,也是構成斷言最常用的模塊,其中最重要的性質是可以在property中使用蘊含操作符(|-> |=>);

4.1 sequence 序列

在任何設計中,功能總是由多個邏輯事件的組合來表示,這些事件可以是簡單的同一個時鐘沿被求值的布爾表達式,也可以是經過幾個時鐘周期的求值事件,SVA用關鍵字sequence來表示這些事件,sequence可以讓斷言易讀,復用性高。

sequence具有如下特性:

? 可帶參數

? 可以在 property 中調用;

? 可以使用局部變量;

? 可以定義時鐘周期;

sequence的定義格式如下:

sequence name_of_sequence(參數);

……

endsequence

以下代碼分別通過property,sequence+property實現對a&&b仿真時間的判斷:

//1.使用property實現對a&&b時序的判斷
check_a_and_b:assert property(@(posedge clk) (a&&b)) 
    $display("a&&b is true");
else     
$error("a&&bisfalse");


//2.使用sequence+property實現對a&&b時序的判斷


sequence seq_a_and_b;
    @(posedge clk) a&&b;
endsequence


//在斷言的property中調用sequence
check_a_and_b: assert property(seq_a_and_b) 
    $display("a&&b is true");
else 
    $error("a&&b is false");

sequence 序列可以帶參數:

格式:

sequence seq1(signal1,signal2);

@(posedge clk) signal1&&signal2;

endsequence

用法:

sequence seq1(signal1,signal2);
    @(posedge clk) signal1&&signal2;
endsequence
//在斷言的property中調用sequence
check_a_and_b: assert property(seq1(a,b)) 
    $display("a&&b is true");
else 
    $error("a&&b is false");
sequence 序列可以有時序

帶時序關系的sequence :在SVA中時鐘延時用符號"##"來表示,如"##2"表示延時兩個時鐘周期;

例如:

sequence seq2;
    @(posedge clk) a ##2 b ;
endsequence


//在斷言的property中調用sequence
check_a_and_b: assert property(seq2);

sequence會 在時鐘上升沿到來后首先檢查 a 是否為 1,當a為1時,兩個時鐘周期后繼續檢查b是否為1,當b為1時,斷言pass ;

sequence 序列可以內嵌

格式:

sequence seq1;

@(posedge clk) a&&b;

endsequence

sequence seq2;

seq1;

endsequence

4.2 property 序列

property是比sequence更高一層的單元,也是構成斷言最常用的模塊,其中最重要的性質是可以在

property中使用 蘊含(overlapped)操作符(|-> |=>).

格式:

property的定義格式如下:

property name_of_property(參數列表);

測試表達式或復雜的sequence;

endproperty

property就是SVA中需要用來判定的部分,用來模擬過程中被驗證的單元,它必須在模擬過程中被斷言來 發揮作用,SVA提供了關鍵字 assert 來檢查屬性,assert的基本語法是:

assertion_name: assert property(property_name)

else

$display("SVA error");

并行斷言構建思路:

ee92b18a-4332-11ee-a2ef-92fbcf53809c.png

05 sequence和property的異同

· 任何在sequence中的表達式都可以放到property中;

· 任何在property中的表達式也可以搬到sequence中,但是只有在property中才能使用蘊含操作符;

· property中可以例化其他property和sequence,sequence中也可以調用其他sequence,但是不能例化property;

· property需要用cover /assert/assume 等關鍵字進行實例化,而sequence直接調用即可。

除了以上的區別外,立即斷言和并發斷言的采樣時間是否相同也是驗證過程中需要注意的問題,以下的代碼進行演示:

//SVA
module inline(
input       clk,
input        a,
input        b,
input [7:0]  d1,
input [7:0]  d2,
output[7:0]  d3,
output[7:0]  d4
);


reg [7:0] d3=8'h0;
reg[7:0]d=48'h0;


always@(posedge clk) begin
if(a) begin
d3<=d1;
end
if(b) begin
d4<=d2;
end
end
endmodule


module top;
reg       clk;
reg         a;
reg          b;
reg [7:0]    d1;
reg [7:0]    d2;
wire [7:0]  d3;
wire [7:0]  d4;
initial?begin


$fsdbDumpfile("wave/top.fsdb");
$fsdbDumpvars();
$fsdbDumpSVA();
end


initial begin
#0 clk=0;
forever begin 
#5 clk=~clk;
    end
end


always begin
a<=$random()%2;
b<=$random()%2;
d1<=$random()%256;
d2<=$random()%256;
end
// immesiate assertions
always@(posedge clk) begin
check_a_and_b:assert(a&&b) $display("a&&b is turn");
else $error("a&&b is false");
end
// concurrent assertions
property p_mutex;
@(posedge clk) not(a&&b);
endproperty
a_mutex: assert property(p_mutex)$display("a&&b is success");
else $error("a&&b is fail");
initial begin
#300;
     $finish;
end


inline?inline_1(clk,a,b,d1,d2,d);


endmodule
波形展示: eeac0cac-4332-11ee-a2ef-92fbcf53809c.png

以上代碼對a&&b分別進行了immediate和concurrent assertions,波形顯示兩種斷言結果完全相同,都在時鐘上升沿前進行采樣。

06 補充知識點

assert

動態仿真中,如果仿真工具運行測試用例時發現斷言失敗,就會打印出相應的信息

形式化驗證中,assertion就是Formal驗證工具(例如cadence的jasperGold)的證明目標。Formal驗證工具會遍歷所有的合法場景,在數學上證明這個斷言永遠不會失敗。還是那句話,仿真只能“證偽” ,而Formal驗證具有可以“證明”的能力。

cover

動態仿真中,覆蓋率是一個非常關鍵的數據,表明驗證人員關注的場景是否真的在用例測試時被覆蓋到。通常,需要確保每個測試點都至少被覆蓋過一次,不然就說明我們的測試存在潛在的風險。

形式化驗證中,cover也起著重要的作用。盡管理論上Formal覆蓋DUT所有的場景,但是如果我們對設計過約了,可能還是會遺漏關鍵的場景測試。這時候,我們仍然需要使用cover來證明,我們確實對這個場景進行了有效的驗證和覆蓋。

assume

動態仿真中,對于assume和assert的處理是完全相同的。EDA仿真器會在執行測試用例的時候檢查assume是否失敗,如果失敗就會打印相應的信息。但是在概念上,assume和assert還是有些區別的:assume失敗意味著驗證環境或者周邊設計可能出現了問題,即所測設計激勵的行為不符合預期;而assert失敗意味著DUT設計的行為不符合預期。

形式化驗證中,assume和assert有著很明顯的區別。就和字面意思一樣,assume是作為設計的約束,會引導Formal工具產生的合法輸入空間。如果沒有assume,Formal工具會盡可能地遍歷所有的空間,像空氣一樣到達他能夠觸及的空間。大多數情況,設計都會使用assume降低FPV的復雜度。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 仿真器
    +關注

    關注

    14

    文章

    1016

    瀏覽量

    83641
  • 模擬器
    +關注

    關注

    2

    文章

    867

    瀏覽量

    43165
  • SVA
    SVA
    +關注

    關注

    1

    文章

    19

    瀏覽量

    10118
  • EDA設計
    +關注

    關注

    1

    文章

    47

    瀏覽量

    13679
  • DUT
    DUT
    +關注

    關注

    0

    文章

    189

    瀏覽量

    12342

原文標題:IC學霸筆記 | 一篇文章看懂驗證斷言(立即斷言&并行斷言)

文章出處:【微信號:IC修真院,微信公眾號:IC修真院】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    什么是斷言?C語言中斷言的語法和用法

    在軟件開發過程中,我們經常需要處理各種錯誤和異常情況。為了提高代碼的健壯性和可靠性,我們需要使用一些工具和技術來檢測和處理這些問題。本篇博客將深入探討C語言中斷言的使用,幫助讀者更好地理解和應用斷言,提高代碼的質量和可維護性。
    發表于 08-03 10:34 ?2621次閱讀

    解析C語言斷言函數的使用

    對于斷言,相信大家都不陌生,大多數編程語言也都有斷言這一特性。簡單地講,斷言就是對某種假設條件進行檢查。 在 C 語言中,斷言被定義為宏的形式(assert(expression)),
    發表于 08-08 09:51 ?444次閱讀
    解析C語言<b class='flag-5'>斷言</b>函數的使用

    C語言assert(斷言)簡介

    assert的功能,條件為真,程序繼續執行;如果斷言為假(false),則程序終止。
    的頭像 發表于 11-17 16:33 ?1124次閱讀
    C語言assert(<b class='flag-5'>斷言</b>)簡介

    如何在XC8中使用斷言的?

    大家好,我正在嘗試使用XC8中的斷言,但是當我使用“*”時,“斷言h”空格main(空隙){BOOL X=0;斷言(x= 1);而(1){}}我的程序停止,并且在控制臺中不顯示任何MsAGAGEM
    發表于 03-26 10:58

    C語言中斷言如何去使用

    文章目錄1 C語言中斷言的使用1.1 處理方式1.2 原型定義1.3 示例代碼1 C語言中斷言的使用1.1 處理方式如果斷言的條件返回錯誤,則終止程序執行。1.2 原型定義#includevoid
    發表于 07-14 08:15

    SVA斷言是基于邊沿還是電平呢?

    SVA斷言是一個強時序的技術,很多時候SVA的實際時序和驗證工程師的期望可能不同,這種不同很難調試定位。下面是一個SVA斷言的示例,驗證工程師期望斷言當檢測到req的上升沿后,再持續高電平6個周期
    發表于 08-25 15:57

    何為斷言斷言該怎么使用呢

    何為斷言斷言一般是用于檢測在某個程序位置程序必須滿足某些條件的宏。一般用的多的可以分兩種種情況:前置條件:在某個程度點開始的地方后置條件:在某段程序執行結束后,一般用于檢測執行結果斷言
    發表于 09-21 14:59

    基于事務斷言驗證及SDH芯片驗證平臺

    提出了基于事務斷言驗證技術,用屬性說明語言(Property Specification Language,PSL)描述系統的屬性,用事務進行系統的驗證,通過編程語言接口機理和工具控制語言來控制驗證中PSL斷
    發表于 08-02 17:26 ?0次下載

    SystemVerilog斷言及其應用

    在介紹SystemVerilog 斷言的概念、使用斷言的好處、斷言的分類、斷言的組成以及斷言如何被插入到被測設計(DUT)的基礎上,本文詳細
    發表于 05-24 16:35 ?0次下載
    SystemVerilog<b class='flag-5'>斷言</b>及其應用

    如何正確使用斷言八個技巧

    對許多開發人員來說,斷言是一個令人困惑的話題,因為它們的許多使用方式與其設計初衷背道而馳。
    的頭像 發表于 05-10 10:19 ?1.1w次閱讀
    如何正確使用<b class='flag-5'>斷言</b>八個技巧

    怎么理解Assert中的斷言語句?

    為什么項目中的代碼需要有Assert斷言語句?
    的頭像 發表于 03-03 14:12 ?2712次閱讀

    STM32函數庫Assert斷言機制

    編寫代碼時,我們總是會做出一些假設,斷言就是用于在代碼中捕捉這些假設,可以將斷言看作是異常處理的一種高級形式。斷言表示為一些布爾表達式,程序員相信在程序中的某個特定點該表達式值為真。可以在任
    發表于 02-08 15:29 ?2次下載
    STM32函數庫Assert<b class='flag-5'>斷言</b>機制

    C語言斷言函數assert()的應用,清晰明了!

    這樣可以快速發現并定位軟件問題,同時對系統錯誤進行自動報警。對于在系統中隱藏很深,用其他手段極難發現的問題也可以通過斷言進行定位,從而縮短軟件問題定位時間,提高系統的可測性。
    的頭像 發表于 04-12 10:02 ?1049次閱讀

    防御式編程之斷言assert的使用

    防御式編程的重點就是需要防御一些程序未曾預料的錯誤,這是一種提高軟件質量的輔助性方法,斷言assert就用于防御式編程,編寫代碼時,我們總是會做出一些假設,斷言就是用于在代碼中捕捉這些假設。使用斷言
    的頭像 發表于 04-19 11:35 ?641次閱讀

    基于斷言的驗證簡介 – 第 1 部分

    基于斷言的驗證(ABV)是一種與傳統方法相比可以大大減少驗證過程的技術.
    的頭像 發表于 01-09 09:59 ?549次閱讀
    基于<b class='flag-5'>斷言</b>的驗證簡介 – 第 1 部分