0
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?

自作MCPサーバー その8

0
Posted at

概要

MCPサーバーが気になったので、調べてみた。
AIに聞いた。
Desktop-Commanderやってみた。
verilogを、シミュレーションしてみた。

verilogは、知ってますか

はい、知っています。Verilogはデジタル回路を記述するハードウェア記述言語(HDL)で、FPGAの設計やASICの設計・検証に使われます。SystemVerilog(Verilogの拡張で、検証機能が強化されたもの)も扱えます。

できること

  • 組み合わせ回路・順序回路の記述(加算器、カウンタ、ステートマシン、FIFOなど)
  • テストベンチの作成(クロック生成、入力刺激、$display や $monitor での確認)
  • 波形(VCD)出力のためのコード作成
  • 既存コードのレビュー、バグ修正、合成可能な書き方への書き換え
  • 記述スタイルの相談(ブロッキング代入とノンブロッキング代入の使い分け、ラッチの意図しない生成の回避など)

シミュレーションについて
Verilogをシミュレーションするには、Icarus Verilog(iverilog / vvp)や Verilator などのツールが必要です。波形を見るにはGTKWaveがよく使われます。あなたのPCにこれらが入っているかは、さっきのcscと同じ要領で確認できます。入っていれば、C:\Users\ohisa\claude でコードを書いてシミュレーションまで一緒にできます。

確認してみますか。

//set PATH=C:\iverilog\bin;%PATH%

//set PATH=C:\iverilog\gtkwave\bin;%PATH%

iverilogが C:\iverilog\bin、GTKWaveが C:\iverilog\gtkwave\bin にあるということですね。実際に存在するか確認します。

iverilog、vvp、gtkwaveの3つとも見つかりました。バージョンはIcarus Verilog 12.0(devel)です。

コマンド パス
iverilog C:\iverilog\bin\iverilog.exe
vvp C:\iverilog\bin\vvp.exe
gtkwave C:\iverilog\gtkwave\bin\gtkwave.exe

貼ってもらった set PATH=... の行はcmd(バッチ)の書き方ですが、私が使っているのはPowerShellなので、同じ内容を $env:PATH = "C:\iverilog\bin;C:\iverilog\gtkwave\bin;" + $env:PATH と書いて通しています。このPATHの設定はそのコマンド内だけ有効です。そのため、私が実行するときは毎回この1行を先頭に付けるか、フルパスで呼び出します。

これでVerilogのシミュレーションができます。C:\Users\ohisa\claude に回路(たとえばカウンタ)とテストベンチを書いて、iverilog → vvp で実行し、VCD波形を出力するところまで試せます。GTKWaveはGUIアプリなので、起動すれば画面にウィンドウが開きます。

試すなら、どんな回路にしますか。決まっていなければ、4ビットカウンタで動作確認しましょうか。

お願いします

4ビットカウンタのシミュレーションが動きました。

作ったファイル(C:\Users\ohisa\claude)

  • counter4.v: 同期リセットとイネーブル付きの4ビットカウンタ
  • counter4_tb.v: テストベンチ(10ns周期のクロックでリセット、カウント、停止、再リセットを順に実行)
  • counter4.vcd: 波形データ

結果の確認ポイント

  • 最初の count=x は、リセット前で値が未確定の状態です。最初のクロックでリセットされて 0 になりました。
  • en=1 の間は 0 から 15 まで増え、その次に 0 に戻っています(4ビットなのでオーバーフローして1周します)。
  • en=0 にすると値が保持されます(count=2)。その後 rst=1 で 0 に戻りました。
  • 時刻の表示が t=5000 のようになっているのは、ps単位で出力されているためです。5000は5nsを表します。

波形をGTKWaveで見ますか。起動するとあなたの画面にウィンドウが開きます。

お願いします

GTKWaveを起動しました(プロセスID 5396)。画面にウィンドウが開いているはずです。ウィンドウのタイトルがexeのパスになっていて、counter4.vcd の名前が出ていないため、波形ファイルが読み込めたかは私からは確認できません。

波形の表示方法

  1. 左上の SST ペインで counter4_tb をクリックします。
  2. 下の信号一覧から clk、rst、en、count[3:0] を選びます。
  3. Append(または信号をダブルクリック)で右側の波形ペインに追加します。
  4. 波形が小さいときは、メニューの Time → Zoom Fit(または Ctrl+Alt+F)で全体を表示します。

count[3:0] は、右クリックの Data Format → Decimal で10進表示に変えると見やすくなります。

ウィンドウが開かない場合や、信号が出てこない場合は教えてください。

写真

image.png

counter4.v

// 4ビットカウンタ(同期リセット、イネーブル付き)
module counter4 (
    input  wire       clk,
    input  wire       rst,   // 同期リセット(High でクリア)
    input  wire       en,    // カウントイネーブル
    output reg  [3:0] count
);
    always @(posedge clk) begin
        if (rst)
            count <= 4'd0;
        else if (en)
            count <= count + 4'd1;
    end
endmodule

counter4_tb.v

`timescale 1ns/1ps

module counter4_tb;
    reg        clk = 0;
    reg        rst = 1;
    reg        en  = 0;
    wire [3:0] count;

    counter4 dut (.clk(clk), .rst(rst), .en(en), .count(count));

    // 10ns周期のクロック
    always #5 clk = ~clk;

    // 波形出力
    initial begin
        $dumpfile("counter4.vcd");
        $dumpvars(0, counter4_tb);
    end

    // 結果表示
    initial $monitor("t=%0t rst=%b en=%b count=%0d", $time, rst, en, count);

    // 入力刺激
    initial begin
        #12 rst = 0;          // リセット解除
        #8  en  = 1;          // カウント開始
        #180 en = 0;          // 18クロック分カウントして停止(4ビットなので1周する)
        #20  rst = 1;         // リセット
        #20  rst = 0;
        #20  $finish;
    end
endmodule

以上。

0
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
0
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?