精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

Verilog語言中阻塞和非阻塞賦值的不同

TLOc_gh_3394704 ? 來源:Verilog數字系統設計 ? 作者:夏宇聞 ? 2021-08-17 16:18 ? 次閱讀

來源:《Verilog數字系統設計(夏宇聞)》

阻塞和非阻塞賦值的語言結構是Verilog 語言中最難理解概念之一。甚至有些很有經驗的Verilog 設計工程師也不能完全正確地理解:何時使用非阻塞賦值何時使用阻塞賦值才能設計出符合要求的電路。

他們也不完全明白在電路結構的設計中,即可綜合風格的Verilog模塊的設計中,究竟為什么還要用非阻塞賦值,以及符合IEEE 標準的Verilog 仿真器究竟如何來處理非阻塞賦值的仿真。

本小節的目的是盡可能地把阻塞和非阻塞賦值的含義詳細地解釋清楚,并明確地提出可綜合的Verilog模塊編程在使用賦值操作時應注意的要點,按照這些要點來編寫代碼就可以避免在Verilog 仿真時出現冒險和競爭的現象。我們在前面曾提到過下面兩個要點:

在描述組合邏輯的always塊中用阻塞賦值,則綜合成組合邏輯的電路結構。

在描述時序邏輯的always塊中用非阻塞賦值,則綜合成時序邏輯的電路結構。

為什么一定要這樣做呢?回答是,這是因為要使綜合前仿真和綜合后仿真一致的緣故。如果不按照上面兩個要點來編寫Verilog代碼,也有可能綜合出正確的邏輯,但前后仿真的結果就會不一致。

為了更好地理解上述要點,我們需要對Verilog 語言中的阻塞賦值和非阻塞賦值的功能和執行時間上的差別有深入的了解。為了解釋問題方便下面定義兩個縮寫字:

RHS – 方程式右手方向的表達式或變量可分別縮寫為:RHS表達式或RHS變量。

LHS – 方程式左手方向的表達式或變量可分別縮寫為:LHS表達式或LHS變量。

IEEE Verilog標準定義了有些語句有確定的執行時間,有些語句沒有確定的執行時間。若有兩條或兩條以上語句準備在同一時刻執行,但由于語句的排列次序不同(而這種排列次序的不同是IEEE Verilog標準所允許的), 卻產生了不同的輸出結果。這就是造成Verilog模塊冒險和競爭現象的原因。為了避免產生競爭,理解阻塞和非阻塞賦值在執行時間上的差別是至關重要的。

阻塞賦值阻塞賦值操作符用等號(即 = )表示。為什么稱這種賦值為阻塞賦值呢?這是因為在賦值時先計算等號右手方向(RHS)部分的值,這時賦值語句不允許任何別的Verilog語句的干擾,直到現行的賦值完成時刻,即把RHS賦值給 LHS的時刻,它才允許別的賦值語句的執行。

一般可綜合的阻塞賦值操作在RHS不能設定有延遲,(即使是零延遲也不允許)。從理論上講,它與后面的賦值語句只有概念上的先后,而無實質上的延遲。若在RHS 加上延遲,則在延遲期間會阻止賦值語句的執行, 延遲后才執行賦值,這種賦值語句是不可綜合的,在需要綜合的模塊設計中不可使用這種風格的代碼。

阻塞賦值的執行可以認為是只有一個步驟的操作:

計算RHS并更新LHS,此時不能允許有來自任何其他Verilog語句的干擾。所謂阻塞的概念是指在同一個always塊中,其后面的賦值語句從概念上(即使不設定延遲)是在前一句賦值語句結束后再開始賦值的。

如果在一個過程塊中阻塞賦值的RHS變量正好是另一個過程塊中阻塞賦值的LHS變量,這兩個過程塊又用同一個時鐘沿觸發,這時阻塞賦值操作會出現問題,即如果阻塞賦值的次序安排不好,就會出現競爭。若這兩個阻塞賦值操作用同一個時鐘沿觸發,則執行的次序是無法確定的。下面的例子可以說明這個問題:

