MacVerilog(预览版)
在 macOS 的 VS Code 中,通过一条命令编译 Verilog、运行仿真并打开 VCD 波形。普通项目只需保存 .v/.sv 文件,插件自动识别测试台和同目录模块依赖,无需先填写 JSON。
必须提供测试台。 只有电路模块、没有时钟或输入激励时,插件不能推断你要测试什么,也不能自动生成有意义的测试结果。
前置条件
- macOS 和 VS Code 1.107.0 或更新版本。目前只在 macOS 本地环境验证过,未验证 Windows、Linux、远程工作区和浏览器版 VS Code。
- 已安装 Icarus Verilog,包含
iverilog 和 vvp。如果已安装 Homebrew,可在终端执行 brew install icarus-verilog。
- 在 VS Code 扩展面板安装 Verilog-HDL/SystemVerilog(扩展 ID:
mshr-h.veriloghdl),用于通过 Fliplot 查看波形。MacVerilog 不内置这两个第三方工具。
- 只运行可信来源的测试台。插件需要工作区信任,并会在本机执行编译器和仿真程序;它不是执行不可信代码的安全沙箱。
扩展先搜索 VS Code 进程的 PATH,再搜索 /opt/homebrew/bin 和 /usr/local/bin。若找不到工具,可在 VS Code 设置中指定 macverilog.iverilogPath、macverilog.vvpPath,值为对应可执行文件的绝对路径。
如何运行
- 安装 MacVerilog。使用本地安装包时,在命令面板执行
Extensions: Install from VSIX... 并选择 .vsix 文件;若命令未出现,执行 Developer: Reload Window。
- 打开项目文件夹,打开并保存要运行的
.v/.sv 文件。也支持直接打开已保存的单个源文件。
- 按 Shift + Command + P,输入
MacVerilog,选择 MacVerilog: 运行仿真并打开波形。注意是字母 P,不是打开生成任务的 B。
- 插件自动识别测试台、保存参与仿真的源码并运行;有多个候选测试台时会让你选择一个。成功生成本次波形后,自动打开 Fliplot。
日志位于“输出”面板的 MacVerilog 通道。运行进度通知可以取消,也可执行 MacVerilog: 停止仿真。默认仿真超时为 30 秒。
一个可直接运行的 .v 文件
在空文件夹中新建 counter_demo.v,粘贴下面的全部代码并保存,然后执行运行命令。不需要创建 JSON,也不需要手动配置生成任务。
`timescale 1ns/1ps
module counter4(input clk, input rst_n, output reg [3:0] count);
always @(posedge clk or negedge rst_n) begin
if (!rst_n) count <= 4'd0;
else count <= count + 1'b1;
end
endmodule
module counter_demo_tb;
reg clk = 0;
reg rst_n = 0;
wire [3:0] count;
counter4 dut(.clk(clk), .rst_n(rst_n), .count(count));
always #5 clk = ~clk;
initial begin
$dumpfile("build/counter_demo.vcd");
$dumpvars(0, dut);
#12 rst_n = 1;
#28;
if (count !== 4'd3) $fatal(1, "counter mismatch");
$display("PASS: count=%0d", count);
$finish;
end
endmodule
预期:仿真持续 40 ns,计数在 15、25、35 ns 上升沿变成 1、2、3,日志出现 PASS: count=3。生成文件位于该文件夹的 build/ 中;源码不会被改写。若波形时间轴只显示开头一小段,请在 Fliplot 中调整缩放。
上面的示例代码允许复制、修改和再分发,用于自己的仿真示例;本项许可仅针对这段示例,不扩展到插件实现代码。
自动识别范围
- 没有项目配置时,扫描当前
.v/.sv 所在目录;没有活动源码时使用打开的项目目录。不递归扫描其他目录。
- 识别普通模块及参数化实例,优先使用当前文件中的唯一测试台;打开电路文件时也会查找同目录测试台。文件名不必与模块名相同。
- 使用已有的固定
$dumpfile 路径,支持当前目录或 build/ 中的 VCD。只有 $dumpvars 时使用 Icarus 默认的 dump.vcd。
- 缺少
$dumpvars 时,在 build/ 中创建临时采集模块;同时缺少 $dumpfile 时使用 build/<测试顶层>.vcd。运行结束后清理临时模块,不向源码插入采集语句。
- 自动识别不替代编译器检查。宏、include、包、接口等复杂工程请使用手动配置;重复模块和动态波形路径会报错,不会猜测运行目标。
高级项目配置
复杂项目可执行 MacVerilog: 初始化仿真项目,创建独立的 iverilog-project.json。已有配置优先于自动识别:
{
"top": "and_gate_tb",
"files": ["and_gate.v", "and_gate_tb.v"],
"wave": "build/and_gate.vcd",
"timeoutSeconds": 30
}
top 是测试顶层模块名;files 只列参与编译的源码。手动模式下,测试台需自行采集波形,wave 必须与 $dumpfile 一致,并放在项目的 build/ 中。可选 includeDirs(目录列表)和 defines(如 NAME、NAME=VALUE)。
多文件夹工作区优先使用当前编辑文件所属项目,无法确定时让你选择;不会将其他工作区的文件自动加入编译。
常见问题与限制
- 命令面板没有 MacVerilog: 确认扩展已安装并启用,然后重新加载 VS Code 窗口。Shift + Command + B 中只有 CMake 不代表扩展没有安装,请使用 Shift + Command + P。
- 找不到测试台: 补充输入激励、时钟和结束条件;仅有待测电路无法自动产生有意义的波形。
- 找不到工具或查看器: 分别检查 Icarus Verilog 和
mshr-h.veriloghdl,它们不会随本扩展一起打包。
- 运行一直不结束: 为测试台添加
$finish,或停止运行;插件也会执行超时保护。
- 波形很窄、重复信号显示异常: 缩放和信号显示由 Fliplot 提供。可手动调整缩放;采集
$dumpvars(0, dut) 可避免测试台与待测模块的重复别名。
- 已有波形却报错: 只有本次成功仿真且 VCD 已更新才会打开,旧波形不会被当成成功结果。
- 功能边界: 仅支持 VCD 和 Icarus 支持的语言特性;不支持 FST/GHW、完整 FPGA 综合、厂商 IP 流程。自动采集在时间 0 开始,复杂采集逻辑应自行编写。
许可
MacVerilog 为专有软件,允许免费安装使用,不授予插件代码的开源修改或再分发许可;详见安装包中的 LICENSE.txt。公开安装包包含可读取的 JavaScript 代码,这不代表软件采用开源许可证。第三方工具分别适用其自身许可。