2016-06-09 75 views
2

所以我使用了生成語句在我一直在處理的測試平臺中創建一些振盪器。SystemVerilog將值分配給生成的塊

我也有一個稱爲OSC_PER的實數陣列,其中陣列中的每個元素都是振盪器的ns週期。

我一直在試圖讓我的測試平臺工作,以便我給它一個參數(要測試的設備數量),並在我的測試臺和模擬中生成語句,實例化模塊並將所有東西連接起來。到目前爲止,這一切都進展順利,但我認爲我已經碰到了將振動週期分配給振盪器的問題。

generate 
    for(i=1; i<=num_duts; i++) 
    begin: generate_my_oscillators 
    osc osc_c_osc(.en(osc_en[i]), .out(osc_c[i])); 
    end 
endgenerate 

因此,這裏是如何我試圖分配值:

foreach(OSC_PER[i]) 
    generate_my_oscillators[i].osc_c_osc.per = OSC_PER[i]; 

這給了我NOTPAR錯誤;我想這是非法的嘗試迭代genvar語句之外的實例編號。好吧,也許我可以蠻力,只是手動奠定了這一切:

generate_my_oscillators[1].osc_c_osc.per = OSC_PER[1] 
if(number_devices >= 2) 
generate_my_oscillators[2].osc_c_osc.per = OSC_PER[2] 
if(number_devices >= 3) 
generate_my_oscillators[3].osc_c_osc.per = OSC_PER[3] 
. 
. 
. 

但是,如果我有= 2,然後在第三個條件,我得到CUVFGS(無效的換生成指數),其次是number_devices CUVUNF(未能查找第三個設備的組件名稱)。

如果我有想要分配給正在生成的振盪器的每個實例的值,我應該怎麼做呢?在這一點上我有點難過。也許我可以讓它在generate-for循環中分配?

編輯:我已經嘗試了一些更多的東西:

如果我動過OSC_PER的到我的測試平臺的定義,並試圖分配週期值在生成的語句是這樣,我得到花費「期待關鍵字 '端'「:

generate 
    for(i=1; i<=num_duts; i++) 
    begin: generate_my_oscillators 
    osc osc_c_osc(.en(osc_en[i]), .out(osc_c[i])); 
    .per = OSC_PER[i]; 
    end 
endgenerate 

好吧,我嘗試這樣做:

generate 
    for(i=1; i<=num_duts; i++) 
    begin: generate_my_oscillators 
    osc osc_c_osc(.en(osc_en[i]), .out(osc_c[i])); 
    osc_c_osc.per = OSC_PER[i]; 
    end 
endgenerate 

...我得到EXPLA:期待左括號。

期間在每個OSC內部信號,所以我不能把它作爲這樣的:

generate 
    for(i=1; i<=num_duts; i++) 
    begin: generate_my_oscillators 
    osc osc_c_osc(.en(osc_en[i]), .out(osc_c[i]), .per(OSC_PER[i]); 
    end 
endgenerate 

如果我這樣做,我得到CUVPOM:「每個」端口名稱無效或有多個連接。

現在我真的沒有想法。有什麼建議麼?

+0

'per'是'parameter','reg'還是'wire'?每個「 – Greg

+0

」是一個「真實」 –

回答

1

如果perparameter的建議的方式來分配是:

generate 
for(i=1; i<=num_duts; i++) begin: generate_my_oscillators 
    osC#(.per(OSC_PER[i])) osc_c_osc(.en(osc_en[i]), .out(osc_c[i])); 
end 
endgenerate 

或者parameter可以用defparam分配。由於該特性被考慮用於折舊(IEEE Std 1800-2012 § C.4.1)

generate 
for(i=1; i<=num_duts; i++) begin: generate_my_oscillators 
    osc osc_c_osc(.en(osc_en[i]), .out(osc_c[i])); 
    defparam osc_c_osc.per = OSC_PER[i]; 
end 
endgenerate 

跨越層次邊界分配內部值這discurraged不是合成的。但它允許進行模擬。

如果per是內部wire那麼它應該被分配一個assign語句。如果perregintegerreal等,OSC_PER是一個常數(如:parameter`define),然後使用一個initial聲明,否則的always @*

generate 
for(i=1; i<=num_duts; i++) begin: generate_my_oscillators 
    osc osc_c_osc(.en(osc_en[i]), .out(osc_c[i])); 
    // Pick one based on the type of per and OSC_PER 
    //assign osc_c_osc.per = OSC_PER[i]; // per is a wire 
    //initial osc_c_osc.per = OSC_PER[i]; // per is non-wire and OSC_PER is a constant 
    //always @* osc_c_osc.per = OSC_PER[i]; // per & OSC_PER are non-wire variables 
end 
endgenerate 

如果per不是一個參數,你希望它是綜合的,然後將其添加到端口列表。這需要修改osc模塊本身。請注意,浮點(例如real)可用作SystemVerilog中的端口進行仿真,但不可合成。