芯片前端工程中,測試驗證的核心理念:以提高覆蓋率為核心。
設計工程師需要關心的主要有行覆蓋率(Block),條件覆蓋率(Expression),翻轉覆蓋率(Toggle),狀態(tài)機覆蓋率。本文從ASIC設計的角度上來討論,如何寫出高覆蓋率的Verilog代碼。 assign慎用 按位運算邏輯,& | ^ ^~和三目運算符,慎用。 使用這樣的描述方式本身功能并沒有什么問題,而且寫起來很爽,但是在很多情況下覆蓋率是真的不好收。
assign mult_a[3:0] = ({4{mult0_vld}} & mult_a0) | ({4{mult1_vld}} & mult_a1) | ({4{mult2_vld}} & mult_a2)用或門和與門實現(xiàn)的一個選擇器的功能,前提是vld不能同時有效,相對于下面第二種寫法可能會節(jié)省一點門。 但是問題我們在收集Expression時需要分析每一個條件是否跑到0/1,上面一共有六個信號,所以0、1隨機組合的情況就有2的6次方種,mult_a0作為數(shù)據(jù)端,如果沒有出現(xiàn)過全0的情況,通過定向case可以覆蓋到,但如果是參數(shù)作為選擇器的輸入端,那么參數(shù)本身就是有永遠不為0的情況,定向case也無法通過。 所以這個時候就只能把它waive(放棄)/exclude(排除)掉,并解釋原因。如果只有幾條這樣的寫法還好,如果有成百上千條,那么就需要重復上面的操作上千次。單純的體力活,沒有任何技術含量。但是直接換一種寫法。
always @(*)begin if(mult0_vld) mult_a[3:0] = mult_a0; else if(mult1_vld) mult_a[3:0] = mult_a1; else // if(mult2_vld) mult_a[3:0] = mult_a2;end這樣寫覆蓋率只會檢查行覆蓋率,基本上哪一行沒跑到一目了然,也并不需要多余的體力勞動。代碼可讀性也很高。第二種可能會消耗更多的邏輯,但是對于整體的系統(tǒng)而言,也是不值一提的。換句話說,扣這一毛兩毛的,要抓大頭。 if-else括號中的條件不要太多
always @(*)begin if(data_vld && mode_sel && enable_flag && (data_num[3:0] > 4'd7) && (ram_addr[4:0] > 4'd15) && ...)end else ...當然最開始的時候肯定不是這樣的設計,造成如此冗長的邏輯,大概率是后期調試打的補丁,可以把一些條件拿出來專門做一個信號,會讓條件覆蓋率分析容易很多,不然這么長的選擇,真不是給人看的。 cur_state不可能同時出現(xiàn)在兩個狀態(tài)上 在控制上用狀態(tài)機中,假如有這樣的邏輯。
assign enable = ((cur_state != STATE_A) && (next_state == STATE_A)) || ((cur_state != STATE_B) && (next_state == STATE_B))這樣的寫法目的是在狀態(tài)跳轉時產生一個脈沖信號,不過在條件覆蓋率中會檢查這兩個選擇條件,cur_state != STATE_A為0與cur_state != STATE_B為0同時滿足的情況。 仔細想一下,cur_state != STATE_A為0就代表cur_state現(xiàn)在就是STATE_A狀態(tài),cur_state != STATE_B為0就是代表cur_state現(xiàn)在就是STATE_B狀態(tài),那么,cur_state怎么可能同時為兩個狀態(tài)呢。 這樣的情況要么就拆開寫要么就別寫。 case語句的default分支考慮周全
always @(*)begin case(in[1:0]) 2'd0 : data[1:0] = 2'd0; 2'd1 : data[1:0] = 2'd1; 2'd2 : data[1:0] = 2'd2; default : data[1:0] = 2'd3; endcase endcase語句不寫default分支會產生鎖存器,如果case中的所有情況都達到,就可以不用寫default分支,但在ASIC設計中可能工具會報lint,所以這樣的寫法是最完美的。 這樣的寫法對于in這個變量如果有規(guī)定取值范圍,哪一個值沒取到也一目了然。 教科書式的反面教材
always @(*)begin if(start) cnt <= 'd0; else if(((para == 3) && (cnt != 3)) || ((para == 4) && (cnt != 7)) || ((para == 5) && (cnt != 15)) || ((para == 6) && (cnt != 31))) cnt <= cnt + 1'd1;...end這樣的寫法我愿稱之為教科書式的反面教材。首先,計數(shù)器的常規(guī)套路是給一個使能進行計數(shù),記到一個值然后給清零,上面這樣的寫法是直接給一個使能信號清零,然后用未記到想要的最大值來做使能。 第二點是,這樣的寫法和上面cur_state同時出現(xiàn)在兩個狀態(tài)上,是一樣的。else if里面的條件進行條件覆蓋率檢查,會出現(xiàn)cnt != 3 cnt != 7 cnt != 15 cnt != 31 兩兩之間或者及以上同時為0的隨機組合,那么cnt一個時刻只能是一個值,必不可能滿足同時等于多個值的情況。 參數(shù)的取值范圍 一個參數(shù)的取值范圍是0,1,2三個值,你做了一個這樣的vld
assign data_vld = (param == 0) || (param == 1) || (param == 2);條件覆蓋率檢查會出現(xiàn),上面三個條件都為0的情況,但是這個參數(shù)配置只有這三個值,不可能去其他值,也是一個典型的情況。換一種寫法。
編輯:黃飛
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
Verilog
+關注
關注
28文章
1365瀏覽量
111506
原文標題:如何寫出高覆蓋率的Verilog代碼?
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
一文詳解Modelsim代碼覆蓋率功能使用
作者:默宸? Modelsim代碼覆蓋率功能Code coverage,能報告出statement(語句)、branch(分支)、condition(條件)、expression(表達
嵌入式仿真平臺SkyEye的覆蓋率分析相關資料下載
代碼執(zhí)娜行覆蓋情況的功能,來檢測代碼中未執(zhí)行覆蓋情況。在覆蓋率分析時需要分析嵌入式軟件的指令覆蓋率
發(fā)表于 12-17 07:27
關于SpinalHDL中的驗證覆蓋率收集簡單說明
在做RTL仿真驗證時,覆蓋率收集往往是我們在驗證中需要注意的地方,本篇就SpinalHDL中的驗證覆蓋率收集做一個簡單說明。sbt配置在SpinalHDL里進行仿真驗證時,我們的待測試代碼會生
發(fā)表于 06-24 15:56
重點厘清覆蓋率相關的概念以及在芯片開發(fā)流程中跟覆蓋率相關的事項
全盤考量。而覆蓋率,就是芯片工程中,評審體系需要重點參考的一項技術指標,但也只是驗證相關的其中一項。目前被業(yè)界廣泛采用的覆蓋率指標有功能覆蓋率(Function Coverage)和代碼
發(fā)表于 09-14 11:57
怎么才能寫出高覆蓋率的Verilog代碼?
設計的角度上來討論,如何寫出高覆蓋率的Verilog代碼。assign慎用按位運算邏輯, | ^ ^~和三目運算符,慎用。使用這樣的描述方式本身功能并沒有什么問題,而且寫起來很爽,但是
更好地測量代碼覆蓋率的 9 個技巧
測量代碼覆蓋率對于嵌入式系統(tǒng)來說越來越重要,但需要一些經驗。這是因為有一些障礙需要克服,尤其是小目標。但是,使用正確的方法和合適的工具,無需過多努力即可測量測試覆蓋率。九個實用技巧可幫助您入門

代碼覆蓋率工具的重要性
測試覆蓋率是軟件質量的重要指標,也是軟件維護的重要組成部分。它通過提供不同承保項目的數(shù)據(jù)來幫助評估測試的有效性。這種洞察力允許通過為未經測試的代碼定義新的測試用例來改進測試,從而提高代碼質量,最終增加

Vivado仿真器和代碼覆蓋率簡析
編寫 HDL 通常是 FPGA 開發(fā)中耗時最少的部分,最具挑戰(zhàn)性和最耗時的部分可能是驗證。根據(jù)最終應用程序,驗證可能非常簡單,也可能非常復雜,簡單的話只需對大多數(shù)功能進行檢查或執(zhí)行完全獨立開發(fā)的測試平臺來演示功能和代碼覆蓋率。

代碼覆蓋率記錄
為確保具體的產品(例如,醫(yī)療或航空電子市場)質量合格,
通常需要提供語句覆蓋與判定覆蓋認證證明。對于各種嵌
入式系統(tǒng),規(guī)范要求高度優(yōu)化的代碼需要實時測試。禁止
代碼插裝和運行時篡
發(fā)表于 11-03 11:02
?0次下載

評論