一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

教你如何書(shū)寫(xiě)高質(zhì)量的Verilog代碼?

冬至子 ? 來(lái)源:小何的芯像石頭 ? 作者:五線(xiàn)譜是偶然來(lái)的 ? 2023-06-27 11:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

關(guān)于 Verilog HDL 的認(rèn)知

常見(jiàn)認(rèn)知(錯(cuò)誤)

  • 很多語(yǔ)法規(guī)則與 C 語(yǔ)言相似,書(shū)寫(xiě)時(shí)可參考 C 語(yǔ)言
  • 追求代碼的整潔簡(jiǎn)短
  • 著眼于代碼書(shū)寫(xiě),性能優(yōu)化由綜合器實(shí)現(xiàn)
  • 把 Verilog 代碼當(dāng)成了程序,把電路設(shè)計(jì)當(dāng)成了編程

正確認(rèn)知

HDL:hardware Description

  • HDL 語(yǔ)言?xún)H是對(duì)已知硬件電路的文本表現(xiàn)形式編寫(xiě)前,對(duì)所需實(shí)現(xiàn)的硬件電路“ 胸有成竹
  • Verilog HDL 的基本功能之一是描述可綜合的硬件電路。
  • 相比 C 語(yǔ)言,最顯著的區(qū)別在于 HDL 語(yǔ)言具備以下硬件設(shè)計(jì)的基本概念:
    • 互連(Connectivity) : wire 型變量描述各個(gè)模塊之間的端口與網(wǎng)線(xiàn)連接關(guān)系
    • 并發(fā)(concurrency) : 可以有效地描述并行的硬件系統(tǒng)
    • 時(shí)間(time) : 定義了絕對(duì)和相對(duì)的時(shí)間度量,可綜合操作符具有物理延遲

Verilog HDL 用于可綜合描述的語(yǔ)句

  • always
  • if-else
  • case
  • assign

這里課件上的 for 不可用于綜合,這點(diǎn)不敢茍同

if-else 相關(guān)語(yǔ)句的硬件結(jié)果映射及優(yōu)化

if-else 硬件結(jié)構(gòu)

  • 映射的硬件結(jié)構(gòu): Multiplexing Hardware -> 多路選擇器, 輸出結(jié)果由輸入的選擇條件決定

圖片

  • 重構(gòu) if-else 映射的硬件結(jié)構(gòu):減少了一個(gè)加法器,減少了硬件面積:

圖片

trade-off :但是在這種情況下,電路的傳播延遲 -> 數(shù)據(jù)通路的延遲沒(méi)改變,但是控制通路的傳播也變成了一個(gè)選擇器和加法器之和,如果 aflag 到來(lái)延遲晚,則后一種電路沒(méi)前者好的性能沒(méi)這么好:

圖片

單 if 語(yǔ)句-無(wú)優(yōu)先級(jí)的判斷結(jié)構(gòu)

如以下代碼:

always@(a or b or c or d or sel)begin
   z=0;
    if(sel[3])
        z=d;
    else if(sel[2])
        z=c;
    else if(sel[1])
        z=b;
    else if(sel[0])
        z=a;
end

硬件結(jié)構(gòu)為:

圖片

多 if 語(yǔ)句-具有優(yōu)先級(jí)的判斷結(jié)構(gòu)

如以下代碼:

always@(a or b or c or d or sel)begin
   z=0;
    if(sel[0])z=a;
    if(sel[1])z=b;
    if(sel[2])z=c;
    if(sel[3])z=d;
end

硬件結(jié)構(gòu)為:

圖片

最后一級(jí)選擇信號(hào)具有最高的優(yōu)先級(jí),具有優(yōu)先級(jí)的多選結(jié)構(gòu)會(huì)消耗組合邏輯

  • 若某些設(shè)計(jì)中,有些信號(hào)要求先到達(dá)(如關(guān)鍵使能信號(hào),選擇信號(hào)等),而有些信號(hào)需要后到達(dá)(如慢速信號(hào),有效時(shí)間較長(zhǎng)的信號(hào)等),此時(shí)則需要采用此結(jié)構(gòu)
  • 設(shè)計(jì)方法:最高優(yōu)先級(jí)給最遲到達(dá)的關(guān)鍵信號(hào)

此處結(jié)合阻塞賦值與非阻塞賦值去想都是成立的

case-無(wú)優(yōu)先級(jí)的判斷結(jié)構(gòu)

如以下代碼:

always@(a or b or c or d or sel)begin
    case(sel)
        2'b00: z=d;
        2'b01: z=c;
        2'b10: z=b;
        2'b11: z=a;
       default: z=1'b0;
    endcase
