2015-11-19 60 views
3

我創建了一個模塊,可以像添加一些流水線延遲一樣簡單。我將數據類型設置爲一個參數,以便它可以處理結構等複雜的事情。我有這樣的事情:傳遞解壓後的數組類型作爲參數

module pipe 
    #(parameter type T = int, 
    parameter DELAY = 0) 
    (
    input clk, 
    input T data_in, 
    output T data_out); 

    T pipe[DELAY]; 
    always_ff @(posedge clk) begin 
    pipe[0] <= data_in; 
    for(int i = 1; i<DEPTH; i++) begin 
     pipe[i] <= pipe[i-1]; 
    end 
    end 
    assign data_out = pipe[DELAY-1]; 
endmodule 

這個偉大的工程,但後來我發現自己想用解壓陣列使用它,我無法弄清楚如何實例它。這將是這個樣子,但我不認爲這是正確的:

logic [7:0] my_data [16]; 
logic [7:0] my_data_delayed [16]; 
pipe #(.T(logic [7:0] [16]), .DELAY(2)) i_pipe 
    (
    .clk(clk), 
    .data_in(my_data), 
    .data_out(my_data_delayed) 
); 

有沒有辦法得到一個變量的類型,因此它可以被傳遞到這個參數?

回答

2

在輸入問題時,我想出了一個答案。 type運算符(IEEE 1800-2012中的6.23節)規定了我所需要的。所以我的例子看起來是這樣的:

logic [7:0] my_data [16]; 
logic [7:0] my_data_delayed [16]; 
pipe #(.T(type(my_data)), .DELAY(2)) i_pipe 
    (
    .clk(clk), 
    .data_in(my_data), 
    .data_out(my_data_delayed) 
); 

當然,這會導致我的工具編譯錯誤,所以它看起來並不普遍支持。

我的解決方法是製作pipe模塊的實例數組。

3

您可以使用typedef做定義數據類型:

typedef logic [7:0] my_type [16]; 
my_type my_data; 
my_type my_data_delayed; 
pipe #(.T(my_type), .DELAY(2)) i_pipe 
    (
    .clk(clk), 
    .data_in(my_data), 
    .data_out(my_data_delayed) 
); 

剩下的問題是,如果它會與你的模擬器的工作。我嘗試過了,在EDAplayground,與VCS的工作,但不裏維埃拉-PRO(有一個「在此版本不支持」消息)


我能得到typedef struct { logic [7:0] data [16]; } my_type;工作。不太乾淨,但它是一種解決方法。

+0

Cadence Incisive 14.2說:「此數據類型不支持當前類型參數覆蓋」 – nguthrie

+0

@nguthrie,是否完全使用'struct'幫助? – Greg

+1

這樣做,但是,變得有點難看。我將堅持使用實例數組的當前解決方法。希望類型操作符將在一天內得到支持,因爲它看起來最有用。 – nguthrie