2017-03-24 66 views
0

最近我想在實例化生成結構中的邏輯單元之前,使用簡單的數學等式預先計算所有必需的參數。在需要具有二維參數的情況下,如果二維陣列是一組固定值,例如使用函數的多維打包參數聲明

parameter para_1[1:0][2:0] = '{2{3{0}}};,則很容易。

但我想要的是一個函數,指定值,使複雜的等式可以在函數內部實現,然後將返回值分配給參數。

理想我想要的東西如下:

function func01 [1:0][1:0] (input int test); 
    int index; 
    for (index=0; index<=2; index++) begin 
    func01[index] = index + $floor(index/2) + $mod(index, 2) + test; 
    end 
endfunction 

parameter test1 = 1; 
parameter logic test2 [1:0][1:0] = func01(test1); 

但ModelSim的抱怨代碼通俗易懂的第一線 - ** Error: (vlog-13069) near "[": syntax error, unexpected '[', expecting ';' or '('.

最終的想法是讓計算在闡述所有參數/常數塊時間,以便這些可以在生成塊中用於實例化,也可以在制定時使用。

希望它是有道理的,並提前感謝。

最佳, 泰海

回答

0

首先,如果你想打包數組,尺寸範圍去數組名的左側。我建議使用明確的數據類型。

parameter bit [1:0][2:0] para_1 = '{2{3{0}}};. 

然後,函數聲明的返回類型出現在函數名稱之前。

function bit [1:0][1:0] func01 (input int test); 

順便說一句,如果你想有一個函數的返回類型有一個解壓的尺寸,你必須使用一個typedef,這在任何情況下,一個很好的做法。

typedef bit [1:0] myParam_t [2:0]; 
parameter myParam_t para_1 = '{default:0}; 
function myParam_t func01 (input int test); 
+0

非常感謝這個@ dave_59。標題和內容是爲了解包數組,而不是打包。抱歉。你的解決方案似乎是我在'typedef'方面所做的。但是,ModelSim不喜歡功能塊中的系統函數(例如$ floor)'系統函數不能用於常量函數中。有沒有繞道? – Tidus

+0

您需要使用SystemVerilog等效運算符('%'用於mod)或者編寫替換方程('let floor(val)= int'(val)> val?int'(val)-1:int'(val );'地板) –

+0

感謝那個戴夫。現在它爲我工作。 – Tidus