135 lines
3.3 KiB
Markdown
135 lines
3.3 KiB
Markdown
# Iverilog 测试示例
|
||
|
||
这个目录包含一个简单的 Verilog 项目示例,用于测试 IC Coder 插件的 VCD 生成功能。
|
||
|
||
## 文件说明
|
||
|
||
- **counter.v** - 一个简单的 4 位计数器模块
|
||
- **counter_tb.v** - 计数器的测试平台(testbench)
|
||
|
||
## 功能说明
|
||
|
||
### counter.v(顶层模块)
|
||
|
||
这是一个同步复位的 4 位计数器:
|
||
- **输入**:
|
||
- `clk` - 时钟信号
|
||
- `rst_n` - 低电平有效的复位信号
|
||
- **输出**:
|
||
- `count[3:0]` - 4 位计数值(0-15)
|
||
|
||
### counter_tb.v(测试平台)
|
||
|
||
测试平台包含:
|
||
- 时钟生成器(100MHz,周期 10ns)
|
||
- 复位序列(初始复位 20ns)
|
||
- VCD 波形文件生成
|
||
- 信号监控和显示
|
||
|
||
## 使用方法
|
||
|
||
### 方法 1:使用 IC Coder 插件(推荐)
|
||
|
||
1. 在 VS Code 中打开这个 `examples` 目录作为工作区
|
||
2. 打开 IC Coder 插件面板
|
||
3. 在聊天框中输入以下任一命令:
|
||
- `生成 VCD`
|
||
- `运行仿真`
|
||
- `生成波形`
|
||
4. 插件会自动编译并运行仿真,生成 `output.vcd` 文件
|
||
|
||
### 方法 2:手动运行(用于测试)
|
||
|
||
在命令行中执行:
|
||
|
||
```bash
|
||
# 进入示例目录
|
||
cd "D:\IC Coder Plugin\ic-coder\tools\iverilog\examples"
|
||
|
||
# 编译 Verilog 文件
|
||
"D:\IC Coder Plugin\ic-coder\tools\iverilog\bin\iverilog.exe" -o simulation.vvp counter.v counter_tb.v
|
||
|
||
# 运行仿真
|
||
"D:\IC Coder Plugin\ic-coder\tools\iverilog\bin\vvp.exe" simulation.vvp
|
||
|
||
# 查看生成的 VCD 文件
|
||
ls -lh output.vcd
|
||
```
|
||
|
||
## 预期输出
|
||
|
||
### 控制台输出
|
||
|
||
```
|
||
Time=0 ns, rst_n=0, count=0 (0x0)
|
||
Time=20 ns, rst_n=1, count=0 (0x0)
|
||
Time=25 ns, rst_n=1, count=1 (0x1)
|
||
Time=35 ns, rst_n=1, count=2 (0x2)
|
||
Time=45 ns, rst_n=1, count=3 (0x3)
|
||
...
|
||
Time=215 ns, rst_n=1, count=15 (0xf)
|
||
Final count value: 15
|
||
```
|
||
|
||
### 生成的文件
|
||
|
||
- **simulation.vvp** - 编译后的中间文件(可以删除)
|
||
- **output.vcd** - VCD 波形文件(约 2-5 KB)
|
||
|
||
## 查看波形
|
||
|
||
使用 GTKWave 查看生成的 VCD 文件:
|
||
|
||
```bash
|
||
gtkwave output.vcd
|
||
```
|
||
|
||
在 GTKWave 中:
|
||
1. 在左侧 SST 窗口选择 `counter_tb`
|
||
2. 将信号 `clk`、`rst_n`、`count[3:0]` 拖到波形窗口
|
||
3. 点击 "Zoom Fit" 查看完整波形
|
||
|
||
## 波形说明
|
||
|
||
你应该能看到:
|
||
- **clk** - 规则的时钟信号(10ns 周期)
|
||
- **rst_n** - 初始 20ns 为低电平,然后保持高电平
|
||
- **count** - 从 0 开始递增到 15 的计数值
|
||
|
||
## 故障排除
|
||
|
||
### 问题:编译失败
|
||
|
||
**检查**:
|
||
- 确认 iverilog.exe 在 `tools/iverilog/bin/` 目录中
|
||
- 确认所有 DLL 文件都已复制
|
||
|
||
### 问题:VCD 文件未生成
|
||
|
||
**检查**:
|
||
- testbench 中是否包含 `$dumpfile("output.vcd");`
|
||
- testbench 中是否包含 `$dumpvars(0, counter_tb);`
|
||
- 仿真是否正常结束(有 `$finish;`)
|
||
|
||
### 问题:路径错误
|
||
|
||
**解决**:
|
||
- 确保在正确的工作区目录中运行
|
||
- 检查路径中是否有特殊字符
|
||
|
||
## 扩展练习
|
||
|
||
你可以修改这个示例来学习:
|
||
|
||
1. **修改计数器位宽**:将 4 位改为 8 位
|
||
2. **添加使能信号**:只在使能时计数
|
||
3. **添加加载功能**:可以加载初始值
|
||
4. **创建递减计数器**:向下计数
|
||
5. **添加溢出标志**:计数到最大值时输出标志
|
||
|
||
## 参考资料
|
||
|
||
- Verilog 语法:https://www.asic-world.com/verilog/
|
||
- Icarus Verilog 文档:http://iverilog.icarus.com/
|
||
- GTKWave 使用:http://gtkwave.sourceforge.net/
|