Verilog 中的 function

举报
李锐博恩 发表于 2021/07/15 03:28:35 2021/07/15
1.3k+ 0 0
【摘要】   函数的目的是返回一个用于表达式的值。定义函数的语法: function <返回值的类型或范围>函数名;      <端口说明语句>      <变量类型说明语句>    begin      ...

函数的目的是返回一个用于表达式的值。定义函数的语法:

function <返回值的类型或范围>函数名;

     <端口说明语句>

     <变量类型说明语句>

   begin

     <语句>

     ...

  end

endfunction

在这里,<返回值的类型或范围>可以不定义,如果默认则代表一位寄存器类型数据。

1)函数返回的值:函数的定义蕴含声明了一个与函数同名的,函数内部的寄存器,其位数与定义的相同;

2)函数的调用:函数的调用是通过将函数作为表达式中的操作数来实现的。例:word=control ? {getbyte(msbyte),getbyte(lsbyte)} : 0;

3)函数的使用规则:

a)函数的定义不能包含任何的时间控制语句,及任何用# ,@,或wait来标识的语句。

b)函数不能启动任务,定义函数至少输入一个输入参量;

c)函数的定义中必须有一条赋值语句给函数中的一个内部变量赋以函数的值,该内部变量具有和函数名一样的名字。

d)函数的输入变脸不能像模块的端口那样列在函数名后面的括弧内,在声明输入时把这些输入端口列出即可。函数不能被禁用。

定义函数实例:

(1)


      function  AND;
      //定义输入变量 
      input A, B;
      //定义函数体 
      begin
         AND = A  && B;
      end
      endfunction
  
 

(2)


      module parity;
      reg [31:0]sddr;
      reg parity;
      initial
      begin
         addr=32'b3456_789a;
       #10 addr=32'bc4c6_78ff;
        #10 addr=32'bff56_ff9a;
        #10 addr=32'b3faa_aaaa;
      end
      //每当地址未发生变化,重新计算偶校验位
      always @(addr)
      begin
        parity=cal_parity(addr);
        $display("parity calculated = %b",cal_paraty(addr));
      end
      //定义偶检验函数
      function cal_parity;
      input [31:0]address;
      begin
        cal_parity=^address;
      end
      endfunction
      endmodule
      偶校验位函数
  
 

调用函数的语句形式如下: 
func_id(expr1, expr2, ........., exprN) 
其中,func_id 是要调用的函数名,expr1, expr2, ......exprN是传递给函数的输入参数列表,该输入参数列表的顺序必须与函数定义时声明其输入的顺序相同。下面给出一个函数调用实例。


      module comb15 (A, B, CIN, S, COUT);
      input [3:0] A, B;
      input CIN;
      output [3:0] S;
      output COUT;
      wire [1:0] S0, S1, S2, S3;
      function signed [1:0] ADD;
      input A, B, CIN;
      reg S, COUT;
      begin
      S = A ^ B ^ CIN;
      COUT = (A&B) | (A&CIN) | (B&CIN);
      ADD = {COUT, S};
      end
      endfunction
      assign S0 = ADD (A[0], B[0], CIN),
      S1 = ADD (A[1], B[1], S0[1]),
      S2 = ADD (A[2], B[2], S1[1]),
      S3 = ADD (A[3], B[3], S2[1]),
      S = {S3[0], S2[0], S1[0], S0[0]},
      COUT = S3[1];
      endmodule
  
 

在函数调用中,有下列几点需要注意: 
(1)函数调用可以在过程块中完成,也可以在 assign 这样的连续赋值语句中出现。 
(2)函数调用语句不能单独作为一条语句出现,只能作为赋值语句的右端操作数
 

参考: verilog中的function用法与例子

Verilog学习笔记基本语法篇(九)········ 任务和函数

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/89813187

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。