RENESAS ForgeFPGA 软件仿真

RENESAS ForgeFPGA 软件仿真

重要信息

仿真是一种在不同时间对设计施加不同输入刺激以检查 RTL 代码是否按预期方式运行的技术。它用于验证设计的稳健性。仿真允​​许用户 view 相关信号的时序图,了解设计中的设计描述 file 表现。

测试台是用于模拟的代码片段。简单的测试台将实例化被测单元 (UUT) 并驱动输入。Go Configure 软件使用 Icarus Verilog (iVerilog) 和 GTKWave 观察测试台提供的刺激下的模拟波形。

本文档介绍了在您的系统上安装 Icarus 时需要采取的步骤以及如何运行成功的模拟。

安装 Icarus Verilog

a. 从以下位置安装最新版本的 Icarus Verilog (IVerilog) https://bleyer.org/icarus/
b。确保将 IVerilog 添加到 PATH 并让其安装 GTKWave(见图 1)
安装 Icarus Verilog

c.打开Go Configure软件,选择部件:SLG47910(Rev BB),打开Forge Workshop(见图2)。
安装 Icarus Verilog

d. 点击上方工具栏中间的 FPGA Editor 或者用户也可以双击窗口中间的 FPGA Core 结构。
安装 Icarus Verilog

e。将打开一个名为 Forge Workshop 的新窗口。在顶部的菜单工具栏中,单击选项 → 设置。在设置对话框中,转到用户设置选项卡下的工具。取消选择 Icarus Verilog 和 GTKWave 的使用“系统环境框”。将系统中保存的 Iverilog 和 GTKWave 的路径添加到给定的空间中(见图 4)。
安装 Icarus Verilog

您已准备好模拟测试台,上述步骤可确保在 Go Configure 软件上模拟测试台时 GTKWave 自动启动。

试验台

成功实施任何系统的最关键步骤是验证设计及其功能。在实施硬件后验证复杂系统并不是明智的选择。从金钱、时间和资源方面来看,这都是无效的。因此,在 FPGA 的情况下,使用测试平台来测试 Verilog 源代码。

假设我们有一个 11 位的输入,我们想测试设备所有可能的输入组合值,即 (211)。由于组合数量非常多,因此不可能手动测试。在这种情况下,测试平台非常有用,因为您可以自动测试设计的所有可能值,从而确认测试设计的可靠性。Verilog 测试平台用于模拟和分析设计,而无需任何物理硬件设备。

被测设计(简称 DUT)是我们要测试的功能的可综合模块。换句话说,它是我们想要测试的电路设计。我们可以使用 Verilog 中的三种建模样式之一来描述我们的 DUT - 门级、数据流或行为。

测试台不可综合,因此仅用于模拟目的。这允许用户使用各种 Verilog 结构(例如“for”、“$display”和“$monitor”等关键字)来编写测试台。简单的测试台将实例化被测单元 (UUT) 或被测设备 (DUT) 并驱动输入。

理解测试台

理解测试台

测试台中的时间尺度定义

在仿真时,软件需要知道时间是如何定义的。使用 `timescale 指令指定延迟单位,该指令指定时间单位及其后面模块的精度。`timescale 有助于确定 #1 在时间方面的含义。# 用于根据 timescale 中指定的时间单位定义要在系统中引入的延迟。因此,如果 time_unit 以 ns 为单位,则 #1 表示 1 ns 的延迟。

