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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/737280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

并发通信(网络进程线程)

如果为每个客户端创建一个进程&#xff08;或线程&#xff09;&#xff0c;因为linux系统文件标识符最多1024位&#xff0c;是有限的。 所以使用IO复用技术&#xff0c;提高并发程度。 阻塞与非阻塞 阻塞式复用 非阻塞复用 信号驱动IO 在属主进程&#xff08;线程中声明&…

Acwing.503 借教室(二分)

题目 在大学期间&#xff0c;经常需要租借教室。 大到院系举办活动&#xff0c;小到学习小组自习讨论&#xff0c;都需要向学校申请借教室。 教室的大小功能不同&#xff0c;借教室人的身份不同&#xff0c;借教室的手续也不一样。 面对海量租借教室的信息&#xff0c;我们…

2.4_4 死锁的检测和解除

文章目录 2.4_4 死锁的检测和解除&#xff08;一&#xff09;死锁的检测&#xff08;二&#xff09;死锁的解除 总结 2.4_4 死锁的检测和解除 如果系统中既不采取预防死锁的措施&#xff0c;也不采取避免死锁的措施&#xff0c;系统就很可能发生死锁。在这种情况下&#xff0c;…

sql-mysql可视化工具Workbench导入sql文件

mysql可视化工具Workbench导入sql文件 1、打开workbench2、导入sql文件3、第一行加上库名4、开始运行 1、打开workbench 2、导入sql文件 3、第一行加上库名 4、开始运行

C++基础语法和概念

基本语法和数据类型 C 是一种高性能的编程语言&#xff0c;允许程序员对内存管理进行精细控制。了解 C 的基本语法和数据类型是学习这门语言的第一步。以下是一些基础概念的详细介绍&#xff1a; 基本语法 程序结构 一个基础的 C 程序通常包括一个或多个头文件引用、一个 m…

【图(1)】:用邻接矩阵和邻接表实现图

目录 一、图的基本概念 二、图的存储结构 1.邻接矩阵 2.邻接表 一、图的基本概念 注意&#xff1a;概念性的文字不列出太多&#xff0c;记不住也不便于理解 图&#xff08;Graph&#xff09;是由节点&#xff08;Node&#xff09;和边&#xff08;Edge&#xff09;组成的…

Vue 监听器:让你的应用实时响应变化

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

AI与自动化控制

AI与自动化控制的结合可以实现更加智能和自适应的控制系统。以下是一些AI与自动化控制结合的实例&#xff1a; 智能交通信号灯控制系统&#xff1a; 利用AI分析交通流量数据&#xff0c;实时调整信号灯的时序&#xff0c;以优化交通流动和提高道路通行效率。 工业自动化机器人…

PrintWriter使用

/*** Description PrintWriter使用* * 演示 PrintWriter的使用* author AI福*/ package com.chapter3.demo02;import java.io.PrintWriter;public class Demo07 {public static void main(String[] args) throws Exception{//1.创建打印流PrintWriter pw new PrintWriter(&quo…

CSS居中对齐 (水平垂直居中对齐)

方案一&#xff1a;flex布局【推荐】 给容器添加样式 display: flex; justify-content: center; align-items: center; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" conte…

AcWing 4262. 空调(每日一题)

题目链接&#xff1a;4262. 空调 - AcWing题库 Farmer John 的 N 头奶牛对他们牛棚的室温非常挑剔。 有些奶牛喜欢温度低一些&#xff0c;而有些奶牛则喜欢温度高一些。 Farmer John 的牛棚包含一排 N 个牛栏&#xff0c;编号为 1…N&#xff0c;每个牛栏里有一头牛。 第 i…

第三百九十六回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容&#xff0c;本章回中将介绍显示Snackbar的另外一种方法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1…

完美十进制数——去年天梯校赛

7-4 完美十进制数 对于一个十进制正整数 x&#xff0c;其包含 k 个位&#xff0c;每个数位的数字累加和为 sum 。如果 sum%k0&#xff0c;那么这个十 进制数就是完美的。 例&#xff1a;对于数 12340&#xff0c;包含 5 位&#xff0c;数位累加和为 10&#xff0c;10%50&#x…

算法-贪心-122. 糖果传递

题目 有 n个小朋友坐成一圈&#xff0c;每人有 a[i]个糖果。 每人只能给左右两人传递糖果。 每人每次传递一个糖果代价为 1。 求使所有人获得均等糖果的最小代价。 输入格式 第一行输入一个正整数 n&#xff0c;表示小朋友的个数。 接下来 n 行&#xff0c;每行一个整数…

【组合递归回溯】【StringBuilder】Leetcode 17. 电话号码的字母组合

【组合递归回溯】【StringBuilde】Leetcode 17. 电话号码的字母组合 StringBulider常用方法&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;17…

JavaScript实现通过键盘弹钢琴的效果

本片文章通过触发键盘事件来触发对应的音乐&#xff0c;而且给页面添加了渐变的active类名&#xff0c;通过触发不同的鼠标事件&#xff0c;然后active类移动来实现按下钢琴键的视觉效果。 关键代码&#xff1a; <!DOCTYPE html> <html lang"en"><h…

十堰网站建设公司华想科技具有10年的网站制作经验

2018年已经结束了。 华翔科技收到了很多客户的咨询&#xff0c;他们都有一个共同的问题&#xff1a;建一个网站需要多少钱&#xff1f; 但是&#xff0c;我们都会问&#xff1a;您有什么具体需求吗&#xff1f; 大多数人的答案是否定的&#xff0c;他们只是想打听一下价格。 十…

嵌入式3-11

1、整理思维导图 2、尝试学生结构体数组&#xff0c;完成成员的输入&#xff0c;以成绩为条件完成对学生成员的冒泡排序并输出&#xff08;全部在主函数内完成&#xff09; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.…

Django——模板

Django——模板 Django 提供一种动态生成 HTML 页面 —— 模板 1、模板语言 模板语言(DTL): 变量 &#xff0c; 注释 &#xff0c; 标签 &#xff0c; 过滤器 &#xff0c; 模板继承 1、变量 <body> <!-- 这个是前端中的注释 --> {# 这种是Django中模板语言的…

25改考408最新资讯!拷贝

东北大学 东北大学计算机考研全面改考408 东北大学计算机学院官网&#xff1a;http://www.cse.neu.edu.cn/6274/list.htm 东北大学计算机考研全面改考408 公告原文 东北大学计算机科学与工程学院关于调整2025年硕士研究生招生计算机科学与技术、计算机技术、人工智能专业初试…