我是靠谱客的博主 无辜蜡烛,最近开发中收集的这篇文章主要介绍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

最后

以上就是无辜蜡烛为你收集整理的Verilog中一些特殊的函数自动(递归)函数常量函数带符号函数的全部内容,希望文章能够帮你解决Verilog中一些特殊的函数自动(递归)函数常量函数带符号函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部