色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

聊聊例化寄存器型的RTL編碼設計

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

這篇文章來整體的聊一下個人理解的例化寄存器型的RTL編碼風格。在脫離實驗室氛圍開始在公司芯片設計代碼的時候,就發現公司里代碼規范里明確表明:

1.避免always @*語句;

2.避免always時序語句;

這讓我幼小的心靈備受打擊,不用always怎么怎么寫RTL呢?當然了寫著寫著也就習慣了。避免always @*這個咱們已經理解用意了,主要是避免X態問題被掩蓋。那么避免always時序語句是為什么?又應該如何實操呢? 要避免always時序語句其實也很簡單,自然就是例化dff了呀,根據接口和特性可以劃分歸類一下有哪幾種dff我們可能會用得到:

1.是否需要復位

2.是否需要使能

3.是否需要校驗

暫時排除第三種校驗情況稍后再聊,根據前兩個分類我們會得到以下的dff模塊:

1.moon_dffre

2.moon_dffr

3.moon_dffe

4.moon_dff

這個前綴就是做一下標志隨便加就可以。dff例化的風格怎么取代always時序呢,以下面這段代碼為例:



reg [7:0]power; always @(posedge clk or negedge rst_n)begin if(!rst_n) power <= 8'b0; else if(case0) power <= case0_data; else if(case1) power <= case1_data; else if(case2) power <= power + 1'b1; end 以dff風格寫的話就是下面這樣:


//信號聲明 wire [7:0]power_d; wire [7:0]power_q; wire power_en; //組合邏輯 assign power_en = case0 || case1 || case2; assign power_d = case0 ? case0_data : case1 ? case1_data : power_q + 1'b1; //時序邏輯 moon_dffre #(.WD(8)) u_power_dff(.clk(clk), .rst_n(rst_n), .d(power_d), .en(power_en), .q(power_q)); 這兩種代碼風格哪種好呢?對于優秀的編碼者這兩種是沒有優劣之分的。不過對于我這種入門級選手以及交付來說,選用dff例化風格的代碼還是有收益的:

1.能夠規避不合理的代碼習慣。最典型的就是時序邏輯中的clk_gating問題。想要綜合工具自動插入門控的話,那么always塊中就盡量不要有else分支(或者else分支是非阻塞賦值給自身),如果else中對信號賦常值了那么門控就插不進去,影響整個芯片的功耗。那么如果自己來寫always塊粗心大意了的話就可能出問題,且這個事完全靠個人意識了(當然工具可以查gating比例)。如果采用例化dff的方式,寄存器的實現方式就是統一的,只要dff模塊寫的合理那么無論如何調用都不會出這個問題。

2.便于X態檢查。如同之前文章中所述的,if-else會掩蓋X態問題,而如果我們希望對X態進行檢查那么就可以統一在dff模塊內來完成。

3.便于集中操作。假如某天突然有一個需求,要求所有的寄存器都加入校驗邏輯,那么如果是always塊怎么處理比較快速呢?需要把所有寄存器的值送入一個模塊,然后連出一根error線。dff模塊呢可以在模塊內加入邏輯,例化時把error接出來||在一起。還是那句話,這兩種方式難說好壞,dff例化型編碼倒是可以從底層保證所有例化的寄存器都加入了校驗邏輯(引出的工作還是得自己來的)。

4.便于全局替換。還是剛剛那個例子,加入校驗邏輯,只需要全局把moon_dffre替換為moon_dffre_chk就可以了。

5.邏輯和互聯更加清晰,更接近于底層電路實現對工具友好。同時我的習慣是用xx_d、xx_q、xx_en來命名信號,那么在寫邏輯時,代碼中用到了xx_q我就會非常放心因為這意味著該信號的時序極好,寫習慣了對于時序路徑的把握也有所提升。

6.有利于降低復位比例,利于功耗控制。dff例化風格編碼時,組合邏輯和時序邏輯是分開寫的,在每一個時序邏輯處都面臨一個模塊選型的問題,這個時候就需要分析這個寄存器是不是需要復位,如果不需要就選用moon_dffe型好了。而always塊寫法組合邏輯和時序邏輯是在一處寫,精力很容易投在if-else的邏輯上,復位很多時候就順手寫了,后面還得艱難的降復位比例。

7.便于腳本工具集中處理,對,說的就是auto_dff哈哈。 最后一點,dff例化風格的代碼天然的會分成信號聲明、組合邏輯、時序邏輯三個部分,因此你可以選擇這樣組織代碼:

//寄存器1 ...聲明... ...邏輯... ...例化... //寄存器2 ...聲明... ...邏輯... ...例化... 也可以很輕易的把三個區域分開:



...聲明所有信號... ... ...例化所有寄存器... ... ...完成所有邏輯... ... 那么這個收益是什么呢?這樣編碼形式和風格容易寫出美感,畢竟好看才是編碼第一要務! 好的,dff編碼風格的收益部分就寫完了,接下來進行實操部分,各種dff模塊應該怎么寫呢?從最典型的moon_dffre寫起吧。dffre顧名思義就是有復位有使能,內部根據使能進行賦值:


