Re: [問題] always與assign的問題
※ 引述《CuckooBoy (阿書)》之銘言:
: 請問一個簡單的 C = A and B
: 可以用always與assign去寫
: 請問兩者差別為何 ?
: verilog 初學者,看過verilog的書了....
: 不過還是弄不清楚
: 不知到高手可以幫小弟解惑一下!!
: 你們應該會覺得這麼簡單還問.......不要罵我>"<
always begin...end block 基本上有兩種描述分別為
always @ (posedge clk) <--- edge trigger 電路,合成出暫存器
always @ (a or b or c) <--- event trigger 電路,合成出組合邏輯電路
ex.
1. always @ (a_in or b_in)
begin
sum = {1'b0, a_in} + {1'b0, b_in};
end
2. assign sum = {1'b0, a_in} + {1'b0, b_in};
以上兩種寫法都是合成出一個加法電路,assign的部份好理解就不說明
always的寫法為啥在模擬的時候也是組合邏輯
簡單的看,當always驅動事件中只要 a_in 以及 b_in 改變輸出 sum 也改變
那這不就相同於組合邏輯電路中只要輸入改變輸出就會經過延遲後可能改變
這也就是為什麼寫event trigger的時候sensitivity list一定要完整寫出
若是a_in沒有寫在list中,模擬器並不會因為a_in改變連帶讓sum改變
然而,合成結果為一加法器,輸入改變輸出依然可能會改變
這就會造成所謂的模擬的mismatch
因此寫成 always @ (event)/assign 都可以合成出組合邏輯電路
那為啥還要有 always block 的寫法,因為case等敘述得活在always block中
所以學會使用always @ (event trigger)的寫法還是很重要的
尤其是if/else, case中unconditional assignment以避免latch的產生是重點
以上的內容其實去上 CIC 的 Logic Synthesis with Design Compiler
王旭昇工程師都會很耐心的說明,包括Synthesizable Verilog HDL該節
初學者強烈建議去上上該門課,王工程師人很熱血問題有問必答喔
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.162.108.175
推
01/02 12:56, , 1F
01/02 12:56, 1F
→
01/02 13:16, , 2F
01/02 13:16, 2F
推
01/02 14:20, , 3F
01/02 14:20, 3F
推
01/03 00:02, , 4F
01/03 00:02, 4F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 3 篇):