跳到主要内容
SystemVerilog

EDA Playground 使用教程

在线 Verilog/SystemVerilog 仿真平台入门指南

验证 工具 EDA Playground

EDA Playground 使用教程

1. 简介

什么是 EDA Playground?

EDA Playground = 在线数字电路仿真平台

特点:
  - 无需安装任何软件
  - 浏览器直接使用
  - 支持 Verilog/SystemVerilog
  - 内置仿真器和波形查看器
  - 免费使用

能做什么?

功能说明
编写代码在线编辑 Verilog/SystemVerilog
运行仿真支持 VCS、Icarus 等仿真器
查看波形内置 GTKWave 波形查看器
保存分享生成链接,可分享给他人

网址

https://www.edaplayground.com

2. 注册登录

步骤

1. 打开 edaplayground.com
2. 点击右上角 "Sign Up"
3. 填写邮箱和密码
4. 验证邮箱
5. 登录使用

注意事项

- 建议用工作邮箱注册
- 免费版有使用限制(每天仿真次数)
- 付费版无限制(个人学习免费版够用)

3. 界面介绍

主界面布局

┌─────────────────────────────────────────────────────────────┐
│  File  Edit  Help                              [Sign Out]   │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────────┐  ┌─────────────────────────┐  │
│  │                         │  │                         │  │
│  │    代码编辑区           │  │    仿真输出区           │  │
│  │    (test.sv)            │  │    (Console)            │  │
│  │                         │  │                         │  │
│  └─────────────────────────┘  └─────────────────────────┘  │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  工具选择区                                          │   │
│  │  Simulator: [Icarus Verilog v0.9.7]                 │   │
│  │  Language:  [SystemVerilog/Verilog]                 │   │
│  │  [Run] [Stop] [Open in Tab]                         │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

关键区域说明

区域作用
代码编辑区编写你的 Verilog/SystemVerilog 代码
仿真输出区显示仿真结果和错误信息
工具选择区选择仿真器、语言、运行仿真

工具选择区详解

Simulator(仿真器):
  - Icarus Verilog v0.9.7(推荐,免费)
  - Synopsys VCS(商业)
  - Cadence Xcelium(商业)

Language(语言):
  - Verilog
  - SystemVerilog

Run 按钮:运行仿真
Stop 按钮:停止仿真

4. 第一个仿真示例

示例 1:时钟生成

// testbench.sv
module testbench;
    reg clk;
    reg rst_n;

    // 时钟生成:每 5ns 翻转一次(周期 10ns,频率 100MHz)
    initial begin
        clk = 0;
        forever #5 clk = ~clk;
    end

    // 复位信号
    initial begin
        rst_n = 0;
        #20;
        rst_n = 1;
        #100;
        $finish;
    end

    // 打印信息
    initial begin
        $monitor("Time=%0t clk=%b rst_n=%b", $time, clk, rst_n);
    end
endmodule

操作步骤

1. 打开 edaplayground.com
2. 在代码编辑区粘贴上述代码
3. 选择 Simulator: Icarus Verilog v0.9.7
4. 选择 Language: SystemVerilog/Verilog
5. 点击 [Run] 按钮
6. 观察仿真输出

预期输出

Time=0 clk=0 rst_n=0
Time=5 clk=1 rst_n=0
Time=10 clk=0 rst_n=0
Time=15 clk=1 rst_n=0
Time=20 clk=0 rst_n=1
Time=25 clk=1 rst_n=1
...

5. 查看波形

步骤 1:添加波形查看代码

在 testbench 中添加以下代码:

// 在 initial 块中添加
initial begin
    $dumpfile("dump.vcd");  // 生成波形文件
    $dumpvars(0, testbench); // 记录所有信号
end

步骤 2:运行仿真

1. 点击 [Run] 运行仿真
2. 等待仿真完成
3. 点击 "Open in Tab" 按钮
4. 选择 "Waveform Viewer (GTKWave)"

步骤 3:在 GTKWave 中查看波形

GTKWave 界面:

┌─────────────────────────────────────────────────────────────┐
│  File  Edit  View  Search  Signal  Data  Time  Help        │
├─────────────────────────────────────────────────────────────┤
│  ┌──────────────┐  ┌─────────────────────────────────────┐ │
│  │ 信号列表     │  │  波形显示区                         │ │
│  │              │  │                                     │ │
│  │  testbench   │  │  clk  ─┐┌─┐┌─┐┌─┐┌─┐┌─┐          │ │
│  │    clk       │  │  rst_n ─┘└─┘└─┘└─┘└─┘└─┘          │ │
│  │    rst_n     │  │                                     │ │
│  │              │  │                                     │ │
│  └──────────────┘  └─────────────────────────────────────┘ │
│                                                             │
│  [Zoom In] [Zoom Out] [Zoom Fit] [Cursor]                  │
└─────────────────────────────────────────────────────────────┘

添加信号到波形

1. 在左侧信号列表中,双击信号名称
2. 信号会添加到波形显示区
3. 使用 Zoom Fit 按钮查看完整波形
4. 使用鼠标滚轮缩放波形

6. 波形解读

基本信号含义

信号含义波形特征
clk时钟信号规律的方波
rst_n复位信号(低有效)正常为1,复位时为0
valid有效信号1=有效,0=无效
ready就绪信号1=就绪,0=忙
data数据信号多位总线,显示十六进制值

波形解读示例

时钟信号 (clk):

  ┌───┐   ┌───┐   ┌───┐   ┌───┐
  │   │   │   │   │   │   │   │
──┘   └───┘   └───┘   └───┘   └───

  ↑       ↑       ↑       ↑
  上升沿  上升沿  上升沿  上升沿

  周期 = 两个上升沿之间的时间
  频率 = 1 / 周期