end
  • 與單 if 語(yǔ)句的區(qū)別: 條件多為互斥
  • 多用于指令譯碼電路

慎用 Latch

綜合器很難解釋 latch,因此,除非特殊用途,一般避免引入 latch.

圖片

一般只在異步電路與門(mén)控時(shí)鐘中用到

  • latch 由電平觸發(fā),非同步控制.在使能信號(hào)有效時(shí),latch 相當(dāng)于通路,在使能信號(hào)無(wú)效時(shí) latch 保持輸出狀態(tài)。DFF 由時(shí)鐘沿觸發(fā),同步控制。
  • latch 容易產(chǎn)生毛刺(glitch),DFF 則不易產(chǎn)生毛刺。
  • latch 將靜態(tài)時(shí)序分析變得極為復(fù)雜。
  • 一般的設(shè)計(jì)規(guī)則時(shí):在絕大多數(shù)設(shè)計(jì)中避免產(chǎn)生 latch。latch 最大的危害在于 不能過(guò)濾毛刺 。這對(duì)于下一級(jí)電路時(shí)極其危險(xiǎn)的。所以,只要能用 D 觸發(fā)器的地方,就不用 latch。
  • 易引入 latch 的途徑:使用不完備的條件判斷語(yǔ)句

圖片

所以防止產(chǎn)生非目的性 latch 的措施:

  • 使用完備的 if-else 語(yǔ)句
  • 為每個(gè)輸入條件設(shè)計(jì)輸出操作,為 case 語(yǔ)句設(shè)置 default 操作
  • 仔細(xì)檢查綜合器生成的報(bào)告,latch 會(huì)以 warning 的形式報(bào)告

利用綜合器指令指定電路結(jié)構(gòu)

full-case

對(duì)如紅綠燈等只有紅綠黃三種情況下,采用 2bit 的狀態(tài)編碼則會(huì)產(chǎn)生分支賦值不完備的情況:

always@(a or b or c or sel)begin
    case(sel)
        2'b00: y=a;
        2'b01: y=b;
        2'b10: y=c;
    endcase
end

此時(shí)現(xiàn)實(shí)的狀態(tài)已經(jīng)完備了,但是從數(shù)字電路角度出發(fā)會(huì)有一個(gè) 2'b11 下的 latch

圖片

此時(shí)使用 full-case:

  • full-case: 告訴綜合器,當(dāng)前 case 結(jié)構(gòu)所列條件已完備
always@(a or b or c or sel)begin
    case(sel) // synopsys full_case
        2'b00: y=a;
        2'b01: y=b;
        2'b10: y=c;
    endcase
end

此時(shí)綜合器結(jié)果:

圖片

則不會(huì)推斷出 latch

parallel_case

當(dāng) case 語(yǔ)句中的分支條件不互斥,則 case 語(yǔ)句存在優(yōu)先級(jí),如:

always@(irq)begin
    int = 3'b0;
    casez(irq)
        3'b1??: int[2]=1'b1;
        3'b?1?: int[1]=1'b1;
        3'b??1: int[0]=1'b1;
    endcase
end

綜合器報(bào)告:

圖片

使用 parallel-case 原語(yǔ):告訴 DC,所有條件互斥,并行且無(wú)優(yōu)先級(jí)

always@(irq)begin
    int = 3'b0;
    casez(irq) // synopsys parallel_case
        3'b1??: int[2]=1'b1;
        3'b?1?: int[1]=1'b1;
        3'b??1: int[0]=1'b1;
    endcase
end

合理使用 parallel case 約束,可以條件譯碼邏輯

圖片

邏輯復(fù)制-均衡負(fù)載

通過(guò)邏輯賦值,降低關(guān)鍵信號(hào)的扇出,進(jìn)而降低該信號(hào)的傳播延遲,提高電路性能:

圖片

trade-off: 資源消耗

資源共享-減少面積

若電路中存在較多公共單元,可以通過(guò)資源共享來(lái)減少面積:

圖片

但一般共享會(huì)導(dǎo)致性能下降

資源順序重排-降低傳播延時(shí)

對(duì)到達(dá)延遲大的信號(hào),可以重排其電路順序以降低傳播延時(shí),提高性能:

圖片

如圖,假設(shè) A 來(lái)得比較晚,就可以將其盡可能放在后面,隱藏他的延遲

":?"僅用于連線(xiàn),always 用于邏輯運(yùn)算

盡可能使用 always 來(lái)描述電路,assign 僅僅用來(lái)實(shí)現(xiàn)連線(xiàn),如:

