生活随笔
收集整理的這篇文章主要介紹了
组合逻辑过程块
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
組合邏輯過程塊
always_comb代表組合邏輯
always_comb過程塊表示建立組合邏輯模型
always_comb
if(!mode)y = a + b;
elsey = a - b;
always_comb能推斷出其敏感表
與通用always過程塊不同,always_comb塊的后面不需要指明敏感表。軟件工具已經知道設計的意圖是建立一個組合邏輯模型,因此這個組合邏輯的敏感表可以是自動推斷出來的。推斷的敏感表包含了所有被過程塊讀取(所謂讀取即信號出現在表達式右邊或作為條件語句的條件表達式中,下同)并在塊外賦值的信號。那些在此過程中被阻塞賦值語句賦值并且只在該過程塊讀取的臨時變量不包括在敏感表中。SystemVerilog的敏感表中還包括過程中調用函數的所有信號,但只被函數賦值和讀取的臨時變量除外。
禁止出現共享變量
always_comb過程塊仍然要求被賦值的變量不能再次在其他過程被賦值。這樣限制避免了非組合邏輯的共享變量的出現。這種限制也符合綜合的指導原則,并且確保了所有的軟件工具(不僅僅是綜合工具)都采用同樣的建模規則。
無歧義的設計意圖
零時刻自動求值
always_comb確保輸出與輸入值保持時間一致
always_comb過程塊與always過程塊的另一個不同之處在于,在所有initial和always過程塊啟動后,always_comb塊會在仿真的零時刻自動出發。不管推斷出的敏感表中的信號是否發生了變化,這樣的自動求值都會發生。always_comb的這種特殊的語義確保了組合邏輯在零時刻產生與輸入相對應的輸出結果。特別是在使用缺省值為邏輯0的兩態變量建模時,這種零時刻的自動求值顯得尤為重要,復位信號很可能不會引起組合邏輯的敏感表中的信號發生變化。而如果沒有變化,通用always過程塊不會被觸發,從而使輸出變量也不會變化。
一個采用枚舉類型建模的簡單有限狀態機。
三個可能的狀態是WAITE、LOAD、STORE
。狀態機復位后處于WAITE狀態。狀態機的
組合邏輯會對當前狀態進行解碼,如果當前
狀態的組合邏輯為WAITE,則下一個狀態為LOAD。
在每個clock信號的上升沿,狀態時序邏輯都會將
變量NextState的值賦給變量Statemodule controller(output logic read,write,input instr_t instruction,input logic clock,resetN
);
enum {WAITE,LOAD,STORE}State,NextState;
always@(posedge clock,negedge resetN)if(!resetN) State <= WAITE;else State <= NextState;always@(State)
begincase(State)WAITE:NextState = LOAD;LOAD:NextState = STORE;STORE:NextState = WAITE;encase
endalways@(State,instruction)
beginread = 0; write = 0;if(State == LOAD && instruction == FETCH) read = 1;else if(State ==STORE && instruction == WRITE) write = 1;
end
endmoudle
module controller(output logic read,write,input instr_t instruction,input logic clock,resetN
);
enum {WAITE,LOAD,STORE}State,NextState;
always@(posedge clock,negedge resetN)if(!resetN) State <= WAITE;else State <= NextState;always_comb
begincase(State)WAITE:NextState = LOAD;LOAD:NextState = STORE;STORE:NextState = WAITE;encase
endalways_comb
beginread = 0; write = 0;if(State == LOAD && instruction == FETCH) read = 1;else if(State ==STORE && instruction == WRITE) write = 1;
end
endmoudle
always_comb敏感列表包含函數讀取的信號
SystemVerilog中的always_comb過程塊則消除了@*的這點缺陷。always_comb過程塊內讀取的信號和塊內調用的函數的信號都敏感。這樣編寫函數時就不需要形式參數了。在設計過程中,即使函數引用的信號的發生變化,也不需要修改函數形式參數列表和調用函數的代碼。
always_comb過程塊會對data、sel、c、d和e敏感
always@* //推斷出@(data)
begina1 = data << 1;b1 = decode();...
endalways_comb //推斷出@(data,sel,c,d,e)
begina2 = data << 1;b2 = decode();...
endfunciton decode;//不帶輸入的函數
begincase(sel)2'b01: decode = d|e;2'b10:decode = d&e;default : decode = c;endcase
end
endfunction
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的组合逻辑过程块的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。