クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

回路のゲート数と合成

このレッスンのあとで: 合成の結果を読んで、セルの数とラッチの有無を言える。

55分のレッスンコマンド11件デジタル設計のラボ:Verilog、VHDL、yosys を 1 台の専用 Ubuntu VM で

書いた回路は何個のゲートになるか

合成とは、ハードウェア記述言語で書いた回路を、実際のゲートとフリップフロップの組に変える作業です。できたセルの数は、回路の大きさと消費電力の目安になります。

同じ働きでも、書き方によって数が変わります。数を数える道具が、yosys です。

このレッスンのゴール

メモ

合成の結果を読んで、セルの数とラッチの有無を言える。

重要な言葉

ことばいみ
合成記述を、ゲートとフリップフロップの組に変えること
ネットリスト合成でできた、部品とつながりの一覧
セルネットリストの部品。ゲートやフリップフロップ
フリップフロップクロックの立ち上がりで、1ビットを覚えるセル
ラッチクロックなしで値を覚え続けてしまう、意図しないセル
yosys合成をして、セルを数える道具

学生が入力するセルは、このプレビューでは空白です。

hdl gates がセルの数を出す

ラボの hdl gates は、yosys で回路を合成して、できたセルを数えます。引数は、ファイル名と、一番上のモジュールの名前です。

最初に、配られた半加算器と4ビットのカウンターを数えます。カウンターのセルの内訳を見て、フリップフロップの数と、桁数を比べましょう。

ラボのフォルダに入る

コマンド
cd ~/hdl

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

半加算器を数える

コマンド
hdl gates half_adder.v half_adder

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

カウンターを数える

コマンド
hdl gates counter.v counter

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

セルの名前の読み方

セルの名前意味
$_AND_AND ゲート
$_XOR_XOR ゲート
$_NOT_反転のゲート
$_SDFF_PP0_同期リセット付きのフリップフロップ
$_DFF_P_ふつうのフリップフロップ
$_DLATCH_P_ラッチ

学生が入力するセルは、このプレビューでは空白です。

同じ働きでもセルの数は変わる

(a & b) | (a & ~b) は、a が1なら1、0なら0を出します。つまり、ただの a と同じです。

合成の道具が、自動でそこまで簡単にしてくれるとは限りません。2つの書き方を並べて、数えてみましょう。

長い書き方を書く

コマンド
printf "module long_way(input a, input b, output y);\n  assign y = (a & b) | (a & ~b);\nendmodule\n" > /tmp/long_way.v

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

長い書き方を数える

コマンド
hdl gates /tmp/long_way.v long_way

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

短い書き方を書く

コマンド
printf "module short_way(input a, input b, output y);\n  assign y = a;\nendmodule\n" > /tmp/short_way.v

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

短い書き方を数える

コマンド
hdl gates /tmp/short_way.v short_way

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

ラッチは書き忘れから生まれる

下のファイルは、en が1のときだけ q を決めます。en が0のとき、q はどうなるでしょうか。何も書かれていないので、前の値を覚え続けるしかありません。

これがラッチです。クロックのない、意図しない記憶で、設計の誤りです。

ラッチができる記述

コード: c
// en が0のとき、q の値が決まっていない。
module latchy(input en, input d, output reg q);
  always @(*) if (en) q = d;
endmodule

ラッチの記述を書く

コマンド
printf "module latchy(input en, input d, output reg q);\n  always @(*) if (en) q = d;\nendmodule\n" > /tmp/latchy.v

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

ラッチを数える

コマンド
hdl gates /tmp/latchy.v latchy

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

else を足した記述を書く

コマンド
printf "module fixed(input en, input d, output reg q);\n  always @(*) if (en) q = d; else q = 1'b0;\nendmodule\n" > /tmp/fixed.v

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

else を足すと数える

コマンド
hdl gates /tmp/fixed.v fixed

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

よくある間違い

注意

出力を決めない場合があっても、シミュレーションは動くので、大丈夫だと思いがちです。しかし合成すると、意図しないラッチができます。if には、必ず else をつけて、どの場合でも出力を決めましょう。

さらに挑戦: 4ビットの加算器

課題が通ったら、4ビットの足し算を書いて数えましょう。module add3(input [3:0] a, input [3:0] b, output [4:0] s); に、assign s = a + b; を1行書くだけです。

セルがいくつできるか、予想してから hdl gates で数えます。1ビットの足し算を4つつなぐと、何個要るかも考えましょう。

このラボとソースについて: デジタル設計のラボ:Verilog、VHDL、yosys を 1 台の専用 Ubuntu VM で

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。