assign a = (b==1)?((c&&d)? 1'b1:1'b0):1'b0;

與 always 塊描述的:

always@(*) begin
    if(b==1'b1)
        if(c&&d == 1'b1)
      a=1'b1;
     else
            a=1'b0;
    else
        a=1'b0;
end

關(guān)于 assign 和三目運(yùn)算符:

  • 僅用于信號(hào)連線(xiàn)
  • 難以閱讀,且多層嵌套后很難被綜合器解釋

可綜合風(fēng)格對(duì)代碼的要求

完整的 always 敏感信號(hào)列表

  • 所有的組合邏輯或所存的 always 結(jié)構(gòu)必須由敏感信號(hào)列表.其中必須包括所有的輸入信號(hào)
  • 原因: 綜合過(guò)程將產(chǎn)生要給取決于除命案列表中所有其它值的結(jié)構(gòu),它將可能在行為仿真和門(mén)級(jí)仿真間產(chǎn)生潛在的失配.

每個(gè) always 敏感信號(hào)列表對(duì)應(yīng)一個(gè)時(shí)鐘

  • 在綜合過(guò)程中,每個(gè) Verilog always 敏感信號(hào)列表只能對(duì)應(yīng)一個(gè)時(shí)鐘。
  • 原因:這是將每一個(gè)過(guò)程限制在單一寄存器類(lèi)型的要求,有利于邏輯綜合和時(shí)序分析

不允許 Wait 聲明和# delay 聲明

  • Wait 聲明語(yǔ)句,無(wú)論時(shí)清楚還是含糊,都不能用于可綜合設(shè)計(jì)。
  • 原因:從 RTL 級(jí)轉(zhuǎn)換到 gate 級(jí)的綜合工具一般都不支持 Wait 聲明和# delay 聲明,為了有效的綜合,這些語(yǔ)句應(yīng)該避免。
  • 例外:在不需要進(jìn)行綜合的行為模塊中,如測(cè)試模塊,表示行為的虛擬期間模塊中可以使用。

在時(shí)序電路中必須使用非阻塞賦值(<=)

在組合邏輯中必須使用阻塞賦值(=)

模塊劃分

分開(kāi)異步邏輯與同步邏輯

  • 建議分開(kāi)異步邏輯與同步邏輯
  • 原因:簡(jiǎn)化綜合時(shí)的問(wèn)題,簡(jiǎn)化約束和編碼難度
  • 例外:不可應(yīng)用于非綜合模塊中(例如:總線(xiàn)模塊,總線(xiàn)監(jiān)視器或是模擬模塊)除非他們被設(shè)計(jì)來(lái)綜合仿真。

分開(kāi)控制邏輯和存儲(chǔ)器

  • 建議分開(kāi)控制邏輯與存儲(chǔ)器邏輯為獨(dú)立模塊
  • 原因:存儲(chǔ)器一般由 memory compiler 生成,便于高層的存儲(chǔ)器模塊的使用和便于重新描述為不同的存儲(chǔ)器類(lèi)型。混用不利于綜合,不利于方便更換工藝庫(kù)和平臺(tái)。
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5434

    瀏覽量

    124513
  • 觸發(fā)器
    +關(guān)注

    關(guān)注

    14

    文章

    2039

    瀏覽量

    62145
  • HDL語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    48

    瀏覽量

    9167
  • dff
    dff
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    3653
  • 多路選擇器
    +關(guān)注

    關(guān)注

    1

    文章

    22

    瀏覽量

    6714
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    分享一些優(yōu)秀的verilog代碼 高質(zhì)量verilog代碼的六要素

    高質(zhì)量verilog代碼至少需要包含以下幾個(gè)要素:可讀性、功能、性能、標(biāo)準(zhǔn)化、穩(wěn)定性、可定位。
    的頭像 發(fā)表于 07-18 10:09 ?1527次閱讀
    分享一些優(yōu)秀的<b class='flag-5'>verilog</b><b class='flag-5'>代碼</b> <b class='flag-5'>高質(zhì)量</b><b class='flag-5'>verilog</b><b class='flag-5'>代碼</b>的六要素

    何為高質(zhì)量代碼?如何寫(xiě)出高質(zhì)量代碼?

    懂得“數(shù)據(jù)結(jié)構(gòu)與算法” 寫(xiě)出高效的代碼,懂得“設(shè)計(jì)模式”寫(xiě)出高質(zhì)量代碼。
    發(fā)表于 08-02 09:44 ?1077次閱讀
    何為<b class='flag-5'>高質(zhì)量</b>的<b class='flag-5'>代碼</b>?如何寫(xiě)出<b class='flag-5'>高質(zhì)量</b><b class='flag-5'>代碼</b>?

    protel輸出高質(zhì)量gerber

    圖文并茂一步一步手把手教你輸出高質(zhì)量的gerber傻瓜式教學(xué)。。。。[hide] [/hide]
    發(fā)表于 12-12 15:43

    高質(zhì)量C++、C編程指南

    高質(zhì)量C++、C編程指南
    發(fā)表于 08-06 11:58

    高質(zhì)量C語(yǔ)言編程

    高質(zhì)量c語(yǔ)言,精,精,精,精華
    發(fā)表于 07-22 13:48

    編寫(xiě)高質(zhì)量C語(yǔ)言代碼

    編寫(xiě)高質(zhì)量C語(yǔ)言代碼 編寫(xiě)高質(zhì)量C語(yǔ)言代碼 編寫(xiě)高質(zhì)量C語(yǔ)言代碼
    發(fā)表于 07-31 17:47

    【分享】verilog代碼書(shū)寫(xiě)規(guī)范

    FPGA verilog代碼書(shū)寫(xiě)規(guī)范,很好的借鑒
    發(fā)表于 05-21 11:36

    高質(zhì)量編程

    干貨,《495個(gè)C語(yǔ)言問(wèn)題》、《華為內(nèi)部程序設(shè)計(jì)編碼規(guī)范》、《C語(yǔ)言:陷阱和缺陷》、《高質(zhì)量C編程[林銳]》
    發(fā)表于 02-27 19:39

    Verilog HDL代碼書(shū)寫(xiě)規(guī)范

    Verilog HDL代碼書(shū)寫(xiě)規(guī)范
    發(fā)表于 09-30 08:55

    Verilog HDL代碼書(shū)寫(xiě)規(guī)范

    本帖最后由 lee_st 于 2017-10-31 08:46 編輯 Verilog HDL代碼書(shū)寫(xiě)規(guī)范
    發(fā)表于 10-21 20:53

    10個(gè)嵌入式小技巧 教你寫(xiě)出高質(zhì)量代碼!

    由于物聯(lián)網(wǎng)的發(fā)展,現(xiàn)在沒(méi)人不知道嵌入式系統(tǒng)了,加上身邊也有很多嵌入式的設(shè)備,所以這也讓大家開(kāi)始都轉(zhuǎn)入到嵌入式門(mén)下,那么因?yàn)榍度胧疆吘故羌夹g(shù),所以下面也來(lái)給大家介紹下10個(gè)嵌入式技巧,教你怎么寫(xiě)高質(zhì)量
    發(fā)表于 12-20 16:19

    Verilog代碼書(shū)寫(xiě)規(guī)范

    Verilog代碼書(shū)寫(xiě)規(guī)范 本規(guī)范的目的是提高書(shū)寫(xiě)代碼的可讀性、可修改性、可重用性,優(yōu)化代碼
    發(fā)表于 04-15 09:47 ?106次下載

    高質(zhì)量代碼的設(shè)計(jì)特點(diǎn)

    高質(zhì)量的設(shè)計(jì)往往有一些共同的特點(diǎn)。如果你能達(dá)到這些對(duì)象,那么可以認(rèn)為你的設(shè)計(jì)也是非常成功的。有些對(duì)象是互相矛盾的。但是這是設(shè)計(jì)的挑戰(zhàn)所在,在相互矛盾的對(duì)象之間做出
    發(fā)表于 07-19 15:15 ?0次下載

    高質(zhì)量Verilog代碼有什么特點(diǎn)

    高質(zhì)量verilog代碼主要包含以下幾個(gè)要素:可讀性、功能、性能、標(biāo)準(zhǔn)化、穩(wěn)定性、可定位。
    發(fā)表于 03-30 10:12 ?2094次閱讀
    <b class='flag-5'>高質(zhì)量</b><b class='flag-5'>Verilog</b><b class='flag-5'>代碼</b>有什么特點(diǎn)

    如何編寫(xiě)高質(zhì)量的Javascript代碼

    這篇文章不僅僅從代碼本身來(lái)考慮如何優(yōu)化編碼,也從代碼的設(shè)計(jì)階段來(lái)考慮,包括書(shū)寫(xiě)API文檔,同事的review,使用JSLint。這些習(xí)慣都能幫助你編寫(xiě)更加高質(zhì)量的、更易于理解的、可維護(hù)
    發(fā)表于 01-21 14:28 ?7次下載
    如何編寫(xiě)<b class='flag-5'>高質(zhì)量</b>的Javascript<b class='flag-5'>代碼</b>