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

FPGA TestBench编写学习

`timescale

1.1 简介

timescale指令用于指定编译器在处理仿真时的时间单位和时间精度。这个指令通常在模块的顶层声明中使用,它告诉编译器和仿真器如何解释代码中的时间值。

timescale指令的语法如下:

`timescale <time_unit> <time_precision>
  • <time_unit>:这是仿真中使用的时间单位,通常以纳秒(ns)或微秒(us)为单位。例如,如果设置为1ns,那么仿真器会将代码中的1单位时间解释为1纳秒。

  • <time_precision>:这是仿真器在处理时间值时的精度。它定义了仿真器在计算和比较时间值时使用的小数点后的位数。例如,如果设置为1ps,那么仿真器会将时间值计算到皮秒(ps)的精度。

一个典型的timescale指令可能如下所示:

`timescale 1ns / 1ps

这表示仿真器将使用1纳秒作为时间单位,并且时间精度为1皮秒。这意味着仿真器在处理时间值时会考虑到1皮秒的精度。

1.2 例子

下面看一个简单的例子来了解下`timescale的使用方法:

`timescale 10ns/1ns     //单位10ns,精度1nsmodule testbench;reg set;localparam d = 1.8;initial begin#1    set = 0;    //1*10 ns  = 10ns#d    set = 1;    //1.8*10ns = 18nsend
endmodule
  • 时间单位设置为10ns,精度设置为1ns
  • 第1次在#1时对set赋值0,此时延时时间为10ns,因为时间单位为10ns,#1表示延时1个时间单位
  • 第2次在#d时对set赋值1,此时延时时间为18+10ns,因为时间单位为10ns,#d表示延时1.8个时间单位,即18ns

不要设置无意义的高精度,时间精度越高,对应的仿真所消耗的资源和时间就越多。

比如“`timescale 1ns/1ps”,一般仿真时不需要精确到ps级,所以只需要设置成ns级就行,比如“`timescale 1ns/1ns”。

2 时钟信号

parameter Period = 10;//周期
wire clk;
always #(Period/2) clk = ~clk
always #5 clk = ~clk; // 每5个时间单位翻转时钟信号

initial语句块

3.1 简介

在Verilog中,initial语句块是一个用来模拟测试的构造,它在仿真开始时执行一次。它通常用于在仿真开始之前对变量进行初始化,或者在仿真过程中生成激励。

initial语句块可以包含一系列的Verilog语句,如变量声明、赋值语句、循环结构(如forever)、条件语句(如if-else)、顺序块(begin-end)等。

Verilog文件中的所有initial块都是同时并发执行的,但在每个initial块内部是按照写入的顺序执行的。

3.2 例子

module test;reg [3:0] data;initial begindata = 4'b0001;  // 初始化data为0001#10 data = 4'b0010;  // 经过10个时间单位后,将data赋值为0010#10 data = 4'b0100;  // 再过10个时间单位后,将data赋值为0100#10 $finish;  // 经过10个时间单位后,结束仿真end
endmodule

常用系统函数

4.1 $finish

$finish任务用于立即终止当前的仿真。

当执行到$finish时,仿真器会停止仿真,并且不会执行任何后续的仿真时间点。
这个任务通常在测试平台中用于在特定的测试条件满足后结束仿真,例如,当检测到错误或完成了一系列测试后。
使用示例:

initial begin// ... 一些初始化代码 ...// 执行测试if (some_condition) begin$display("Test condition met, finishing simulation.");$finish; // 终止仿真end
end

4.2  $stop

$stop任务用于暂停仿真,但它不会立即终止仿真。

相反,它会停止仿真直到下一个仿真时间点。这意味着仿真器会等待直到下一个时间点,然后根据仿真器的设置,可能会继续仿真或者停在那个时间点。
$stop通常用于调试目的,例如,当仿真器在某个特定的时间点停止时,设计师可以检查电路的状态,然后决定是否继续仿真或者结束仿真。
使用示例:

initial begin// ... 一些初始化代码 ...// 执行测试$display("Pausing simulation for inspection.");$stop; // 暂停仿真// 如果需要继续仿真,可以在这里添加代码// 如果需要结束仿真,可以在这里添加 $finish;
end

$stop一般与wait函数配合使用,检测到仿真结束条件时,停止仿真,这样就不用一直盯着仿真界面。直接在initial语句中,调用该语句即可,如:

reg reset, start_r;
wire data_end;initial begin// 初始化信号reset = 1;         // 将reset信号设置为高电平start_r = 0;       // 将start_r信号设置为低电平// 等待10个时间单位#10 reset = 0;     // 经过10个时间单位后,将reset信号设置为低电平// 等待100个时间单位#100 start_r = 1;  // 经过100个时间单位后,将start_r信号设置为高电平// 等待data_end信号变为高电平wait(data_end);    // 这会阻塞直到data_end信号变为高电平// 当data_end变为高电平时,执行$stop$stop;             // 暂停仿真,用户可以在此时进行调试
end

4.3 $display

$display用于在仿真过程中输出信息到控制台。它允许设计者在仿真时查看信号的值、变量的状态以及仿真过程中的其他信息。

$display的基本语法如下:

$display(format_string, arg1, arg2, ..., argn);
  • format_string:这是一个字符串,用于指定输出的格式。你可以在其中使用格式说明符,如 %d 表示十进制数,%b 表示二进制数,%o 表示八进制数,%x 表示十六进制数等。还可以使用 %m 来输出一个字符串,%t 来输出时间信息,%% 表示字面上的百分号。

  • arg1, arg2, ..., argn:这些是要输出的参数,它们的数量和类型应该与 format_string 中的格式说明符相匹配。

使用例子:

module test;reg [3:0] a, b;initial begina = 4'b1010;b = 4'b1100;$display("a = %b, b = %b", a, b);  // 输出:a = 1010, b = 1100$display("Sum = %d", a + b);       // 输出:Sum = 12end
endmodule

4.4 $monitor

$monitor用于在仿真过程中监控指定的信号变化,并在信号值发生变化时输出相关信息。$monitor通常用于调试,因为它可以帮助设计者实时跟踪信号的状态。

用法与$display类似:

module test;reg [3:0] a, b;initial begina = 4'b0001;b = 4'b0010;#10 a = 4'b0010;#10 b = 4'b0100;#10 a = 4'b0101;endinitial begin$monitor("Time = %t, a = %b, b = %b",$time, a, b);end
endmodule

在这个例子中,$monitor用于监控寄存器a和b的值。每当a或b的值发生变化时,$monitor都会输出当前的时间、a和b的值。输出结果可能如下:

Time = 0, a = 0001, b = 0010
Time = 10, a = 0010, b = 0010
Time = 20, a = 0010, b = 0100
Time = 30, a = 0101, b = 0100

相关文章:

FPGA TestBench编写学习

1 timescale 1.1 简介 timescale指令用于指定编译器在处理仿真时的时间单位和时间精度。这个指令通常在模块的顶层声明中使用&#xff0c;它告诉编译器和仿真器如何解释代码中的时间值。 timescale指令的语法如下&#xff1a; timescale <time_unit> <time_precis…...

Centos7 安装mongoDB

下载安装包 curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.12.tgz 解压 tar -zxvf mongodb-linux-x86_64-3.2.12.tgz移动到指定位置 mv mongodb-linux-x86_64-3.2.12/ /usr/local/mongodb在/usr/local/mongodb下创建文件夹 cd /usr/local/mongodb m…...

Redis冲冲冲——Redis持久化方式及其区别

目录 引出Redis持久化方式Redis入门1.Redis是什么&#xff1f;2.Redis里面存Java对象 Redis进阶1.雪崩/ 击穿 / 穿透2.Redis高可用-主从哨兵3.持久化RDB和AOF4.Redis未授权访问漏洞5.Redis里面安装BloomFilte Redis的应用1.验证码2.Redis高并发抢购3.缓存预热用户注册验证码4.R…...

谷粒商城【成神路】-【10】——缓存

目录 &#x1f9c2;1.引入缓存的优势 &#x1f953;2.哪些数据适合放入缓存 &#x1f32d;3.使用redis作为缓存组件 &#x1f37f;4.redis存在的问题 &#x1f9c8;5.添加本地锁 &#x1f95e;6.添加分布式锁 &#x1f95a;7.整合redisson作为分布式锁 &#x1f697…...

Facebook、亚马逊账号如何养号?

之前我们讨论过很多关于代理器的问题。它们的工作原理是什么?在不同的软件中要使用那些代理服务器?这些代理服务器之间的区别是什么?什么是反检测浏览器等等。 除了这些问题&#xff0c;相信很多人也会关心在使用不同平台的时代理器的选择问题。比如&#xff0c;为什么最好…...

Milvus的相似度指标

官网&#xff1a;https://milvus.io/docs/metric.md版本: v2.3.x 在 Milvus 中&#xff0c;相似度度量用于衡量向量之间的相似度。选择良好的距离度量有助于显着提高分类和聚类性能。下表展示了这些广泛使用的相似性指标如何与各种输入数据形式和 Milvus 索引相匹配。 一、浮…...

如何在unity中实现倒计时

public class showtime : MonoBehaviour {public TextMeshProUGUI Countdown;void Update(){if (Input.GetKeyDown(KeyCode.Space))//如果按下空格后开始倒计时{StartCoroutine(hahaha());}}IEnumerator hahaha()//声明了一个协程函数 hahaha{int time 10;Countdown.text tim…...

蓝桥杯简单题,公司名称

题目链接&#xff08;需要登录&#xff09; #include <iostream> #include <cstring> #include <algorithm> using namespace std; bool lanqiao(string str,int len){ sort(str.begin(),str.end());//对str按照ascii排序if(str.find("Laainoq")s…...

【linux】02 :Linux基础命令

1.掌握linux系统的目录结构 linux只有一个顶级目录&#xff0c;称之为&#xff1a;根目录。 windows系统有多个顶级目录&#xff0c;即各个盘符。 2.linux路径的描述方式 /在Linux中的表示&#xff1a;出现在开头表示根目录&#xff0c;出现在后面表示层级关系。 3.什么是命…...

AOP切面编程,以及自定义注解实现切面

AOP切面编程 通知类型表达式重用表达式切面优先级使用注解开发&#xff0c;加上注解实现某些功能 简介 动态代理分为JDK动态代理和cglib动态代理当目标类有接口的情况使用JDK动态代理和cglib动态代理&#xff0c;没有接口时只能使用cglib动态代理JDK动态代理动态生成的代理类…...

C70600 CuNi10Fe1Mn铜合金深冲性能好

C70600 CuNi10Fe1Mn铜合金深冲性能好CW608N-R460、CW608N-H135、CuZn36Pb2As-R370、CuZn38Pb1-R460、CW607N-H120、CuZn38Pb1-H120、CW602N-H080、CW608N-H105、CuZn39Pb0.5-R460、CuZn39Pb0.5-H120、CW608N-H120、CuZn38Pb1-R470、CW607N-H080、CW607N-R470、CW607N-H105、CuZ…...

算法学习05:离散化、区间合并

算法学习05&#xff1a;离散化、区间合并 文章目录 算法学习05&#xff1a;离散化、区间合并前言需要记忆的模版&#xff1a;一、离散化1.例题&#xff1a;离散化 区间和&#xff1a;拓展: 二、区间合并&#xff08;贪心&#xff09;1.例题&#xff1a; 总结 前言 需要记忆的模…...

内部审计2.0时代:数字化工具和方法全面升级

文章目录 一、内部审计的发展阶段二、内部审计的逻辑架构三、内部审计数字化转型面临的问题&#xff08;1&#xff09;缺少内部审计数字化转型规划和方案&#xff08;2&#xff09;非结构化数据的采集和后续利用不足&#xff08;3&#xff09;依赖编程或使用新工具的数据分析能…...

五子棋小游戏(sut实验报告)

实验目的 实现人与人或人与电脑进行五子棋对弈 实验内容 启动游戏&#xff0c;显示游戏参数设置界面&#xff0c;用户输入参数后进入游戏界面&#xff0c;显示棋盘及双方博弈过程&#xff0c;游戏过程中可选择退出游戏。判定一方获胜后结束本局游戏&#xff0c;可选择继续下…...

图像超分辨率算法ESRGAN原理及应用

前言 图像超分辨率算法是一种用于增加图像分辨率的算法,与传统的图像缩放算法不同的是,超分算法在放大图像的同时根据原图纹理生成更多细节,确保图像在放大后仍然有清晰的纹理细节。 一、模型简介 1、模型开源地址 GitHub - xinntao/ESRGAN: ECCV18 Workshops - Enhance…...

excel 动态列导出

excel动态列&#xff0c;只好用poi来写了&#xff0c;也并不复杂&#xff0c;一样就这个件事情抽像为几步&#xff0c;就是套路了&#xff0c;开发效率就上去了。 1 准备空模板 导出操作与excel模板的导出一样&#xff0c;可以参考excel导出标准化 2 自定义SheetWriteHandler …...

Java零基础入门到精通_Day 1

01 Java 语言发展史 Java语言是美国Sun公司(StanfordUniversity Network)在1995年推出的 计算机语言Java之父:詹姆斯高斯林(ames Gosling) 重要的版本过度&#xff1a; 2004年 Java 5.0 2014年 Java 8.0 2018年 9月 Java 11.0 &#xff08;目前所使用的&#xff09; 02 J…...

Spring Cloud集成nacos配置中心

1.添加Nacos Config依赖 打开nacos-config-demo的pom.xml文件并添加以下两个依赖项 项目的配置文件中通常包括数据库连接配置项、日志输出配置项、Redis连接配置项、服务注册配置项等内容&#xff0c;如spring-cloud-alibaba-nacos-config-base-demo项目中就包含数据库连接配置…...

【AI视频教程】只需5步,AI作出鸡你太美视频

1.视频效果 2.准备工作 制作视频效果&#xff0c;需要准备下面3个条件&#xff1a; 准备stable diffusion的环境剪辑一段【鸡你太美】原版视频stable diffusion安装sd-webui-IS-NET-pro插件 2.1部署stable diffusion环境 这里还是建议大家用云平台部署stable diffusion&am…...

C# OpenCvSharp DNN FreeYOLO 密集行人检测

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN FreeYOLO 密集行人检测 效果 模型信息 Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Float[1, 3, 192, 320] --------------------------------------------------------------- …...

利用screen高效管理串口会话:从基础操作到高级技巧

1. 为什么选择screen管理串口&#xff1f; 第一次接触串口调试时&#xff0c;我和大多数人一样用的是minicom。直到有次调试某款嵌入式设备&#xff0c;发现minicom显示BIOS信息时色彩混乱&#xff0c;这才开始寻找替代方案。screen这个看似普通的终端复用工具&#xff0c;在串…...

【Skills开发实战指南】第25篇:PPT演示Skill:幻灯片自动生成与美化

在企业汇报、产品展示、学术演讲等场景中&#xff0c;PowerPoint演示文稿的制作是极其重要但耗时的工作。本文深入探讨如何通过Skills实现PPT演示文稿的自动化生成与美化&#xff0c;从基础幻灯片创建到复杂模板设计&#xff0c;从简单的文本填充到高级的图表集成&#xff0c;提…...

C++ 右值引用与程序优化

一、左值与右值基础概念1. 左值&#xff08;Lvalue&#xff09;定义&#xff1a;能取地址、可被修改&#xff08;除非用const修饰&#xff09;的表达式&#xff0c;有持久的生命周期。示例&#xff1a;int a 10; // a是左值&#xff0c;&a合法 const int b 20; // b是con…...

【AI绘图进阶指南】Latent Diffusion Model核心组件解析——从理论到实践

1. 从像素到潜空间&#xff1a;Autoencoder如何重塑AI绘图 第一次接触Latent Diffusion Model&#xff08;LDM&#xff09;时&#xff0c;最让我困惑的就是&#xff1a;为什么要把好端端的图片压缩成看不懂的"潜空间"表示&#xff1f;后来在项目里踩过几次坑才明白&a…...

Ubuntu 22 Server 直传百度网盘实战:成功可用的完整流程

我的目标很明确&#xff1a;把 Ubuntu 22 Server 上的数据直接上传到百度网盘&#xff0c;然后在 Windows 版百度网盘里下载。实际踩坑后&#xff0c;最终可用的方案是&#xff1a;不用账号密码直登类工具改用 bypy通过授权码绑定百度网盘把服务器文件上传到百度网盘的 我的应用…...

Neeshck-Z-lmage_LYX_v2企业应用:LoRA权重数字签名与版本溯源机制

Neeshck-Z-lmage_LYX_v2企业应用&#xff1a;LoRA权重数字签名与版本溯源机制 1. 引言&#xff1a;从工具到系统&#xff0c;企业级应用的新挑战 你可能已经体验过Neeshck-Z-lmage_LYX_v2这个轻量化绘画工具。它确实很方便——基于Z-Image底座模型&#xff0c;支持动态切换Lo…...

ROS机器人开发实战:用tf库搞定四元数、欧拉角、旋转矩阵的6种转换(附C++/Python代码)

ROS机器人开发实战&#xff1a;四元数、欧拉角与旋转矩阵的高效转换指南 在机器人开发中&#xff0c;姿态表示就像工程师的语言——四元数、欧拉角和旋转矩阵各有其独特的语法规则。记得第一次调试机械臂时&#xff0c;我被这些转换搞得晕头转向&#xff0c;直到发现tf库这个&q…...

RAG的完整链路拆解:从文档切片到向量检索到LLM回答

RAG是目前最主流的破解方案&#xff1a;不改模型&#xff0c;而是在回答之前先去知识库里把相关信息捞出来&#xff0c;跟问题一起喂给LLM。LLM从万事通变成了带参考资料的答题者。 上篇我们搞清了一件事&#xff1a;LLM的知识边界就是训练数据的边界。超出这个边界它不会说不知…...

如何快速上手PointNet_Pointnet2_pytorch:从零开始的完整教程

如何快速上手PointNet_Pointnet2_pytorch&#xff1a;从零开始的完整教程 【免费下载链接】Pointnet_Pointnet2_pytorch PointNet and PointNet implemented by pytorch (pure python) and on ModelNet, ShapeNet and S3DIS. 项目地址: https://gitcode.com/gh_mirrors/po/Po…...

为什么TitanHide是逆向工程师的必备工具?

为什么TitanHide是逆向工程师的必备工具&#xff1f; 【免费下载链接】TitanHide Hiding kernel-driver for x86/x64. 项目地址: https://gitcode.com/gh_mirrors/ti/TitanHide TitanHide是一款专为逆向工程师设计的内核级隐藏驱动&#xff0c;通过修改系统内核函数的返…...