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
は最終的に正しい値 (9) を取得することに注意してください。width2
幅を正しく設定するには遅すぎauto_sized2
ます。最初は、すべての変数に幅が割り当てられた後に単純に評価されると思っていましたが、の幅を設定するのに問題なく機能$size
するため、そうではないようです。$size(data_in)
auto_sized1
何かご意見は?繰り返しますが、それはプロジェクトの成功にとって重要ではありません。私はこの時点で最も興味があります!
ありがとう -