0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

何為斷言?斷言的作用有哪些?斷言的種類 斷言層次結(jié)構(gòu)

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

01 何為斷言

斷言主要用來檢查仿真過程中存在的時(shí)序問題,如果存在異常情況,斷言會(huì)報(bào)警。一般在數(shù)字電路設(shè)計(jì)中都要加入斷言,斷言占整個(gè)設(shè)計(jì)的比例應(yīng)不少于30%。

02 斷言的作用

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

· 使用斷言可以使設(shè)計(jì)中存在的各種問題更容易被動(dòng)態(tài)監(jiān)測(cè)觀察;

· 使用斷言內(nèi)嵌的覆蓋率統(tǒng)計(jì)功能(cover)可以更加容易的獲得對(duì)于功能的覆蓋性;

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

· 通過全局控制實(shí)現(xiàn)設(shè)計(jì)中斷言的開關(guān);

· 斷言可以加速形式驗(yàn)證,提高形式驗(yàn)證的效率;

03 斷言的種類

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

3.1 立即斷言

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

語法:

labels:assert(expression)action_block;

· action_block 操作塊在斷言表達(dá)式的求值之后立即執(zhí)行;

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

· action_block: pass_statement; else fail_statement;

例子:

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

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

斷言失敗默認(rèn)嚴(yán)重程度為error,error達(dá)到一定數(shù)量仿真會(huì)退出

立即斷言構(gòu)建思路:

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

3.2 并發(fā)斷言

并發(fā)斷言檢 查跨越多個(gè)時(shí)鐘周期的事件序列 。

可以認(rèn)為并發(fā)斷言是一個(gè)連續(xù)運(yùn)行的模塊,為整個(gè)仿真過程檢查信號(hào),所以需要在并發(fā)斷言內(nèi)指定一個(gè)采樣時(shí)鐘。

· 并發(fā)斷言僅在有時(shí)鐘周期的情況下出現(xiàn)

· 測(cè)試表達(dá)式是基于所涉及變量的采樣值在時(shí)鐘邊緣進(jìn)行計(jì)算的

· 可以在過程塊、module、interface和program塊內(nèi)定義并發(fā)斷言

· 區(qū)別并發(fā)斷言和立即斷言的關(guān)鍵字是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 斷言層次結(jié)構(gòu)

SVA中可以存在內(nèi)建的單元,這些單元可以是以下的幾種:

Boolean expressions 布爾表達(dá)式

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

Sequence序列

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

Property 屬性

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

4.1 sequence 序列

在任何設(shè)計(jì)中,功能總是由多個(gè)邏輯事件的組合來表示,這些事件可以是簡(jiǎn)單的同一個(gè)時(shí)鐘沿被求值的布爾表達(dá)式,也可以是經(jīng)過幾個(gè)時(shí)鐘周期的求值事件,SVA用關(guān)鍵字sequence來表示這些事件,sequence可以讓斷言易讀,復(fù)用性高。

sequence具有如下特性:

? 可帶參數(shù);

? 可以在 property 中調(diào)用;

? 可以使用局部變量;

? 可以定義時(shí)鐘周期;

sequence的定義格式如下:

sequence name_of_sequence(參數(shù));

……

endsequence

以下代碼分別通過property,sequence+property實(shí)現(xiàn)對(duì)a&&b仿真時(shí)間的判斷:

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


//2.使用sequence+property實(shí)現(xiàn)對(duì)a&&b時(shí)序的判斷


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


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

sequence 序列可以帶參數(shù):

格式:

sequence seq1(signal1,signal2);

@(posedge clk) signal1&&signal2;

endsequence

用法:

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

帶時(shí)序關(guān)系的sequence :在SVA中時(shí)鐘延時(shí)用符號(hào)"##"來表示,如"##2"表示延時(shí)兩個(gè)時(shí)鐘周期;

例如:

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


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

sequence會(huì) 在時(shí)鐘上升沿到來后首先檢查 a 是否為 1,當(dāng)a為1時(shí),兩個(gè)時(shí)鐘周期后繼續(xù)檢查b是否為1,當(dāng)b為1時(shí),斷言pass ;

sequence 序列可以內(nèi)嵌

格式:

sequence seq1;

@(posedge clk) a&&b;

endsequence

sequence seq2;

seq1;

endsequence

4.2 property 序列

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

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

格式:

property的定義格式如下:

property name_of_property(參數(shù)列表);

測(cè)試表達(dá)式或復(fù)雜的sequence;

endproperty

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

assertion_name: assert property(property_name)

else

$display("SVA error");

并行斷言構(gòu)建思路:

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

05 sequence和property的異同

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

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

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

· property需要用cover /assert/assume 等關(guān)鍵字進(jìn)行實(shí)例化,而sequence直接調(diào)用即可。

除了以上的區(qū)別外,立即斷言和并發(fā)斷言的采樣時(shí)間是否相同也是驗(yàn)證過程中需要注意的問題,以下的代碼進(jìn)行演示:

//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

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

06 補(bǔ)充知識(shí)點(diǎn)

assert

動(dòng)態(tài)仿真中,如果仿真工具運(yùn)行測(cè)試用例時(shí)發(fā)現(xiàn)斷言失敗,就會(huì)打印出相應(yīng)的信息。

形式化驗(yàn)證中,assertion就是Formal驗(yàn)證工具(例如cadence的jasperGold)的證明目標(biāo)。Formal驗(yàn)證工具會(huì)遍歷所有的合法場(chǎng)景,在數(shù)學(xué)上證明這個(gè)斷言永遠(yuǎn)不會(huì)失敗。還是那句話,仿真只能“證偽” ,而Formal驗(yàn)證具有可以“證明”的能力。

