手机制作网站免费,加盟推广公司,wordpress免费企业站主题,网站管理后台 模板1 timescale
1.1 简介
timescale指令用于指定编译器在处理仿真时的时间单位和时间精度。这个指令通常在模块的顶层声明中使用#xff0c;它告诉编译器和仿真器如何解释代码中的时间值。
timescale指令的语法如下#xff1a;
timescale time_unit time_precis…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此时延时时间为1810ns因为时间单位为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 4b0001; // 初始化data为0001#10 data 4b0010; // 经过10个时间单位后将data赋值为0010#10 data 4b0100; // 再过10个时间单位后将data赋值为0100#10 $finish; // 经过10个时间单位后结束仿真end
endmodule4 常用系统函数
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; // 暂停仿真用户可以在此时进行调试
end4.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 4b1010;b 4b1100;$display(a %b, b %b, a, b); // 输出a 1010, b 1100$display(Sum %d, a b); // 输出Sum 12end
endmodule4.4 $monitor
$monitor用于在仿真过程中监控指定的信号变化并在信号值发生变化时输出相关信息。$monitor通常用于调试因为它可以帮助设计者实时跟踪信号的状态。
用法与$display类似
module test;reg [3:0] a, b;initial begina 4b0001;b 4b0010;#10 a 4b0010;#10 b 4b0100;#10 a 4b0101;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