[例1]。 用阻塞賦值的反饋振蕩器

module fbosc1 (y1, y2, clk, rst);

output y1, y2;

input clk, rst;

reg y1, y2;

always @(posedge clk or posedge rst)

if (rst) y1 = 0; // reset

else y1 = y2;

always @(posedge clk or posedge rst)

if (rst) y2 = 1; // preset

else y2 = y1;

endmodule

按照IEEE Verilog 的標準,上例中兩個always塊是并行執行的,與前后次序無關。如果前一個always塊的復位信號先到0時刻,則y1 和y2都會取1,而如果后一個always塊的復位信號先到0時刻,則y1 和y2都會取0。這清楚地說明這個Verilog模塊是不穩定的會產生冒險和競爭的情況。

非阻塞賦值非阻塞賦值操作符用小于等于號 (即 《= )表示。為什么稱這種賦值為非阻塞賦值?這是因為在賦值操作時刻開始時計算非阻塞賦值符的RHS表達式,賦值操作時刻結束時更新LHS。

在計算非阻塞賦值的RHS表達式和更新LHS期間,其他的Verilog語句,包括其他的Verilog非阻塞賦值語句都能同時計算RHS表達式和更新LHS。非阻塞賦值允許其他的Verilog語句同時進行操作。非阻塞賦值的操作可以看作為兩個步驟的過程:

在賦值時刻開始時,計算非阻塞賦值RHS表達式。

在賦值時刻結束時,更新非阻塞賦值LHS表達式。

非阻塞賦值操作只能用于對寄存器類型變量進行賦值,因此只能用在“initial”塊和“always”塊等過程塊中。非阻塞賦值不允許用于連續賦值。下面的例子可以說明這個問題:

[例2]。 用非阻塞賦值的反饋振蕩器

module fbosc2 (y1, y2, clk, rst);

output y1, y2;

input clk, rst;

reg y1, y2;

always @(posedge clk or posedge rst)

if (rst) y1 《= 0; // reset

else y1 《= y2;

always @(posedge clk or posedge rst)

if (rst) y2 《= 1; // preset

else y2 《= y1;

endmodule

同樣,按照IEEE Verilog 的標準,上例中兩個always塊是并行執行的,與前后次序無關。無論哪一個always塊的復位信號先到, 兩個always塊中的非阻塞賦值都在賦值開始時刻計算RHS表達式,而在結束時刻才更新LHS表達式。所以這兩個always塊在復位信號到來后,在always塊結束時 y1為0而y2為1是確定的。從用戶的角度看這兩個非阻塞賦值正好是并行執行的。

Verilog模塊編程要點:

下面我們還將對阻塞和非阻塞賦值做進一步解釋并將舉更多的例子來說明這個問題。在此之前,掌握可綜合風格的Verilog模塊編程的八個原則會有很大的幫助。在編寫時牢記這八個要點可以為絕大多數的Verilog用戶解決在綜合后仿真中出現的90-100% 的冒險競爭問題。

時序電路建模時,用非阻塞賦值。

鎖存器電路建模時,用非阻塞賦值。

用always塊建立組合邏輯模型時,用阻塞賦值。

在同一個always塊中建立時序和組合邏輯電路時,用非阻塞賦值。

在同一個always塊中不要既用非阻塞賦值又用阻塞賦值。

不要在一個以上的always塊中為同一個變量賦值。

用$strobe系統任務來顯示用非阻塞賦值的變量值

在賦值時不要使用 #0 延遲

Verilog的新用戶在徹底搞明白這兩種賦值功能差別之前,一定要牢記這幾條要點。照著要點來編寫Verilog模塊程序,就可省去很多麻煩。

編輯:jq

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

    關注

    28

    文章

    3814

    瀏覽量

    138912
  • Verilog
    +關注

    關注

    28

    文章

    1345

    瀏覽量

    109996
  • 阻塞
    +關注

    關注

    0

    文章

    24

    瀏覽量

    8093

原文標題:【Verilog】深入理解阻塞和非阻塞賦值的不同

