`timescale 1ns/1ns 解读

module   counter
#(
  parameter    CNT_MAX = 25'd24_999_999
)
(
  input   wire        sys_clk,
  input   wire        sys_rst_n,
  
  output  reg        led_out
);

reg   [24:0]   cnt;
reg            cnt_flag;

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
	     cnt <= 25'd0;
    else   if(cnt == CNT_MAX)
	     cnt <= 25'd0;
    else
	     cnt <= cnt + 25'd1;
		 
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
	     cnt_flag  <= 1'b0;
    else   if(cnt == (CNT_MAX-25'd1))
	     cnt_flag  <= 1'b1;
    else 
	     cnt_flag  <= 1'b0;
		 
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
	     led_out <= 1'd0;
	else   if(cnt_flag == 1'b1)
	     led_out <= ~led_out;
    else
	     led_out <= led_out;	 
endmodule

1:`timescale 1ns/1ns

写在所有仿真文件(.v)的代码首行,时间尺度、精度单位定义,时间尺度预编译指令,用来定义模块仿真时的时间单位和时间精度,不可被综合,但在可综合代码中也可以写,只是会在仿真时表达效果,而综合时会自动被综合器优化掉。格式如下:

`timescale   时间尺度/时间精度         或          `timescale timeunit / timeprecision

注意:仿真时间单位和时间精度的数字只能是1、10、100,不能为其它的数字。而且,时间精度不能比时间单位还要大。最多两者一样大。比如:下面定义都是对的:

`timescale  1ns/1ns

`timescale  100ns/100ns

下面的定义是错的

`timescale  1ps/1ns

时间的进位关系如下:

1秒(s) =1000毫秒(ms)
1毫秒(ms)=1000微秒 (us)
1微秒(us)=1000纳秒 (ns)
1纳秒(ns)=1000皮秒 (ps)

时间精度就是模块仿真时间和延时的精确程序,比如:定义时间精度为10ns,那么时序中所有的延时至多能精确到10ns,而8ns或者18ns是不可能做到的

2:时间精度对仿真时间的影响

`timescale的时间精度设置是会影响仿真时间的,如下面几种设置。最后一种设置可能是第一种的一倍还多,并且占用更多的内存,所以如果没有必要,应尽量将时间精度设置得更大一些。

`timescale  1ns/1ns
`timescale  1ns/100ps
`timescale  1ns/10ps
`timescale  1ns/1ps

3:timescale对相对时间的影响

如果设定`timescale 1ns/1ps,#100是相对时间,等价于#100ns,而#100.1111会被认为是#100.111ns,因为它的精度高于timescaled的时间精度,而被四舍五入。

4:timescale的作用范围

假如咱们延时x个时间单位,那延时的总时间time = x*time_unit,但最后真正延时的时间是根据time_precision对time进行四舍五入后的结果,以下面的代码所示。

`timescale 100ns / 10ns // 时间单位100ns,时间精度10ns
module tb;
reg [4:0] set;
parameter d1 = 20,
          d2 = 1.5,
          d3 = 1.54,
          d4 = 1.55;

initial begin
    #d1   set = 0;      // real_delay = round(20*100) = 2000ns, 以10ns为精度作四舍五入
    #d2   set = 1;      // real_delay = round(1.5*100) = 150ns 
    #d3   set = 2;      // real_delay = round(1.54*100) = 150ns 
    #d4   set = 3;      // real_delay = round(1.55*100) = 160ns 
end

endmodule

参考:

https://wuzhikai.blog.csdn.net/article/details/124299401?spm=1001.2101.3001.6650.1

https://zhuanlan.zhihu.com/p/486525352

  • 20
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值