这是可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行的命令验证器,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
Verilator - 将 Verilog 代码转换为 C++/SystemC
概要
验证器 --help
验证器 --version
verilator --cc [选项] [top_level.v]... [opt_c_files.cpp/c/cc/a/o/so]
verilator --sc [选项] [top_level.v] ... [opt_c_files.cpp/c/cc/a/o/so]
verilator --lint-only [top_level.v] ...
商品描述
Verilator 转换可综合(非行为)Verilog 代码,加上一些综合,
SystemVerilog 和一小部分 Verilog AMS 断言,转换为 C++ 或 SystemC 代码。 它
不是一个完整的模拟器,而是一个编译器。
使用类似于 GCC、Cadence Verilog-XL/NC-Verilog 或
Synopsys 的 VCS。 它读取指定的 Verilog 代码,对其进行 lint,并可选择添加
覆盖率和波形跟踪代码。 对于 C++ 和 SystemC 格式,它输出 .cpp 和 .h
文件。
Verilator 创建的文件然后用 C++ 编译。 用户写了一点C++
包装器文件,它实例化顶级模块,并将此文件名传递到
命令行。 这些 C 文件是用 C++ 编译的,并与 Verilated 文件链接。
生成的可执行文件将执行实际模拟。
首先,跳到“EXAMPLE C++ EXECUTION”。
论据 概要
这是 Verilator 参数的简短摘要。 详细说明见
下一节了解更多信息。
{file.v} Verilog 顶级文件名
{file.c/cc/cpp} 要编译的可选 C++ 文件
{file.a/o/so} 要链接的可选 C++ 文件
+1364-1995ext+ 使用带有文件扩展名的 Verilog 1995
+1364-2001ext+ 使用带有文件扩展名的 Verilog 2001
+1364-2005ext+ 使用带有文件扩展名的 Verilog 2005
+1800-2005ext+ 使用带有文件扩展名的 SystemVerilog 2005
+1800-2009ext+ 使用带有文件扩展名的 SystemVerilog 2009
+1800-2012ext+ 使用带有文件扩展名的 SystemVerilog 2012
--assert 启用所有断言
--autoflush 在所有 $displays 之后刷新流
--bbox-sys Blackbox 未知 $system 调用
--bbox-unsup Blackbox 不支持的语言功能
--bin 覆盖 Verilator 二进制文件
-CFLAGS makefile 的 C++ 编译器标志
--cc 创建 C++ 输出
--cdc 时钟域交叉分析
--clk 将指定信号标记为时钟
--编译器调整指定的 C++ 编译器
--收敛限制调谐收敛稳定时间
--coverage 启用所有覆盖
--coverage-line 启用线路覆盖
--coverage-toggle 启用切换覆盖
--coverage-user 启用 SVL 用户覆盖
--coverage-underscore 启用 _signals 覆盖
-D [= ] 设置预处理器定义
--debug 开启调试
--debug-check 启用调试断言
--debugi 在指定级别启用调试
--调试- 在某个级别启用调试源文件
--默认语言要解析的默认语言
+定义+ = 设置预处理器定义
--dump-tree 启用转储 .tree 文件
--dump-treei 在某个级别启用转储 .tree 文件
--dump-treei- 在某个级别的源文件中启用转储 .tree 文件
-E 预处理,但不编译
--错误限制在此数量的错误后中止
--exe 创建可执行文件的链接
-F 从文件中解析选项,相对
-F 从文件解析选项
--gdb 在 GDB 下交互运行 Verilator
--gdbbt 在 GDB 下运行 Verilator 进行回溯
--help 显示此帮助
-一世要搜索的目录包括
--if-深度调整 IFDEPTH 警告
+目录+ 要搜索的目录包括
--inhibit-sim 创建关闭sim的功能
--内联多调整模块内联
-LDFLAGS 生成文件的链接器预对象标志
-低密度脂蛋白makefile 的链接器库标志
- 语要解析的默认语言标准
+libext+ +[ext]... 用于查找模块的扩展
--lint-only Lint,但不输出
--MMD 创建 .d 依赖文件
--MP 创建虚假的依赖目标
--目录输出对象目录的名称
--mod-前缀名称添加到较低的类
--no-clk 防止将指定信号标记为时钟
--no-pins64 不要将 vluint64_t 用于 33-64 位信号
--no-skip-identical 禁用跳过相同的输出
+notimingchecks 忽略
-O0 禁用优化
-O3 高性能优化
-O 可选择的优化
-o 最终可执行文件的名称
--no-order-clock-delay 禁用排序时钟启用分配
--输出分割将 .cpp 文件拆分为多个部分
--output-split-cfuncs 拆分 .cpp 函数
--output-split-ctrace 拆分跟踪功能
-P 使用 -E 禁用行号和空格
--pins-bv 指定顶级端口的类型
--pins-sc-uint 指定顶级端口的类型
--pins-sc-biguint 指定顶级端口的类型
--pins-uint8 指定顶级端口的类型
--管道过滤器通过脚本过滤所有输入
- 字首顶级班级名称
--profile-cfuncs 用于分析的名称函数
--私人调试; 查看文档
--公开调试; 查看文档
--report-unoptflat UNOPTFLAT 的额外诊断
--savable 启用模型保存-恢复
--sc 创建 SystemC 输出
--stats 创建统计文件
--stats-vars 提供变量的统计信息
-sv 启用 SystemVerilog 解析
+systemverilogext+ +1800-2012ext+ 的同义词
--顶部模块顶层输入模块名称
--trace 启用波形创建
--跟踪深度追踪深度
--trace-max-array 跟踪的最大位宽
--trace-max-width 追踪的最大阵列深度
--trace-params 启用跟踪参数
--trace-structs 启用跟踪结构名称
--trace-underscore 启用 _signals 跟踪
-U取消定义预处理器定义
--展开计数调整最大循环迭代
--unroll-stmts 调整最大循环体尺寸
--未使用的正则表达式调整未使用的 lint 信号
-V 详细版本和配置
-v Verilog 库
+verilog1995ext+ +1364-1995ext+ 的同义词
+verilog2001ext+ +1364-2001ext+ 的同义词
-错误- 将警告转换为错误
-W未来- 禁用未知消息警告
-Wno- 禁用警告
-Wno-lint 禁用所有 lint 警告
-Wno-style 禁用所有样式警告
-Wno-fatal 在警告时禁用致命退出
--x-赋值最初将 Xs 分配给这个值
--x-initial-edge 启用初始 X->0 和 X->1 边沿触发
-y 搜索模块的目录
争论
{文件.v}
指定包含要验证的顶级模块的 Verilog 文件。
{文件.c/.cc/.cpp/.cxx}
指定要与 Verilog 代码链接的可选 C++ 文件。 如果有任何 C++ 文件
以这种方式指定,Verilator 将包含一个 make 规则,该规则生成一个 模块
可执行。 如果没有任何 C++ 文件,Verilator 将停在 模块__ALL.a 图书馆,
并假设您将继续使用您自己编写的 make 规则进行链接。 另见
-CFLAGS 选项。
{文件.a/.o/.so}
指定要与 Verilog 代码链接的可选对象或库文件,作为
-LDFLAGS 的简写”。如果以这种方式指定了任何文件,Verilator
将包含在链接时使用这些文件的 make 规则 模块 可执行文件。
这通常仅在与 --exe 选项一起使用时才有用。
+1364-1995分机+分机
+1364-2001分机+分机
+1364-2005分机+分机
+1800-2005分机+分机
+1800-2009分机+分机
+1800-2012分机+分机
指定要与特定文件扩展名一起使用的语言标准, 分机.
有关与其他模拟器的兼容性,另请参见同义词“+verilog1995ext+”分机,
"+verilog2001ext+"分机, 和 "+systemverilogext+"分机.
对于任何源文件,这些选项指定的语言优先于任何
由“--default-language”或“--language”选项指定的语言。
这些选项按遇到的顺序生效。 因此,以下将
将 Verilog 1995 用于“av”,将 Verilog 2001 用于“bv”。
verilator ... +1364-1995ext+v av +1364-2001ext+v bv
这些标志仅推荐用于传统的混合语言设计,因为最好
选项是编辑代码以修复新关键字,或添加适当的
“`begin_keywords”。
备注 “`begin_keywords”是一个 SystemVerilog 结构,它指定 仅由 其中
要识别的关键字集。 无论选择什么集合,语义都将是
SystemVerilog 的那些。 相比之下,“+1364-1995ext+”等指定了两种语法 和
要使用的语义。
- 断言
启用所有断言。
另见--x-assign 和--x-initial-edge; 设置“--x-assign unique”和/或
“--x-initial-edge”可能是可取的。
--自动刷新
在每个 $display 或 $fdisplay 之后,刷新输出流。 这确保
消息会立即出现,但可能会降低性能; 为获得最佳性能调用
"fflush(stdout)" 偶尔出现在主 C 循环中。 默认关闭,这将缓冲
由普通 C stdio 调用提供的输出。
--bbox-sys
黑框任何未知的 $system 任务或函数调用。 系统任务将很简单
NOPed,系统函数将被未定义大小的零替换。 对此类的争论
函数将被解析,但不会以其他方式检查。 这可以防止错误
在公司特定的 PLI 调用存在的情况下 linting。
--bbox-unsup
黑匣子一些不受支持的语言功能,目前 UDP 表和 cmos 和
跨门基元。 即使在
存在不受支持的构造。
- 垃圾桶 文件名
很少需要。 覆盖 Verilator 本身的默认文件名。 当一个依赖
(.d) 文件被创建,这个文件名将成为一个源依赖,这样一个
此二进制文件中的更改将使重建输出文件。
-CFLAGS 标志
将指定的 C 编译器标志添加到生成的 makefile 中。 当 make 在
生成的 makefile 这些将传递给 C++ 编译器 (gcc/g++/msvc++)。
--抄送
指定没有 SystemC 输出模式的 C++; 另见--sc。
- CDC
实验性的。 执行一些时钟域交叉检查并发出相关警告
(CDCRSTLOGIC) 然后退出; 如果需要除 CDC 警告以外的警告,
第二次运行 --lint-only。 附加警告信息也写入
文件 {前缀}__cdc.txt。
目前只检查其他CDC工具遗漏的一些项目; 如果你有兴趣
添加更多传统的 CDC 检查,请联系作者。
--时钟 信号名称
有时 Verilator 很难将时钟信号与其他时钟信号区分开来
数据信号。 有时,时钟信号可能会出现在以下检查列表中
决定是否需要进一步评估的信号。 这将严重退化
验证模型的性能。
使用 --clk , 用户可以指定根时钟进入模型,然后 Verilator
将信号标记为时钟并自动将时钟属性传播到
从中衍生出的其他信号。 这样,Verilator 将尽量避免采取
时钟信号进入检查清单。
注意信号名称由 RTL 层次结构路径指定。 例如,v.foo.bar。 如果
信号是顶层模块的输入,直接是信号名称。 如果你找到了
很难找到确切的名称,尝试在 RTL 文件中使用“/*verilator clocker*/”来
直接标记信号。
--编译器 编译器名称
为指定的 C++ 编译器启用调整和变通方法。
铛
调整叮当声。 这可能会降低执行速度,因为它启用了几种解决方法
避免在 clang 中愚蠢的硬编码限制。 这包括打破深层结构
至于 msvc,如下所述。
gcc Tune for Gnu C++,虽然生成的代码应该适用于几乎所有兼容的 C++
编译器。 目前默认。
微信
调整 Microsoft Visual C++。 这可能会降低执行速度,因为它启用
几种避免 MSVC++ 中愚蠢的硬编码限制的解决方法。 这包括
将深层嵌套的括号表达式分解为子表达式以避免
错误 C1009,并将深层块分解为函数以避免错误 C1061。
--收敛限制
很少需要。 指定创建前的最大运行时迭代次数
模型未能收敛错误。 默认为 100。
--覆盖率
启用所有形式的覆盖,别名为“--coverage-line --coverage-toggle”
--coverage-user”。
--覆盖线
指定应插入的基本块线覆盖分析代码。
覆盖分析在每个代码流变化点添加语句,它们是
IF 和 CASE 语句的分支,正常 Verilog Line Coverage 的超集。 在
每个这样的分支都会增加一个唯一的计数器。 在测试结束时,计数器
与每个计数器对应的文件名和行号一起写入
日志/coverage.pl。
Verilator 会自动禁用包含 $stop 的分支的覆盖,因为它
假定 $stop 分支包含不应发生的错误检查。 一个 /* 验证器
coverage_block_off*/ 注释将对该块中的任何代码执行类似的功能
或以下,或 /*verilatorcoverage_on/coverage_off*/ 将禁用线周围的覆盖
的代码。
注意 Verilator 可能会超量组合(非时钟)块,当这些块
接收已禁用 UNOPTFLAT 警告的信号; 为了最准确
结果在使用覆盖率时不会禁用此警告。
--覆盖切换
指定应插入的信号切换覆盖分析代码。
模块中每个信号的每一位都插入了一个计数器。 柜台会
在相应位的每个边沿变化时递增。
作为任务或开始/结束块的一部分的信号被视为局部变量,并且
不包括在内。 以下划线开头、整数或非常宽的信号
(所有维度的总存储超过 256 位)也不包括在内。
层次结构被压缩,如果一个模块被多次实例化,
覆盖将在该模块的所有实例中与该位相加
相同的参数集。 使用不同参数值实例化的模块是
被视为不同的模块,并将单独计算。
Verilator 对信号的时钟域做出最低限度的智能决定
转到,并且只在该时钟域中寻找边沿。 这意味着边缘可能是
如果知道接收逻辑永远无法看到边缘,则忽略。 这个
算法可能会在未来改进。 最终结果是覆盖率可能低于
通过查看痕迹会看到什么,但覆盖范围更准确
在设计中体现刺激的质量。
当模型稳定时,可能会在时间零附近计数边缘。 这是一个很好的
在释放重置之前练习将所有覆盖范围归零,以防止计算此类
行为。
一个 /*verilatorcoverage_off/on */ 注释对可以用于不
需要切换分析,例如 RAM 和寄存器文件。
--coverage-下划线
启用以下划线开头的信号覆盖。 通常,这些信号是
不包括。 另见--trace-underscore。
--覆盖用户
启用用户插入的功能覆盖。 目前,所有功能覆盖点
使用 SVA 指定,必须使用 --assert 单独启用。
例如,下面的语句将添加一个覆盖点,并带有注释
“默认时钟”:
DefaultClock: 覆盖属性 (@(posedge clk) cyc==3);
-DVAR=折扣值
定义给定的预处理器符号,不允许。 类似于 +define; +定义
在 Verilog 工具中是相当标准的,而 -D 是 GCC 兼容性的别名。
-调试
选择 Verilator 的调试构建镜像(如果可用),并启用更多内部
断言(相当于“--debug-check”),调试消息(相当于
“--debugi 4”)和中间格式转储文件(相当于“--dump-treei 3”)。
--调试检查
很少需要。 启用内部调试断言检查,无需更改调试
冗长。 指定 --debug 时自动启用。
--debugi
--调试-
很少需要 - 供开发人员使用。 将内部调试级别全局设置为
指定的调试级别 (1-10) 或将指定的 Verilator 源文件设置为
指定级别(例如“--debugi-V3Width 9”)。 更高的级别产生更详细的
消息。
--默认语言 折扣值
选择首次处理每个 Verilog 文件时默认使用的语言。
语言值必须是“1364-1995”、“1364-2001”、“1364-2005”、“1800-2005”、
“1800-2009”或“1800-2012”。
与特定文件扩展名相关的任何语言(请参阅各种 +郎分机+
选项)将优先使用 --default-language 指定的语言。
--default-language 标志只推荐用于使用相同的遗留代码
所有源文件中的语言,因为最好的选择是编辑代码以进行修复
新关键字,或添加适当的“`begin_keywords”。 对于传统的混合语言设计,
各种+郎应该使用 ext+ 选项。
如果未指定语言,则通过此标志或 +郎ext+ 选项,然后是最新的
使用 SystemVerilog 语言 (IEEE 1800-2012)。
+定义+VAR=折扣值
+定义+VAR=折扣值+无功2=价值2...
定义给定的预处理器符号,或多个符号(如果用加号分隔)。
类似于 -D; +define 在 Verilog 工具中是相当标准的,而 -D 是别名
用于 GCC 兼容性。
--转储树
很少需要。 启用使用转储级别 3 编写 .tree 调试文件,这会转储
标准的关键阶段。 有关格式的详细信息,请参阅 Verilator Internals
手动的。 --dump-tree 使用 --debug 自动启用,因此“--debug
--no-dump-tree" 如果转储文件很大且不需要时可能会很有用。
--dump-treei
--dump-treei-
很少需要 - 供开发人员使用。 将内部树转储级别全局设置为
特定的转储级别或将指定的 Verilator 源文件设置为指定的
树转储级别(例如“--dump-treei-V3Order 9”)。 级别 0 禁用转储并且是
相当于“--no-dump-tree”。 级别 9 允许倾倒每个阶段。
-E 预处理源代码,但不编译,就像'gcc -E'。 输出已写入
达到标准。 当心启用调试消息,因为它们也会转到
标准出来。
--错误限制
遇到此数量的错误或警告后,退出。 默认为 50。
- 可执行程序
生成可执行文件。 您还需要在
为您的模拟实现主循环的命令行。
-F 文件
读取指定的文件,并将其中的所有文本都指定为命令
线参数。 任何相对路径都相对于包含
指定的文件。 另见 -f。 注意 -F 在 Verilog 工具中是相当标准的。
-f 文件
读取指定的文件,并将其中的所有文本都指定为命令
线参数。 任何相对路径都是相对于当前目录的。 也可以看看
-F。 注意 -f 在 Verilog 工具中是相当标准的。
该文件可能包含 // 注释,这些注释会被忽略到行尾。 任何 $VAR,
$(VAR) 或 ${VAR} 将替换为指定的环境变量。
--gdb
在交互式 GDB(或 VERILATOR_GDB 环境变量)下运行 Verilator
值)会话。 另见--gdbbt。
--gdbt
如果指定了 --debug,则在 GDB 进程下运行 Verilator 并打印回溯
在退出时,然后立即退出 GDB。 如果没有 --debug 或者 GDB 似乎不起作用,
这个标志被忽略。 旨在方便用户创建回溯; 除此以外
请参阅 --gdb 标志。
- 帮帮我
显示此消息和程序版本并退出。
-IDIR
见-y。
--if-深度 折扣值
很少需要。 设置触发 IFDEPTH 警告的深度,默认为 0
这将禁用此警告。
+目录+DIR
见-y。
--抑制-SIM
很少需要。 创建一个“inhibitSim(bool)”函数来启用和禁用评估。
这允许上层测试平台禁用在测试中不重要的模块
给定模拟,无需重新编译或更改 SystemC 模块
实例化。
--内联多 折扣值
调整模块的内联。 默认值 2000 指定最多 2000 个新
操作可以通过内联添加到模型中,如果超过这个数量
操作将导致,模块没有内联。 较大的值,或值 <= 1
将内联所有内容,将导致更长的编译时间,但可能更快
运行时。 对于非常小的模块,此设置将被忽略; 他们将永远是
内联,如果允许的话。
-LD标志 标志
将指定的 C 链接器标志添加到生成的 makefile 中。 当 make 在
生成的 makefile 这些将被传递给 C++ 链接器 (ld) *after* 主
正在链接的文件。 此标志称为 -LDFLAGS,因为这是传统名称
模拟器; 最好将其称为 LDLIBS,因为那是 Makefile 变量
它控制。 (在 Make 中,LDFLAGS 在第一个对象之前,LDLIBS 在之后。-L
库需要在 Make 变量 LDLIBS 中,而不是 LDFLAGS。)
- 语 折扣值
“--default-langauge”的同义词,用于与其他工具和更早版本的兼容性
Verilator 的版本。
+libext+分机+分机...
指定应该用于查找模块的扩展。 如果例如模块
x 被引用,查看 x.分机. 注意 +libext+ 在 Verilog 中是相当标准的
工具。 默认为 .v 和 .sv。
--仅 lint
仅检查文件是否存在 lint 违规,不要创建任何其他输出。
您可能还需要 -Wall 选项来启用被视为风格的消息
并且默认不启用。
如果设计不完全验证,请参见 --bbox-sys 和
--bbox-unsup 选项。
——MMD
启用创建.d依赖文件,用于make依赖检测,类似于
gcc -MMD 选项。 默认情况下,使用 --no-MMD 禁用。
--议员
使用 --MMD 创建 .d 依赖文件时,制作虚假目标。 类似于 gcc -MP
选项。
--目录 目录
指定 Make 对象目录的名称。 所有生成的文件将被放置
在这个目录中。 如果未指定,则使用“obj_dir”。 如果目录被创建
它不存在并且父目录存在; 否则手动创建 Mdir
在调用 Verilator 之前。
--mod-前缀 顶名
指定要附加到所有较低级别类的名称。 默认与
- 字首。
--no-clk
防止指定的信号被标记为时钟。 参见“--clk”。
--no-pin64
“--pins-bv 33”的向后兼容别名。
--no-skip-相同
很少需要。 如果所有源文件都在,则禁用跳过 Verilator 的执行
相同,并且所有输出文件都具有较新的日期。
+通知检查
忽略与其他模拟器的兼容性。
-O0 禁用模型优化。
-O3 为 Verilator 本身生成的代码启用慢速优化(与
"-CFLAGS -O3" 影响 C 编译器的优化。 -O3 可能会减少模拟
以编译时间为代价的运行时。 这当前设置--inline-mult -1。
-O优化信
很少需要。 启用或禁用特定的优化,与优化
根据通过的信件选择。 小写字母禁用优化,一个
大写字母启用它。 这仅供调试使用; 看源码
优化到 -O 字母的版本相关映射的代码。
-o
如果使用 --exe,则指定生成的最终可执行文件的名称。 默认为
--prefix 如果未指定。
--无顺序时钟延迟
很少需要。 禁用用于延迟时钟启用排序的错误修复
任务。 只有在开发人员建议时才应使用此标志。
--输出分割 字节
启用将输出 .cpp/.sp 文件拆分为多个输出。 当一个 C++ 文件
超过指定的操作次数,下一个将创建一个新文件
功能边界。 此外,任何慢速例程都将放入 __Slow 文件中。
这可以加速编译,因为可以在慢速例程上禁用优化,
剩下的文件可以在并行机器上编译。 使用 --output-split
应该只对性能产生微不足道的影响。 在 3.3GHz Opteron 上使用 GCC 2,
--output-split 20000 将导致分裂成大约一分钟的编译
大块。
--输出-拆分-cfuncs 声明
启用将输出 .cpp/.sp 文件中的功能拆分为多个功能。
当一个生成的函数超过指定的操作次数时,一个新的函数
将被创建。 使用 --output-split,这将使 GCC 编译速度更快,
性能的小损失,随着拆分值的减少而变得更糟。 注意
这个选项比 --output-split 强,因为 --output-split 不会
在函数内拆分。
--输出-拆分-ctrace 声明
启用将输出 .cpp/.sp 文件中的跟踪功能拆分为多个
职能。 默认为与 --output-split-cfuncs 相同的设置。
-P 和 -E 一起禁用`行标记和空行的生成,类似于 GCC -P 标志。
--pin64
“--pins-bv 65”的向后兼容别名。 请注意,这是 65,而不是 64。
--pins-bv 宽度
指定 SystemC 输入/输出大于或等于 宽度 位宽应该
使用 sc_bv 而不是 uint32/vluint64_t。 默认值为“--pins-bv 65”。 版本
在 Verilator 3.671 默认为“--pins-bv 33”之前。 sc_bv 用得越多越差
为了性能。 使用“/*verilator sc_bv*/”属性选择特定端口
是 sc_bv。
--pin-sc-uint
指定大于 2 位宽的 SystemC 输入/输出应使用 sc_uint
在 2 到 64 之间。当与“--pins-sc-biguint”组合结合时,结果
在 2 到 64 之间使用的 sc_uint 和在 65 到 512 之间使用的 sc_biguint 中。
--pins-sc-biguint
指定大于 65 位宽的 SystemC 输入/输出应使用 sc_biguint
65 到 512 之间,sc_bv 从 513 向上。 当与
“--pins-sc-uint”组合,它导致 sc_uint 在 2 和 64 之间使用,并且
sc_biguint 在 65 和 512 之间使用。
--pins-uint8
指定小于 --pins-bv 设置和 8 的 SystemC 输入/输出
位或更少应使用 uint8_t 而不是 uint32_t。 同样,宽度为 9-16 的引脚将
使用 uint16_t 而不是 uint32_t。
--管道过滤器 命令
很少需要和实验。 Verilator 将生成指定的命令作为
子进程管道,允许命令对 Verilog 代码执行自定义编辑
在它到达 Verilator 之前。
在读取每个 Verilog 文件之前,Verilator 会将文件名传递给子进程'
带有“read_verilog”的标准输入"'。然后过滤器可以读取文件并执行
它需要的任何过滤,并将新文件内容反馈给标准输出上的 Verilator
带有“内容长度”。 从过滤器到标准错误的输出会馈送到 Verilator 的
标准输出,如果过滤器以非零状态退出 Verilator 终止。 见
t/t_pipe_filter 测试示例。
要调试过滤器的输出,请尝试使用 -E 选项查看预处理输出。
- 字首 顶名
指定顶级类和生成文件的名称。 默认为 V 前置
--top-module 开关的名称,或者在第一个 Verilog 文件名前面加上 V
在命令行上传递。
--profile-cfuncs
修改创建的 C++ 函数以支持分析。 功能将是
最小化以包含一个“基本”语句,通常是一个始终块或连线
陈述。 (请注意,这会使可执行文件减慢约 5%。)此外,
函数名称后缀为 Verilog 模块的基本名称和行号
声明来自。 这允许 gprof 或 oprofile 报告与
原始的 Verilog 源语句。
- 私人的
与--public 相反。 是默认值; 存在此选项是为了向后兼容。
- 民众
这仅用于历史调试使用。 使用它可能会导致错误模拟
生成的时钟。
将所有信号和模块声明为公开的。 这将关闭信号优化,因为
如果所有信号都有 /*verilator public*/ 注释和内联。 这也会转
关闭内联,就好像所有模块都有一个 /*verilator public_module*/,除非模块
特别使用 /*verilator inline_module* 启用它/.
--报告-unoptflat
UNOPTFLAT 警告的额外诊断。 这包括对于每个循环,最宽的 10 个
循环中的变量,以及循环中最散开的 10 个变量。 这些是
拆分为多个变量以打破循环的候选者。
此外生成整个强连接组件的 GraphViz DOT 文件
在与每个循环关联的源中。 无论是否产生此
--dump-tree 已设置。 此类图表可能有助于分析问题,但可能非常有用
确实很大。
存在用于查看和操作 DOT 文件的各种命令。 例如 点
命令可用于将 DOT 文件转换为 PDF 进行打印。 例如:
点 -Tpdf -O Vt_unoptflat_simple_2_35_unoptflat.dot
将从 DOT 文件生成 PDF Vt_unoptflat_simple_2_35_unoptflat.dot.pdf。
--可保存
在生成的模型中启用包括保存和恢复功能。
用户代码必须创建一个 VerilatedSerialize 或 VerilatedDeserialze 对象,然后
在生成的模型和任何其他数据上调用 << 或 >> 操作符
需要保存/恢复。 例如:
void save_model(const char* filenamep) {
已验证保存操作系统;
os.open(文件名);
操作系统 << main_time; // 用户代码必须保存时间戳等
操作系统 << *topp;
}
无效恢复模型(const char * filenamep){
VerilatedRestore 操作系统;
os.open(文件名);
操作系统>> main_time;
操作系统 >> *顶;
}
--sc
指定 SystemC 输出模式; 另见--cc。
--统计
在 {prefix}__stats.txt 中创建带有设计统计信息的转储文件。
--统计变量
创建更详细的统计信息,包括按大小列出所有变量的列表(普通
--stats 只是给出一个计数)。 请参阅--stats,这暗示了这一点。
-sv 指定应启用 SystemVerilog 语言功能; 相当于“--语言
1800-2005"。这个选项是默认选中的,它存在是为了兼容
其他模拟器。
+系统verilogext+分机
“+1800-2012ext+”的同义词分机.
--顶部模块 顶名
当输入 Verilog 包含多个顶级模块时,指定名称
顶层 Verilog 模块成为顶层,并为 if --prefix 设置默认值
未使用。 这对于只有一个顶部的标准设计是不需要的。
- 痕迹
向模型添加波形跟踪代码。 Verilator 将生成额外的
{prefix}__Trace*.cpp 需要编译的文件。 此外
verilated_vcd_sc.cpp(对于 SystemC 跟踪)或 verilated_vcd_c.cpp(对于两者)必须是
编译并链接。如果使用 Verilator 生成的 Makefile,这些将是
添加为您的源目标。 如果您不使用 Verilator 生成文件,您
需要手动将这些添加到您的 Makefile 中。
编译跟踪可能会导致一些小的性能损失,即使
模型执行期间不会打开波形。
--跟踪深度 各级
指定启用跟踪的深度级别数,例如 --trace-level 1 到
只看到顶层的信号。 默认为整个模型。 使用小数
会降低可见性,但会大大改善运行时和跟踪文件的大小。
--trace-max-数组 深度
很少需要。 指定可以跟踪的信号的最大阵列深度。
默认为 32,因为跟踪大型数组可能会大大减慢跟踪的模拟。
--trace-最大宽度 宽度
很少需要。 指定可以跟踪的信号的最大位宽。
默认为 256,因为追踪大向量可能会大大减慢追踪模拟。
--无痕迹参数
禁用参数跟踪。
--trace-结构
启用跟踪以显示压缩结构、联合和压缩数组字段的名称,
而不是一个单一的组合包装总线。 由于 VCD 文件格式限制,这可能
导致跟踪时间显着减慢和跟踪文件更大。
--trace-下划线
启用对以下划线开头的信号的跟踪。 通常,这些信号是
跟踪期间不输出。 另见--coverage-underscore。
-UVAR
取消定义给定的预处理器符号。
--展开计数 循环
很少需要。 指定可以展开的最大循环迭代次数。
另请参阅 BLKLOOPINIT 警告。
--unroll-stmts 声明
很少需要。 为该循环指定循环中的最大语句数
展开。 另请参阅 BLKLOOPINIT 警告。
--未使用的正则表达式 正则表达式
很少需要。 用 * 和 ? 指定一个简单的正则表达式如果信号名称匹配
将抑制 UNUSED 警告。 默认为“*未使用*”。 将其设置为 "" 禁用
匹配。
-V 显示详细版本,包括编译成的配置信息
验证器。 (类似于 perl -V。)
-v 文件名
将文件名作为 Verilog 库读取。 文件中的任何模块都可用于
解析顶层模块中的单元实例,否则忽略。 注意 -v 是公平的
Verilog 工具的标准。
+verilog1995ext+分机
+verilog2001ext+分机
"+1364-1995ext+" 的同义词分机 和“+1364-2001ext+”分机 分别
-墙
启用所有警告,包括通常被禁用的代码样式警告
默认。
-错误-的话
将指定的警告消息转换为错误消息。 这一般是为了
阻止用户违反重要的站点范围规则,例如
“-Werror-NOUNOPTFLAT”。
-W未来-的话
很少需要。 使用给定的信息抑制未知的 Verilator 评论或警告消息
消息代码。 这用于允许使用编译指示编写的代码用于更高版本的
Verilator 在旧版本下运行; 为每个消息代码添加 -Wfuture- 参数
或评论新版本支持旧版本不支持。
-没有-的话
禁用指定的警告消息。 这将覆盖任何 lint_on 指令
来源,即警告仍然不会被打印。
-Wno-lint
禁用所有与 lint 相关的警告消息和所有样式警告。 这是等价的
到“-Wno-ALWCOMBORDER -Wno-CASEINCOMPLETE -Wno-CASEOVERLAP -Wno-CASEX -Wno-CASEWITHX
-Wno-CMPCONST -Wno-ENDLABEL -Wno-IMPLICIT -Wno-LITENDIAN -Wno-PINCONNECTEMPTY
-Wno-PINMISSING -Wno-SYNCASYNCNET -Wno-UNDRIVEN -Wno-UNSIGNED -Wno-UNUSED -Wno-WIDTH”
加上为 Wno 风格显示的列表。
强烈建议您清理代码而不是使用此选项,它是
仅用于运行从第三方收到的代码的测试用例。
-Wno风格
禁用所有与代码风格相关的警告消息(注意默认情况下它们已经
禁用)。 这相当于“-Wno-DECLFILENAME -Wno-DEFPARAM -Wno-INCABSPATH
-Wno-PINCONNECTEMPTY -Wno-PINNOCONNECT -Wno-SYNCASYNCNET -Wno-UNDRIVEN -Wno-未使用
-Wno-VARHIDDEN”。
-Wno-致命
当检测到警告时,打印它们,但不要退出模拟器。
在构建中出现警告消息是草率的。 强烈建议你清理
您的代码,使用内联 lint_off,或使用 -Wno-... 标志而不是使用此选项。
-警告-的话
启用指定的警告消息。
-Wwarn-lint
启用所有与 lint 相关的警告消息(注意默认情况下它们已经启用),
但不影响样式消息。 这相当于“-Wwarn-ALWCOMBORDER
-Wwarn-CASEINCOMPLETE -Wwarn-CASEOVERLAP -Wwarn-CASEX -Wwarn-CASEWITHX -Wwarn-CMPCONST
-Wwarn-ENDLABEL -Wwarn-IMPLICIT -Wwarn-LITENDIAN -Wwarn-PINMISSING -Wwarn-REALCVT
-Wwarn-UNSIGNED -Wwarn-WIDTH”。
-Wwarn 风格
启用所有与代码样式相关的警告消息。 这相当于“-Wwarn
分配 -Wwarn-DECLFILENAME -Wwarn-DEFPARAM -Wwarn-INCABSPATH -Wwarn-PINNOCONNECT
-Wwarn-SYNCASYNCNET -Wwarn-UNDRIVEN -Wwarn-UNUSED -Wwarn-VARHIDDEN”。
--x-赋值 0
--x-赋值 1
--x-assign 快速(默认)
--x-分配唯一
控制遇到对 X 的赋值时替换的二态值。
--x-assign=fast,默认值,将所有 X 转换为最能提高性能的值。
--x-assign=0 将所有 X 转换为 0,而且速度也很快。 --x-assign=1 将所有 X 转换为
1s,这几乎和 0 一样快,但更有可能发现重置错误为活动高
逻辑会火。 --x-assign=unique 将调用一个函数来确定值,这个
允许随机化所有 X 以查找重置错误并且是最慢但最安全的
在代码中查找重置错误。
如果使用--x-assign unique,您可能希望为您的随机数生成器设置种子,例如
每次回归运行都会获得不同的随机化序列。 使用系统的
srand48() 或 Windows srand() 功能来做到这一点。 你可能还想
打印选择的任何种子,并编写代码以使用相同的种子重新运行,以便您可以
重现错误。
注意事项。 此选项仅适用于显式分配给 X 的变量
Verilog 源代码。 时钟的初始值设置为 0,除非 --x-initial-edge 是
指定的。 所有其他状态保持变量的初始值设置为
--x-assign unique 已指定。
--x-初始边缘
启用事件驱动模拟器的仿真,这些模拟器通常会触发一个边缘
从 X 到 1(“posedge”)或从 X 到 0(“negedge”)的转换。 因此下面的代码,
当“rst_n”第一次设置时,“rst_n”未初始化会将“res_n”设置为“1'b1”
归零:
reg res_n = 1'b0;
总是@(negedge rst_n) 开始
如果 (rst_n == 1'b0) 开始
res_n <= 1'b1;
结束
结束
在 Verilator 中,默认情况下,未初始化的时钟被赋予零值,因此上面的
“总是”块不会触发。
虽然这不是一个好的做法,但有一些设计依赖于 XX 0 触发
“否定”,尤其是在重置序列中。 将 --x-initial-edge 与 Verilator 一起使用将
复制这种行为。 它还将确保 XX 1 触发“posedge”。
注意事项。 一些用户报告说使用此选项会影响收敛,并且
可能需要使用 --converge-limit 来增加收敛次数
迭代。 这可能是建模设计存在问题的另一个迹象
应予以解决。
-y DIR
将目录添加到应搜索包含文件的目录列表中
或图书馆。 三个标志 -y、+incdir 和 -I 具有类似的效果; +incdir 和 +y
在 Verilog 工具中是相当标准的,而 -I 是 GCC 兼容性的别名。
Verilator 默认为当前目录(“-y .”)和任何指定的 --Mdir,不过
这些默认路径在任何用户指定的目录之后使用。 这允许 '-y
如果错误消息需要绝对文件名而不是使用“$(pwd)”'
相对文件名。
例 C + +中 执行
我们将把这个例子编译成 C++。
mkdir test_our
光盘测试_我们
猫 < 我们的.v
模块我们的;
初始开始 $display("Hello World"); $完成; 结尾
endmodule
EOF
猫 < sim_main.cpp
#include "Vour.h"
#include "verilated.h"
int main(int argc, char **argv, char **env) {
验证::commandArgs(argc, argv);
Vour* top = 新 Vour;
while (!Verilated::gotFinish()) { top->eval(); }
删除顶部;
出口(0);
}
EOF
如果您从源或 tarball 安装 Verilator,但不是作为操作的一部分
系统(作为 RPM),首先您需要指向套件:
导出 VERILATOR_ROOT=/path/to/where/verilator/was/installed
导出路径=$VERILATOR_ROOT/bin:$PATH
现在我们在我们的小例子上运行 Verilator。
verilator-Wall --cc our.v --exe sim_main.cpp
我们可以在“obj_dir”目录下看到源代码。 请参阅下面的文件部分
已创建的一些文件的描述。
ls -l 对象目录
然后我们可以编译它
cd 对象目录
制作-j -f Vour.mk Vour
(Verilator 包含一个默认的编译规则和链接规则,因为我们使用了 --exe 并传递了一个
Verilator 命令行上的 .cpp 文件。 您还可以编写自己的编译规则,如
我们将在 SYSTEMC 部分显示。)
现在我们运行它
cd ..
obj_dir/你的
我们得到作为输出
你好世界
-our.v:2: Verilog $finish
真的,您最好编写一个 Makefile 来为您完成所有这些工作。 那么,当你的
源更改它会自动运行所有这些步骤。 查看 test_c 目录中的
以分布为例。
例 系统控制 执行
这是一个与上面类似的示例,但使用的是 SystemC。
mkdir test_our_sc
cd test_our_sc
猫 < 我们的.v
模块我们的(clk);
输入时钟; // 需要时钟来获得初始激活
总是@(posedge clk)
开始 $display("Hello World"); $完成; 结尾
endmodule
EOF
猫 < sc_main.cpp
#include "Vour.h"
int sc_main(int argc, char **argv) {
验证::commandArgs(argc, argv);
sc_clock clk ("clk",10, 0.5, 3, true);
Vour* 顶部;
top = new Vour("top"); // SP_CELL(顶部,Vour);
顶部->时钟(时钟); // SP_PIN (top, clk, clk);
而 (!Verilated::gotFinish()) { sc_start(1, SC_NS); }
删除顶部;
出口(0);
}
EOF
如果您从源或 tarball 安装 Verilator,但不是作为操作的一部分
系统(作为 RPM),首先您需要指向套件:
导出 VERILATOR_ROOT=/path/to/where/verilator/was/installed
导出路径=$VERILATOR_ROOT/bin:$PATH
现在我们在我们的小例子上运行 Verilator。
验证器 -Wall --sc our.v
然后我们可以编译它
make -j -f Vour.mk Vour__ALL.a
make -j -f Vour.mk ../sc_main.o verilated.o
并与 SystemC 链接。 请注意,您的库路径可能会有所不同,具体取决于
操作系统。
导出 SYSTEMC_LIBDIR=/path/to/where/libsystemc.a/exists
导出 LD_LIBRARY_PATH=$SYSTEMC_LIBDIR:$LD_LIBRARY_PATH
# 如果 SystemC 2.3.0 可能需要
导出 SYSTEMC_CXX_FLAGS=-pthread
g++ -L$SYSTEMC_LIBDIR ../sc_main.o Vour__ALL*.o verilated.o \
-o 你的-lsystemc
现在我们运行它
cd ..
obj_dir/你的
我们得到与 C++ 示例相同的输出:
你好世界
-our.v:2: Verilog $finish
真的,您最好使用 Makefile 为您完成所有这些工作。 然后,当您的来源
更改它会自动运行所有这些步骤。 查看 test_sc 目录中的
以分布为例。
基准化 & 优化
为了获得最佳性能,请使用“-O3 --x-assign=fast --noassert”标志运行 Verilator。 这
-O3 标志将需要更长的编译时间,并且 --x-assign=fast 可能会增加风险
重置交易中的错误以提高性能; 有关这些标志,请参阅上述文档。
小的 Verilog 代码更改也可以带来巨大的成功。 你不应该有任何 UNOPTFLAT
来自 Verilator 的警告。 修复这些警告可以带来巨大的改进; 一位用户
通过对用于门控的时钟锁存器进行简单更改,修复了他们的一个 UNOPTFLAT 警告
时钟并获得了 60% 的性能提升。
除此之外,Verilated 模型的性能主要取决于您的 C++ 编译器和
CPU 缓存的大小。
默认情况下,lib/verilated.mk 文件已关闭优化。 这是为了
新用户的好处,因为它以运行时为代价缩短了编译时间。 加上
优化作为默认值,设置三个变量之一,OPT、OPT_FAST 或 OPT_SLOW
lib/verilated.mk。 或者,在 verilator 命令中使用 -CFLAGS 和/或 -LDFLAGS 选项
行将标志直接传递给编译器或链接器。 或者,只跑一次,通过
它们在命令行上进行:
make OPT_FAST="-O2" -f Vour.mk Vour__ALL.a
OPT_FAST 为那些属于快速路径的程序指定优化,主要是
每个周期执行的代码。 OPT_SLOW 指定对慢路径文件的优化
(加上跟踪),它很少执行,但需要很长时间来编译
优化上。 OPT 指定整体优化并影响所有编译,包括
那些 OPT_FAST 和 OPT_SLOW 影响。 为获得最佳结果,请使用 OPT="-O2",并与
“-静止的”。 几乎相同的结果可以得到更好的编译时间
OPT_FAST="-O1 -fstrict-aliasing"。 诸如“-O3”之类的更高优化可能会有所帮助,但 gcc
即使是中等规模的设计,在 O3 下编译时间也可能过长。 或者,一些
更大的设计使用“-Os”报告更好的性能。
不幸的是,对 SystemC 文件使用优化器可能会导致编译
几分钟。 (SystemC 库有许多小的内联函数来驱动
编译器坚果。)
为获得最佳效果,请使用 GCC 3.3 或更新版本。 GCC 3.2 及更早版本存在优化错误
指针混叠检测,这可能导致 2 倍的性能损失。
如果您将在一次编译中运行许多模拟,请调查反馈驱动
汇编。 使用 GCC,使用 -fprofile-arcs,然后 -fbranch-probabilities 将产生
另有 15% 左右。
现代编译器还支持链接时优化 (LTO),这在以下情况下尤其有用
您在 DPI 代码中链接。 要在 GCC 上启用 LTO,请在编译和链接中传递“-flto”。
注意 LTO 可能会导致大型设计的编译时间过长。
如果您使用自己的 makefile,则可能需要使用以下命令编译 Verilated 代码
-DVL_INLINE_OPT=内联。 这将内联函数,但这需要所有 cpp
文件在单个编译器运行中编译。
您可以通过分析 Verilog 代码发现进一步调整的可能性。 用
Verilator 的 --profile-cfuncs,然后是 GCC 的 -g -pg。 然后您可以运行 oprofile 或
gprof 以查看时间在 C++ 代码中的何处花费。 通过运行 gprof 输出
verilator_profcfunc 它会告诉你哪些 Verilog 行号
时间正在花费。
完成后,请让作者知道结果。 我喜欢密切关注 Verilator
进行比较,并可能提出其他改进建议。
使用 onworks.net 服务在线使用 verilator