复位信号 (rst_n):

  ──────────────────────┐           ┌──────────
                        │           │
                        └───────────┘
                        ↑           ↑
                      复位开始    复位结束

  低电平期间,系统处于复位状态
握手信号 (valid/ready):

  valid ──────┐     ┌─────────────┐     ┌──────
              └─────┘             └─────┘

  ready ──────────────┐     ┌─────────────┐
                      └─────┘             └─────

              ↑           ↑
           传输完成    传输完成

  valid=1 且 ready=1 时,数据传输完成

测量工具

GTKWave 测量功能:

1. 点击 [Cursor] 按钮
2. 在波形上点击,添加光标
3. 查看时间信息:
   - 光标位置的时间
   - 两个光标之间的时间差

用途:
  - 测量时钟周期
  - 测量信号延迟
  - 测量脉冲宽度

7. 常用技巧

技巧 1:保存设计

1. 点击 File → Save
2. 输入设计名称
3. 生成保存链接
4. 可以随时通过链接访问

技巧 2:分享给他人

1. 保存设计后,复制浏览器地址栏的链接
2. 发送给同事/朋友
3. 他们打开链接即可查看代码和仿真结果

技巧 3:调试方法

方法 1:添加 $display 打印
  $display("Time=%0t data=%h", $time, data);

方法 2:添加 $monitor 监控
  $monitor("Time=%0t valid=%b ready=%b data=%h", 
           $time, valid, ready, data);

方法 3:查看波形
  - 找到问题时间点
  - 追踪信号变化
  - 分析原因

技巧 4:使用预设模板

EDA Playground 提供多种模板:
  - Basic Verilog
  - SystemVerilog
  - UVM Testbench

使用方法:
  点击 Load → 选择模板 → 修改代码

技巧 5:查看编译错误

如果仿真失败:
1. 查看仿真输出区的错误信息
2. 常见错误:
   - 语法错误(缺少分号、括号不匹配)
   - 信号未声明
   - 模块未定义
3. 根据错误信息修改代码

8. AXI 握手示例

简单的 valid/ready 握手仿真

module axi_handshake_tb;
    reg clk;
    reg rst_n;
    reg valid;
    reg ready;
    reg [31:0] data;

    // 时钟生成
    initial begin
        clk = 0;
        forever #5 clk = ~clk;
    end

    // 复位和激励
    initial begin
        rst_n = 0;
        valid = 0;
        ready = 0;
        data = 0;

        #20;
        rst_n = 1;

        // 第一次传输:主机发送,从机立即接收
        #10;
        valid = 1;
        ready = 1;
        data = 32'hDEAD_BEEF;
        #10;
        valid = 0;
        ready = 0;
        data = 0;

        // 第二次传输:主机发送,从机反压
        #10;
        valid = 1;
        ready = 0;  // 从机没准备好
        data = 32'hCAFE_BABE;
        #20;  // 等待 2 个周期
        ready = 1;  // 从机准备好
        #10;
        valid = 0;
        ready = 0;
        data = 0;

        #50;
        $finish;
    end

    // 波形输出
    initial begin
        $dumpfile("dump.vcd");
        $dumpvars(0, axi_handshake_tb);
    end

    // 打印信息
    initial begin
        $monitor("Time=%0t valid=%b ready=%b data=%h", 
                 $time, valid, ready, data);
    end
endmodule

波形解读

预期波形:

Time=0:   valid=0, ready=0, data=00000000  (空闲)
Time=30:  valid=1, ready=1, data=DEADBEEF (传输完成)
Time=40:  valid=0, ready=0, data=00000000 (空闲)
Time=50:  valid=1, ready=0, data=CAFEBABE (反压)
Time=70:  valid=1, ready=1, data=CAFEBABE (传输完成)
Time=80:  valid=0, ready=0, data=00000000 (空闲)

关键观察:
  - valid=1 且 ready=1 时,数据传输完成
  - valid=1 且 ready=0 时,从机反压,主机必须保持

9. 常见问题

Q1:仿真很慢怎么办?

原因:
  - 仿真时间太长
  - 代码中有无限循环

解决:
  - 减少仿真时间(#100 → #50)
  - 检查是否有死循环

Q2:波形显示不全?

解决:
  - 点击 Zoom Fit 按钮
  - 检查仿真时间是否足够
  - 检查 $dumpvars 是否正确

Q3:找不到信号?

解决:
  - 检查信号是否声明
  - 检查模块层次是否正确
  - 在信号列表中搜索信号名

Q4:如何查看内部信号?

方法:
  - 在 $dumpvars 中指定模块层次
  - 例如:$dumpvars(0, axi_handshake_tb.u_axi_master)

10. 学习建议

学习路径

第 1 阶段:熟悉工具(1-2天)
  - 注册账号
  - 运行第一个仿真
  - 学会查看波形

第 2 阶段:基础练习(1周)
  - 时钟、复位生成
  - 简单状态机
  - 握手协议

第 3 阶段:协议实践(2-3周)
  - AXI 握手
  - AHB 传输
  - APB 读写

第 4 阶段:项目实战(持续)
  - 完整模块验证
  - 断言编写
  - 覆盖率收集

推荐练习顺序

1. 时钟和复位
2. 计数器
3. 状态机
4. FIFO
5. AXI Slave
6. AHB Master
7. 完整 SoC 模块

总结

内容要点
工具EDA Playground(在线免费)
核心操作写代码 → 运行仿真 → 查看波形
波形解读时钟、复位、valid/ready 握手
调试方法$display 打印 + 波形分析
学习路径从简单到复杂,逐步深入

核心目标:能够独立完成仿真,看懂波形,定位问题。