FPGA TestBench编写学习
1 `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个时间单位翻转时钟信号
3 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 常用系统函数
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指令用于指定编译器在处理仿真时的时间单位和时间精度。这个指令通常在模块的顶层声明中使用,它告诉编译器和仿真器如何解释代码中的时间值。 timescale指令的语法如下: 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是什么?2.Redis里面存Java对象 Redis进阶1.雪崩/ 击穿 / 穿透2.Redis高可用-主从哨兵3.持久化RDB和AOF4.Redis未授权访问漏洞5.Redis里面安装BloomFilte Redis的应用1.验证码2.Redis高并发抢购3.缓存预热用户注册验证码4.R…...
谷粒商城【成神路】-【10】——缓存
目录 🧂1.引入缓存的优势 🥓2.哪些数据适合放入缓存 🌭3.使用redis作为缓存组件 🍿4.redis存在的问题 🧈5.添加本地锁 🥞6.添加分布式锁 🥚7.整合redisson作为分布式锁 🚗…...
Facebook、亚马逊账号如何养号?
之前我们讨论过很多关于代理器的问题。它们的工作原理是什么?在不同的软件中要使用那些代理服务器?这些代理服务器之间的区别是什么?什么是反检测浏览器等等。 除了这些问题,相信很多人也会关心在使用不同平台的时代理器的选择问题。比如,为什么最好…...
Milvus的相似度指标
官网:https://milvus.io/docs/metric.md版本: v2.3.x 在 Milvus 中,相似度度量用于衡量向量之间的相似度。选择良好的距离度量有助于显着提高分类和聚类性能。下表展示了这些广泛使用的相似性指标如何与各种输入数据形式和 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…...
蓝桥杯简单题,公司名称
题目链接(需要登录) #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只有一个顶级目录,称之为:根目录。 windows系统有多个顶级目录,即各个盘符。 2.linux路径的描述方式 /在Linux中的表示:出现在开头表示根目录,出现在后面表示层级关系。 3.什么是命…...
AOP切面编程,以及自定义注解实现切面
AOP切面编程 通知类型表达式重用表达式切面优先级使用注解开发,加上注解实现某些功能 简介 动态代理分为JDK动态代理和cglib动态代理当目标类有接口的情况使用JDK动态代理和cglib动态代理,没有接口时只能使用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:离散化、区间合并 文章目录 算法学习05:离散化、区间合并前言需要记忆的模版:一、离散化1.例题:离散化 区间和:拓展: 二、区间合并(贪心)1.例题: 总结 前言 需要记忆的模…...
内部审计2.0时代:数字化工具和方法全面升级
文章目录 一、内部审计的发展阶段二、内部审计的逻辑架构三、内部审计数字化转型面临的问题(1)缺少内部审计数字化转型规划和方案(2)非结构化数据的采集和后续利用不足(3)依赖编程或使用新工具的数据分析能…...
五子棋小游戏(sut实验报告)
实验目的 实现人与人或人与电脑进行五子棋对弈 实验内容 启动游戏,显示游戏参数设置界面,用户输入参数后进入游戏界面,显示棋盘及双方博弈过程,游戏过程中可选择退出游戏。判定一方获胜后结束本局游戏,可选择继续下…...
图像超分辨率算法ESRGAN原理及应用
前言 图像超分辨率算法是一种用于增加图像分辨率的算法,与传统的图像缩放算法不同的是,超分算法在放大图像的同时根据原图纹理生成更多细节,确保图像在放大后仍然有清晰的纹理细节。 一、模型简介 1、模型开源地址 GitHub - xinntao/ESRGAN: ECCV18 Workshops - Enhance…...
excel 动态列导出
excel动态列,只好用poi来写了,也并不复杂,一样就这个件事情抽像为几步,就是套路了,开发效率就上去了。 1 准备空模板 导出操作与excel模板的导出一样,可以参考excel导出标准化 2 自定义SheetWriteHandler …...
Java零基础入门到精通_Day 1
01 Java 语言发展史 Java语言是美国Sun公司(StanfordUniversity Network)在1995年推出的 计算机语言Java之父:詹姆斯高斯林(ames Gosling) 重要的版本过度: 2004年 Java 5.0 2014年 Java 8.0 2018年 9月 Java 11.0 (目前所使用的) 02 J…...
Spring Cloud集成nacos配置中心
1.添加Nacos Config依赖 打开nacos-config-demo的pom.xml文件并添加以下两个依赖项 项目的配置文件中通常包括数据库连接配置项、日志输出配置项、Redis连接配置项、服务注册配置项等内容,如spring-cloud-alibaba-nacos-config-base-demo项目中就包含数据库连接配置…...
【AI视频教程】只需5步,AI作出鸡你太美视频
1.视频效果 2.准备工作 制作视频效果,需要准备下面3个条件: 准备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:input tensor:Float[1, 3, 192, 320] --------------------------------------------------------------- …...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...
