Menu
CoddyTech

ビット幅なし数値

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 または 'd2558'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文

実際のハードウェア割り当てでは、明示的に指定して警告を避けるために、サイズ指定付きの数値を使用してください。

challenge icon

チャレンジ

以下のコードでは、サイズ指定のない数値がいくつかあります。警告を避けるため、8ビットのサイズ指定付き数値に変更してください。

やること:

  1. aを1010を表す8ビットの2進数に変更する
  2. bを255を表す8ビットの10進数に変更する
  3. 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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン

自分で練習してみよう: Verilogオンラインコンパイラ

変換を確かめる: N進数変換