概要
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 の名前が出ていないため、波形ファイルが読み込めたかは私からは確認できません。
波形の表示方法
- 左上の
SSTペインでcounter4_tbをクリックします。 - 下の信号一覧から
clk、rst、en、count[3:0]を選びます。 -
Append(または信号をダブルクリック)で右側の波形ペインに追加します。 - 波形が小さいときは、メニューの
Time→Zoom Fit(またはCtrl+Alt+F)で全体を表示します。
count[3:0] は、右クリックの Data Format → Decimal で10進表示に変えると見やすくなります。
ウィンドウが開かない場合や、信号が出てこない場合は教えてください。
写真
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
以上。