odulemodule moon_dffre #( parameter WD = 1, parameter VE = {WD{1'b0}}) ( input clk, input rst_n, input [DW -1:0]d, input en, output reg[DW -1:0]q ); always @(posedge clk or negedge rst_n)begin if(!rst_n) q <= VE; else if(en) q <= d; end endmodule 兩個參數分別是寄存器的位寬和復位值。那么如果在模塊內加入關于X態的校驗,可以增加如下的代碼(示意):


`ifdef ASSERT_ON property chk_en_xz(); @(posedge clk) disable iff(~rst_n) ~$isunknown(en); endproperty property chk_d_xz(); @(posedge clk) disable iff(~rst_n) en |-> ~$isunknown(d); endproperty assert_chk_en_xz: assert property(chk_en_xz()) else $assertoff(0, assert_chk_en_xz); assert_chk_d_xz: assert property(chk_d_xz()) else $assertoff(0, assert_chk_d_xz); `endif 這樣一來,X態檢查的問題就融在底層模塊中了。順著這個思路,另外幾種dff的編碼也很簡單,moon_dffe:


module moon_dffe #( parameter WD = 1) ( input clk, input [DW -1:0]d, input en, output reg[DW -1:0]q ); always @(posedge clk)begin if(en) q <= d; end `ifdef ASSERT_ON property chk_en_xz(); @(posedge clk) disable iff(~rst_n) ~$isunknown(en); endproperty property chk_d_xz(); @(posedge clk) disable iff(~rst_n) en |-> ~$isunknown(d); endproperty assert_chk_en_xz: assert property(chk_en_xz()) else $assertoff(0, assert_chk_en_xz); assert_chk_d_xz: assert property(chk_d_xz()) else $assertoff(0, assert_chk_d_xz); `endif endmodule moon_dffr沒有使能其實就沒有必要檢查什么X態的事了:


module moon_dffr #( parameter WD = 1, parameter VE = {WD{1'b0}}) ( input clk, input rst_n, input [DW -1:0]d, output reg[DW -1:0]q ); always @(posedge clk or negedge rst_n)begin q <= d; end endmodule 最最古樸的自然還是moon_dff:


module moon_dffr #( parameter WD = 1, parameter VE = {WD{1'b0}}) ( input clk, input rst_n, input [DW -1:0]d, output reg[DW -1:0]q ); always @(posedge clk)begin q <= d; end endmodule 基礎版本的寄存器這四種就完全夠用了。那么如果有需求在寄存器中加入校驗,比如說加入奇偶校驗,又該如何編碼呢?這就需要一個單獨的寄存器,當數據寫入時同步寫入校驗位,之后每拍檢查是否發生數據篡改:


module moon_dffre_chk #( parameter WD = 1, parameter VE = {WD{1'b0}}) ( input clk, input rst_n, input [DW -1:0]d, input en, output reg[DW -1:0]q, output e ); always @(posedge clk or negedge rst_n)begin if(!rst_n) q <= VE; else if(en) q <= d; end reg err_q; wire err_d = ^d; always @(posedge clk or negedge rst_n)begin if(!rst_n) err_q <= ^VE; else if(en) err_q <= err_d; end assign e = (err_q != ^q); `ifdef ASSERT_ON property chk_en_xz(); @(posedge clk) disable iff(~rst_n) ~$isunknown(en); endproperty property chk_d_xz(); @(posedge clk) disable iff(~rst_n) en |-> ~$isunknown(d); endproperty assert_chk_en_xz: assert property(chk_en_xz()) else $assertoff(0, assert_chk_en_xz); assert_chk_d_xz: assert property(chk_d_xz()) else $assertoff(0, assert_chk_d_xz); `endif endmodule 差不多啦,收工。

編輯:黃飛

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

    關注

    31

    文章

    5363

    瀏覽量

    120912
  • 芯片設計
    +關注

    關注

    15

    文章

    1026

    瀏覽量

    54968
  • RTL
    RTL
    +關注

    關注

    1

    文章

    385

    瀏覽量

    59897
  • 代碼
    +關注

    關注

    30

    文章

    4819

    瀏覽量

    68878
  • 時序邏輯
    +關注

    關注

    0

    文章

    39

    瀏覽量

    9173

原文標題:IC設計筆記 | 論RTL中always語法的消失術

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

