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

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

3天內不再提示

怎么才能寫出高覆蓋率的Verilog代碼?

電子工程師 ? 來源:硅農 ? 作者:硅農 ? 2021-06-01 10:13 ? 次閱讀

芯片前端工程中,測試驗證的核心理念:以提高覆蓋率為核心。設計工程師需要關心的主要有行覆蓋率(Block),條件覆蓋率(Expression),翻轉覆蓋率(Toggle),狀態機覆蓋率。本文從ASIC設計的角度上來討論,如何寫出高覆蓋率的Verilog代碼。assign慎用按位運算邏輯,& | ^ ^~和三目運算符,慎用。使用這樣的描述方式本身功能并沒有什么問題,而且寫起來很爽,但是在很多情況下覆蓋率是真的不好收。

assign mult_a[3:0] = ({4{mult0_vld}} & mult_a0) | ({4{mult1_vld}} & mult_a1) | ({4{mult2_vld}} & mult_a2)

用或門和與門實現的一個選擇器的功能,前提是vld不能同時有效,相對于下面第二種寫法可能會節省一點門。但是問題我們在收集Expression時需要分析每一個條件是否跑到0/1,上面一共有六個信號,所以0、1隨機組合的情況就有2的6次方種,mult_a0作為數據端,如果沒有出現過全0的情況,通過定向case可以覆蓋到,但如果是參數作為選擇器的輸入端,那么參數本身就是有永遠不為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

這樣寫覆蓋率只會檢查行覆蓋率,基本上哪一行沒跑到一目了然,也并不需要多余的體力勞動。代碼可讀性也很高。第二種可能會消耗更多的邏輯,但是對于整體的系統而言,也是不值一提的。換句話說,扣這一毛兩毛的,要抓大頭。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不可能同時出現在兩個狀態上在控制上用狀態機中,假如有這樣的邏輯。

assign enable = ((cur_state != STATE_A) && (next_state == STATE_A)) || ((cur_state != STATE_B) && (next_state == STATE_B))

這樣的寫法目的是在狀態跳轉時產生一個脈沖信號,不過在條件覆蓋率中會檢查這兩個選擇條件,cur_state != STATE_A為0與cur_state != STATE_B為0同時滿足的情況。仔細想一下,cur_state != STATE_A為0就代表cur_state現在就是STATE_A狀態,cur_state != STATE_B為0就是代表cur_state現在就是STATE_B狀態,那么,cur_state怎么可能同時為兩個狀態呢。這樣的情況要么就拆開寫要么就別寫。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 end

case語句不寫default分支會產生鎖存器,如果case中的所有情況都達到,就可以不用寫default分支,但在ASIC設計中可能工具會報lint,所以這樣的寫法是最完美的。這樣的寫法對于in這個變量如果有規定取值范圍,哪一個值沒取到也一目了然。教科書式的反面教材

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

這樣的寫法我愿稱之為教科書式的反面教材。首先,計數器的常規套路是給一個使能進行計數,記到一個值然后給清零,上面這樣的寫法是直接給一個使能信號清零,然后用未記到想要的最大值來做使能。第二點是,這樣的寫法和上面cur_state同時出現在兩個狀態上,是一樣的。else if里面的條件進行條件覆蓋率檢查,會出現cnt != 3 cnt != 7 cnt != 15 cnt != 31 兩兩之間或者及以上同時為0的隨機組合,那么cnt一個時刻只能是一個值,必不可能滿足同時等于多個值的情況。參數的取值范圍一個參數的取值范圍是0,1,2三個值,你做了一個這樣的vld

assign data_vld = (param == 0) || (param == 1) || (param == 2);

條件覆蓋率檢查會出現,上面三個條件都為0的情況,但是這個參數配置只有這三個值,不可能去其他值,也是一個典型的情況。換一種寫法。最后很多的代碼寫法,工具有smart exclude也會自動waive一些分支,不過工具也沒那么smart,還是需要自己在編碼的時候注意,盡量避免很多體力活。評論區支持互動回復蓋樓了,關于這個問題你還有什么想法,歡迎評論區留言交流。

編輯:jq

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

    關注

    447

    文章

    48194

    瀏覽量

    411031
  • asic
    +關注

    關注

    34

    文章

    1162

    瀏覽量

    119408
  • 鎖存器
    +關注

    關注

    8

    文章

    847

    瀏覽量

    41105
  • 選擇器
    +關注

    關注

    0

    文章

    105

    瀏覽量

    14358

原文標題:如何寫出高覆蓋率的Verilog代碼?

