2014-11-04 137 views
3

Verilog中的<=有什麼作用。<= Verilog中的指派運算符

例如

always @(posedge Clock) begin 
    if (Clear) begin 
     BCD1 < = 0; 
     BCD0 < = 0; 
    end 
end 
+0

有人能解釋爲什麼他們低估了這個嗎? – Ben 2014-11-04 18:59:05

+0

請檢查,http://stackoverflow.com/questions/4653284/how-to-interpret-blocking-vs-non-blocking-assignments-in-verilog – Jithin 2015-03-24 13:46:44

回答

13

「< =」在Verilog中被稱爲非阻塞賦值,與「=」有很大區別,因爲在任何基於供應商的仿真器中調度事件,所以稱爲阻塞賦值。

建議對組合邏輯的順序邏輯和阻塞賦值使用非阻塞賦值,然後才能在合成期間推斷正確的硬件邏輯。

順序模塊中的非阻塞語句將推斷實際硬件中的觸發器。

一定要記住,不要在任何順序或組合塊中混合阻塞和非阻塞。

在模擬器的調度處理:

有四個區域和命令的執行次序如下

1) Active region 
    --Blocking assignments 
    --Evaluation of RHS of non-blocking assignments(NBA) 
    --Continuous assignment 
    --$display command 
    --Evaluate input and output of primitives 
2) Inactive region 
    --#0 blocking assignments 
3) NBA(non-blocking assignment update) 
    --update LHS of non-blocking assignments (NBA) 
4) Postponed 
    --$monitor command 
    --$strobe command 

使用阻塞分配的「=」爲在同一時間兩個可變時隙導致競爭條件

如:Verilog代碼與競爭條件,

always @(posedge Clock) 
    BCD0 = 0; // Usage of blocking statements should be avoided 
always @(posedge Clock) 
    BCD1 = BCD0; 

爲了避免競態條件使用非阻塞語句「< =」

例如:

always @(posedge Clock) 
     BCD0 <= 0; // Recommended to use NBA 
    always @(posedge Clock) 
     BCD1 <= BCD0; 

當執行該塊,將有兩個事件加入到非阻擋分配更新隊列。 因此,它在時間步驟結束時從BCD0更新BCD1。

使用非阻塞根據的Verilog LRM「< =」連續賦值語句賦值是不允許的,會導致編譯錯誤。

如:

assign BCD0 <= BCD1; //Results in compilation error 

僅使用NBA的過程賦值語句,

- initial and 
- always blocks 
3

這就是所謂的 '非阻塞' 分配。非阻塞賦值允許設計人員描述狀態機更新,而無需聲明和使用臨時存儲變量。

例如,在此代碼中,當您使用非阻塞賦值時,其操作將不會被註冊,直到下一個時鐘週期。這意味着作業的順序是不相關的,並且會產生相同的結果。

另一個賦值運算符'='被稱爲阻塞賦值。當使用'='賦值時,出於邏輯的目的,目標變量會立即更新。

的理解這一點更深入,請看看下面這個例子(維基百科):

module toplevel(clock,reset); 
    input clock; 
    input reset; 

    reg flop1; 
    reg flop2; 

    always @ (posedge reset or posedge clock) 
     if (reset) 
     begin 
      flop1 <= 0; 
      flop2 <= 1; 
     end 
     else 
     begin 
      flop1 <= flop2; 
      flop2 <= flop1; 
     end 
endmodule 

在這個例子中,flop1 <= flop2flop2 <= flop1會掉這兩個reg S的值。但是,如果我們使用阻止作業,=,這不會發生,行爲將是錯誤的。

-1

**你的問題是downvoted因爲它是你可以很容易地在一個基本的Verilog講義或書找到。對於你或其他人在這樣的論壇上被問到是非常有幫助的。

由於大部分說,這是一個「非阻塞< =」賦值廣泛用於時序邏輯設計,因爲它最能效仿。 這是爲什麼:主要牽涉延遲(這裏posedge時鐘),它是類似的東西調度RHS到LHS的評估所提到的延遲之後,並移動到下一個聲明(模擬順序)的流動不像「阻塞=」這將實際上延遲下一條語句的執行,符合上述延遲(模擬組合)

+0

作爲堆棧的標準做法,在downvoting之前,您必須解釋原因。我的回答絕對正確,只是以非常精確的方式和用我自己的語言提到。 – 2015-04-02 18:50:02

1

「< =」是一個verilog中的非阻塞賦值運算符。「=」是一個阻塞賦值運算符。

考慮下面的代碼..

[email protected](clk) 
begin 
a=b; 
end 

[email protected](clk) 
begin 
b=a; 
end 

的值和b正在使用兩種不同的總塊交換..使用「=」這裏引起了種族周圍條件。即。兩個變量a和b正在同時改變.. 使用「< =」將避免種族周圍。

[email protected](clk) 
begin 
a<=b; 
end 

[email protected](clk) 
begin 
b<=a; 
end 

希望我也有幫助..

0

<=是非阻塞分配。 <=語句並行執行。想象一下流水線架構,我們遇到這樣的任務。

小exammple:

//初始化一個,B,C分別具有1,2和3。 initial begin a <= 1 b <= 2 c <= 3 end

[email protected](clock.posedge) begin a <= b b <= c c <= a end

第一posedge時鐘後: a = 2, b = 3, c = 1

第二posedge時鐘後: a = 3, b = 1, c = 2

第三posedge時鐘後: a = 1, b = 2, c = 3

1

由於人們甲肝Ë已經解釋了阻塞/非阻塞的情況,我只要加入這個在這裏,以幫助理解。 「< =」 替換詞 「被」 當你閱讀代碼

例如:

....// Verilog代碼這裏

一個< = B //讀取它作爲一個得到乙

什麼時候一大家子B'在給定的時間段內,考慮硬件中發生在時隙中的所有事情,例如由時鐘驅動的特定採樣事件。如果在每5ns運行一個時鐘的模塊中使用「< =」運算符,設想A在每個其他「阻塞」分配已解決且在與其他非阻塞同時在該時隙結束時獲得B分配。

我知道它很混亂,它會在你使用和弄亂一堆設計並學習如何以這種方式工作時變得更好。