SV3自学

SV3

过程语句和子程序

  1. task 与 function 区别
  • task 可以消耗时间而 function 不能
  • function 不可以带 时延语句 或者 阻塞语句
  • function 必须有 返回值, 并且返回值必须被使用
  1. SV中允许 function 调用 task,只能在fork…jion_none线程中调用
  2. 所有用于调试的子程序都应该定义成 void函数,不消耗时间,灵活,可以被其他任务或者函数调用

任务和函数

  1. 子程序去掉 begin … end
  2. 使用task / endtask,function/endfunction 定义边界
  3. 通用输入类型:logic
task mytask1(output logic [31:0]x,input logic y);
endtask

缺省类型和方向为:input logic

  1. SV中,参数类型可以为ref,比input,output好用

  2. ref参数只能被用于带自动存储的子程序中

  3. 在任务中可以修改变量且结果对调用它的函数随时可见

task sticky(int a,int b); //未说明端口方向,则为 input int a,input int b;
  1. 在module 与 program 块中的子程序,缺省情况下仍使用静态存储,若要使用自动存储,必须加automatic关键词

时间参数

  1. SV允许使用数值和单位来明确指明一个时间值,代码可以使用timeunit,timeprecision,'timescale
  2. 也可以使用verilog里面的 t i m e f o r m a t , timeformat, timeformattime,$realtime
  3. timeformat 四个参数分别是 时间标度,小数点后的数据精度,时间值之后的后缀字符串,显示数值的最小宽度
  4. -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
  1. 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值