verilog同步復位和非同步復位
1、阻塞賦值操作符用等號(即 = )表示。“阻塞”是指在程序語句(initial和always)中,當前的賦值語句阻斷了其後的語句,也就是說後面的語句必須等到當前的賦值語句執行完畢才能執行。而且阻塞賦值可以看成是一步完成的,即:計算等號右邊的值並同時賦給左邊變數。例如:
當執行“x=next_x;”時,x會立即的到next_x的值。而下一句“y=x;”必須等到“x=next_x;”執行完畢才能被執行。由於這兩條語句都沒有延遲(相當於導線),導致他們的等價語句為“y=next_x;”。
賦值是實時的,計算完右面的馬上賦值給左邊的,然後再執行下一句,操作時序列的,且在一個alway內完成。
2、非阻塞賦值操作符用小於等於號 (即 <= )表示。“非阻塞”是指在程序語句(initial和always)中,當前的賦值語句不會阻斷其後的語句。非阻塞語句可以認為是分為兩個步驟進行的:
①計算等號右邊的表示式的值,(我的理解是:在進入程序後,所有的非阻塞語句的右端表示式同時計算,賦值動作只發生在順序執行到當前非阻塞語句那一刻)。
②在本條賦值語句結束時,將等號右邊的值賦給等號左邊的變數。
例如:
當執行“x<=next_x;”時,並不會阻斷語句“y<=x;”的執行。因此,語句“y<=x;”中的x的值與語句“x<=next_x;”中的x的值不同:語句“y<=x;”中的x是第一個D觸發器的初值(Q0)。而語句“x<=next_x;”中的x的值是D觸發器經過一個同步脈衝後的輸出值(Q1)。基於此這個程序產生了與阻塞賦值程序截然不同的結果,即:產生了移位暫存器的效果,next_x à x à y。
簡單理解就是,阻塞賦值是按需執行,非阻塞賦值是並行執行。
為了更好地理解上述要點,我們需要對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語句同時進行操作。非阻塞賦值的操作可以看作為兩個步驟的過程:
1) 在賦值時刻開始時,計算非阻塞賦值RHS表示式。
2) 在賦值時刻結束時,更新非阻塞賦值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使用者解決在綜合後模擬中出現的90-100% 的冒險競爭問題。
1) 時序電路建模時,用非阻塞賦值。
2) 鎖存器電路建模時,用非阻塞賦值。
3) 用always塊建立組合邏輯模型時,用阻塞賦值。
4) 在同一個always塊中建立時序和組合邏輯電路時,用非阻塞賦值。
5) 在同一個always塊中不要既用非阻塞賦值又用阻塞賦值。
6) 不要在一個以上的always塊中為同一個變數賦值。
7) 用$strobe系統任務來顯示用非阻塞賦值的變數值
8) 在賦值時不要使用 #0 延遲
相關推薦
【Verilog】 同步復位和非同步復位比較 async vs. sync
同步復位 sync 非同步復位 async 特點 復位訊號只有在時鐘上升沿到來時才能有效。 無論時鐘沿是否到來,只要復位訊號有效,就進行復位。
verilog同步復位和非同步復位
1、阻塞賦值操作符用等號(即 = )表示。“阻塞”是指在程序語句(initial和always)中,當前的賦值語句阻斷了其後的語句,也就是說後面的語句必須等到當前的賦值語句執行完畢才能執行。而且阻塞賦值可以看成是一步完成的,即:計算等號右邊的值並同時賦給左邊變數。例如: 當執行“x=next_x;”時,x會
非同步復位、同步復位和非同步復位同步釋放的比較
原文地址:http://www.cnblogs.com/yfwblog/p/4793118.htm 簡介 在實際的工程中選擇復位策略之前必須考慮許多設計方面的問題,如使用同步復位或者非同步復位或者非同步復位同步釋放(Asynchronous Reset Synchro
同步復位和非同步復位的對比
復位分為同步復位和非同步復位。 同步復位的優點: 1.抗干擾性高,可以剔除復位訊號中週期短於時鐘週期的毛刺。 2.有利於靜態時序分析工具的分析。 3.有利於基於週期的模擬工具的模擬。 同步復位的缺點:
Verilog中同步復位,非同步復位,非同步復位同步釋放
簡介 在實際的工程中選擇復位策略之前必須考慮許多設計方面的問題,如使用同步復位或者非同步復位或者非同步復位同步釋放(Asynchronous Reset Synchronous Release或者Synchronized Asynchronous Reset),以及
同步FIFO和非同步FIFO的Verilog實現
module fifo2 (rdata, wfull, rempty, wdata, winc, wclk, wrst_n, rinc, rclk, rrst_n); parameter DSIZE = 8; parameter ASIZE = 4; output [DSIZE-1:0] rdata; out
FPGA之同步復位與非同步復位(1)
正常情況下,clk的上升沿c更新為b,b更新為a。一旦進入復位,b,c都清零;但是我們不能確定復位訊號rst_n會在什麼時候結束。如果結束於b_reg0和c_reg0的{launch edge –stup,launch edge+hold}時間只外,那麼一切都會正常。但如果恰恰相反,會出現什麼情況呢? rst
FPGA之同步復位與非同步復位(2)
為了避免純粹的同步復位和純粹非同步復位的問題,可以使用一種叫做同步化的非同步復位,我們稱其為第三類復位。這種復位完全結合了非同步復位和同步復位的優勢,我們知道非同步復位的優勢是不參與資料路徑,所以不影響資料路徑速度,而復位幾乎是瞬間起作用;而同步復位的優勢是百分百地同步時
C# 委託的同步呼叫和非同步呼叫--抓住重點
委託的Invoke方法用來進行同步呼叫。同步呼叫也可以叫阻塞呼叫,它將阻塞當前執行緒,然後執行呼叫,呼叫完畢後再繼續向下進行。 同步呼叫的例子: using System; using System.Threading; public delegate int AddHandl
tensorflow原始碼學習之五 -- 同步訓練和非同步訓練
同步和非同步訓練是由optimizer來決定的。 1. 同步訓練 同步訓練需要使用SyncReplicasOptimizer,參考https://www.tensorflow.org
執行緒同步鎖和非同步鎖的幾種方式
同步鎖:當在一個java虛擬機器多個執行緒操作一個變數的時候就會出現執行緒安全問題,這個時候就會用到同步鎖。 同步鎖的解決方式: 先看下一個執行緒異常的售票 public class ThreadSafe { public static void main(String[] arg
Mysql 半同步複製和非同步複製
mysql 半同步複製和非同步複製 -- 在主庫中安裝半同步外掛,開啟半同步複製功能 install plugin rpl_semi_sync_master soname 'semisync_master.so'; set global rpl_semi_sync_master_enab
extjs中Ext.Ajax.request同步請求和非同步請求
用Ext.Ajax.request請求預設是非同步請求,這就導致定義的物件無法識別,沒有定義,因此需要將請求方式改為同步。請看程式碼。 function showFormPanel(){ if(centerPanel.getSelectionModel().hasSelection()){
同步IO和非同步IO、阻塞IO和非阻塞IO
1、IO IO (Input/Output,輸入/輸出)即資料的讀取(接收)或寫入(傳送)操作,通常使用者程序中的一個完整IO分為兩階段:使用者程序空
同步IO和非同步IO
程式碼:VOID WINAPI APC_A ( DWORD dwError, DWORD cbTransferred, LPOVERLAPPED lpo ){ pTempInfo.push_back ( "執行IO_A的完成例程" ) ;}VOID WINAPI APC_B ( DWORD dwError,
同步任務和非同步任務
程式裡面所有的任務,可以分成兩類:同步任務和非同步任務 同步任務是那些沒有被引擎掛起,在主執行緒上排隊執行的任務。 只有前一個任務執行完畢,才能執行後一個任務。 非同步任務是那些被引擎放在一邊,不進去主執行緒、而進入任務佇列的任務。只有 引擎認為某個非同
網路程式設計中,同步傳輸和非同步傳輸有什麼區別
在網路通訊過程中,通訊雙方要交換資料,需要高度的協同工作。為了正確的解釋訊號,接收方必須確切地知道訊號應當何時接收和處理,因此定時是至關重要的。 在計算機網路中,定時的因素稱為位同步。同步是要接收方按照發送方傳送的每個位的起止時刻和速率來接收資料,否則會產生誤差。 通常可以
okhttp 同步請求和非同步請求
一、使用OkHttp OkHttp傳送請求後,可以通過同步或非同步地方式獲取響應。下面就同步和非同步兩種方式進行介紹。 1.1、同步方式 傳送請求後,就會進入阻塞狀態,知道收到響應。下面看一個下載百度首頁的例子: OkHttpClient client = new
form表單同步提交和非同步提交
同步提交: html: <form id="form" method='"post" action="${ctx}/user/saveUser"> <input type=
HttpClient實現同步(sync)和非同步(Async)
pom: <httpclient.version>4.5</httpclient.version> <http-async-client.version>4.1</http-async-client.version> &