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

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

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

探討always和always_ff的編碼風(fēng)格

OpenFPGA ? 來源:OpenFPGA ? 2023-02-03 10:24 ? 次閱讀

數(shù)字門級(jí)電路可分為兩大類:組合邏輯和時(shí)序邏輯。鎖存器是組合邏輯和時(shí)序邏輯的一個(gè)交叉點(diǎn),在后面會(huì)作為單獨(dú)的主題處理。

組合邏輯描述了門級(jí)電路,其中邏輯塊的輸出直接反映到該塊的輸入值的組合,例如,雙輸入AND門的輸出是兩個(gè)輸入的邏輯與。如果輸入值發(fā)生變化,輸出值將反映這一變化,組合邏輯的RTL模型需要反映這種門級(jí)行為,這意味著邏輯塊的輸出必須始終反映該邏輯塊當(dāng)前輸入值的組合。

SystemVerilog有三種在可綜合RTL級(jí)別表示組合邏輯的方法:連續(xù)賦值語句、always程序塊和函數(shù)。接下來幾篇文章將探討每種編碼風(fēng)格,并推薦最佳實(shí)踐編碼風(fēng)格。

always和always_ff

通用的always程序可以用來為任何類型的邏輯建模,包括組合邏輯、時(shí)序邏輯(觸發(fā)器)和電平感應(yīng)的時(shí)序邏輯(鎖存器)。為了讓通用的always程序?qū)τ|發(fā)器行為進(jìn)行建模,always關(guān)鍵字后面必須緊跟一個(gè)敏感度列表,指定時(shí)鐘信號(hào)的posedge或negedge,如:。

b68a7e2c-a30e-11ed-bfe3-dac502259ad0.png

盡管這個(gè)例子在功能上是準(zhǔn)確的,但是通用的always程序并不要求也不強(qiáng)制執(zhí)行前面一節(jié)中列出的任何綜合要求。下一個(gè)例子在語法上是合法的,但是不可綜合。

b6a33958-a30e-11ed-bfe3-dac502259ad0.png

這個(gè)例子可以在仿真中編譯和運(yùn)行,沒有任何警告或錯(cuò)誤提示,但是綜合編譯器在試圖編譯這個(gè)例子時(shí),會(huì)報(bào)告一個(gè)錯(cuò)誤。它不符合要求,即除了時(shí)鐘和異步置位或復(fù)位的邊沿之外,其他信號(hào)都不能包含在靈敏度列表中。對(duì)RTL仿真的仔細(xì)驗(yàn)證會(huì)發(fā)現(xiàn),即使在沒有發(fā)生時(shí)鐘觸發(fā)的情況下,觸發(fā)器的狀態(tài)也會(huì)在每次enable改變值時(shí)更新其內(nèi)部存儲(chǔ)。門級(jí)的觸發(fā)器沒有這個(gè)功能。

always_ff過程也需要一個(gè)敏感度列表,指定一個(gè)時(shí)鐘的posedge或negedge,但是always_ff也執(zhí)行上一節(jié)中列出的許多綜合要求。SystemVerilog標(biāo)準(zhǔn)要求所有軟件工具在以下情況下報(bào)告錯(cuò)誤。

過程的主體包含#,wait,或者@時(shí)間控制延遲時(shí),將阻止過程的執(zhí)行,直到要求的仿真時(shí)間。

在程序中,有一個(gè)對(duì)任務(wù)的調(diào)用(因?yàn)槿蝿?wù)可以包含延遲)。

任何其他存儲(chǔ)過程、連續(xù)賦值或輸入端口的賦值與always_ff存儲(chǔ)過程的變量相同。

IEEE標(biāo)準(zhǔn)還建議(但不要求)軟件工具檢查其他綜合限制,如不正確的靈敏度列表。設(shè)計(jì)工程工具,如綜合編譯器和lint檢查器(檢查編碼風(fēng)格)執(zhí)行這些可選的檢查,但大多數(shù)仿真器不對(duì)always_ff程序執(zhí)行額外的檢查。這些錯(cuò)誤和可選的額外檢查有助于確保具有時(shí)序邏輯的RTL模型既能正確仿真,又能正確綜合(仿真和綜合后功能相同)。

always_ff過程之后必須有一個(gè)符合綜合要求的敏感性列表。靈敏度列表不能像always_comb可以推斷靈敏度列表那樣從程序的主體中推斷出來。原因很簡單:時(shí)鐘信號(hào)在always_ff過程的主體中沒有命名。時(shí)鐘的名稱,以及時(shí)鐘的哪個(gè)邊沿觸發(fā)了存儲(chǔ)過程,必須由設(shè)計(jì)工程師在靈敏度列表中明確指定。

最佳實(shí)踐指南8-1
使用SystemVerilog always_ff RTL專用存儲(chǔ)過程來模擬RTL時(shí)序邏輯。請(qǐng)不要使用通用的always過程。

always_ff RTL專用程序強(qiáng)制執(zhí)行上一篇文章中所要求的綜合風(fēng)格,以正確模擬時(shí)序邏輯行為。






審核編輯:劉清

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

    關(guān)注

    8

    文章

    903

    瀏覽量

    41317
  • RTL
    RTL
    +關(guān)注

    關(guān)注

    1

    文章

    384

    瀏覽量

    59519
  • Verilog語言
    +關(guān)注

    關(guān)注

    0

    文章

    113

    瀏覽量

    8192
  • 門級(jí)電路
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    1949

