18,verilog之函数用法 您所在的位置:网站首页 verilogfunction的调用 18,verilog之函数用法

18,verilog之函数用法

2023-09-06 17:50| 来源: 网络整理| 查看: 265

注:学习、交流就在博主的个人weixin公众号 “FPGA动力联盟” 留言或直接+博主weixin “fpga_start” 私信~

我们都知道函数在C语言里有着非常重要的地位,几乎无处不用。因此大牛在发明verilog语言时也就自然而然的被“拿来主义了”。

函数这种东西,设计的本义是用来计算复杂公式的值。程序语言中有些东西求值的代码,不是几行代码可以表达的,需要几十上百行代码。这种长代码放到主模块的代码中时,就有点喧宾夺主的感觉,不如提出来表示。

然而不幸的是,对于verilog电路设计,函数的用处不是很大,简单的运算用不到函数,复杂的运算用函数又实现不了,只是在某些特殊应用时,函数才用得上(比如繁杂的纯组合逻辑)。对于verilog仿真和验证,本来就是类似于程序语言,还有点用。

Verilog中函数的声明如下:

function [range] function_name(ports_list);……endfunction

Verilog中函数的简单例子如下:

function and(input a, input b);……endfunction

Verilog中函数的调用格式如下:

function_name(input_variable1, input_variable1,……);

Verilog中函数的调用例子如下:

and(a, b);

在书写函数的代码时,需要注意以下几个原则:

1,函数的定义只能在模块中完成,不能出现在过程块中(比如always,initial)

2,函数至少要有一个input端口,不能含有output或inout端口

3,函数定义结构体中不能出现过程块语句(always语句)

4,函数内部可以调用函数

5,函数调用既可以在过程块中完成,也可以在assign语句中出现

6,函数调用语句不能单独作为一条语句出现,只能作为赋值语句的右端操作数

7,函数结构中不能使用任何形式的时间控制语句(#, wait等),也不能使用disable中止语句

由于上面的约束,函数能做的事情也就没多少了,只能够算算数值什么的。

下面给出具体的函数应用的代码,包括函数调用函数,我们在应用时依葫芦画瓢就行:

modulefunction_total( input clk, input rst, input [7:0] width, output reg[16:0] area ); // function[15:0] circle(input [7:0]diameter); begin circle= (24'd201 * {16'h0, diameter}*{16'h0, diameter})/256; end endfunction function[15:0] square(input [7:0] width); begin square= {8'h0, width}*{8'h0, width}; end endfunction // function[16:0] total(input [7:0] width); begin total= {1'b0, square(width)} + {1'b0, circle(width)}; end endfunction /// always @ (posedge clk or negedge rst) if(!rst) area


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有