iT邦幫忙

2021 iThome 鐵人賽

DAY 11
1
Software Development

verilog or very lag系列 第 11

【Day11】Function & Task

很多人對於 Function 以及 Task 有點混亂,這篇將帶你搞懂他們~

共有的特色

  • 他們都會寫在 Module 內而不是外面。
  • 都不能使用 wire 變數(原因大概也是 wire 不具有記憶性吧)。
  • 被使用時都會放在 always 內(所以適用 Behavioral level)。
  • 裡面都不能放 always block。

Function

  • 可以引用其他的 Function,但就是不能引用 task。
  • 至少要有一個以上的 input。
  • 最多只能有一個 Output。
  • 一定出現在等號右邊(有 output 值)。

EX:
輸入數字計算需要的位寬大小

function integer log2;
  input integer in ;
  for(log2=0; in>1; log2=log2+1) begin
    in = in >> 1 ;
  end
endfunction

引用 log2:

parameter width = 16;
reg [log2(width)]:0]a;//5 bit register a

在這邊值得注意的是,上面雖然用了 integer,你可能會想,這樣不是很耗硬體資源嗎,不如自己算好 log2 再打上數字還比較省資源,但其實那些數字會在 "前置處理器" 就先幫你算出來了,所以並不會合成出實際的電路~
(在 quartus 編譯好然後查看 RTL Viewer 就可以知道了~)


Task

  • 可以引用其他的 Function 以及 task。
  • 不一定要宣告 input、output,有的話可以有數個都沒問題。

EX:
七段顯示解碼(共陰)

task give_seg;
  input reg [13:0]in;
  output reg [7:0]out;
  casex(in)
    14'd0:out = 8'b11111100;
    14'd1:out = 8'b01100000;
    14'd2:out = 8'b11011010;
    14'd3:out = 8'b11110010;
    14'd4:out = 8'b01100110;
    14'd5:out = 8'b10110110;
    14'd6:out = 8'b10111110;
    14'd7:out = 8'b11100000;
    14'd8:out = 8'b11111110;
    14'd9:out = 8'b11100110;
    default:out = 8'b00000010;
  endcase
endtask

上一篇
【Day10】模組化及引用模組
下一篇
【Day12】Latch的生成條件以及如何避免(上)
系列文
verilog or very lag30

尚未有邦友留言

立即登入留言