原文標(biāo)題:數(shù)字硬件建模SystemVerilog-時(shí)序邏輯建模(2)always和always_ff

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是always on buffer?什么情況下需要插always on buffer?

    相比普通的buffer cell,always on buffer(AOB)有secondary always on pin,可以讓AOB即使在primary power off的情況下保持on的狀態(tài);AOB在secondary pg pin off的情況下也是off的。
    的頭像 發(fā)表于 12-01 15:31 ?1890次閱讀
    什么是<b class='flag-5'>always</b> on buffer?什么情況下需要插<b class='flag-5'>always</b> on buffer?

    關(guān)于always語句的問題

    1個(gè)Verilog HDL語言,有很多個(gè)always語句,這些always語句是并行一起執(zhí)行,還是按照先后順序執(zhí)行?
    發(fā)表于 06-29 10:01

    Verilog中always @*是什么意思

    Verilog中always @*是什么意思???
    發(fā)表于 09-27 16:27

    什么是AO/DI (Always On-line/Dynam

    什么是AO/DI (Always On-line/Dynamic ISDN)  英文縮寫: AO/DI (Always On-line/Dynamic ISDN) 中文譯名: 永遠(yuǎn)在線/動(dòng)態(tài)ISDN
    發(fā)表于 02-22 10:03 ?607次閱讀

    FPGA 開發(fā)經(jīng)驗(yàn)與技巧—無處不在的 ALWAYS@

    FLC1301T02 無處不在的Always@,希望對(duì)大家的學(xué)習(xí)有幫助!
    發(fā)表于 12-16 15:32 ?2次下載

    談?wù)?b class='flag-5'>Always@_【FPGA助學(xué)系列—技巧篇】

    電子專業(yè)單片機(jī)相關(guān)知識(shí)學(xué)習(xí)教材資料——談?wù)?b class='flag-5'>Always@
    發(fā)表于 08-08 17:03 ?0次下載

    initial和always兩者的關(guān)系分析

    兩者的關(guān)系 一個(gè)程序塊可以有多個(gè)initial和always過程塊。每個(gè)initial和always說明語句在仿真的一開始同時(shí)立即開始執(zhí)行;initial語句只執(zhí)行一次,而always語句則不斷重復(fù)
    的頭像 發(fā)表于 11-24 14:48 ?5532次閱讀

    你們知道always,assign和always@(*)之間的區(qū)別嗎

    1.always@后面內(nèi)容是敏感變量,always@(*)里面的敏感變量為*,意思是說敏感變量由綜合器根據(jù)always里面的輸入變量自動(dòng)添加,也就是所有變量都是敏感列表,不用自己考慮。2.如果沒有
    的頭像 發(fā)表于 06-27 11:47 ?1.5w次閱讀

    assign組合邏輯和always@(*)組合邏輯的區(qū)別

    1.always@后面內(nèi)容是敏感變量,always@(*)里面的敏感變量為*,意思是說敏感變量由綜合器根據(jù)always里面的輸入變量自動(dòng)添加,也就是所有變量都是敏感列表,不用自己考慮。
    的頭像 發(fā)表于 03-15 14:08 ?9390次閱讀

    數(shù)字硬件建模SystemVerilog篇OpenFPGA介紹

    專用的RTL程序。Always_ff、always_comb和always_latch專用always程序塊的行為與通用always程序塊相
    發(fā)表于 10-11 09:20 ?1381次閱讀

    SystemVerilog中的always語句塊

    always”關(guān)鍵字意味著這個(gè)語句塊“總是”一直執(zhí)行。大多數(shù)時(shí)候“always”后面跟一個(gè)邊沿事件或者延遲。
    的頭像 發(fā)表于 12-06 09:47 ?2147次閱讀

    FPGA設(shè)計(jì):always組合邏輯塊的講解和譯碼器的實(shí)現(xiàn)

    always 語句是重復(fù)執(zhí)行的。always 語句塊從 0 時(shí)刻開始執(zhí)行其中的行為語句;當(dāng)執(zhí)行完最后一條語句后,便再次執(zhí)行語句塊中的第一條語句,如此循環(huán)反復(fù)。多用于仿真時(shí)鐘的產(chǎn)生,信號(hào)行為的檢測等。
    的頭像 發(fā)表于 05-12 14:42 ?3698次閱讀
    FPGA設(shè)計(jì):<b class='flag-5'>always</b>組合邏輯塊的講解和譯碼器的實(shí)現(xiàn)

    always組合邏輯塊的講解和譯碼器的實(shí)現(xiàn)

    always 語句是重復(fù)執(zhí)行的。always 語句塊從 0 時(shí)刻開始執(zhí)行其中的行為語句;當(dāng)執(zhí)行完最后一條語句后,便再次執(zhí)行語句塊中的第一條語句,如此循環(huán)反復(fù)。
    的頭像 發(fā)表于 05-22 15:13 ?2444次閱讀
    <b class='flag-5'>always</b>組合邏輯塊的講解和譯碼器的實(shí)現(xiàn)

    SystemVerilog相比于Verilog的優(yōu)勢

    我們?cè)購膶?duì)可綜合代碼的支持角度看看SystemVerilog相比于Verilog的優(yōu)勢。針對(duì)硬件設(shè)計(jì),SystemVerilog引入了三種進(jìn)程always_ff,always
    的頭像 發(fā)表于 10-26 10:05 ?713次閱讀
    SystemVerilog相比于Verilog的優(yōu)勢

    assign語句和always語句的用法

    Assign語句和Always語句是在硬件描述語言(HDL)中常用的兩種語句,用于對(duì)數(shù)字電路建模和設(shè)計(jì)。Assign語句用于連續(xù)賦值,而Always語句用于時(shí)序邏輯建模。本文將詳細(xì)探討這兩種語句
    的頭像 發(fā)表于 02-22 16:24 ?1556次閱讀