很多人對於 Function 以及 Task 有點混亂,這篇將帶你搞懂他們~
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 就可以知道了~)
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