文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術江湖】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何寫出時序最優的HDL代碼?如何寫出時序裕量足夠的代碼?

    你想寫出可以跑出700M以上的代碼嗎,直逼FPGA內部PLL的極限。
    的頭像 發表于 03-12 09:59 ?392次閱讀
    如何<b class='flag-5'>寫出</b>時序最優的HDL<b class='flag-5'>代碼</b>?如何<b class='flag-5'>寫出</b>時序裕量足夠的<b class='flag-5'>代碼</b>?

    如何寫出好的代碼?高質量代碼的三要素

    膾炙人口的詩"春有百花秋有月,夏有涼風冬有雪",意境唯美,簡明易懂。好的代碼也是讓人陶醉的,那么如何寫出好的代碼?
    的頭像 發表于 01-05 11:29 ?725次閱讀
    如何<b class='flag-5'>寫出</b>好的<b class='flag-5'>代碼</b>?高質量<b class='flag-5'>代碼</b>的三要素

    怎么用Vivado做覆蓋率分析

    在做仿真的時候往往會去做代碼覆蓋率和功能覆蓋率的分析,來保證仿真是做的比較充分完備的。
    的頭像 發表于 01-03 12:34 ?712次閱讀
    怎么用Vivado做<b class='flag-5'>覆蓋率</b>分析

    CPU程序幾個優化程序性能的手段詳解

    寫出高性能的代碼,首先需要對編譯器有基礎的了解,原因在于現代編譯器有很強的優化能力,但有些代碼編譯器不能進行優化。對編譯器有了基礎的了解,才能寫出編譯器友好型高性能
    的頭像 發表于 11-21 09:46 ?291次閱讀
    CPU程序幾個優化程序性能的手段詳解

    如何寫出高效優美的C語言代碼

    電子發燒友網站提供《如何寫出高效優美的C語言代碼.pdf》資料免費下載
    發表于 11-18 10:55 ?0次下載
    如何<b class='flag-5'>寫出</b>高效優美的C語言<b class='flag-5'>代碼</b>

    代碼覆蓋率記錄

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

    軟件代碼結構化覆蓋測試-分支覆蓋

    本篇我們介紹分支覆蓋,從測試技術對代碼的測試程度上來說,在復雜代碼中,分支覆蓋比語句覆蓋效果要好。
    的頭像 發表于 09-01 11:34 ?439次閱讀
    軟件<b class='flag-5'>代碼</b>結構化<b class='flag-5'>覆蓋</b>測試-分支<b class='flag-5'>覆蓋</b>

    FPGA的Verilog代碼編寫規范

      注:以R起頭的是對編寫Verilog代碼的IP設計者所做的強制性規定,以G起頭的條款是建議采用的規范。每個設計者遵守本規范可鍛煉命名規范性。
    的頭像 發表于 08-15 16:23 ?1318次閱讀

    Vivado仿真器和代碼覆蓋率簡析

    編寫 HDL 通常是 FPGA 開發中耗時最少的部分,最具挑戰性和最耗時的部分可能是驗證。根據最終應用程序,驗證可能非常簡單,也可能非常復雜,簡單的話只需對大多數功能進行檢查或執行完全獨立開發的測試平臺來演示功能和代碼覆蓋率。
    的頭像 發表于 08-03 09:23 ?1357次閱讀
    Vivado仿真器和<b class='flag-5'>代碼</b><b class='flag-5'>覆蓋率</b>簡析

    何為高質量的代碼?如何寫出高質量代碼?

    懂得“數據結構與算法” 寫出高效的代碼,懂得“設計模式”寫出高質量的代碼。
    發表于 08-02 09:44 ?501次閱讀
    何為高質量的<b class='flag-5'>代碼</b>?如何<b class='flag-5'>寫出</b>高質量<b class='flag-5'>代碼</b>?

    教你如何寫出性能更高的SystemVerilog代碼

    本文旨在幫助大家降低在編碼過程中寫出低性能和耗內存的概率,只要大家在寫代碼時稍注意下,積少成多。
    的頭像 發表于 07-26 17:31 ?622次閱讀
    教你如何<b class='flag-5'>寫出</b>性能更高的SystemVerilog<b class='flag-5'>代碼</b>

    分享一些優秀的verilog代碼 高質量verilog代碼的六要素

    高質量的verilog代碼至少需要包含以下幾個要素:可讀性、功能、性能、標準化、穩定性、可定位。
    的頭像 發表于 07-18 10:09 ?763次閱讀
    分享一些優秀的<b class='flag-5'>verilog</b><b class='flag-5'>代碼</b> 高質量<b class='flag-5'>verilog</b><b class='flag-5'>代碼</b>的六要素

    Verilog代碼封裝后門訪問

    關于仿真里的后門訪問,之前的文章《三分鐘教會你SpinalHDL仿真中的后門讀寫》中有做過介紹,其針對的都是針對以SpinalHDL中的代碼進行的后門訪問。今天來看看當封裝了Verilog BlackBox時,在SpinalHDL仿真中如何進行后門訪問
    的頭像 發表于 07-15 10:22 ?576次閱讀
    <b class='flag-5'>Verilog</b><b class='flag-5'>代碼</b>封裝后門訪問

    SystemVerilog的覆蓋率建模方式

    為了確保驗證的完備性,我們需要量化驗證目標。SystemVerilog提供了一套豐富的覆蓋率建模方式。
    的頭像 發表于 06-25 10:44 ?649次閱讀

    Verilog中Pmod ALS的SPI接口代碼

    電子發燒友網站提供《Verilog中Pmod ALS的SPI接口代碼.zip》資料免費下載
    發表于 06-15 09:32 ?0次下載
    <b class='flag-5'>Verilog</b>中Pmod ALS的SPI接口<b class='flag-5'>代碼</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>