文章目录
-
- RTL自动验证
-
- 在C/RTL协同综合条件
- Test Bench的要求
- 接口综合的要求
- RTL仿真器支持
- 协同仿真不支持的优化
- 仿真IP核
- 使用C/RTL协同仿真
-
- 执行RTL仿真
- Directives验证
- 分析RTL仿真
- 波形查看器
- 调试C/RTL协同仿真
-
- 设置环境
- 指令优化
- C tb 和 C 源码
RTL自动验证
- 背景:c语言通过高层次综合(HLS)综合为相应的硬件RTL语言。再此之前进行了c的仿真,相应的硬件优化,然后下面需要进行c与RTL的协同仿真、RTL仿真及RTL输出
- 执行C仿真,并且将顶层功能或被测设备(DUT)的输入保存为“输入向量”
- 使用由Vivado HLS创建的RTL在RTL模拟中使用“输入向量”。 RTL的输出另存为“输出向量”
- 将RTL仿真中的“输出矢量”应用于综合功能后的C测试台,以验证结果是否正确。 C测试台执行结果验证
文章图片
要成功使用C / RTL协同仿真功能,需要满足以下条件:
- 测试台必须进行自我检查,如果测试通过,则返回O值;如果测试失败,则返回非零值
- 必须选择正确的接口综合选项
- 任何第三方模拟器必须能在路径中被找到
- 任何不能被优化指令优化的数组和结构体设计接口都必须在Unsupported Optimizations for Cosimulation中指出
要验证RTL设计产生的结果与原始C代码相同,请使用自检测试台执行验证。下面的代码示例显示了自检测试平台的重要功能:
int main ()
{
int ret=0;
//Execute (DUT) Function
//Write the output results to a file
//Check the results
ret = system("diff --brief -w output.dat output.golden.dat");
if(ret !=0)
{
printf("Test failed !!! \n");
ret = 1;
}
else printf("Test pass ! \n");
return ret;
}
- 该自检测试台将结果与输出中的已知的正确结果进行比较(golden…dat)
- 有很多方法可以执行此检查。这只是一个例子
- 在Vivado HLS设计流程中,函数main)的返回值指示以下内容:
- 零:结果正确
- 非零值:结果不正确
- 测试台可以返回任何非零值
- 复杂的测试台可以根据差异或故障的类型返回不同的值
- 如果在C模拟或C / RTL联合模拟之后测试台返回非零值,则Vivado HLS报告错误,并且模拟失败
- 由于系统环境(例如Linux,Windows或Tcl)会解释main函数的返回值
- 因此建议将返回值限制在8位范围内,以实现可移植性和安全性
- 确保测试台检查结果,如果测试台未检查结果但返回零,则Vivado HLS指示仿真测试通过,即使实际未检查结果也是如此
- 即使输出数据正确且有效,如果测试台没有将零值返回给函数main(),Vivado HLS也会报告模拟失败
若要使用C / RTL协同仿真功能来验证RTL设计,至少必须满足以下条件之一:
- 顶级功能必须使用ap_ctrl_hs或ap_ctrl_chain区块层次接口
- 设计必须是纯粹的组合
- 顶级函数的启动间隔必须为1
- 接口必须是所有正在流式传输并以ap-hs或axis接口模式实现的阵列
note:hls::stream变量自动实现为ap_fifo接口
@E[SIM-345] Cosim only supports the following ‘ap_ctrl_none’ designs: (1)Important !
combinational designs; (2) pipelined design with task interval of 1; (3)
designs with array streaming or hls_stream ports.
@E [SIM-4] C/RTL co-simulation finished: FAIL
- 如果将设计指定为使用块级IO协议ap_ctrl_none,并且该设计包含任何采用非阻塞行为的流变量hls::stream,则不能保证C / RTL协同仿真完成
- 如果将任何顶级函数参数指定为AXI-Lite接口,则函数返回也必须指定为AXI-Lite接口
- 确保满足上述要求之后,您可以使用C / RTL协同仿真通过Verilog或VHDL验证RTL设计。默认的仿真语言是Verilog
- 但是,您也可以指定VHDL。当默认模拟器是Vivado Simulator(XSim)时,您可以使用以下任何模拟器来运行C / RTL协同仿真:
- Vivado Simulator(XSim)
- ModelSim simulator
- VCS simulator
- NC-Sim simulator
- Riviera simulator
- Xcelium
- 要使用第三方仿真器(例如ModelSim,VCS,Riviera)验证RTL设计,您必须在系统搜索路径中包括仿真器的可执行文件,并且相应的许可证必须可用。有关配置这些模拟器的详细信息,请参见第三方供应商文档
- 验证SystemC设计时,必须选择ModelSim仿真器,并确保它包括具有适当许可的Ccompiler功能
【【FPGA】 HLS教程之C/RTL Cosimulation】RTL验证不支持对接口上的结构中的一个或多个数组执行多个转换的情况
为了执行自动验证,功能接口上的数组或功能接口上的结构内部数组可以使用以下任何一种优化,但不能使用两个或更多个:
- 在相同大小的数组上的垂直映射
- 重塑
- 划分
- 数据包结构
- 水平映射
- 不同大小的数组的垂直映射
- 包含其他结构作为成员的结构的数据包
- 不支持在启用了寄存器片的AXIS上进行有条件的访问
- 将数组映射到流
- 当使用浮点内核实现设计时,必须使RTL仿真器可以使用浮点内核的位精确模型。如果使用Xilinx Vivado Simulator使用Verilog和VHDL执行RTL仿真,则将自动完成此操作
- 对于受支持的HDL 3rd-party模拟器,必须预先编译Xilinx浮点库并将其添加到模拟器库中。以下示例步骤演示了如何在Verilog中编译浮点库以与VCS模拟器一起使用
- 打开Vivado(不是Vivado HLS),然后在Tcl控制台窗口中发出以下命令
compilesimlib -simulator vcs-mx -family all -language verilog
- This command creates floating-point library in the current directory
- 请参阅Vivado控制台窗口中的目录名称,例如./rev3-1然后可以从Vivado HLS中引用该库:
cosim-design -trace-level all -tool vcs-compiled-library-dir/
/rev31
使用C/RTL协同仿真
文章图片
以下是选项:
- Setup Only:这将创建运行模拟但不执行模拟器所需的所有文件(包装程序,适配器和脚本)。可以从相应的RTL模拟文件夹 / sim / 中的命令外壳程序中运行模拟
- Dump Trace:这会为每个功能生成跟踪文件,并将其保存到 / sim / 文件夹。下拉菜单允许您选择将哪些信号保存到跟踪文件。您可以选择跟踪设计中的所有信号,仅跟踪顶层端口或不跟踪任何信号。有关使用跟踪文件的详细信息,请参阅所选RTL模拟器的文档
- Optimizing Compile:这可以确保对C测试平台进行高级优化。使用此选项会增加编译时间,但模拟执行速度更快
- Reduce Disk Space:执行RTL模拟之前,上面显示的流程将保存所有事务的结果。在某些情况下,这可能会导致数据文件很大。 reduce_diskspace选项可用于一次执行一个事务,并减少文件所需的磁盘空间量。如果函数在C测试平台中执行了N次,则reduce_diskspace选项将确保执行N个单独的RTL仿真,这将导致模拟运行变慢
- Compiled Library Location:这指定了第三方RTL模拟器的编译库的位置
- Input Arguments:这允许指定测试平台所需的任何参数
执行RTL仿真
Vivado HLS在项目子目录中执行RTL仿真:< SOLUTION > / sim / < RTL > 下
- SOLUTION是解决方案的名称
- RTL是为仿真选择的RTL类型
Directives验证
C / RTL协同仿真自动体现DEPENDENCE和DATAFLOW指令的各个方面
- 如果将DATAFLOW指令用于管道任务,它将在任务之间插入通道以促进任务之间的数据流
- 通常使用FIFO实现通道,并使用STREAM指令或config-dataflow命令指定FIFO深度
- 如果FIFO的深度太小,则RTL模拟可能会停顿
- 例如,如果指定的FIFO的深度为2,但生产方任务在使用者任务读取任何数据值之前写入了三个值,则FIFO会阻塞生产方
- 在某些情况下,这可能会导致整个设计停滞
文章图片
- 在这种情况下,请检查任务之间通道的实现,并确保任何FIFO足够大以容纳正在生成的数据
- 类似的方式,RTL测试平台还配置为自动确认使用DEPENDENCE指令指定的错误依赖关系
- 这表明依赖性不是假的,必须删除该依赖性才能实现功能上有效的设计
- C / RTL协同仿真完成后,仿真报告将打开并显示测得的延迟和II
- 这些结果可能与HLS合成后报告的值不同,后者是基于通过设计的绝对最短和最长路径得出的
- C / RTL协同仿真后提供的结果显示了给定仿真数据集的延迟和II的实际值(如果使用不同的输入刺激,则可能会改变)
- 在非流水线设计中,C / RTL协同仿真可测量ap-start和ap-done信号之间的延迟
- II比延迟多1,因为设计在所有操作完成后的1个周期内读取新的输入仅在当前事务完成后才开始下一个事务
- 在流水线设计中,设计可能会在第一个事务完成之前读取新的输入,并且在事务完成之前可能会有多个ap_start和ap_ready信号
- 在这种情况下,C / RTL协同仿真将等待时间测量为数据输入值和数据输出值之间的周期数
- II是ap_ready之间的周期数,设计将其用于请求新的输入
Optionally:您可以使用Open Wave Viewer工具栏按钮从C / RTL协同仿真中查看波形。要查看RTL波形,必须在执行C / RTL协同仿真之前选择以下选项
- Verilog / VHDL Simulator Selection:选择Vivado模拟器。对于Xilinx 7系列及更高版本的设备,您也可以选择自动
- Dump Trace:Select all or port
- C / RTL协同仿真完成后,“ Open Wave Viewer”工具栏按钮将在Vivado IDE中打开RTL波形
波形查看器
波形查看器可将设计中的所有过程可视化。该可视化分为两部分
- HLS流程摘要
包含所有流程的活动报告的层次结构表示。例如,生成的RTL中包含的数据流和顺序过程 - 数据流分析
提供有关数据流区域内任务的详细活动信息
- C / RTL协同仿真完成后,Vivado HLS通常会指示已通过仿真,并且RTL设计的功能与初始C代码匹配
- 当C / RTL协同仿真失败时,Vivado HLS发出以下消息
[SIM-4]***C/RTL co-simulation finished:FAIL ***
设置环境
文章图片
指令优化
文章图片
C tb 和 C 源码
文章图片
文章图片
文章图片
推荐阅读
- FPGA学习手册|FPGA学习记录(5)<低通&带通FIR滤波器FPGA实现>
- 视频处理|FPGA verilog 临近插值任意比例视频缩小代码
- 视频处理|FPGA 处理视频SDRAM带宽计算
- 基于 Cyclone IV 在 Quartus 中配置 IP 核中的 PLL、RAM 与 FIFO 的详细步骤及仿真验证
- fpga|【入门学习四】基于 FPGA 使用 Verilog 实现串口回传通信代码及原理讲解
- Quartus 使用 tcl 文件快速配置管脚
- 简单接口开发|Verilog实现IIC协议读写EEPROM
- i2c|用verilog 实现的 i2c控制模块
- FPGA|FPGA实验记录五(I2C读取AHT10温湿度传感器)