Verilog系统函数
- 前言
- 一、$width
- (一)简介
- (二)$width 参数
- (三)例子
- 二、Specify参数
- 三、$display
- (一)简介
- (二)格式说明
- (三)例子
- 1.例1
- 2.例2
- 四、$time
- (一)简介
- (二)例子
- 参考
前言
在Verilog HDL语言中每个系统函数和任务前面都用一个标识符$
来加以确认。这些系统函数和任务提供了非常强大的功能。
在ModelSim仿真时添加系统函数利于调试。
一、$width
(一)简介
$width函数用于检查信号脉冲的宽度是否达到要求。而信号脉冲的宽度由信号的reference_event和data_event决定,如下图所示
(二)$width 参数
Argument | Description | 翻译 |
---|---|---|
reference_event | Timestamp edge triggered event | 时间戳边缘触发事件 |
(data_event - implicit) | Timecheck edge triggered event | 时间检查边沿触发事件 |
limit | Non-negative constant expression | 非负常量表达式 |
threshold(optional) | Non-negative constant expression | 非负常量表达式 |
notifier (optional) | Reg | — |
-
第二个参数data_event是一个隐式参数,也就是说你不用将它写出来。系统会根据你的第一个参数得到第二个参数,也就是说,第二个参数就是第一个参数的反向取沿。
-
第3、4个参数是可选的。但是需要注意要使用第4个参数,首先要有第3个参数。
-
第3个参数是门限值,如果脉冲小于该门限,是不会报violation的,没有该参数时该值为0。
(三)例子
1.下面的示例演示了一些合法和非法调用的示例:
//Legal calls
$width ( negedge clr , lim ) ;
$width ( negedge clr , lim , thresh , notif) ;
$width ( negedge clr , lim , 0 , notif ) ;
//Illegal calls
$width ( negedge clr , lim, , notif ) ;
$width ( negedge clr , lim , notif);
2.如图
二、Specify参数
这些主要用于提供定时和延迟值,使用specparam关键字来声明。它既可以在specify块内使用,也可以在主模块体中使用。
// Use of specify block
specify
specparam t_rise = 200, t_fall = 150;
specparam clk_to_q = 70, d_to_q = 100;
endspecify
// Within main module
module my_block ( ... );
specparam dhold = 2.0;
specparam ddly = 1.5;
parameter WIDTH = 32;
endmodule
三、$display
(一)简介
$display(p1,p2,....pn)
;
作用是用来输出信息,即将参数p2到pn按参数p1给定的格式输出。参数p1通常称为“格式控制”,参数p2至pn通常称为“输出表列”。$display自动地在输出后进行换行。
(二)格式说明
格式说明,由"%"和格式字符组成。它的作用是将输出的数据转换成指定的格式输出。格式说明总是由“%”字符开始的。对于不同类型的数据用不同的格式输出。下表中给出了常用的几种输出格式。
普通字符,即需要原样输出的字符。其中一些特殊的字符可以通过下表中的转换序列来输出。下面表中的字符形式用于格式字符串参数中,用来显示特殊的字符。
(三)例子
1.例1
module disp;
initial
begin
$display("\\\t%%\n\"\123");
end
endmodule
输出结果
\%
"S
从上面的这个例子中可以看到一些特殊字符的输出形式(八进制数123就是字符S)。
2.例2
module disp;
reg[31:0] rval;
pulldown(pd);
initial
begin
rval=101;
$display("rval=%h hex %d decimal", rval, rval);
$display("rval=%o otal %b binary", rval, rval);
$display("rval has %c ascii character value",rval);
$display("pd strength value is %v",pd);
$display("current scope is %m");
$display("%s is ascii value for 101",101);
$display("simulation time is %t",$time);
end
endmodule
输出结果
rval=00000065 hex 101 decimal
rval=00000000145 octal 00000000000000000000000001100101 binary
rval has e ascii character value
pd strength value is StX
current scope is disp
e is ascii value for 101
simulation time is 0
更详细例子参考Verilog语法之十二:系统函数和任务
四、$time
(一)简介
.时间度量系统函数,在Verilog HDL中有两种类型的时间系统函数: t i m e 和 time和 time和realtime。用这两个时间系统函数可以得到当前的仿真时刻。
$time可以返回一个64比特的整数来表示的当前仿真时刻值。该时刻是以模块的仿真时间尺度为基准的。
(二)例子
`timescale 10ns/1ns
module test;
reg set;
parameter p=1.6;
initial
begin
$monitor($time,,"set=",set);
#p set=0;
#p set=1;
end
endmodule
输出结果为:
0 set=x
2 set=0
3 set=1
在这个例子中,模块test想在时刻为16ns时设置寄存器set为0,在时刻为32ns时设置寄存器set为1。但是由$time记录的set变化时刻却和预想的不一样。这是由下面两个原因引起的:
-
$ time显示时刻受时间尺度比例的影响。在上面的例子中,时间尺度是10ns,因为$ time输出的时刻总是时间尺度的倍数,这样将16ns和32ns输出为1.6和3.2。
-
因为$time总是输出整数,所以在将经过尺度比例变换的数字输出时,要先进行取整。在上面的例子中,1.6和3.2经取整后为2和3输出。注意:时间的精确度并不影响数字的取整。
参考
Verilog的Timing check函数之$width
Verilog初级教程(19)Verilog中的参数
静态时序分析—脉冲宽度检查(Pulse Width Check)
Verilog语法之十二:系统函数和任务
verilog中的$ display和$ wirte