day10-verilog---模块的调用,任务和函数

这篇具有很好参考价值的文章主要介绍了day10-verilog---模块的调用,任务和函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

模块的调用(上层模块对底层模块的调用)

  • 在做模块划分时,通常会出现这种情形,某个大的模块中包含了一个或多个功能子模块,verilog是通过模块调用或称为模块实例化的方式来实现这些子模块与高层模块的连接的

  • 调用模块实例化的一般形式为:

  • <模块名><参数列表><实例名>(<端口列表>);

  • 其中参数列表是传递到子模块的参数值,参数传递的典型应用是定义门级时延。

  • 信号端口可以通过位置或名称关联,但是关联方式不能够混合使用

名称关联&位置关联

  • 定义模块:module Design(端口1,端口2,端口3...)

  • 位置关联:

  • 引用时,严格按照模块定义的端口顺序来连接,不用标明元模型定义时规定的端口名。

Design u1(u1的端口1,u1的端口2,u1的端口3)
  • 名称关联:

  • 引用时用“.”符号,标明原模型定义时规定的端口名:

Design u2(.端口1(u1的端口1),
.端口2(u1的端口2),
.端口3(u1的端口3)
)

eg:

module and(C,A,B)
input A,B;
output C;
位置相关
and A1 (T3,A,B)
名称相关
and A2(
    .C(T3),
    .A(A),
    .B(B)
)

(1条消息) 关于verilog实例化的介绍_能饮一杯吴?的博客-CSDN博客_verilog实例化

模块的调用---参数传递

//子模块
module Decode(A,F);
    parameter width =1,polarity=1;
endmodule
//顶层模块
moudle top;
    wire [3:0] A4;
    wire [4:0] A5;
    wire [15:0] F16;
    wire [31:0] F32;
    Decode #(4,0) D1(A4,F16);
endmodule

ps:在top模块中引用Decode实例时,可通过参数的传递来改变定义时已规定的参数值,即通过

#(4,0),实例D1实际引用的是参数width和polarity分别为4与0时的Decode模块

传递参数的另一种方法

module_name #(.parameter name(para_value),.parameter name(para_value)) inst_name(port_map)
实际就为:
Decode #(.width(4),.polarity(0)) D1(A4,F16)

注意事项

  • 位选择,如.C(D[0]),C端口接到了D信号的第0bit位;

  • 部分选择,如.Bus(Din[5:4])

  • 上述类型的合并,如.Addr({A1,A2[1:0]})

悬空端口的处理:

在实例化中,可能有些管脚没用到,可在映射中留白处理

DFF d1(
.Q(QS),
.Qbar(),
.Data(D),
.Preset(),//该管脚悬空
.clock(CK);
)

PS:输入管脚悬空,该管脚输入为高阻Z,输出管脚悬空,该管脚废弃不用

任务和函数

  • task和function语句分别用来由用户定义任务和函数;

  • 任务和函数往往时大的程序模块中在不同地点多次用到的相同的程序段

  • 利用任务和函数可将一个很大的程序模块分解为许多较小的任务和函数,便于理解和调试

任务定义

task<任务名>;
    端口及数据类型声明语句;
    其他语句;
endtask

任务调用

<任务名>(端口1,端口2,......);

task语句

  • 任务的定义与调用必须在一个module模块内

  • 任务被调用时,需列出端口名列表,且必须与任务定义中的I/0变量一一对应

  • 一个任务可以调用其他任务和函数

//任务定义
task my_task;
    input a,b;
    inout c;//一个三态门,由一个开关控制这个门是输入还是输出
    output d,e;
    ......
    <语句>//执行任务工作相应的语句
    .....
    c = foo1;
    d = foo2;
    e = foo3;//对任务变量进行赋值
endtask

//任务调用
my_task(v,w,x,y,z)//为位置关联,v对应a,w对应b,c对应x,y对应d,z对应e
day10-verilog---模块的调用,任务和函数

函数function(可以综合)

  • 函数的目的是通过返回一个用于某表达式的值,来响应输入信号(适于对不同变量采取同一运算的操作)

  • 函数在模块内部定义,通常在本模块中调用,也能根据按模块层次分级命名的函数名从其他模块调用。而任务只能在同一模块内定义与调用

function<返回值位宽或类型说明>函数名;//如缺少位宽定义,则默认为一
 端口声明;
 局部变量定义;
 其他语句;
endfunction

函数的调用 <函数名>(<表达式><表达式>)

注:函数的调用是通过将函数作为调用函数的表达式中的操作数来实现的

函数规则
  • 函数不能包含任何时间控制的语句,如#,@,wait,poesdge,negedege

  • 函数不能调用任务,因为任务可以包含时间控制语句,但是可以调用其他函数

  • 函数应该至少有一个输入

  • 函数不能有非阻塞性的赋值或force....release或assign...deassign

  • 函数不能有任何触发器

  • 函数不能有output或inout

函数的声明:

function [7:0] sum;
    input [7:0] a, b;
    begin
        sum = a + b;
    end
endfunction

function [7:0] sum (input [7:0] a, b);
    begin
        sum = a + b;
    end
endfunction
————————————————
版权声明:本文为CSDN博主「李锐博恩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Reborn_Lee/article/details/107447734

函数的调用:

reg [7:0] result;
reg [7:0] a, b;

initial begin
    a = 4;
    b = 5;
    #10 result = sum (a, b);
end

利用一个函数对一个8位二进制数中为0的位进行计数

