VerilogHDL负责数字电路设计(AI助学版)课件_第1页
VerilogHDL负责数字电路设计(AI助学版)课件_第2页
VerilogHDL负责数字电路设计(AI助学版)课件_第3页
VerilogHDL负责数字电路设计(AI助学版)课件_第4页
VerilogHDL负责数字电路设计(AI助学版)课件_第5页
已阅读5页,还剩6页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

10.2函数关键字:function

endfunction如果程序中调用了一个函数,就隐含声明了一个名为function_identifier(函数标识符)的寄存器型变量,函数的输出结果将通过这个寄存器型变量传递回来函数的调用需要指明函数名和输入变量。在函数执行结束时,返回值传回到调用处。函数无输出端口,通过函数名返回单一值,至少要有一个输入在函数不能调用任务,只能调用其他函数函数的调用是通过将函数名作为表达式中的操作数调用时必须定义一个与函数名同范围的寄存器变量,接收函数的返回值。因此,函数的调用方式与任务的调用方式不同moduleparity;//偶效验位的计算...reg[31:0]addr;regparity;always@(addr)beginparity=calc_parity(addr);$display("Paritycalculated=%b",calc_parity(addr));end...functioncalc_parity;input[31:0]address;begincalc_parity=^address;endendfunction......endmodule10.2.1函数应用在函数第一次被调用时,它的返回值被用来设置寄存器变量parity;在第二次被调用时,它的返回值直接使用系统任务$display进行显示。偶校验位的计算,计算32位地址值的偶校验位,并返回校验位的值。偶校验是指被校验数中“1”的个数为偶数,校验位为0,否则为1,保证校验位加被校验数中“1”的个数为偶数functioncalc_parity(input[31:0]address);begincalc_parity=^address;endendfunction使用ANSIC风格的变量声明进行函数定义moduleshifter;`defineLEFT_SHIFT1'b0`defineRIGHT_SHIFT1'b1reg[31:0]addr,left_addr,right_addr;regcontrol;always@(addr)beginleft_addr=shift(addr,`LEFT_SHIFT);right_addr=shift(addr,`RIGHT_SHIFT);end

function[31:0]shift;input[31:0]address;inputcontrol;beginshift=(control==`LEFT_SHIFT)?(address<<1):(address>>1);endendfunctionendmodule左/右移位寄存器10.2.2自动(递归)函数VerilogHDL中的函数是不能进行递归调用的。在设计模块中,若某函数在两个不同的地方被同时并发调用,由于这两个调用同时对同一块地址空间进行操作,那么计算结果将是不确定的若在函数声明时使用了关键字automatic,那么该函数将成为自动的或可递归的,即仿真器为每一次函数调用动态地分配新的地址空间,每个函数调用对各自的地址空间进行操作。因此,自动函数中声明的局部变量不能通过层次名进行访问,而自动函数本身可以通过层次名进行调用moduletop;

functionautomaticintegerfactorial;input[31:0]oper;integeri;beginif(oper>=2)factorial=factorial(oper-1)*oper;elsefactorial=1;endendfunctionintegerresult;initialbeginresult=factorial(4);//调用4的阶乘$display(“Factorialof4is%0d”,result);end

endmodule递归(自动)函数10.2.3常量函数常量函数是一个带有某些限制的常规verilogHDL函数。这种函数能够用来引用复杂的值,因此可用来代替常量。moduleTwoPortRAM(w_clk,w_en,w_addr,w_data,r_clk,r_en,r_addr,r_data);parameterRAM_DEPTH=255;input[clogb2(RAM_DEPTH)-1:0]w_addr,r_addr;//函数clogb2(255)=8inputw_clk,w_en,r_clk,r_en;input[7:0]w_data;output[7:0]r_data;reg[7:0]r_data;reg[7:0]mem[63:0];always@(posedgew_clk)if(w_en)mem[w_addr]<=w_data;always@(posedger_clk)if(r_en)r_data<=mem[r_addr];functionintegerclogb2(inputintegerdepth);beginfor(clogb2=0;depth>0;clogb2=clogb2+1)depth=depth>>1;endendfunction

endmodule10.2.4带符号函数moduletop;--//带符号的函数声明//返回一个64位带符号数functionsigned[63:0]compute_signed(input[63:0]vector);----endfunction--//从上层模块调用带符号函数

if(compute_signed(vector)<-3)begin--end--endmodule10.3任务和函数的区别特性任务(Task)函数(Function)时序控制支持(如

#delay,

@event)不支持输入/输出端口支持input,

output,

inout仅支持input返回值无(通过output传递)通过函数名隐式寄存器返回单值调用范围可调用任务和函数仅可调用函数存储分配默认静态,需automatic支持动态分配同任务执行时间支持延时/事件控制零延时执行(组合逻辑任务和函数都必须在模块内进行定义,其作用范围仅局限于定义它们的模块任务用于代替普通的verilogHDL代码,其中可以包括延迟、时序、事件等语法结构,并且可以具有多个输出变量函数用于代替表示纯组合逻辑的verilogHDL代码,在仿真时刻0就开始执行,只能有一个输出。函数一般用于完成各类转换和常用的计算

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论