收藏 人收藏

    評論

    相關推薦

    ARM開發中幾個常見的寄存器詳解

    筆者今天來聊聊對于ARM幾個特殊寄存器的理解,FP、SP和LR。
    發表于 11-22 09:02 ?4299次閱讀

    聊聊寄存器被優化的2種情況

    在項目初期,在使用FPGA工具quartus或者vivado生成版本燒入開發板進行調試時(DC開啟優化選項后同樣會優化掉寄存器),我們有時會發現部分寄存器被優化掉了,今天簡單聊聊被優化的幾種情況。
    的頭像 發表于 09-08 15:09 ?2370次閱讀
    <b class='flag-5'>聊聊</b><b class='flag-5'>寄存器</b>被優化的2種情況

    有償求助:RTL8365MB/RTL8363SB 寄存器問題

    內容:RTL8365MB/RTL8363SBdatasheet上寫到可以通過寄存器配置GMAC的工作模式為GMII/RGMII/MII,但是datasheet中并沒有相關的寄存器描述。
    發表于 08-30 09:53

    寄存器與移位寄存器

    寄存器與移位寄存器 寄存器是用來寄存數碼的邏輯部件,所以必須具備接收和寄存數碼的功能。任何一種觸發
    發表于 03-12 15:19 ?59次下載

    寄存器,寄存器是什么意思

    寄存器,寄存器是什么意思 寄存器定義  寄存器是中央處理內的組成部分。寄存器是有限存貯容量
    發表于 03-08 14:26 ?2.2w次閱讀

    數據寄存器,數據寄存器是什么意思

    數據寄存器,數據寄存器是什么意思 數據寄存器數據寄存器包括累加AX、基址寄存器BX、計數
    發表于 03-08 14:38 ?1.3w次閱讀

    移位寄存器,移位寄存器是什么意思

    移位寄存器,移位寄存器是什么意思 移位寄存器_
    發表于 03-08 14:50 ?1.8w次閱讀

    寄存器與移位寄存器

    寄存器與移位寄存器:介紹寄存器原理和移位寄存器的原理及實現。
    發表于 05-20 11:47 ?0次下載

    AD轉換寄存器設置

    AD轉換寄存器設置AD轉換寄存器設置AD轉換寄存器設置
    發表于 11-10 17:36 ?16次下載
    AD轉換<b class='flag-5'>寄存器</b>設置

    五個廣泛使用的特殊寄存器

      下一步是學習如何在 IP-XACT 或 SystemRDL 中定義這些特殊寄存器。還需要學習如何在 RTL 中對其進行編碼,并創建 UVM 寄存器模型并完成 UVM 測試平臺以進行
    的頭像 發表于 06-08 09:55 ?4630次閱讀
    五個廣泛使用的特殊<b class='flag-5'>寄存器</b>

    ARM通用寄存器及狀態寄存器詳解

    筆者來聊聊ARM通用寄存器以及狀態寄存器的認識與理解。
    的頭像 發表于 01-06 14:58 ?7311次閱讀

    RAL寄存器模型操作圖鑒

    寄存器模型操作,指的是通過寄存器模型對RTL寄存器進行讀寫訪問,或者同步寄存器模型與RTL
    的頭像 發表于 05-17 09:01 ?1022次閱讀
    RAL<b class='flag-5'>寄存器</b>模型操作圖鑒

    RAL寄存器模型操作指南

    寄存器模型操作,指的是通過寄存器模型對RTL寄存器進行讀寫訪問,或者同步寄存器模型與RTL
    的頭像 發表于 07-12 09:37 ?1130次閱讀
    RAL<b class='flag-5'>寄存器</b>模型操作指南

    寄存器是什么 掌握使用寄存器做設計需要注意的事項

    既然RTL是以寄存器行為為基礎,那么就必須先了解寄存器是什么,并且掌握使用寄存器做設計需要注意的事項。
    的頭像 發表于 07-13 15:38 ?1615次閱讀
    <b class='flag-5'>寄存器</b>是什么 掌握使用<b class='flag-5'>寄存器</b>做設計需要注意的事項

    寄存器分為基本寄存器和什么兩種

    寄存器是計算機中用于存儲數據的高速存儲單元,它們是CPU內部的重要組成部分。寄存器可以分為基本寄存器和擴展寄存器兩種類型。 一、基本寄存器
    的頭像 發表于 07-12 10:31 ?1560次閱讀
    主站蜘蛛池模板: 91国内精品久久久久免费影院| 国产成年网站v片在线观看| 亚洲综合中文| 浴室里强摁做开腿呻吟的漫画男男 | 亚洲黄色大片| 亚洲一级特黄| 1313久久国产午夜精品理论片 | 日本艳妓BBW高潮一19| 手机在线国产视频| 亚洲精品国产自在在线观看| 一手揉着乳头一手模仿抽插视频| 中文字幕亚洲视频| www.av日韩| 国产精品久久久久久搜索| 激情女人花| 女女破视频在线观看| 色视频色露露永久免费观看| 亚洲高清国产拍精品影院| 一个人在线观看的视频| 97国产精品视频在线观看| 东北老妇xxxxhd| 果冻传媒视频在线播放| 毛片999| 伸进同桌奶罩里摸她胸作文| 亚洲欧美高清在线| adc免费观看| 国产全部视频列表支持手机| 久久丫线这里只精品| 日本欧美高清一区二区视频| 亚洲AV无码国产精品色在线看 | 久久伊人久久| 人妻少妇久久久久久97人妻| 亚州性夜夜射在线观看| 最近日本MV字幕免费观看在线| 超碰在线视频97| 国模大胆一区二区三区| 美女内射少妇一区二区四区| 天堂so导航| 纵欲(高H)| 国产跪地吃黄金喝圣水合集| 精品一区二区三区四区五区六区|