//count the numbers of 0 in rega[7:0]
module count_0 (numbers,rega);
    output [7:0] numbers;
    input [7:0] rega;
    function [7:0] get_n_of_0; //define a function
        input [7:0] x;
        reg [7:0] count;
        integer i;
            begin
                count = 0;
                for(i=0;i<=7;i++)
                    if(x[i] == 1'b0) 
                        count = count +1;
                    get_n_of_0 = count; //函数名就相当于输出变量;
                end;
    endfunction
assign number = get_n_of_0(rega);
endmodule

ps:函数名就相当于输出变量

函数和任务的区别

任务task

函数function

目的或用途

可计算多个结果值

通过返回一个值,来响应输入信号

function的名字即可作为参数,作输出

输入与输出

可为各种类型(包括input型)

至少有一个输入变量,但不能有任何output或input型变量

被调用

只可在过程赋值语句中调用(过程赋值语句为阻塞赋值和非阻塞赋值),不能在连续赋值语句中调用(连续赋值的关键词为assign)

可作为表达式中的一个操作数来调用,在过程赋值和连续赋值语句中均可调用

调用其他任务和函数

任务可调用其他任务和函数

函数可调用其他函数,但不可调用其他任务

返回值

不向表达式返回值

像调用它的表达式返回一个值文章来源地址https://www.toymoban.com/news/detail-433705.html

day10-verilog---模块的调用,任务和函数

到了这里,关于day10-verilog---模块的调用,任务和函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Verilog语法之任务Task与函数Function

    目录 1、概述 2、任务 task 2.1、任务的定义 2.2、一个task例子 3、函数 function 3.1、函数的定义 3.2、一个function例子 4、任务与函数的异同 5、总结与参考         与C语言中的函数类似,在Verilog代码中,通过把代码分成小的模块或者使用 任务(task) 和 函数(function) ,可把一

    2024年02月15日
    浏览(37)
  • 【FPGA】verilog基础语法与应用:位操作 / 模块调用——流水灯(跑马灯)

    今天的实验是计数器实验的升级,设计让8个LED灯以每个0.5s的速率循环闪烁 1 移位法实现 1.1 移位方法1 每个LED灯代表一位,共8位,亮为1,灭为0 如何实现这样的逻辑呢? 移位操作即可! 怎么样才能移位呢? 第一个状态需满足最低位为1,然后每次左移1个 源代码 仿真代码 功

    2024年01月16日
    浏览(47)
  • Verilog语法学习——LV10_使用函数实现数据大小端转换

    题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page=1tab=Verilog篇topicId=301) 描述 在数字芯片设计中,经常把实现特定功能的模块编写成函数,在需要的时候再在主模块中调用,以提高代码的复用性和提高设计的层次,分别后续的

    2024年02月15日
    浏览(46)
  • day10-内置函数和推导式

    传统的函数的定义包括了:函数名 + 函数体。 匿名函数,则是基于lambda表达式实现定义一个可以没有名字的函数,例如: 基于Lambda定义的函数格式为: lambda 参数:函数体 参数,支持任意参数。 函数体,只能支持单行的代码。 返回值,默认将函数体单行代码执行的结果返回

    2024年04月08日
    浏览(36)
  • Python爬虫的学习day02 requests 模块post 函数, lmxl 模块的 etree 模块

    1.1 post 函数的参数 (简单版) 参数1:  url     网络地址 参数2:   data   请求数据 (一般数据是  账号,密码) 参数3:    headers  头请求  (User-Agent:  第一章讲过) 1.2  post 请求中 url 参数的获取 1.2.1 首先 打开一个 登录界面 。(这里以淘宝的登录界面为样例)

    2024年02月14日
    浏览(33)
  • 【SQL刷题】Day10----SQL高级过滤函数专项练习

    博主昵称:跳楼梯企鹅 博主主页面链接: 博主主页传送门 博主专栏页面连接: 专栏传送门--网路安全技术 创作初心:本博客的初心为与技术朋友们相互交流,每个人的技术都存在短板,博主也是一样,虚心求教,希望各位技术友给予指导。 博主座右铭:发现光,追随光,

    2023年04月09日
    浏览(48)
  • 如何从 html 页面调用在 javascript 模块 (type=module) 中声明的函数

    首先,必须明确导出您的功能 其次,模块有它自己的范围(这是模块的全部意义),因此您需要将函数添加到全局范围。因此,要做到这一点,您必须运行一个脚本来导入该函数并将其添加到窗口对象: 现在你不需要这部分了 script type=\\\"module\\\" src=\\\"app.js\\\"/script 或者,您可以创

    2024年02月14日
    浏览(48)
  • Python 爬虫的学习 day01 ,爬虫的基本知识, requests 和 charde模块, get函数的使用

    1.1什么是网络爬虫 网络爬虫,又称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。 1.2  网络爬虫的特点 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万

    2024年02月15日
    浏览(42)
  • FPGA Verilog Cordic算法实现三角函数计算,可计算sin cos arctan,精度达到,10e-5,有完整资料说明

    FPGA Verilog Cordic算法实现三角函数计算,可计算sin cos arctan,精度达到,10e-5,有完整资料说明。 另有串口收发,可上板后在串口助手检测 图文无关,在altera板子上有完整工程。 FPGA Verilog Cordic算法实现三角函数计算 FPGA在近年来得到越来越广泛的应用,针对三角函数计算的需

    2024年02月01日
    浏览(40)
  • 【Verilog 教程】6.2Verilog任务

    :任务 任务与函数的区别 和函数一样,任务(task)可以用来描述共同的代码段,并在模块内任意位置被调用,让代码更加的直观易读。函数一般用于组合逻辑的各种转换和计算,而任务更像一个过程,不仅能完成函数的功能,还可以包含时序控制逻辑。下面对任务与

    2024年02月07日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包