Verilog中一些特殊的函数

最近在看夏宇闻的书,函数声明部分,其中提到一些之前没有用到过的函数,在此作为记录

自动(递归)函数

Verilog中的函数是不能够进行递归调用的。设计模块中若某函数在两个不同的地方被同时开发调用,由于这两个调用同时对同一块地址空间进行操作,那么计算结果将是不确定的。

若在函数声明中使用了关键字automatic, 那么该函数将成为自动的或可递归的,即仿真器为每一次函数调用动态地分配新的地址空间,每一个函数调用对各自的地址空间进行操作。因此,自动函数中声明的局部变量不能通过层次名进行访问。而自动函数本身可以通过层次名进行调用。

下面例子说明如何定义自动函数,来完成阶乘运算

// 用函数的递归调用定义阶乘计算
module top;
  // 定义自动(递归)函数
  function automatic integer factorial;
    input [31:0]oper;
    integer i;
    begin
      if(operand>=2)
        factorial = factorial(oper-1) * oper; // 递归调用
      else
        factorial = 1;
    end
  endfunction

  //调用该函数
  integer result;
  initial begin
    result = factorial(4); // 调用4的阶乘
    $display("Factorial of 4 is % 0d", result);  // 显示24
  end

endmodule

常量函数

常量函数实际上是一个带有某些限制的常规Verilog函数,这种函数能够用来引用复杂的值,因为可以用来代替常量。

下面例子中,声明了一个常量函数,它可以用来计算模块中地址总线的宽度。

module ram(..., ...);
  parameter RAM_DEPTH = 256;
  input [clog2(RAM_DEPTH)-1:0] addr_bus;
  ......
  // 定义常量函数
  function integer clogb2(input integer depth);
    begin
      for(clogb2 = 0; depth>0; clogb2 = clogb2 + 1)
        depth = depth + 1;
    end
  endfunction
endmodule

说实话,没有看懂,懂了再来补充

带符号函数

带符号函数的返回值可以作为带符号数进行运算,具体见下面例子

module top;
  function signed[63:0]compute_signed(input[63:0]vector);
  ...
  endfunction
  
  if (compute_signed(vector)<-3) // 带符号数返回值可以作为带符号数进行运算
    begin
      ...
    end
  else
    begin
      ...
    end
endmodule

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值