1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Hardware Description LanguageAdvent Calendar 2024

Day 22

「Hardware Description Language」に今来た私が試したこと(ChatGPT先生と共に)

Last updated at Posted at 2024-12-21

はじめに

この記事は、Hardware Description Language Advent Calendar 2024 の22日目の記事となります。

アドベントカレンダのリストを見ていて、今、Hardware Description Languageに来た初心者の記録です。

ChatGPT先生に教えてもらう

ChatGPT先生に嘘を教えられている可能性は否定できないので、誤りがありましたら有識者の方のコメントをお願いいたします。
スクリーンショット 2024-12-17 9.23.52.png
スクリーンショット 2024-12-17 9.24.18.png

スクリーンショット 2024-12-17 9.24.34.png
スクリーンショット 2024-12-17 9.24.45.png
スクリーンショット 2024-12-17 9.24.56.png

なるほど。Verilogはどんな文法なんだろう
聞いてみよう。

スクリーンショット 2024-12-17 9.28.47.png
スクリーンショット 2024-12-17 9.29.08.png
スクリーンショット 2024-12-17 9.29.38.png

kouzou.v
module モジュール名 (入力, 出力);
  // ポート(入力と出力)の宣言
  input 入力名;
  output 出力名;

  // 内部の回路や信号の宣言
  wire 信号名;

  // 回路の動作を記述
  assign 出力名 = 入力名;

endmodule

スクリーンショット 2024-12-17 9.33.26.png

and_gate.v
module AND_Gate (a, b, y);
  input a, b;      // 入力信号
  output y;        // 出力信号

  assign y = a & b; // AND演算
endmodule

スクリーンショット 2024-12-17 9.38.37.png

スクリーンショット 2024-12-17 9.39.16.png

and_gate_tb.v
module Testbench;
  reg a, b;        // 入力信号のシミュレーション用変数
  wire y;          // 出力信号

  // AND_Gateモジュールをインスタンス化
  AND_Gate U1 (a, b, y);

  initial begin
    // シミュレーションでの入力値を設定
    a = 0; b = 0;
    #10; // 10単位時間待つ
    a = 0; b = 1;
    #10;
    a = 1; b = 0;
    #10;
    a = 1; b = 1;
    #10;

    $finish; // シミュレーション終了
  end
endmodule

スクリーンショット 2024-12-17 9.44.53.png
スクリーンショット 2024-12-17 10.03.18.png
スクリーンショット 2024-12-17 10.03.29.png

なるほどテストベンチを作って確認するのね。
拡張子は何?

スクリーンショット 2024-12-17 10.05.55.png
スクリーンショット 2024-12-17 10.06.11.png

defines.vh
// ヘッダーファイル defines.vh
`define AND_GATE_DELAY 10
and_gate.v
// ソースファイル and_gate.v
`include "defines.vh" // ヘッダーファイルを読み込む

module AND_Gate (a, b, y);
  input a, b;
  output y;

  assign #`AND_GATE_DELAY y = a & b; // 定義された遅延を使用
endmodule

なるほど。

入力と出力が同じ引数のような書き方なのは気になる

スクリーンショット 2024-12-17 10.08.31.png
スクリーンショット 2024-12-17 10.08.52.png

inout.v
module モジュール名 (入力信号, 出力信号);
  input 入力信号;  // 入力ポート
  output 出力信号; // 出力ポート
endmodule

スクリーンショット 2024-12-17 10.10.33.png

kouzou.v
module AND_Gate (a, b, y);
  input a, b;      // 入力ポート
  output y;        // 出力ポート

  assign y = a & b; // AND演算
endmodule

スクリーンショット 2024-12-17 10.11.18.png

add.c
int add(int a, int b) {
    return a + b;
}

スクリーンショット 2024-12-17 10.12.32.png
スクリーンショット 2024-12-17 10.12.58.png

スクリーンショット 2024-12-17 10.20.05.png

and.v
module Top_Module;
  wire a, b, y;

  // ANDゲートのインスタンス
  AND_Gate U1 (a, b, y); // 外部信号a, b, yをAND_Gateのポートに接続