cover

動(dòng)態(tài)仿真中,覆蓋率是一個(gè)非常關(guān)鍵的數(shù)據(jù),表明驗(yàn)證人員關(guān)注的場(chǎng)景是否真的在用例測(cè)試時(shí)被覆蓋到。通常,需要確保每個(gè)測(cè)試點(diǎn)都至少被覆蓋過一次,不然就說明我們的測(cè)試存在潛在的風(fēng)險(xiǎn)。

形式化驗(yàn)證中,cover也起著重要的作用。盡管理論上Formal覆蓋DUT所有的場(chǎng)景,但是如果我們對(duì)設(shè)計(jì)過約了,可能還是會(huì)遺漏關(guān)鍵的場(chǎng)景測(cè)試。這時(shí)候,我們?nèi)匀恍枰褂胏over來證明,我們確實(shí)對(duì)這個(gè)場(chǎng)景進(jìn)行了有效的驗(yàn)證和覆蓋。

assume

動(dòng)態(tài)仿真中,對(duì)于assume和assert的處理是完全相同的。EDA仿真器會(huì)在執(zhí)行測(cè)試用例的時(shí)候檢查assume是否失敗,如果失敗就會(huì)打印相應(yīng)的信息。但是在概念上,assume和assert還是有些區(qū)別的:assume失敗意味著驗(yàn)證環(huán)境或者周邊設(shè)計(jì)可能出現(xiàn)了問題,即所測(cè)設(shè)計(jì)激勵(lì)的行為不符合預(yù)期;而assert失敗意味著DUT設(shè)計(jì)的行為不符合預(yù)期。

形式化驗(yàn)證中,assume和assert有著很明顯的區(qū)別。就和字面意思一樣,assume是作為設(shè)計(jì)的約束,會(huì)引導(dǎo)Formal工具產(chǎn)生的合法輸入空間。如果沒有assume,F(xiàn)ormal工具會(huì)盡可能地遍歷所有的空間,像空氣一樣到達(dá)他能夠觸及的空間。大多數(shù)情況,設(shè)計(jì)都會(huì)使用assume降低FPV的復(fù)雜度。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 仿真器
    +關(guān)注

    關(guān)注

    14

    文章

    1008

    瀏覽量

    83441
  • 模擬器
    +關(guān)注

    關(guān)注

    2

    文章

    855

    瀏覽量

    42978
  • SVA
    SVA
    +關(guān)注

    關(guān)注

    1

    文章

    19

    瀏覽量

    10113
  • EDA設(shè)計(jì)
    +關(guān)注

    關(guān)注

    1

    文章

    47

    瀏覽量

    13653
  • DUT
    DUT
    +關(guān)注

    關(guān)注

    0

    文章

    188

    瀏覽量

    12192

原文標(biāo)題:IC學(xué)霸筆記 | 一篇文章看懂驗(yàn)證斷言(立即斷言&并行斷言)

文章出處:【微信號(hào):IC修真院,微信公眾號(hào):IC修真院】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    解析C語言斷言函數(shù)的使用

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

    C語言assert(斷言)簡(jiǎn)介

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

    如何在XC8中使用斷言的?

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

    C語言中斷言如何去使用

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

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

    SVA斷言是一個(gè)強(qiáng)時(shí)序的技術(shù),很多時(shí)候SVA的實(shí)際時(shí)序和驗(yàn)證工程師的期望可能不同,這種不同很難調(diào)試定位。下面是一個(gè)SVA斷言的示例,驗(yàn)證工程師期望斷言當(dāng)檢測(cè)到req的上升沿后,再持續(xù)高電平6個(gè)周期
    發(fā)表于 08-25 15:57

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

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

    基于事務(wù)斷言驗(yàn)證及SDH芯片驗(yàn)證平臺(tái)

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

    SystemVerilog斷言及其應(yīng)用

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

    如何正確使用斷言八個(gè)技巧

    對(duì)許多開發(fā)人員來說,斷言是一個(gè)令人困惑的話題,因?yàn)樗鼈兊脑S多使用方式與其設(shè)計(jì)初衷背道而馳。
    的頭像 發(fā)表于 05-10 10:19 ?1.1w次閱讀
    如何正確使用<b class='flag-5'>斷言</b>八個(gè)技巧

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

    為什么項(xiàng)目中的代碼需要有Assert斷言語句?
    的頭像 發(fā)表于 03-03 14:12 ?2645次閱讀

    STM32函數(shù)庫Assert斷言機(jī)制

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

    C語言斷言函數(shù)assert()的應(yīng)用,清晰明了!

    這樣可以快速發(fā)現(xiàn)并定位軟件問題,同時(shí)對(duì)系統(tǒng)錯(cuò)誤進(jìn)行自動(dòng)報(bào)警。對(duì)于在系統(tǒng)中隱藏很深,用其他手段極難發(fā)現(xiàn)的問題也可以通過斷言進(jìn)行定位,從而縮短軟件問題定位時(shí)間,提高系統(tǒng)的可測(cè)性。
    的頭像 發(fā)表于 04-12 10:02 ?945次閱讀

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

    防御式編程的重點(diǎn)就是需要防御一些程序未曾預(yù)料的錯(cuò)誤,這是一種提高軟件質(zhì)量的輔助性方法,斷言assert就用于防御式編程,編寫代碼時(shí),我們總是會(huì)做出一些假設(shè),斷言就是用于在代碼中捕捉這些假設(shè)。使用斷言
    的頭像 發(fā)表于 04-19 11:35 ?526次閱讀

    基于斷言的驗(yàn)證簡(jiǎn)介 – 第 1 部分

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