2013-01-13 56 views
4

我想用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的寬度工作得很好。

有什麼想法?再說一次,這對項目的成功並不重要,我對此很感興趣!

謝謝 -

+1

與Adam的答案一致,看起來像一個編譯器錯誤。您的原始代碼適用於Incisive和Questa。 – dwikle

+0

感謝您關注它,@dwinkle - 很高興知道這不是代碼本身的問題。 – Martin

回答

2

看起來像一個編譯器錯誤。我可能會在界面定義中使用一個參數。

module top (input [14:0] data_in, 
       output [14:0] data_out1, data_out2, 
          data_out3, data_out4); 

    test_interface #(.port_size(8)) my_interface(); // Initialize the interface 
    test_module my_module(.*);  // Initialize & connect module 
endmodule 

interface test_interface(); 
    parameter port_size = 1; 
    logic [port_size-1:0] my_port; 
endinterface 


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); 
    localparam width2 = my_interface.port_size; 
endmodule 
+0

感謝您的快速回復!是的,似乎最好是用參數解決它,如果它是一個編譯器錯誤(它似乎是)。 – Martin

相關問題