endmodule

スクリーンショット 2024-12-17 10.22.17.png

信号線を書いているということね。でもその信号線が、入力なのか出力なのか、信号線の名前だけ見たのでは、分からんのでは?
スクリーンショット 2024-12-17 10.23.33.png

褒められた!

スクリーンショット 2024-12-17 10.24.08.png

non_ansi.v
module AND_Gate (a, b, y);
  input a, b;    // 入力ポートを内部で宣言
  output y;      // 出力ポートを内部で宣言

  assign y = a & b; // AND演算
endmodule

スクリーンショット 2024-12-17 10.24.55.png
スクリーンショット 2024-12-17 10.25.05.png

ansi.v
module AND_Gate (input a, input b, output y);
  assign y = a & b; // AND演算
endmodule

スクリーンショット 2024-12-17 10.31.35.png
スクリーンショット 2024-12-17 10.31.45.png
スクリーンショット 2024-12-17 10.31.52.png

なるほど腑に落ちた。

あっとテストベンチの拡張子を聞いてなかった。
スクリーンショット 2024-12-17 10.33.46.png
スクリーンショット 2024-12-17 10.34.06.png
スクリーンショット 2024-12-17 10.34.15.png

納得です。

何か試してみたい。練習問題を検索してみる。

itmediaさんの素晴らしい記事を発見。

ここの練習問題をChatGPT先生に聞いてみよう。
スクリーンショット 2024-12-17 10.38.11.png

logic_circuit.v
module logic_circuit (
    input A,
    input B,
    input C,
    output X
);

    wire or_out;
    wire not_out;

    // ORゲート
    assign or_out = A | B;

    // NOTゲート
    assign not_out = ~C;

    // ANDゲート
    assign X = or_out & not_out;

endmodule

ChatGPTの方はANSIでロジックを1つ1つ書いている。
一方、模範解答の方はnon ANSIでロジックをまとめて書いている。
という感じか。

テストベンチをChatGPT先生に作ってもらおう。

スクリーンショット 2024-12-17 10.43.20.png

logic_circuit_tb.v
module logic_circuit_tb;

    // テストベンチ用信号
    reg A;
    reg B;
    reg C;
    wire X;

    // 被テストモジュールのインスタンス化
    logic_circuit uut (
        .A(A),
        .B(B),
        .C(C),
        .X(X)
    );

    // テストケース
    initial begin
        // 波形を出力
        $dumpfile("logic_circuit_tb.vcd");
        $dumpvars(0, logic_circuit_tb);

        // 初期状態
        A = 0; B = 0; C = 0;
        #10; // 10タイムユニット待機

        A = 0; B = 0; C = 1;
        #10;

        A = 0; B = 1; C = 0;
        #10;

        A = 0; B = 1; C = 1;
        #10;

        A = 1; B = 0; C = 0;
        #10;

        A = 1; B = 0; C = 1;
        #10;

        A = 1; B = 1; C = 0;
        #10;

        A = 1; B = 1; C = 1;
        #10;

        // シミュレーション終了
        $finish;
    end

endmodule

スクリーンショット 2024-12-17 11.02.22.png

おお。網羅しているっぽい。

いざ実行!

これ動かすのはどうしたら良いのか。
Google先生で見つけた以下のサイトでトライしてみる。

使い方の参考にさせてもらったブログ

先ほどのコードを左、テストベンチを右に、貼り付ける。

スクリーンショット 2024-12-17 10.50.31.png

左のペインで適当なSimulatorを選択する。
左上の青色のRunボタンを押すと・・

スクリーンショット 2024-12-17 11.01.26.png

やったぁ!波形が出たぞ。
あってるのかな・・

真理値表をChatGPT先生に作ってもらう
スクリーンショット 2024-12-17 11.02.35.png
スクリーンショット 2024-12-17 11.02.56.png

波形と対比して入力が000のとき0で・・・
っと・・・。おお。全部正しい。

以上、「Hardware Description Language」に今来た私が試したこと(ChatGPT先生と共に)でした。
最後までご覧いただきましてありがとうございました!。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?