配列
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 10/90。
配列を使用すると、1つの変数に複数の値を格納できます。配列内の各要素には、そのインデックスによってアクセスできます。
注意: 配列は独立したデータ型ではありません。これは、wire、reg、integer、または real 型のコレクションです。
配列の宣言
構文: <data_type> <name> [<size>];
reg [7:0] memory [0:255]; // 256バイトのメモリ(各8ビット)
reg data [0:7]; // 8個の1ビットレジスタ
wire [3:0] bus [0:3]; // 4つのバス、各4ビット幅
integer counters [0:9]; // 10個の整数括弧 [ ] 内の数値は、ビット幅ではなく配列のサイズです。
配列要素へのアクセス
reg [7:0] memory [0:3];
memory[0] = 165; // 10進数の165
memory[1] = 90; // 10進数の90
memory[2] = memory[0] + memory[1];
$display("%d", memory[2]); // 出力: 255配列は、テストデータを格納するためにテストベンチで非常に役立ちます。
多次元配列
複数の次元を持つ配列を作成できます:
reg [7:0] matrix [0:3][0:3]; // 8ビット値の4x4配列
matrix[0][0] = 255; // 8'hFF = 10進数の255
matrix[2][1] = 85; // 8'h55 = 10進数の85配列 vs ベクタ
| ベクタ | 配列 | |
|---|---|---|
| 概要 | 複数ビットの wire または reg | 複数の値の集合 |
| 構文 | [MSB:LSB] | [size] |
| 例 | reg [7:0] data; | reg [7:0] mem [0:255]; |
| アクセス | data[3] (ビット 3) | mem[3] (要素 3) |
ベクトルは複数のビットを持つ1つの値です。
配列は複数の値であり、それぞれが独自のビットを持ちます。
重要な注意事項
- 配列は、大きなサイズで使用される場合、多くのツールで合成可能ではありません
- 配列は主にテストベンチで使用されます
- ハードウェアメモリには、専用のメモリプリミティブを使用してください
チャレンジ
4つのテスト値を格納する配列を作成するために、以下のコードを完成させてください。
行うべきこと:
test_dataという名前の配列を宣言しますregデータ型を使用します(テストベンチで値を格納するため)- 各要素の幅は8ビットにする必要があります (
[7:0]) - 配列は4つの要素を持つ必要があります (
[0:3])
チートシート
配列は、インデックスによってアクセスされる複数の値を1つの変数に格納します。配列は、wire、reg、integer、または real 型の集合です。
宣言の構文: <data_type> <name> [<size>];
reg [7:0] memory [0:255]; // 256個の要素、各8ビット幅
wire [3:0] bus [0:3]; // 4個の要素、各4ビット幅
integer counters [0:9]; // 10個の整数要素へのアクセス:
memory[0] = 165;
memory[2] = memory[0] + memory[1];
$display("%d", memory[2]);多次元配列:
reg [7:0] matrix [0:3][0:3]; // 8ビット値の4x4配列
matrix[0][0] = 255;配列とベクトルの違い:
- ベクトル — 複数のビットを持つ1つの値:
reg [7:0] data;—data[3]はビット3にアクセスします - 配列 — それぞれが独自のビットを持つ複数の値:
reg [7:0] mem [0:255];—mem[3]は要素3にアクセスします
配列は主にテストベンチで使用されます。ハードウェアメモリについては、専用のメモリプリミティブを使用してください。
自分で試してみよう
module arrays;
// test_dataという名前の配列を宣言します
// 4つの要素を持ち、各要素は8ビット幅である必要があります
// regデータ型を使用します(テストベンチで値を保持するため)
integer i;
initial begin
test_data[0] = 170;
test_data[1] = 240;
test_data[2] = 204;
test_data[3] = 15;
for (i = 0; i < 4; i = i + 1) begin
$display("test_data[%0d] = %b", i, test_data[i]);
end
$finish;
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。