ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Icarus Verilog 入门实战:从 Hello World 到多文件设计、命令文件与根模块选择

Icarus Verilog 入门实战:从 Hello World 到多文件设计、命令文件与根模块选择 编译器硬件仿真EDA【免费下载链接】iverilogIcarus Verilog项目地址https://gitcode.com/gh_mirrors/iv/iverilog点击查看免费下载Icarus Verilogiverilog是一个开源 Verilog 编译与仿真工具链本指南基于仓库中的Documentation/usage/getting_started.rst展开带你从零开始掌握两条核心命令——编译器iverilog与仿真运行时vvp并逐步进阶到多文件设计、命令文件command file以及根模块root module的选择控制。读完本文你将能够独立完成编写 → 编译 → 仿真执行的完整流程并理解大型设计中如何组织源码、指定顶层模块。约定所有平台一致的命令行与源码文件后缀在进入具体示例之前需要先了解 Icarus Verilog 文档中使用的两条约定命令行在所有支持的操作系统上保持一致包括 Linux、Windows 以及各类 Unix 系统。文档示例中通用提示符%只是你所在系统提示符的占位符在 Windows 下这些命令是在命令行窗口中执行的。存放 Verilog 代码的文件通常使用.v或.vl后缀。这是社区通行约定并非 Icarus Verilog 的强制要求也有人使用.ver或.vlg。本指南及仓库示例统一使用.v后缀。仓库中的examples/目录即为这些约定的活例子例如 examples/hello.vl 使用.vl后缀文件头注释中还给出了与本文相同的编译命令iverilog -ohello hello.vl与运行命令vvp hello。第一步编译并运行 Hello World作为设计师使用 Icarus Verilog 的第一步是学会编译并执行哪怕最简单的设计。仿真场景下最典型的例子就是 Hello World 程序module hello; initial begin $display(Hello, World); $finish ; end endmodule用文本编辑器把上述代码保存为hello.v然后编译% iverilog -o hello hello.v-o标志告诉编译器把编译结果放到哪个文件这里生成hello。随后执行编译产物% vvp hello Hello, World程序就这样执行完毕了。整个过程分两步第一步iverilog读取并解释源文件、生成编译结果第二步vvp解释hello文件使程序真正运行起来。仓库中的真实示例略有不同——examples/hello.vl 将顶层模块命名为main而不是helloinitial块内的$display(Hello, World); $finish;逻辑与文档完全一致可直接按注释中的命令验证。理解两大核心命令iverilog 与 vvpiverilog与vvp是 Icarus Verilog 用户最重要的两个命令iverilog是编译器。它读取 Verilog 源码经过预处理、解析、细化elaboration、优化与代码生成后产生某种可执行形式。编译产物的格式由命令行开关决定默认是vvp 格式。vvp是仿真运行时引擎。它解释执行iverilog生成的 vvp 格式文件。从vvp/main.cc的用法说明可以看到其标准调用方式为Usage: vvp [options] input-file [plusargs...]见 vvp/main.cc即选项 仿真文件 可选扩展参数。编译器的完整用法可在驱动程序的帮助信息中看到见 driver/main.c包含-g1995/-g2001/-g2005/-g2009/-g2012/-g2017/-g2023等语言代际选项、-s顶层模块选项、-t目标格式选项等。值得一提的是若省略-o编译器默认把输出写入名为a.out的文件见 driver/iverilog.man.in。多文件设计两种组织方式随着设计变大变复杂会形成模块嵌套的层次结构把不同模块分文件存放变得自然。常见做法是每个文件放一个中等规模的模块或把一组相关的小模块放进同一文件编译时再把所有文件合并。文档以计数器模型counter.v和测试台counter_tb.v为例module counter(out, clk, reset); parameter WIDTH 8; output [WIDTH-1 : 0] out; input clk, reset; reg [WIDTH-1 : 0] out; wire clk, reset; always (posedge clk or posedge reset) if (reset) out 0; else out out 1; endmodule // countermodule test; /* Make a reset that pulses once. */ reg reset 0; initial begin # 17 reset 1; # 11 reset 0; # 29 reset 1; # 11 reset 0; # 100 $stop; end /* Make a regular pulsing clock. */ reg clk 0; always #5 clk !clk; wire [7:0] value; counter c1 (value, clk, reset); initial $monitor(At time %t, value %h (%0d), $time, value, value); endmodule // test方式一命令行直接列出文件iverilog支持多文件设计的两种方法最简单的是把文件全部列在命令行上% iverilog -o my_design counter_tb.v counter.v % vvp my_design该命令编译分布在两个输入文件中的设计并把结果写入my_design。这种方式适合中小型设计但文件一多就会变得繁琐。方式二命令文件command file另一种技术是使用命令文件在一个文本文件中逐行列出输入文件。例如创建file_list.txtcounter.v counter_tb.v然后用-c标志告诉 iverilog 把该文件当作 Verilog 输入文件列表来读取% iverilog -o my_design -c file_list.txt % vvp my_design命令文件技术明显支持更大的设计——你只需在文件中列出设计成员省去了在命令行上敲全部源码文件名的麻烦。命令文件的完整语法注释、plusargs、变量替换等记录在 Documentation/usage/command_files.rst 中例如以#或//开头的行是注释/* ... */支持多行注释不可嵌套以开头的行是编译器参数plusarg充当 token 分隔符因此含空格的路径也能表达-y path声明库搜索目录等价于更通用的libdirpath...$(name)是环境变量引用可在文件名或目录名中使用如-y $(VENDOR)/verilog/library使命令文件具有安装位置无关性注意即使 Windows 下也建议使用正斜杠以便跨平台共享还有incdir、definenamevalue、timescaleunits/precision、parametermain.WIDTH5等高级记录。一个展示主要语法要素的完整示例命令文件# This is a comment in a command file. # The -y statement declares a library # search directory -y $(PROJ_LIBRARY)/prims # # This plusarg tells the compiler that # files in libraries may have .v or .vl # extensions. libext.v.vl # main.v // This is a source file # # This is a file name with blanks. C:/Project Directory/file name.vl实际项目中命令文件可以长达数百行配合库library机制即使是大型设计也能得到相当精简的命令文件同一组源码还可以通过不同命令文件组合出多种设计配置。根模块自动选择与-s开关随着设计复杂化Verilog 模块会构成层次结构通常存在一个实例化其他模块、但自身不被任何模块实例化的模块称为根模块root module。Icarus Verilog 的默认策略是把所有未被其他模块实例化的模块都选为根模块根可以有多个。如果没有任何未被实例化的模块编译器将无法自动选出根此时必须用-s开关指定例如% iverilog -s main -o hello hello.v当存在多个候选根时所有根都会被细化elaborate——即使其中有些根你并不想仿真、或对仿真毫无影响编译器也会照做。这种情况很容易出现比如某个源文件包含多个模块而你只关心其中一部分。-s标志指定特定根模块同时关闭对其他根模块的自动搜索因此可以利用它阻止不想要的根被实例化。-s可以多次使用指定多个根其行为与 driver/iverilog.man.in 的描述一致如果用户用一个或多个-s标志指定根模块则它们将作为根模块使用替代默认选择。该手册还提示iverilog也可以配合-pflagvalue传递目标相关标志、用-t选择输出目标格式等。深入理解编译与细化的完整流水线理解编译过程对排查错误大有帮助。文档 Documentation/usage/simulation.rst 指出Icarus Verilog 把源码 → 可执行形式的编译划分为若干步骤边界虽常有重叠但这条主线始终成立宏预处理macro preprocessing完成define宏替换、include文本包含、ifdef/ifndef条件编译。预处理器在内部是独立程序可用-E标志单独调用% iverilog -E -o out.v example.v输出是去除了所有预处理指令的单一 Verilog 流。例如用-E -ofoo.v -DKEY10 src1.v src2.v可以把多个源文件预处理合并成单个foo.v。编译compile编译器核心把预处理后的 Verilog 转换为内部解析形式parsed form供后续处理使用该形式对用户不可见。细化elaboration选取根模块并实例化它们。这里需要区分模块module即类型与模块实例module instance——实例通过实例名区分一个模块可以被实例化多次。根模块是特例程序员不给根模块起实例名其实例名与模块名相同因为一个模块只能作为根出现一次。细化创建出作用域scope层次每个实例都有唯一的层级名hierarchical name错误信息和波形查看器都依赖这些层级名。优化optimization对细化后的设计做常量传播、死代码消除等变换得到更小但行为等价的设计。这个步骤只会影响编写 VPI 模块的程序员API 对设计结构的访问受限。代码生成code generation把优化后的设计写入可执行形式。仿真默认使用vvp 格式文本格式由仿真引擎执行用户也可以选择第三方代码生成器或其他目标。进阶实操语言代际、警告与运行期输入入门之后有几个高频使用的开关值得掌握详见 Documentation/usage/command_line_flags.rst-g语言代际选择如-g1995、-g2001、-g2005、-g2009、-g2012、-g2017、-g2023以及-g2001-noconfig禁用 config 文件关键字等多个-g标志可组合使用如-g2001 -gno-specify。还支持-gverilog-ams、-gassertions/-gsupported-assertions/-gno-assertions、-gspecify/-gno-specify、-gxtypes/-gno-xtypes等特性级开关。-W警告类别如-Wall涵盖 anachronisms、implicit、macro-replacement、portbind、select-range、timescale、sensitivity-entire-array 等、-Winfloop检测 always 语句可能的运行时死循环不在-Wall内、-Wtimescale检测 timescale 不一致等绝大多数类别可用no-前缀关闭。-Dmacro与-Ipath分别定义预处理宏-Dkeyvalue无值时视为1等价于define key value和追加 include 搜索目录多个-I按出现顺序搜索。-Psymbolvalue用 defparam 行为覆盖根模块实例的参数如-Pmain.foo2。运行期向仿真传递输入是另一个实用主题。vvp中仿真文件名之后的所有参数都是扩展参数以开头的可通过$test$plusargs与$value$plusargs系统函数访问不以开头的只能由基于 VPI 的 C 系统任务/函数访问。例如配合平方根计算模块sqrt32该模块在仓库中有对应实现 examples/sqrt-virtex.vif (! $value$plusargs(x%d, x)) begin $display(ERROR: please specify xvalue to start.); $finish; end编译并运行% iverilog -osqrt_plusargs.vvp sqrt_plusargs.v sqrt.v % vvp sqrt_plusargs.vvp x81 y 9x%d描述参数格式%d匹配十进制值81并赋值给x。传入多个参数同样简单vvp sqrt_plusargs.vvp x81 z64。此外还可以用$readmemh(sqrt.hex, data)从数据文件批量读入测试向量实现改文件、重跑仿真而不重新编译的批处理工作流。下一步当设计扩展到几十上百个文件时命令文件、自动模块库-y库目录、-l库文件、libext后缀声明等更高级的源码管理技术会成为必需品Icarus Verilog 对这些技术都有完整支持。继续阅读仓库中的 Documentation/usage/simulation.rst编译流水线与库机制详解、Documentation/usage/command_files.rst命令文件完整格式和 Documentation/usage/command_line_flags.rst全部编译器开关即可系统掌握从入门到大型设计的全部工具链能力。赞分享编译器硬件仿真EDA【免费下载链接】iverilogIcarus Verilog项目地址https://gitcode.com/gh_mirrors/iv/iverilog点击查看免费下载相关推荐Python基础入门从Hello World到文件操作实战Python基础入门从Hello World到文件操作实战 本文是一份全面的Python编程入门指南从环境搭建、基础语法到文件操作和函数编程系统性地介绍了教程文档React Fast Marquee性能优化指南打造高性能无限滚动效果React Fast Marquee性能优化指南打造高性能无限滚动效果 React Fast Marquee是一个轻量级React组件它利用CSS动画的强大Ventoy插件开发入门从Hello World到功能插件Ventoy插件开发入门从Hello World到功能插件 引言你还在为多系统启动盘配置繁琐而烦恼吗 当你需要在一个USB设备上管理多个操作系统镜像时是操作系统固件开发工具上一篇免费IDM激活终极指南3分钟永久解决下载管理器的激活弹窗问题下一篇Mac Mouse Fix 鼠标增强实操手册5 招让百元鼠标在 Mac 上像原装创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表