文章出處:【微信號:gh_339470469b7d,微信公眾號:FPGA與數據通信】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Verilog阻塞阻塞原理分析

    Verilog阻塞阻塞原理分析在Verilog語言最難弄明白的結構中“
    發表于 11-23 12:02

    Verilog阻塞賦值阻塞賦值的正確使用

    [table][tr][td] Verilog中有兩種為變量賦值的方法。一種叫做連續賦值,另一種叫做過程賦值。過程賦值又分為
    發表于 07-03 03:06

    Verilog阻塞賦值阻塞賦值的區別是什么

    Verilog阻塞賦值阻塞賦值的區別
    發表于 12-30 06:22

    verilog阻塞賦值阻塞賦值

    阻塞阻塞語句作為verilog HDL語言的最大難點之一,一直困擾著FPGA設計者,即使是一個頗富經驗的設計工程師,也很容易在這個點上犯
    發表于 03-15 10:57 ?6986次閱讀

    阻塞賦值阻塞賦值的用法一篇文章就夠了

    對于VerilogHDL語言中,經常在always模塊中,面臨兩種賦值方式:阻塞賦值阻塞
    的頭像 發表于 01-30 17:41 ?2.2w次閱讀

    IEEE Verilog阻塞賦值阻塞賦值的區別

    阻塞賦值對應的電路往往與觸發沿沒有關系,只與輸入電平的變化有關系。阻塞賦值對應的電路結構往往與觸發沿有關系,只有在觸發沿時才有可能發生
    的頭像 發表于 06-17 11:57 ?1.1w次閱讀
    IEEE <b class='flag-5'>Verilog</b><b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>和<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>的區別

    VerilogHDL語言:清阻塞賦值阻塞賦值

    對于VerilogHDL語言中,經常在always模塊中,面臨兩種賦值方式:阻塞賦值阻塞
    發表于 11-19 15:48 ?1129次閱讀

    簡述阻塞賦值阻塞賦值的可綜合性

    阻塞賦值阻塞賦值的可綜合性 Blocking Assignment阻塞
    的頭像 發表于 05-12 09:45 ?2696次閱讀
    簡述<b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>和<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>的可綜合性

    簡述Verilog HDL中阻塞語句和阻塞語句的區別

    ? 在Verilog中有兩種類型的賦值語句:阻塞賦值語句(“=”)和阻塞
    的頭像 發表于 12-02 18:24 ?6043次閱讀
    簡述<b class='flag-5'>Verilog</b> HDL中<b class='flag-5'>阻塞</b>語句和<b class='flag-5'>非</b><b class='flag-5'>阻塞</b>語句的區別

    時序邏輯中的阻塞阻塞

    Verilog HDL的賦值語句分為阻塞賦值阻塞賦值
    的頭像 發表于 03-15 13:53 ?2999次閱讀

    verilog阻塞賦值阻塞賦值的區別

    阻塞賦值操作符用等號(即 = )表示?!?b class='flag-5'>阻塞”是指在進程語句(initial和always)中,當前的賦值語句阻斷了其后的語句,也就是說后面的語句必須等到當前的
    發表于 12-19 16:49 ?7315次閱讀

    Verilog阻塞阻塞賦值金規

    對于VerilogHDL語言中,經常在always模塊中,面臨兩種賦值方式:阻塞賦值阻塞
    的頭像 發表于 06-01 09:21 ?1214次閱讀

    一文了解阻塞賦值阻塞賦值

    今天給大家普及一下阻塞賦值阻塞賦值的相關知識
    的頭像 發表于 07-07 14:15 ?2122次閱讀
    一文了解<b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>與<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>

    阻塞賦值阻塞賦值

    ”=“阻塞賦值與”
    的頭像 發表于 09-12 09:06 ?1004次閱讀
    <b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>與<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>

    verilog同步和異步的區別 verilog阻塞賦值阻塞賦值的區別

    Verilog是一種硬件描述語言,用于設計和模擬數字電路。在Verilog中,同步和異步是用來描述數據傳輸和信號處理的兩種不同方式,而阻塞賦值
    的頭像 發表于 02-22 15:33 ?1562次閱讀