SV3
过程语句和子程序
- task 与 function 区别
- task 可以消耗时间而 function 不能
- function 不可以带 时延语句 或者 阻塞语句
- function 必须有 返回值, 并且返回值必须被使用
- SV中允许 function 调用 task,只能在fork…jion_none线程中调用
- 所有用于调试的子程序都应该定义成 void函数,不消耗时间,灵活,可以被其他任务或者函数调用
任务和函数
- 子程序去掉 begin … end
- 使用task / endtask,function/endfunction 定义边界
- 通用输入类型:logic
task mytask1(output logic [31:0]x,input logic y);
endtask
缺省类型和方向为:input logic
-
SV中,参数类型可以为ref,比input,output好用
-
ref参数只能被用于带自动存储的子程序中
-
在任务中可以修改变量且结果对调用它的函数随时可见
task sticky(int a,int b); //未说明端口方向,则为 input int a,input int b;
- 在module 与 program 块中的子程序,缺省情况下仍使用静态存储,若要使用自动存储,必须加automatic关键词
时间参数
- SV允许使用数值和单位来明确指明一个时间值,代码可以使用timeunit,timeprecision,'timescale
- 也可以使用verilog里面的 t i m e f o r m a t , timeformat, timeformat,time,$realtime
- timeformat 四个参数分别是 时间标度,小数点后的数据精度,时间值之后的后缀字符串,显示数值的最小宽度
- -9 表示 纳秒, -12表示皮秒
module timing
timeunit 1ns;
timeprecision 1ps;
initial begin
$timeformate(-9, 3, "ns", 8);
#1 $display("%t",$realtime); // 1.000ns
#2ns $display("%t",$realtime); // 3.000ns
#0.1ns $display("%t",$realtime); // 3.100ns
#41ps $display("%t",$realtime); // 3.141ns
end
endmodule
- time类型变量不能保存 小数时延,因为其为64bit整数,时延的小数部分会被舍去,应该使用real类型保存精确的数值,他们只在用作时延量时被舍入
'timescale 1ps/1ps
module ps;
initial begin
real rdelay = 800fs; // 以 0.800 存储
time tdelay = 800fs; // 舍入后得到 1
$timeformat(-15, 0, "fs", 5);
#rdelay; // 时延舍入后得到 1ps
$display("%t",rdelay); // 800fs
#tdelay; // 再延时 1ps
$display("%t",tdelay); // 1000fs
end
endmodule