FPGA TestBench编写学习

news/2024/11/28 23:45:28/

`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.ppmy.cn/news/1379700.html

相关文章

graylog API 弱密码

graylog web 页面密码设置 输入密码&#xff1a;获取sha256加密后密码 echo -n "Enter Password: " && head -1 </dev/stdin | tr -d \n | sha256sum | cut -d" " -f1vi /etc/graylog/server/server.conf #修改以下配置 root_usernameroot ro…

java SSM汽车租赁管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM汽车租赁管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用…

Linux(CentOS7.5):通过docker安装mysql8.0

一、预创建存储券映射 mkdir -p /opt/docker_mysql/conf/conf.d; mkdir -p /opt/docker_mysql/data; mkdir -p /opt/docker_mysql/logs; mkdir -p /opt/docker_mysql/mysql-files;chmod -R 755 /opt/docker_mysql; 二、编辑配置文件 vim /opt/docker_mysql/conf/conf.d/my.cnf …

ETL的数据挖掘方式

ETL的基本概念 数据抽取&#xff08;Extraction&#xff09;&#xff1a;从不同源头系统中获取所需数据的步骤。比如从mysql中拿取数据就是一种简单的抽取动作&#xff0c;从API接口拿取数据也是。 数据转换&#xff08;Transformation&#xff09;&#xff1a;清洗、整合和转…

Python中如何操作数据库?

Python中如何操作数据库&#xff1f; ​​​​​ 在Python中操作数据库通常涉及到使用数据库驱动程序或ORM&#xff08;对象关系映射&#xff09;库。下面是一些常见的步骤和工具&#xff0c;用于在Python中操作数据库&#xff1a; 1. 选择数据库和驱动程序 首先&#xff0c…

[BT]小迪安全2023学习笔记(第20天:Web攻防-PHP特性)

第20天 和 &#xff08;等值比较&#xff09; 当使用 操作符时&#xff0c;PHP将进行宽松比较&#xff0c;也就是说&#xff0c;只比较两个值的等价性&#xff0c;而不考虑它们的类型。 如果两个值类型不同&#xff0c;PHP会尝试将它们转换成相同的类型&#xff0c;然后再进…

PaddleSeg分割框架解读[01] readme解读

简介 PaddleSeg是基于飞桨PaddlePaddle的端到端图像分割套件,内置45+模型算法及140+预训练模型,支持配置化驱动和API调用开发方式,打通数据标注、模型开发、训练、压缩、部署的全流程,提供语义分割、交互式分割、Matting、全景分割四大分割能力,助力算法在医疗、工业、遥…

vue接入百度地图获取经纬度

通过城市名称和城市中心经纬度来获取当前所在地图&#xff0c;当前经纬度中心获取可以通过后端获取 静态文件包&#xff0c;替换baidu.html中的ak值&#xff0c;ak值通过百度地图官方网站申请 申请&#xff1a;百度地图API申请步骤 - 知乎 代码示例文件&#xff1a; 链接&a…