句法:
`时间尺度 / /

time_unit 是延迟 #1 所代表的时间量。time_precision 基数表示相对于时间单位要使用多少个小数点的精度。(参见图 23 中的第 5 行)

我们可以使用时间尺度构造在同一设计中使用不同的时间单位。用户需要记住,延迟规范不可综合,也不能转换为硬件逻辑。延迟函数完全用于模拟目的。$时间 和 $即时的 系统函数返回当前时间,并且可以使用另一个系统任务 $timeformat 更改默认报告格式。

Examp乐: 

`时间尺度 10us/100ns
`时间尺度 1ns/1ps
#10 reset = 1; // 将信号延迟 10 纳秒
#0.49 $display( “T = %0t 在时间#0.49”, $realtime) ;

指定的延迟为 #0.49,小于半个单位时间。但是,时间精度指定为 1ps,因此模拟器不能小于 1ns,这使得它舍入给定的延迟语句并得出 0ns。因此,该语句无法提供任何延迟。

模拟日志: 

时间 #1 时 T = 0.49

模块声明

任何测试平台中的模块声明都与主 Verilog 代码不同。在测试平台中,模块声明时没有任何终端端口。(参见图 25 中的第 5 行)

句法: 

模块;

模块声明之后是定义主设计中先前定义的输入和输出信号 file.
我们使用两种信号类型在模拟过程中驱动和监控信号。reg 数据类型将保存该值,直到为其分配新值。此数据类型只能在 always 或 initial 块中分配值。
wire 数据类型类似于物理连接。它将保存由端口、赋值语句或 reg 驱动的值。此数据类型不能在 initial 或 always 块中使用。任何参数和整数声明也在此部分中完成。

Examp乐:
Reg a,b; //HDL代码中的输入在testbench中定义为reg
Wire y; //HDL 中的输出信号在测试台中定义为 wire

DUT 实例

测试平台的目的是验证我们的 DUT 模块是否正常运行。因此,我们需要将我们的设计模块实例化为测试模块。

句法: 

(。 (信号1),.信号1>(信号2));

Examp乐:

ALU d0 (.a(a), // ALU 中的信号“a”应连接到 ALU_tb 模块中的“a”
.b(b), // ALU 中的信号“b”应该连接到 ALU_tb 模块中的“b”
.c(c)) ;// ALU 中的信号“c”应该连接到 ALU_tb 模块中的“c”

我们已经将 DUT 模块 ALU 实例化到测试模块。实例名称 (d0) 由用户选择。前面带有句点“.”的信号是 ALU 模块内部信号的名称,而它们在测试台上连接的电线或寄存器位于信号旁边的括号 () 中。建议将每个端口连接编码为单独的一行,以便任何编译错误消息都能正确指向发生错误的行号。由于这些连接是按名称进行的,因此它们出现的顺序无关紧要。

还可以针对测试平台模块具有不同信号名称的模块进行 DUT 实例化。实例化时,信号的正确映射非常重要。

Examp乐: 

ALU d0 (.a(A), // ALU 中的信号“a”应连接到 ALU_tb 模块中的“A”
.clk(clock), // ALU 中的信号“clk”应该连接到“clock” ALU_tb 模块
.out(OUT)) ; // ALU 中的信号“out”应连接到 ALU_tb 模块中的“OUT”

测试台中始终使用 & Initial 块

Verilog 中有两个顺序块,initial 和 always。我们在这两个块中施加刺激。

初始区块

初始块仅执行一次,并在执行完块的最后一行时终止。刺激被写入初始块中。(参见图 54 中的 72-5 行)

句法:
..
初始开始
$转储file();
$转储变量();
..(输入刺激)
结尾

初始块在模拟开始时(时间 t = 0)开始执行。从开始和结束之间的第一行开始,每行从上到下执行,直到达到延迟。当达到延迟时,此块的执行将等待延迟时间(10 个时间单位)过去,然后再次开始执行。
用户也可以在这个初始块内使用循环(for、while、if-else)定义刺激,而不必手动输入所有组合。
初始区块

 

Examp乐:
初始开始
A = 0; b = 0; //开始执行
#10 a = 0; b = 1; // 执行时间为 t = 10 单位时间
#10 a = 1; b = 0; // 执行时间为 t = 20 单位时间
结尾

倾倒 Files

另一件需要记住的事情是声明$倾倒files 和 $转储变量 在初始块内(参见图 55 中的第 56-5 行)。$倾倒file 用于转储网络和寄存器值的变化 file 这被称为它的参数。

例如amp乐:

$倾倒file(“alu_tb.vcd”);

将会转储到 file 名为 alu_tb.vcd。更改记录在 file 称为 VCD file 代表值更改转储。VCD(值更改转储)存储有关值更改的所有信息。我们不能有多个 $dumpfile Verilog 仿真中的语句。

美元转储变量 用于指定要转储哪些变量(在 file $dump 提及file)。最简单的使用方法是不带任何参数。$dumpvars 的一般语法是

$转储变量 ( <, >);

我们基本上可以指定要转储哪些模块以及模块中的哪些变量。使用此功能的最简单方法是将级别设置为 0,并将模块名称设置为顶级模块(通常是顶级测试台模块)。

$转储变量(0,alu_tb);

当级别设置为 0 时,并且仅指定模块名称,它将转储该模块的所有变量以及此顶级模块实例化的所有下级模块中的所有变量。如果任何模块不是由此顶级模块实例化的,则不会覆盖其变量。还有一件事,$ 的声明倾倒file 必须位于 $dumpvars 或任何其他指定 dump 的系统任务之前。这些 dump file必须在刺激输入之前声明,否则,这些转储中将不会保存任何值 files.

永远封锁

与初始语句相反,always 块会重复执行,尽管执行从时间 t = 0 开始。例如amp也就是说,时钟信号对于触发器等顺序电路的运行至关重要。它需要连续供应。因此,我们可以在测试台上编写时钟操作的代码(参见图 52 中的第 5 行):

总是
#10 clk = ~clk;
结束模块

上述语句从 t = 10 开始,在 0 纳秒后执行。clk 的值将在 10 纳秒后从前一个值反转。因此,生成一个脉冲宽度为 20 纳秒的时钟信号。因此,该语句生成一个频率为 50 MHz 的信号。需要注意的是,信号的初始化是在 always 块之前完成的。如果我们不进行初始化部分,clk 信号从 t – 0 开始将为 x,在 10 纳秒后,它将反转为另一个 x。

自检测试台

自检测试台包含一个用于检查当前状态的语句。

  • $展示 系统任务主要用于显示调试消息,以跟踪模拟流程

初始开始
A = 0 ; b = 0 ; c = 0; #10; // 应用输入,等待
如果(y!==1)开始
$display( “000 失败”) ; //检查
c = 1; #10 ; //应用输入,等待
结尾
否则,如果(y!==0)开始
$display(“001 失败”) // 检查
b = 1; c = 0; #10; 结束
否则,如果(y!==0)
$display(“010 失败”);//检查
结尾
结束模块

$展示 用于显示变量、字符串或表达式的值。从上面的示例ample,只要满足任何 if-else 循环,模拟器日志就会显示其各自的 $展示 语句。字符串末尾默认有一个换行符。

$展示 (“时间 = %t,A = %b,B = %b,C = %b”,$时间,A,B,C);

引号中提到的字符将按原样打印。字母和 % 表示字符串格式。我们使用 %b 表示二进制数据。我们可以使用 %d、%h、%o 分别表示十进制、十六进制和八进制。%g 用于表示实数。这些将按照提到的顺序替换为引号外的值。例如amp例如,上述语句将在仿真日志中显示为:time = 20, A = 0, B =1, C = 0

桌子 1. Verilog 表格式

争论 描述
%h,%H 以十六进制格式显示
%d, %D 以十进制形式显示
%b,%B 以二进制格式显示
%毫米 显示层级名称
%s,%S 显示为字符串
%t,%T 以时间格式显示
%f, %F 以十进制格式显示“实数”
%e,%E 以指数格式显示“实数”

$展示 主要打印当时的数据或变量,就像 C 中的 printf 一样。我们必须提到 $展示 无论我们需要什么文本 view 在模拟日志中。

  • $时间

$时间 是一个系统任务,它将返回模拟的当前时间。

  • $监视器

$监视器 将监视写入的数据或变量,并且每当变量发生变化时,它将打印
改变的值。它实现了每次其任何参数被调用后调用 $display 的类似效果
已更新。$监视器 就像在主线程的后台运行的一个任务,它监视并
显示其参数变量的值变化。$监视器 与 $ 语法相同展示.

$监视器(“时间 = %t,A = %b,B = %b,C = %b”,$时间,A,B,C);
自检测试台

从图 7 中,您可以观察到添加了新的代码行来自我评估测试平台。$展示 和 $监视器 测试平台不同部分的语句将产生不同的结果(见图 8)。$时间 这些语句中提到的打印值被打印的时间。同时,假设是 170000,我们可以看到 A 和 B 的值由于 $ 而存在差异展示 和 $监视器 陣容 註釋 .
自检测试台

GTKWave 软件

GTKWave 是功能齐全的 GTK+ wave view适用于 Unix、Win32 和 Mac OSX 的读取器,可读取 LXT、LXT2、VZT、FST 和 GHW file以及标准 VCD/EVCD file并允许他们的 viewing。这是官方 web网站位于 http://gtkwave.sourceforge.net/ . GTKWave 是推荐的 view通过Icarus Verilog仿真工具。

一旦用户成功创建了测试平台来测试设计的功能,用户现在就可以使用 GTKWave 软件来 view 波形。

启动 GTKWave 软件 view 波形,用户需要单击工具栏顶部的“模拟测试台”按钮或从主菜单“工具”→“模拟”→“模拟测试台”。如果没有语法错误,则根据设计,GTKWave 应该会自动启动,或者测试台中的刺激结果将显示在窗口的“记录器”部分中。

GTKWave 软件打开 .vcd 格式的转储file 自动。GTKWave 窗口打开时不显示波形。这让用户有机会选择要显示的信号 view 并观察。要选择用户需要显示的信号,用户需要单击窗口左侧 SST 选项卡下模块/实例的名称。通过单击每个实例的 +,您可以在底部看到与该实例相关的信号。然后,您可以拖放所需的信号或双击它们以显示在信号窗口中。您也可以选择全部(CTRL + A)并将它们插入到信号窗口(见图 9)。
GTKWave 软件

信号现已添加到信号窗口,但尚未模拟。将所需信号添加到信号窗口后,单击象征 将信号调整到窗口的当前宽度,然后从重新加载中重新加载信号象征 工具栏上出现的符号。现在您可以看到信号及其各自的值。

信号值

默认情况下,信号值采用十六进制格式,所有波都为绿色(如果运行正常)。

用户可以通过右键单击信号并选择数据格式或颜色格式来更改这些信号的属性。用户还可以插入空白信号以在信号组之间划分区域。当您获得所需的光学结果时,您可以通过以下方式保存配置: File → 写入保存 File.

GTKWave 工具栏

工具栏(见图 10)允许用户执行信号的基本功能。让我们从左到右讨论工具栏上的每个选项。
GTKWave 工具栏

  1. 菜单选项:在这个选项下,我们可以 view 软件的所有各种功能,可用于试用软件。此菜单选项下的详细信息在本用户指南的第 8 部分中介绍。
  2. 切割痕迹:用于从信号窗口中删除/剪切选择的信号
  3. 复制踪迹:用于从信号窗口复制选定的信号
  4. 粘贴痕迹:复制/剪切的轨迹可以粘贴到信号窗口的其他位置
  5. 缩放适合:用于根据用户选择显示的窗口大小调整信号
  6. 放大:用于放大信号窗口
  7. 缩小:用于缩小信号窗口
  8. 缩放 撤消:用于取消信号窗口的放大/缩小
  9. 缩放至起始点:这将放大信号窗口,显示信号的开始时间。
  10. 缩放至末端:这将放大信号窗口,显示信号的结束时间
  11. 查找前一个边:这会将标记移到左侧,指示前一个边缘
  12. 查找下一个边缘:这会将标记向右移动,指示下一个边缘
  13. 滚动下/上键:使用此功能我们可以设置用户想要显示的时间范围。例如amp例如,我们可以将时间范围设置为 0 秒到 500 纳秒,它将只显示该持续时间内的信号。
  14. 重新加载: 每当显示的信号发生变化时,按下重新加载按钮。它将根据新参数重新加载并显示信号。例如amp例如,在改变信号的时间框架后,我们需要重新加载信号,以便在新设定的时间框架内显示信号。

菜单选项

从 GTKWave 软件的左上角,用户可以通过单击三条垂直线来访问菜单选项(见图 11)。用户可以在菜单选项下找到以下选项:
菜单选项

File

这 File 子菜单包含与访问相关的各种项目 files,导入导出VCD files、打印和阅读/写作 files 并退出。

编辑

编辑子菜单用于执行各种实用功能,例如更改波形子窗口中值的数据表示。使用编辑子菜单下的选项,用户可以更改信号的数据格式、重新排列信号、移动信号、修剪信号、突出显示信号、对信号进行分组、注释信号、更改信号的颜色等。

搜索

搜索子菜单用于搜索网络名称和值。它有助于对 VCD 中的信号和实例的不同层次执行功能 file.

时间

时间子菜单包含导航和状态面板按钮执行的功能超集。
它可以实现简单的、与时间相关的功能,如缩放、移动到特定时间点、沿特定方向移动信号等。

标记

标记子菜单用于对标记执行各种操作以及控制屏幕外滚动。
它可以在信号窗口上添加大量标记。最多允许添加 26 个名称标记,并且所有标记的时间必须不同。

a. 在信号窗口添加标记
在您想要放置标记的所需点处单击鼠标左键,然后按 ALT + N。这将在所需点处放置一个命名标记(A、B、C 等)。用户可以继续对 26 个不同的时间位置执行此操作。
要比较所有位置标记的时间值,菜单 → 标记 → 显示更改标记数据。
这将打开一个窗口,其中包含每个标记处的时间值。用户可以手动记录每个标记处的时间值,然后将其减去以计算两个标记之间的时间差。
b. 删除信号窗口中的标记

用户可以进入菜单 → 标记 → 收集命名标记。这将删除信号窗口中放置的最后一个命名标记。用户可以通过进入菜单 → 标记 → 收集所有命名标记来删除所有命名标记(图 12)。
菜单选项

在图 13 中,我们可以看到信号颜色是如何变化的。您还可以观察到信号窗口中添加了一个空白信号,并带有注释 - 空白信号。
还要注意 6 个命名标记 (A – E) 的存在以及 ps 中这些标记之间的时间值的计算。
菜单选项

View

这 View 子菜单用于控制处理信号子窗口中状态项和值的图形渲染的各种属性。从此菜单中,您可以将信号窗口转换为黑白或彩色。 View 子菜单还允许您更改时间维度,范围从秒 (secs) 到飞秒 (fs)。用户可以找到此选项 View → 缩放到时间维度 → fs。

帮助

帮助子菜单包含启用在线帮助以及显示程序版本信息的选项。

结论

创建此文档是为了帮助用户通过纠正绘制所需的测试平台并使用 Icarus Verilog 和 GTKWave 显示波形并观察结果来成功模拟他们的设计并验证功能。

修订历史

修订 日期 描述
1.00 20 年 2024 月 XNUMX 日 初始版本。

R19US0011EU0100 修订版1.0
20 年 2024 月 XNUMX 日
© 2024 瑞萨电子
标识

文件/资源

RENESAS ForgeFPGA 软件仿真 [pdf] 用户指南
REN_r19us0011eu0100,ForgeFPGA 软件仿真,ForgeFPGA 软件,ForgeFPGA,ForgeFPGA 仿真,软件仿真,仿真,软件

参考

发表评论

您的电子邮件地址不会被公开。 必填字段已标记 *