サイズ指定なしの数値
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 15/90。
Unsized な数値(サイズ指定のない数値)とは、ビット数を明示せずに記述された数値のことです。サイズ プレフィックスを指定せずに数値を記述した場合、Verilog はデフォルトで 32 bits であるとみなします。
a = 'b1010; // Unsized: Verilog treats this as 32 bits
a = 32'b1010; // 上記と同じだが、明示的サイズ未指定の数値(Unsized numbers)は、フォーマットと値の形式のみを使用します: [format][value]
<strong>format</strong>— 数値の基数: 2進数はb、10進数はd、16進数はh、8進数はo<strong>value</strong>— 実際の数値(例えば、1010)
アポストロフィ ' はフォーマットと値の間に引き続き必要ですが、その前にビット数の指定はありません。
'b1010— 32ビットのbinary1010'd255— 32ビットのdecimal255'hFF— 32ビットのhexFF'b1— 32ビットのbinary1(先頭に31個のゼロが付く)
コード例:
reg [7:0] data;
initial begin
data = 1010; // サイズ未指定: 32ビット値(警告が出る可能性あり)
data = 'd255; // Unsized: 32-bit decimal 255
data = 'hFF; // サイズ未指定: 32ビット16進数 FF
endUnsized vs Sized
| Unsized | Sized | |
|---|---|---|
| 例 | 1010 または 'd255 | 8'b1010 または 8'd255 |
| ビット幅 | 32 bits(デフォルト) | explicit(指定通り) |
| アポストロフィ | フォーマット指定時に必要 | 必要 |
| 使用場面 | シンプルなテストベンチコード | ハードウェアの代入 |
Potential Problem
Unsized numbers can cause unexpected behavior when assigned to smaller registers:
reg [3:0] small;
small = 'b1111; // 32-bit value, but fits in 4 bits (fine)
small = 'b10000; // 32ビット値だが、大きすぎる!(警告)2番目の例では、32-bitの値 10000 を4-bitのレジスタに代入します。下位4 bit(0000)のみが保持されますが、これは意図した動作とは異なる場合があります。
Unsized数値を使用すべきタイミング
Unsized数値は以下の場合に便利です:
- テストベンチでのシンプルな数値
- ループカウンタ
$displayステートメント
実際のハードウェアへの代入では、明確にし警告を避けるためにsized数値を使用してください。
チャレンジ
以下のコードでは、いくつかの数値が unsized になっています。警告を回避するために、それらを sized の数値(8 bits)に変更してください。
作業内容:
aを 1010 の 8-bit binary 数値に変更しますbを 255 の 8-bit decimal 数値に変更しますcを FF の 8-bit hex 数値に変更します
自分で試してみよう
module unsized_challenge;
reg [7:0] a, b, c;
initial begin
a = 'b1010; // Change to sized (8-bit binary)
b = 'd255; // サイズ付きに変更(8ビット10進数)
c = 'hFF; // Change to sized (8-bit hex)
$display("a = %b", a);
$display("b = %b", b);
$display("c = %b", c);
$finish;
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。