Verilog 中的 Always 語句

Verilog

基本語法

型態

全域變數

基本元件

多樣的寫法

指定

assign

always

initial

運算式

分枝

迴圈

模組

函數

Task

陣列

輸出入

觀察

真值表

測試程式

訊息顯示

注意事項

模擬程序

硬體工程

程式範例

Xor

Xor3

全加器

加法器

加減器

快速加法器

乘法器

ALU

閂鎖器

脈衝偵測

計數器

多工器

暫存器群

記憶體

延遲問題

浮點數

狀態機

程式計數器

CPU0-Mini

CPU0

pipeline

工具

QuartusII

Icarus

Veritek

訊息

相關網站

參考文獻

最新修改

簡體版

English

摘要1:Never use = (blocking) assignments in always@(posedge Clock) blocks. Only use always@(posedge Clock) blocks when you want to infer an element(s) that changes its value at the positive or negative edge of the clock.
摘要2:Never use <= (non-blocking) assignments in always@( * ) blocks. Only use always@( * ) block when you want to infer an element(s) that changes its value as soon as one or more of its inputs change

always
begin
// 程式碼
end

1. 當模擬開始後就會被執行
2. 執行到 end 之後會重新執行 begin
3. 通常用在設計電路時,有時也用在 test bench 當中。

範例:邊緣觸發正反器

reg q;

always @(posedge clk)
  q = d;

問題

  1. 真正的電路執行時所有的 always 區塊合成後是同步執行的。
  2. 但在跑 Verilog 模擬時,always @(posedge clk) 區塊是以一種順序的方式執行,只是順序是不一定的。

舉例而言:以下程式的執行順序並不一定,所以模擬的結果值也不一定,因此這是一個糟糕的程式。

reg d1, d2, d3, d4;
always @(posedge clk) d2 = d1;
always @(posedge clk) d3 = d2;
always @(posedge clk) d4 = d3;

正確的做法

reg d1, d2, d3, d4;
always @(posedge clk) begin
  d2 = d1;
  d3 = d2;
  d4 = d3;
end

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License