当前位置: 首页 > news >正文

开源Verilog仿真即波形模拟工具iVerilog初步教程

文章目录

    • 下载安装
    • 文件准备
    • 仿真

下载安装

硬件编程最让人无语的就是综合与实现的耗时,这个时间非常微妙,既不像软件开发,一个进度条的时间基本就能搞定,也不像AI调参,可以一行代码调一天,而是刚好卡在十几分钟,几乎啥也做不了。所以,为了让自己尽量少一点浪费时间,事先对verilog的代码进行检查和仿真就显得格外重要,Icarus Verilog就是为此而生。

iVerilog是一款开源免费的Verilog编译器和仿真器,安装时注意勾选将可执行文件夹加入环境变量,安装完成后,可在命令行中用where语句检查下面三个工具是否存在,若安装成功,会返回其对应的路径。

where iverilog
where vvp
where gtkwave

这三个工具的功能为

  • 【iverilog】对verilog和VHDL文件进行语法检查,并进行编译,生成可执行文件
  • 【vvp】根据可执行文件,生成仿真波形文件
  • 【gtkwave】打开仿真波形文件,图形化显示波形

接下来,我们就逐一试用这三个功能

文件准备

我们需要准备一段测试代码和一段仿真代码,前者是我们希望实现的某个功能,后者用于模拟仿真环境,从而对我们的代码进行测试。

以最简单的控制led灯为例,下面代码的功能是,让led每隔15个时钟周期进行亮暗变化。当然,如果真的有LED灯,我们是没发看到这种高频变化的规律的,但从波形仿真的角度来说,这个频率刚好合适。

module led(input clk,input rst_n,output reg led
);reg [4:0] cnt;always @ (posedge clk or negedge rst_n) beginif(!rst_n)cnt <= 0;else cnt <= cnt==15 ? 0 : cnt+1;
endalways @ (posedge clk or negedge rst_n) beginif(!rst_n)led <= 0;else if(cnt == 15)led <= !led;
endendmodule

上述代码需要两个输入信号clk, rst_n和一个输出信号led,那么在仿真环境中,也需要对这三个信号进行定义。代码如下

`timescale 1ns/100psmodule led_tb;parameter PERIOD = 10;reg SYSCLK;
reg NSYSRESET;initial beginSYSCLK = 1'b0;NSYSRESET = 1'b0;
end/*iverilog */
initial begin$dumpfile("wave.vcd");    //生成的vcd文件名称$dumpvars(0, led_tb);    //tb模块名称
end
/*iverilog */initial begin#(PERIOD * 10 )NSYSRESET = 1'b1;#1000$stop;
endalways @(SYSCLK)#(PERIOD / 2.0) SYSCLK <= !SYSCLK;led u_led (.rst_n(NSYSRESET),.clk(SYSCLK),.led( led)
);endmodule

其中,被/*iverilog*/框起来的区域,是iverilog特有的语法,其中【dumpfile】用于生成波形文件,【dumpvars】指定要记录的波形,0表示记录led_tb模块及其子模块中的所有变量。

仿真

编译和仿真的语句如下

iverilog -o wave led_tb.v led.v

其语法与gcc相似,【-o wave】代表输出名为wave的文件,后面【led_tb.v】和【led.v】即为准备编译的文件。该命令被执行后,同目录下会生成wave文件,该文件可用于生成波形。

生成波形的语句如下

vvp -n wave -lxt2

其中,【-n wave】用于指定生成波形的文件,lxt2是一种二进制格式,可以理解为vcd文件的一种。当执行完该文件后,同级目录下会生成wave.vcd文件,该文件可通过gtkwave打开,以查看波形

gtkwave wave.vcd

弹出gtkwave窗口后,点击SST侧栏中的树形图,则Signal中会出现对应的信号,双击信号,即可将其显示在右侧的波形图中。通过Ctrl键和鼠标滚轮,可以调整波形图的时间坐标,结果如下

在这里插入图片描述

http://www.dtcms.com/a/336838.html

相关文章:

  • 香港数据合集:建筑物、手机基站、POI、职住数据、用地类型
  • Java 中表示数据集的常用集合类
  • 【快速解决】Redis配置问题以及解决方法
  • 世界模型之自动驾驶
  • 实战架构思考及实战问题:Docker+‌Jenkins 自动化部署
  • 基于Android的随身小管家APP的设计与实现/基于SSM框架的财务管理系统/android Studio/java/原生开发
  • Rust 教程之简介000
  • 【网络安全实验报告】实验六: 病毒防护实验
  • Rust 异步中的 Waker
  • reGeorg、dnscat2--安装、使用
  • moe并行
  • 【Linux系统】进程间通信:System V IPC——消息队列和信号量
  • 灯哥FOC笔记(3) --FOC开环程序原理
  • 轨迹优化 | 基于边界值问题(BVP)的无约束路径平滑(附ROS C++/Python仿真)
  • 第二章:C语言数据类型和变量
  • PyTorch数据处理工具箱详解|深入理解torchvision与torch.utils.data
  • Gemini CLI 系统配置小结
  • ±2cm精度破壁者:有鹿机器人如何重写清洁行业规则?
  • java自动化更新
  • Git+Jenkins 基本使用
  • Win11安装WSL、Docker Desktop
  • MySQL集群、分布式
  • 如何生成结婚登记档案目录套打文件
  • 上下文切换及线程操作相关内容
  • Zephyr 中 BT_GATT_SERVICE_DEFINE 使用详解
  • 信创产业:从技术突围到生态重构的强国之路
  • 云计算- KubeVirt 实操指南:VM 创建 、存储挂载、快照、VMI全流程 | 容器到虚拟机(镜像转换/资源调度)
  • Python之Django框架开发Web应用,并部署到服务器
  • 【LeetCode题解】LeetCode 74. 搜索二维矩阵
  • Gartner发布2025年AI与网络安全成熟度曲线:用AI增强网络安全计划的27项技术与创新