ビット幅なし数値
CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 15/90。
サイズ指定のない数値とは、ビット数を指定せずに記述された数値です。サイズ接頭辞を付けずに数値を記述すると、Verilog はデフォルトで32 ビットとして扱います。
a = 'b1010; // Unsized: Verilog treats this as 32 bits
a = 32'b1010; // 上と同じだが、明示的に指定しているサイズ指定のない数値では、形式と値のみを使用します: [format][value]
format: 数値の基数。2進数はb、10進数はd、16進数はh、8進数はoですvalue: 実際の数値(例:1010)
書式指定文字の前には引き続きアポストロフィ ' が必要ですが、その前にビット数はありません。
'b1010: 32ビットの2進数 1010'd255: 32ビットの10進数 255'hFF: 32ビットの16進数 FF'b1: 32ビットの2進数 1(先頭に31個のゼロが付く)
コード例:
reg [7:0] data;
initial begin
data = 1010; // サイズ指定なし: 32-bitの値(警告が出る場合があります)
data = 'd255; // Unsized: 32-bit decimal 255
data = 'hFF; // サイズ指定なし: 32-bitの16進数FF
endサイズ指定なしとサイズ指定あり
| サイズ指定なし | サイズ指定あり | |
|---|---|---|
| 例 | 1010 または 'd255 | 8'b1010 または 8'd255 |
| ビット幅 | 32ビット(デフォルト) | 明示的(指定どおり) |
| アポストロフィ | 形式指定とともに必要 | 必要 |
| 使用場面 | シンプルなテストベンチコード | ハードウェアへの代入 |
潜在的な問題
サイズ指定のない数値を小さなレジスタに代入すると、予期しない動作が発生することがあります。
reg [3:0] small_reg;
small_reg = 'b1111; // 32-bit value, but fits in 4 bits (fine)
small_reg = 'b10000; // 32ビットの値だが、大きすぎる! (警告)2つ目の例では、32ビットの値 10000 を4ビットのレジスタに代入します。下位4ビットだけが保持され(0000)、これは期待どおりではないかもしれません。
サイズ指定のない数値を使う場面
サイズ指定のない数値は、次の用途に便利です。
- テストベンチでの単純な数値
- ループカウンター
$display文
実際のハードウェア割り当てでは、明示的に指定して警告を避けるために、サイズ指定付きの数値を使用してください。
チャレンジ
以下のコードでは、サイズ指定のない数値がいくつかあります。警告を避けるため、8ビットのサイズ指定付き数値に変更してください。
やること:
aを1010を表す8ビットの2進数に変更するbを255を表す8ビットの10進数に変更するcをFFを表す8ビットの16進数に変更する
自分で試してみよう
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ
変換を確かめる: N進数変換