返回顶部
首页 > 资讯 > 精选 >Verilog语言关键字模块例化的方法是什么
  • 904
分享到

Verilog语言关键字模块例化的方法是什么

2023-07-06 00:07:25 904人浏览 独家记忆
摘要

这篇文章主要介绍“Verilog语言关键字模块例化的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Verilog语言关键字模块例化的方法是什么”文章能帮助大家解决问题。关键字:例化,gen

这篇文章主要介绍“Verilog语言关键字模块例化的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Verilog语言关键字模块例化的方法是什么”文章能帮助大家解决问题。

关键字:例化,generate,全加器,层次访问

在一个模块中引用另一个模块,对其端口进行相关连接,叫做模块例化。模块例化建立了描述的层次。信号端口可以通过位置或名称关联,端口连接也必须遵循一些规则。

命名端口连接

这种方法将需要例化的模块端口与外部信号按照其名字进行连接,端口顺序随意,可以与引用 module 的声明端口顺序不一致,只要保证端口名字与外部信号匹配即可。

下面是例化一次 1bit 全加器的例子:

full_adder1  u_adder0(    .ai     (a[0]),    .Bi     (b[0]),    .Ci     (c==1'b1 ? 1'b0 : 1'b1),    .So     (so_bit0),    .Co     (co_temp[0]));

如果某些输出端口并不需要在外部连接,例化时 可以悬空不连接,甚至删除。一般来说,input 端口在例化时不能删除,否则编译报错,output 端口在例化时可以删除。例如:

//output 端口 Co 悬空full_adder1  u_adder0(    .Ai     (a[0]),    .Bi     (b[0]),    .Ci     (c==1'b1 ? 1'b0 : 1'b1),    .So     (so_bit0),    .Co     ()); //output 端口 Co 删除full_adder1  u_adder0(    .Ai     (a[0]),    .Bi     (b[0]),    .Ci     (c==1'b1 ? 1'b0 : 1'b1),    .So     (so_bit0));

顺序端口连接

这种方法将需要例化的模块端口按照模块声明时端口的顺序与外部信号进行匹配连接,位置要严格保持一致。例如例化一次 1bit 全加器的代码可以改为:

full_adder1  u_adder1(    a[1], b[1], co_temp[0], so_bit1, co_temp[1]);

虽然代码从书写上可能会占用相对较少的空间,但代码可读性降低,也不易于调试。有时候在大型的设计中可能会有很多个端口,端口信号的顺序时不时的可能也会有所改动,此时再利用顺序端口连接进行模块例化,显然是不方便的。所以平时,建议采用命名端口方式对模块进行例化。

端口连接规则

输入端口

模块例化时,从模块外部来讲, input 端口可以连接 wire 或 reg 型变量。这与模块声明是不同的,从模块内部来讲,input 端口必须是 wire 型变量。

输出端口

模块例化时,从模块外部来讲,output 端口必须连接 wire 型变量。这与模块声明是不同的,从模块内部来讲,output 端口可以是 wire 或 reg 型变量。

输入输出端口

模块例化时,从模块外部来讲,inout 端口必须连接 wire 型变量。这与模块声明是相同的。

悬空端口

模块例化时,如果某些信号不需要与外部信号进行连接交互,我们可以将其悬空,即端口例化处保留空白即可,上述例子中有提及。

output 端口正常悬空时,我们甚至可以在例化时将其删除。

input 端口正常悬空时,悬空信号的逻辑功能表现为高阻状态(逻辑值为 z)。但是,例化时一般不能将悬空的 input 端口删除,否则编译会报错,例如:

//下述代码编译会报Warningfull_adder4  u_adder4(    .a      (a),    .b      (b),    .c      (),    .so     (so),    .co     (co));
//如果模块full_adder4有input端口c,则下述代码编译是会报Errorfull_adder4  u_adder4(    .a      (a),    .b      (b),    .so     (so),    .co     (co));

一般来说,建议 input 端口不要做悬空处理,无其他外部连接时赋值其常量,例如:

full_adder4  u_adder4(    .a      (a),    .b      (b),    .c      (1'b0),    .so     (so),    .co     (co));

位宽匹配

当例化端口与连续信号位宽不匹配时,端口会通过无符号数的右对齐或截断方式进行匹配。

假如在模块 full_adder4 中,端口 a 和端口 b 的位宽都为 4bit,则下面代码的例化结果会导致:u_adder4.a = {2'bzz, a[1:0]}, u_adder4.b = b[3:0] 。

full_adder4  u_adder4(    .a      (a[1:0]),      //input a[3:0]    .b      (b[5:0]),      //input b[3:0]    .c      (1'b0),    .so     (so),    .co     (co));

端口连续信号类型

连接端口的信号类型可以是,1)标识符,2)位选择,3)部分选择,4)上述类型的合并,5)用于输入端口的表达式。

当然,信号名字可以与端口名字一样,但他们的意义是不一样的,分别代表的是 2 个模块内的信号。

用 generate 进行模块例化

当例化多个相同的模块时,一个一个的手动例化会比较繁琐。用 generate 语句进行多个模块的重复例化,可大大简化程序的编写过程。

重复例化 4 个 1bit 全加器组成一个 4bit 全加器的代码如下:

module full_adder4(    input [3:0]   a ,   //adder1    input [3:0]   b ,   //adder2    input         c ,   //input carry bit     output [3:0]  so ,  //adding result    output        co    //output carry bit    );     wire [3:0]    co_temp ;    //第一个例化模块一般格式有所差异,需要单独例化    full_adder1  u_adder0(        .Ai     (a[0]),        .Bi     (b[0]),        .Ci     (c==1'b1 ? 1'b1 : 1'b0),        .So     (so[0]),        .Co     (co_temp[0]));     genvar        i ;    generate        for(i=1; i<=3; i=i+1) begin: adder_gen        full_adder1  u_adder(            .Ai     (a[i]),            .Bi     (b[i]),            .Ci     (co_temp[i-1]), //上一个全加器的溢位是下一个的进位            .So     (so[i]),            .Co     (co_temp[i]));        end    endgenerate     assign co    = co_temp[3] ; endmodule
`timescale 1ns/1ns module test ;    reg  [3:0]   a ;    reg  [3:0]   b ;    //reg          c ;    wire [3:0]   so ;    wire         co ;     //简单驱动    initial begin        a = 4'd5 ;        b = 4'd2 ;        #10 ;        a = 4'd10 ;        b = 4'd8 ;    end     full_adder4  u_adder4(               .a      (a),               .b      (b),               .c      (1'b0),   //端口可以连接常量               .so     (so),               .co     (co));     initial begin        forever begin            #100;            if ($time >= 1000)  $finish ;        end    end endmodule // test

仿真结果如下,可知 4bit 全加器工作正常:

Verilog语言关键字模块例化的方法是什么

层次访问

每一个例化模块的名字,每个模块的信号变量等,都使用一个特定的标识符进行定义。在整个层次设计中,每个标识符都具有唯一的位置与名字。

Verilog 中,通过使用一连串的 . 符号对各个模块的标识符进行层次分隔连接,就可以在任何地方通过指定完整的层次名对整个设计中的标识符进行访问。

层次访问多见于仿真中。

例如,有以下层次设计,则叶单元、子模块和顶层模块间的信号就可以相互访问。

//u_n1模块中访问u_n3模块信号:a = top.u_m2.u_n3.c ;//u_n1模块中访问top模块信号if (top.p == 'b0) a = 1'b1 ;//top模块中访问u_n4模块信号assign p = top.u_m2.u_n4.d ;

Verilog语言关键字模块例化的方法是什么

关于“Verilog语言关键字模块例化的方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Verilog语言关键字模块例化的方法是什么

本文链接: https://lsjlt.com/news/356859.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Verilog语言关键字模块例化的方法是什么
    这篇文章主要介绍“Verilog语言关键字模块例化的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Verilog语言关键字模块例化的方法是什么”文章能帮助大家解决问题。关键字:例化,gen...
    99+
    2023-07-06
  • Verilog语言关键字模块例化实例讲解
    目录关键字:例化,generate,全加器,层次访问命名端口连接顺序端口连接端口连接规则用 generate 进行模块例化层次访问关键字:例化,generate,全加器,层次访问 ...
    99+
    2023-05-15
    Verilog语言关键字模块例化 Verilog 模块例化
  • c语言inline关键字的用法是什么
    C语言中的`inline`关键字用于提示编译器将函数内联展开,以提高程序的执行效率。 具体用法如下: 在函数声明或定义前加上`i...
    99+
    2023-10-26
    c语言
  • c语言volitate关键字的用法是什么
    在C语言中,“volatile"是一个关键字,通常用来声明一个变量是"易变的”,即其值可能会在程序执行过程中被外...
    99+
    2024-03-01
    c语言
  • vlookup关键字模糊匹配的方法是什么
    VLOOKUP函数在进行关键字模糊匹配时,可以使用通配符*来表示任意字符。可以通过在VLOOKUP函数的第一个参数中使用通配符来匹配...
    99+
    2023-09-07
    vlookup
  • c语言register关键字的作用是什么
    C语言中的register关键字用于向编译器建议将变量存储在寄存器中,以便更快地访问。它是一种优化技术,用于提高程序的执行速度。使用...
    99+
    2023-09-16
    c语言
  • c语言关键字static的作用是什么
    在C语言中,关键字static有以下几种作用:1. 静态变量:static关键字可以用于声明静态变量,静态变量存储在静态存储区,在程...
    99+
    2023-09-14
    c语言 static
  • C语言volatile关键字的作用是什么
    本篇内容介绍了“C语言volatile关键字的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!写在前面版本信息:Linux操作系统,...
    99+
    2023-07-06
  • c语言volitate关键字的作用是什么
    在C语言中,volatile关键字用于告诉编译器,所修饰的变量可能会在程序的执行过程中被意外修改,因此编译器在优化代码时应该避免对这...
    99+
    2024-03-01
    c语言
  • this关键字和单例模式是什么
    这篇文章主要讲解了“this关键字和单例模式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“this关键字和单例模式是什么”吧!一、this关键字1.假...
    99+
    2024-04-02
  • Node.js中的模块化方法是什么
    今天给大家介绍一下Node.js中的模块化方法是什么。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。一、模块化的基本概念1、什么是模块化模块化是指解决一个复杂问...
    99+
    2023-06-26
  • C语言中static关键字的作用是什么
    本篇内容介绍了“C语言中static关键字的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!static这个关键字是“静态”的意思,...
    99+
    2023-07-05
  • Node模块化开发的方法是什么
    本文小编为大家详细介绍“Node模块化开发的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Node模块化开发的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、介绍1. 什么是模块化开发模块...
    99+
    2023-07-05
  • java中的This关键字和单例模式是什么
    这篇文章主要介绍“java中的This关键字和单例模式是什么”,在日常操作中,相信很多人在java中的This关键字和单例模式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • nlp关键字提取的方法是什么
    NLP关键字提取的方法有以下几种:1. 基于统计的方法:这些方法通过统计文本中单词的出现频率或者词语的共现信息来提取关键字。常见的方...
    99+
    2023-09-21
    nlp
  • c语言字符串格式化的方法是什么
    在C语言中,字符串格式化是通过使用printf()函数和相关的格式控制符来完成的。格式控制符用于指定要打印或输出的数据类型和格式。 ...
    99+
    2023-10-28
    c语言
  • java中volatile关键字的语法规则是什么
    在Java中,volatile关键字有以下语法规则:1. volatile关键字用于标记一个变量,表示该变量是易变的,即可能被多个线...
    99+
    2023-09-12
    java
  • Go语言中new和make关键字的区别是什么
    这篇文章主要介绍了Go语言中new和make关键字的区别是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中new和make关键字的区别是什么文章都会有所收获,下面我们一起来看看吧。newnew 是一...
    99+
    2023-07-05
  • c语言大小写字母转化的方法是什么
    C语言中,可以通过以下两种方法将小写字母转换为大写字母:1. 使用库函数toupper():该函数接受一个小写字母作为参数,返回对应...
    99+
    2023-08-16
    c语言
  • C语言中文件包含的命令关键字是什么
    本篇内容主要讲解“C语言中文件包含的命令关键字是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言中文件包含的命令关键字是什么”吧!文件包含命令的关键字是“include”。文件包含命令“...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作