我想用SystemVerilog中的標準化內存接口製作一個模塊(在我的情況下是DSP),並希望模塊中的變量根據所連接接口中的總線寬度自動調整大小。我的基本原理是:通過允許代碼自動調整大小到任何連接的接口,代碼更加便攜,而不需要HDL編碼器傳入參數,告訴模塊將連接到它的所有接口總線的寬度(而不是這將是可怕的,它看起來更乾淨,沒有參數)。
但是,我似乎無法得到這個工作。這裏有一個例子說明了這個問題。在的Quartus II 12.1以下綜合類:
// Top level module with some 15-bit ports
module top (input [14:0] data_in,
output [14:0] data_out1, data_out2,
data_out3, data_out4);
test_interface my_interface(); // Initialize the interface
test_module my_module(.*); // Initialize & connect module
endmodule
// Define a simple interface:
interface test_interface();
logic [8:0] my_port;
endinterface
// Define the module:
module test_module (input [14:0] data_in,
test_interface my_interface,
output [14:0] data_out1, data_out2,
data_out3, data_out4);
localparam width1 = $size(data_in); // should be 15
localparam width2 = $size(my_interface.my_port); // should be 9
logic [width1-1:0] auto_sized1; // gets correct size (14:0)
logic [width2-1:0] auto_sized2; // **PROBLEM**: gets size of 0:0!
always_comb begin
auto_sized1 = 5; // ok
auto_sized2 = 5; // problem; value now truncated to 1
data_out1 = data_in + width1; // Yields data_in + 15 (ok)
data_out2 = data_in + width2; // Yields data_in + 9 (ok...!)
data_out3 = data_in + auto_sized1; // Yields data_in + 5 (ok)
data_out4 = data_in + auto_sized2; // Yields data_in + 1 (problem)
end
endmodule
注意width2
並最終得到正確的值(9) - 只是來不及爲它設置正確的auto_sized2
寬度。我最初認爲$size
只是在所有變量分配了它們的寬度後才被評估,但這似乎不是這種情況,因爲$size(data_in)
對於設置auto_sized1
的寬度工作得很好。
有什麼想法?再說一次,這對項目的成功並不重要,我對此很感興趣!
謝謝 -
與Adam的答案一致,看起來像一個編譯器錯誤。您的原始代碼適用於Incisive和Questa。 – dwikle
感謝您關注它,@dwinkle - 很高興知道這不是代碼本身的問題。 – Martin