在Verilog中,參數化模塊被廣泛應用。參數可重新定義保證模塊的可配置性及可復用性。但是,函數及任務並無法像模塊一樣被參數化,減弱了Verilog的描述化能力。
SystemVerilog提供了一種方式解決上述限制,在參數化的類(class)中使用靜態(static)函數/任務。調用函數/任務時,重新定義類的參數,例程如下:
virtual class Functions #(parameter SIZE=32);
static function [SIZE-1:0] adder (input [SIZE-1:0] a, b);
return a+b;
endfunction
endclass
module top (input logic [63:0] a, b,
output logic [63:0] y);
always_comb
y = Functions #(64)::adder(a, b);
endmodule
參數化使我們只需要維護一個版本的函數/任務,而不是像原先因不同的數據類型,數據大小產生多個代碼版本。該功能有兩個使用限制:
- 類必須被聲明為虛擬(virtual)類
- 類必須定義在$unit命名空間中
上述代碼在Vivado 2014.3中可綜合通過,但是Synplify-Pro 2013.03不支持virtual class關鍵字聲明。
下篇預告:可綜合的SystemVerilog:命名空間