Version:Sequoia 15.1 (24B83) 2024-11-06
一堆教程都是失效的,最后从源码安装GTKwave成功。
brew install icarus-verilog verilator graphviz gtk4 cmake
brew install desktop-file-utils shared-mime-info \
gobject-introspection gtk-mac-integration \
meson ninja pkg-config gtk+3
git clone "https://github.com/gtkwave/gtkwave.git"
cd gtkwave
meson setup build && cd build && meson install
# 用法
gtkwave [path to a .vcd, .fst, .ghw dump file or a .gtkw savefile]
写个ALU测试一下
alu.v
module alu (
input [3:0] a, b,
input [2:0] op,
output reg [3:0] result
);
always @(*) begin
case (op)
3'b000: result = a + b; // 加法
3'b001: result = a - b; // 减法
3'b010: result = a & b; // 按位与
3'b011: result = a | b; // 按位或
3'b100: result = a ^ b; // 按位异或
3'b101: result = ~a; // 按位取反
default: result = 4'b0000;
endcase
end
endmodule
alu_tb.v:
`timescale 1ns/10ps
module ALU_tb;
reg [3:0] A;
reg [3:0] B;
reg [2:0] operation;
wire [3:0] result;
wire cout;
ALU ALU(A, B, operation, result, cout);
initial begin
$dumpfile("alu.vcd");
$dumpvars(0, ALU_tb);
// Initial values
A = 4'b0000; B = 4'b0000; operation = 3'b000;
#20;
// Test cases
A = 4'b0001; B = 4'b0001; operation = 3'b000; // A + B
#20;
A = 4'b0001; B = 4'b0001; operation = 3'b001; // A - B
#20;
A = 4'b0001; B = 4'b0001; operation = 3'b010; // B + 1
#20;
A = 4'b0001; B = 4'b0001; operation = 3'b011; // B - 1
#20;
A = 4'b1001; B = 4'b0001; operation = 3'b100; // NOT A
#20;
A = 4'b0001; B = 4'b0010; operation = 3'b101; // A XOR B
#20;
A = 4'b0001; B = 4'b0001; operation = 3'b110; // A AND B
#20;
A = 4'b0001; B = 4'b0000; operation = 3'b110; // A AND B
#20;
A = 4'b0001; B = 4'b0000; operation = 3'b111; // A OR B
#20;
A = 4'b0000; B = 4'b0000; operation = 3'b111; // A OR B
#20;
$finish;
end
endmodule
编译出alu.vcd文件:
(HDL) szy@AppleM2 实验1 % iverilog -o alu_tb alu.v alu_tb.v vvp alu_tb
使用gtkwave查看波形图:
(HDL) szy@AppleM2 实验1 % gtkwave alu.vcd
把左下角四个Signals都挨个选中点出来: