- 1、本文档共21页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Verilog课件--17_Vrilog任务与函数
第17章 Verilog中的高级结构 学习内容: 任务和函数的定义和调用 怎样使用命名块 怎样禁止命名块和任务 有限状态机(FSM)及建模 Verilog的任务及函数 Verilog的任务及函数 任务 任务 任务 函数(function) 函数 函数 函数 函数 命名块(named block) 禁止命名块和任务 禁止命名块和任务 有限状态机 有限状态机 显式有限状态机 显式有限状态机 隐式有限状态机 隐式有限状态机 复习 * 结构化设计是将任务分解为较小的,更易管理的单元,并将可重用代码进行封装。这通过将设计分成模块,或任务和函数实现。 任务(task) 通常用于调试,或对硬件进行行为描述 可以包含时序控制(#延迟,@, wait) 可以有 input,output,和inout参数 可以调用其他任务或函数 函数(function) 通常用于计算,或描述组合逻辑 不能包含任何延迟;函数仿真时间为0 只含有input参数并由函数名返回一个结果 可以调用其他函数,但不能调用任务 任务和函数必须在module内调用 在任务和函数中不能声明wire 所有输入/输出都是局部寄存器 任务/函数执行完成后才返回结果。 例如,若任务/函数中有forever语句,则永远不会返回结果 下面的任务中含有时序控制和一个输入,并引用了一个module变量,但没有输出、输入输出和内部变量,也不显示任何结果。 时序控制中使用的信号(例如ck)一定不能作为任务的输入,因为输入值只向该任务传送一次。 module top; reg clk, a, b; DUT u1 (out, a, b, clk); always #5 clk = !clk; task neg_clocks; input [31:0] number_of_edges; repeat( number_of_edges) @( negedge clk); endtask initial begin clk = 0; a = 1; b = 1; neg_clocks(3); // 任务调用 a = 0; neg_clocks (5); b = 0; end endmodule 任务可以有input,output 和 inout参数。 传送到任务的参数和与任务I/O说明顺序相同。尽管传送到任务的参数名称与任务内部I/O说明的名字可以相同,但在实际中这通常不是一个好的方法。参数名的唯一性可以使任务具有好的模块性。 可以在任务内使用时序控制。 在Verilog中任务定义一个新范围(scope) 要禁止任务,使用关键字disable 。 主要特点: 从代码中多处调用任务时要小心。因为任务的局部变量的只有一个拷贝,并行调用任务可能导致错误的结果。在任务中使用时序控制时这种情况时常发生。 在任务或函数中引用调用模块的变量时要小心。如果想使任务或函数能从另一个模块调用,则所有在任务或函数内部用到的变量都必须列在端口列表中。 下面的任务中有输入,输出,时序控制和一个内部变量,并且引用了一个module变量。但没有双向端口,也没有显示。 任务调用时的参数按任务定义的顺序列出。 module mult (clk, a, b, out, en_mult); input clk, en_mult; input [3: 0] a, b; output [7: 0] out; reg [7: 0] out; always @( posedge clk) multme (a, b, out); // 任务调用 task multme; // 任务定义 input [3: 0] xme, tome; output [7: 0] result; wait (en_mult) result = xme * tome; endtask endmodule 函数中不能有时序控制,但调用它的过程可以有时序控制。 函数名f_or_and在函数中作为register使用 module orand (a, b, c, d, e, out); input [7: 0] a, b, c, d, e; output [7: 0] out; reg [7: 0] out;
您可能关注的文档
最近下载
- GBT5680-2023 奥氏体锰钢铸件.pdf VIP
- 从课堂到奥数7年级.pdf VIP
- 2025年南通市第一人民医院医护人员招聘参考题库含答案解析.docx VIP
- 2025年西湖区专职社区工作者及两新专职党务工作者招聘62人笔试备考试题及答案解析.docx VIP
- CECS69-2011 拔出法检测混凝土强度技术规程.pdf VIP
- 广东省水利水电工程设计概(估)算编制规定_广东省水利厅 发布_2017_1.pdf
- SN_T 5417-2024 进口再生铜合金原料检验规程.docx
- 一汽丰田爱车养护课堂-空调滤芯-3.14.pptx VIP
- 消防安全培训记录.doc VIP
- 高级钳工技师实操试题.docx VIP
文档评论(0)