まず、この質問のタイトルを表現するのには多くの困難がありました。だから私が直面している問題を理解し、それを言葉で伝えるより良い方法があり、前に質問が答えられたなら、私は謝罪し、どうすれば解決できるか教えてください。とにかく、ここで私はわかりやすくするために切り捨てられてきた、関連するコードスニペットです:VerilogでのRAMビットの連結
parameter RAM_DEPTH = 256;
reg ram [0:RAM_DEPTH-1]; //256 deep memory, 1-bit size per location
parameter NUM_INST = 64;
parameter N = 4;
genvar x;
generate for (x = 0; x < NUM_INST; x = x + 1) begin: xs
//instantiate a module here
//connect N bits to input port
//which N bits depends module number x
mod inst (
.in(ram[x*N : x*N + N - 1]) //the error is here
);
end endgenerate
エラーは次のとおりです。
error: Array cannot be indexed by a range.
私はram
がreg ram [0:RAM_DEPTH-1]
代わりのreg [0:RAM_DEPTH-1] ram
として宣言されているためであると理解しています。しかし、N
パラメータに基づいてRAMビットの連結を自動化する方法があります。すなわち、.in({ram[x*N],ram[x*N+1],ram[x*N+2],ram[x*N+3]})
を書く代わりに、Nに基づいてビットを連結する自動範囲選択ロジックがあります。例えば、N = 256
非常に長い連結演算子を書く必要があり、モジュールのパラメトリックも小さくなります。
この場合、reg [0:RAM_DEPTH-1] ram
宣言を使用するだけで、代わりに1つのレジスタ配列のビット更新をサポートするためにモジュールを書き直す必要がありますか?
ありがとうございました。
http://stackoverflow.com/questions/18067571/indexing-vectors-and-arrays-withに記載されている方法を試したことがありますか?私はそれがこのようなもののためにうまくいくことを覚えているようだ... – wilcroft
Verilog 2001で可能になるはずです。どのような標準バージョンを使用していますか? –
@wilcroft あなたのリンクのソリューションは概念的に同じです。変数宣言を見ると、それは単一のNビットレジスタですが、N個の1ビットレジスタ(分散メモリブロックなど)を宣言しています。とにかく '+:'演算子を試しましたが、私はまだ同じエラーが発生しています。 @EugeneSh。 – sidmontu