iT邦幫忙

2021 iThome 鐵人賽

DAY 7
1
Software Development

verilog or very lag系列 第 7

【Day07】Behavior Level

always block

  • always 若超過一行要用 begin、end 包起來。
  • always 內的變數若要賦值(等號左邊的變數)必須是 reg 型態,而等號右邊可以是 wire 或 reg 。
  • always的觸發條件若超過一項則以 "," 或是 "or" 區分。
  • 正緣觸發用 posedge,負原則是 negedge。
  • 若想以任意一個訊號 b 的變動來當作觸發原則是寫成 always@(b)
  • 若想隨時執行這個 block 寫成 always@(*)

EX:

always@(posedge clkSys or negedge rst_n)begin
  if(!rst_n)begin
    .....
  end
  else begin
    .....
  end
end


if-else語句

這裡的 if-else 跟 C 語言是相同的用法,不過值得一提的是,在描述組合邏輯電路時 else 最好要寫(循序邏輯則沒差),避免電路的描述不完整,容易產生 latch。

EX:

if(...)begin
  if()begin
    ....
  end
  else begin
    ....
  end
end
else if(...)begin
  ....
end
else begin
  ....
end

case、casex、casez語句

  • 一般 case 中的 item 不能有 "z" 或是 "x" ,只能出現 "0"、"1"。
  • casez 中的 item 值除了 "0"、"1" 外,"z" 也可以出現。
  • casex 中的 item 值除了 "0"、"1" 外,"z" 及 "x" 都可以出現。
  • 最後記得 endcase。
  • 除外的狀況寫在 default 內。

EX:

case(...)
  item_1:begin
    ....
  end
  item_2:begin
    ....
  end
  item_3:begin
    ....
  end
  item_4:begin
    ....
  end
  default:begin
    ....
  end
endcase

這邊的 default 跟 if-else 中的 else 一樣,不管有沒有用,在描述組合邏輯時都加上去,避免導致 latch,抑或是在 always block 的最上面先給初值也可以避免 latch 的產生。


上一篇
【Day06】Dataflow Level
下一篇
【Day08】for 迴圈在硬體的使用及該注意的那些事
系列文
verilog or very lag30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言