Verilog初级教程(12)Verilog中的generate块

文章目录

    • 前言
    • 正文
      • generate for
      • generate if
      • generate case
    • 参考资料
    • 本系列博文

前言

verilog中的generate块可以称为生成块,所谓生成,可以理解为复制。如果不太好理解,下面我们继续使用generate块。

generate块应用的场合通常是对模块进行批量例化,或者有条件的例化,使用参数进行控制对哪些模块进行例化,或者例化多少。
不仅限于模块例化,当同一个操作或模块实例需要多次重复,或者某些代码需要根据给定的Verilog参数有条件地包含时,这些语句特别方便。

generate块可以分为generate for和generate if或者generate case。

正文

下面根据实际例子对这几个generate块语句进行分析。

generate for

先设计一个半加器:

// Design for a half-adder
module ha ( input   a, b,output  sum, cout);assign sum  = a ^ b;assign cout = a & b;
endmodule

下面对半加器模块例化N次,N为输入变量的位宽,例如:

input [N-1:0] a, b;

每一次对输入变量的一位进行加法运算。
如下:

// A top level design that contains N instances of half adder
module my_design#(parameter N=2)(	input [N-1:0] a, b,output [N-1:0] sum, cout);// Declare a temporary loop variable to be used during// generation and won't be available during simulationgenvar i;// Generate for loop to instantiate N timesgeneratefor (i = 0; i < N; i = i + 1) beginha u0 (a[i], b[i], sum[i], cout[i]);endendgenerate
endmodule

a[0]和b[0]的输出sum[0]和cout[0],而a[N-1]和b[N-1]的输出sum[1]和cout[1]。

对应的RTL图可想而知,就是多个半加器的复制。
如果N = 2,则为:

在这里插入图片描述

generate if

generate if中的条件必须是参数,这是很重要的一点,初学者容易误用,例如将generate if(),括号内给一个变量,根据其值选择执行哪一块语句。

下面设计一个仅用于仿真的例子:

我们先设计两个待选择模块:

// Design #1: Multiplexer design uses an "assign" statement to assign
// out signal
module mux_assign ( input a, b, sel,output out);assign out = sel ? a : b;// The initial display statement is used so that// we know which design got instantiated from simulation// logsinitial$display ("mux_assign is instantiated");
endmodule
// Design #2: Multiplexer design uses a "case" statement to drive
// out signal
module mux_case (input a, b, sel,output reg out);always @ (a or b or sel) begincase (sel)0 : out = a;1 : out = b;endcaseend// The initial display statement is used so that// we know which design got instantiated from simulation// logsinitial$display ("mux_case is instantiated");
endmodule

下面使用generate if语句来选择例化哪一个模块:

// Top Level Design: Use a parameter to choose either one
module my_design (	input a, b, sel,output out);parameter USE_CASE = 0;// Use a "generate" block to instantiate either mux_case// or mux_assign using an if else construct with generategenerateif (USE_CASE)mux_case mc (.a(a), .b(b), .sel(sel), .out(out));elsemux_assign ma (.a(a), .b(b), .sel(sel), .out(out));endgenerateendmodule

USE_CASE就是一个参数,根据参数的值来选择例化哪一个模块。

设计仿真文件来验证:

module tb;// Declare testbench variablesreg a, b, sel;wire out;integer i;// Instantiate top level design and set USE_CASE parameter to 1 so that// the design using case statement is instantiatedmy_design #(.USE_CASE(1)) u0 ( .a(a), .b(b), .sel(sel), .out(out));initial begin// Initialize testbench variablesa <= 0;b <= 0;sel <= 0;// Assign random values to DUT inputs with some delayfor (i = 0; i < 5; i = i + 1) begin#10 a <= $random;b <= $random;sel <= $random;$display ("i=%0d a=0x%0h b=0x%0h sel=0x%0h out=0x%0h", i, a, b, sel, out);endend
endmodule

上面仿真文件中将USE_CASE代入参数为1,因此,应该例化的是mux_case 被执行。

// When USE_CASE = 1
ncsim> run
mux_case is instantiated
i=0 a=0x0 b=0x0 sel=0x0 out=0x0
i=1 a=0x0 b=0x1 sel=0x1 out=0x1
i=2 a=0x1 b=0x1 sel=0x1 out=0x1
i=3 a=0x1 b=0x0 sel=0x1 out=0x0
i=4 a=0x1 b=0x0 sel=0x1 out=0x0
ncsim: *W,RNQUIE: Simulation is complete.

generate case

generate case语句和generate if语句用法无异,和普通的if与case一致,if具有优先级,case没有优先级。

举个例子,介绍其使用方法。

先设计一个半加器:

// Design #1: Half adder
module ha (input a, b,output reg sum, cout);always @ (a or b){cout, sum} = a + b;initial$display ("Half adder instantiation");
endmodule

在设计一个全加器:

// Design #2: Full adder
module fa (input a, b, cin,output reg sum, cout);always @ (a or b or cin){cout, sum} = a + b + cin;initial$display ("Full adder instantiation");
endmodule

设计顶层模块,令参数为ADDER_TYPE = 1;则如下:

// Top level design: Choose between half adder and full adder
module my_adder (input a, b, cin,output sum, cout);parameter ADDER_TYPE = 1;generatecase(ADDER_TYPE)0 : ha u0 (.a(a), .b(b), .sum(sum), .cout(cout));1 : fa u1 (.a(a), .b(b), .cin(cin), .sum(sum), .cout(cout));endcaseendgenerate
endmodule

设计仿真文件:

module tb;reg a, b, cin;wire sum, cout;my_adder #(.ADDER_TYPE(0)) u0 (.a(a), .b(b), .cin(cin), .sum(sum), .cout(cout));initial begina <= 0;b <= 0;cin <= 0;$monitor("a=0x%0h b=0x%0h cin=0x%0h cout=0%0h sum=0x%0h",a, b, cin, cout, sum);for (int i = 0; i < 5; i = i + 1) begin#10 a <= $random;b <= $random;cin <= $random;endend
endmodule

可见,代入参数为0,应该例化的为半加器模块:

ncsim> run
Half adder instantiation
a=0x0 b=0x0 cin=0x0 cout=00 sum=0x0
a=0x0 b=0x1 cin=0x1 cout=00 sum=0x1
a=0x1 b=0x1 cin=0x1 cout=01 sum=0x0
a=0x1 b=0x0 cin=0x1 cout=00 sum=0x1
ncsim: *W,RNQUIE: Simulation is complete.

参考资料

参考资料

本系列博文

Verilog初级教程(11)Verilog中的initial块

Verilog初级教程(10)Verilog的always块

Verilog初级教程(9)Verilog的运算符

Verilog初级教程(8)Verilog中的assign语句

Verilog初级教程(7)Verilog模块例化以及悬空端口的处理

Verilog初级教程(6)Verilog模块与端口

Verilog初级教程(5)Verilog中的多维数组和存储器

Verilog初级教程(4)Verilog中的标量与向量

Verilog初级教程(3)Verilog 数据类型

Verilog初级教程(2)Verilog HDL的初级语法

Verilog初级教程(1)认识 Verilog HDL

芯片设计抽象层及其设计风格

Verilog以及VHDL所倡导的的代码准则

FPGA/ASIC初学者应该学习Verilog还是VHDL?

  • 个人微信公众号: FPGA LAB

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/254244.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Verilog初级教程(17)Verilog中的case语句

文章目录 前言正文语法例子硬件原理图case与if-else有什么不同&#xff1f; 往期回顾参考资料及推荐关注 前言 case语句检查给定的表达式是否与列表中的其他表达式之一相匹配&#xff0c;并据此进行分支。它通常用于实现一个多路复用器。 如果要检查的条件很多&#xff0c;if…

Verilog初级教程(3)Verilog 数据类型

文章目录 前言正文变量可以取什么样的值&#xff1f;变量的取值意味着什么&#xff1f;主要的数据类型其他数据类型integertime / realtimereal例子 Verilog的字符串 写在最后 前言 这是本系列的第三篇博文&#xff0c;依然很基础&#xff0c;这个系列文章&#xff0c;主要是在…

Verilog初级教程(10)Verilog的always块

博文目录 写在前面正文语法什么是敏感列表&#xff1f;always块是用来干什么的&#xff1f;如果没有敏感列表怎么办&#xff1f;时序逻辑实例组合逻辑实例注意事项 参考资料 写在前面 由于刚毕业&#xff0c;又发生了很多事&#xff0c;在进入工作的准备期&#xff0c;就这样一…

verilog 入门教程

verilog 入门教程 1.1 什么是Verilog HDL? 1.2 Verilog的历史 1.3 Verilog的主要描述能力 2.1 Verilog-模块 2.2 Verilog-时延 2.3 Verilog-assign语句 2.4 Verilog-initial语句 2.5 Verilog-always语句 2.6 Verilog的结构化描述形式 2.7 Verilog-混合设计描述方式 2.8 Veri…

Verilog初级教程(14)Verilog中的赋值语句

文章目录 前言正文合理的左值过程性赋值&#xff08;Procedural assignment&#xff09;连续赋值过程连续性赋值 往期回顾 前言 何为赋值语句&#xff1f;即将值放到线网或者变量上&#xff0c;这种操作称为赋值&#xff0c;英文&#xff1a;assignment. 它有三种基本形式&…

嵌入式开发Verilog教程(二)——Verilog HDL设计方法概述

嵌入式开发Verilog教程&#xff08;二&#xff09;——Verilog HDL设计方法概述 前言一、Verilog HDL语言简介1.1 Verilog HDL语言是什么1.2 Verilog HDL设计复杂数字电路的优点1.2.1 传统设计方法——电路原理图输入法1.2.2 Verilog HDL设计方法与传统设计方法相比较的优势1.2…

嵌入式开发Verilog教程(三)——Verilog HDL基本语法汇总(上)

嵌入式开发Verilog教程&#xff08;三&#xff09;——Verilog HDL基本语法汇总&#xff08;上&#xff09; 前言一、简单的Verilog HDL模块1.1 Verilog HDL程序简单模块1.2 Verilog HDL程序模块结构1.3 Verilog HDL程序模块端口定义1.4 Verilog HDL程序模块内容 二、Verilog H…

SANXIN-B01开发板verilog教程V3电子版

今天给大侠带来“SANXIN-B01开发板verilog教程V3-郝旭帅团队电子版”,V3版本更新了后几章节的高级设计部分,获取电子版资料,请点击左下角阅读原文,跳转叁芯智能科技官方技术论坛下载,或者登录网址www.sxznfpga.com下载。 叁芯智能科技-郝旭帅团队打造“FPGA 设计与研发”学…

Verilog 教程

第一章&#xff1a;Verilog 简介 1.1 Verilog 教程 1.2 Verilog 简介 1.3 Verilog 环境搭建 1.4 Verilog 设计方法第二章&#xff1a;语法要素 2.1 Verilog 基础语法 2.2 Verilog 数值表示 2.3 Verilog 数据类型 2.4 Verilog 表达式 2.5 Verilog 编译指令 第三章…

ol中不同区域加载不同底图

概述 写一篇水文&#xff0c;讲讲如果在openlayers中实现不同的区域加载不同的底图。 效果 实现 通过tileUrlFunction实现不同切片地址的请求。 <!DOCTYPE html> <html><head><title>XYZ</title><link rel"stylesheet" href&qu…

数电/数字电子技术期末考前突击复习(小白稳过,看这一篇就够了)

博主&#xff1a;命运之光 专栏&#xff1a;期末考试必过and不挂科and争高分&#x1f636;‍&#x1f32b;️还有其他科目的考试突击日后会陆续更新 ✨✨✨✨✨点赞&#xff0c;关注&#xff0c;收藏不迷路✨✨✨✨✨ &#x1f984;前言&#xff1a;总结了期末数电大概率可能…

windows 10下载安装mysql5.7

MySQL数据库在日常使用是非常的频繁的&#xff0c;不管是线上还是线下。下面我就分享出我安装MySQL5.7的一步一脚印的教程&#xff0c;本教程只针对windows版本。 下载 MySQL官网下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 选择对应的系统和版本…

【明解STM32】中断系统理论基础知识篇之中断寄存器功能原理

目录 一、前言 二、寄存器概述 三、NVIC寄存器组 四、SCB寄存器组 五、中断屏蔽寄存器组 六、总结 一、前言 在之前的STM32的中断系统理论基础知识之基本原理及NVIC中&#xff0c;分别中断的基本原理&#xff0c;中断的管理机制和中断的处理流程进行了较为详细的论述&…

mysql.exe下载_mysql8 windows 下载安装

一. 下载 点击download 可以注册登录&#xff0c;嫌麻烦的话直接点击NO&#xff0c;thanks… 开始下载 二. 安装 下载完成后得到一个zip包 我是安装板和解压即用版都下了&#xff0c;但用的解压即用版本&#xff0c;比较方便 解压mysql-8.0.17-winx64.zip&#xff0c;得到mysql…

MySQL 64位安装教程,不需要配置my.ini文件

一、下载安装包&#xff0c;官网下载 下载网址&#xff1a;https://dev.mysql.com/downloads/mysql/ 2、MySQLWorkbench 8.0.25下载 二、进行MySql压缩包安装方式配置。 不需要配置环境变量&#xff0c;不需要配置mini文件。下载是这些&#xff0c;自己改一下文件夹名字&…

mysql下载安装(清华源)

鉴于网上大多数MySQL方法均是上官网下载&#xff0c;然而像我这样普通电脑&#xff0c;普通带宽&#xff0c;普通配置的电脑&#xff0c;上那些官网的速度确实不敢恭维&#xff0c;因此写了这篇文章&#xff0c;举个例子&#xff0c;我在家中的是最普通的10M带宽&#xff0c;上…

MySQL 5.6 (Win7 64位)下载、安装与配置图文教程

MySQL是目前十分流行的一种关系型数据库管理系统。官网推出的安装包有两种格式&#xff0c;分别是&#xff1a;ZIP格式和MSI格式。其中MSI格式的可以直接点击安装&#xff0c;按照它给出的安装提示进行安装&#xff0c;一般MySQL将会安装在C:\Program Files\MySQL\MySQL Server…

C++ queue类成员介绍

目录 &#x1f914;queue模板介绍&#xff1a; &#x1f914;queue特点&#xff1a; &#x1f914;queue内存图解&#xff1a; &#x1f914; queue的成员函数 &#x1f50d;queue构造函数&#xff1a; &#x1f50d;queue赋值函数&#xff1a; &#x1f50d;queue判断函…

video标签学习 xgplayer视频播放器分段播放mp4

文章目录 学习链接目标video标签自带视频和制作的视频区别video标签的src属性本地视频文件前端代码播放效果 服务器视频文件示例1后端代码前端代码播放效果 示例2后端代码前端代码播放效果 示例3后端配置前端代码播放效果 video对象video对象创建和获取video的属性video的方法v…

spring cloud Alibaba之Nacos Discovery--服务治理 (二)

接着上一篇文章 搭建的微服务环境, 实现nacos 注册中心实战操作案例 一. 服务治理介绍 先来思考一个问题 通过上一章的操作&#xff0c;我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址 &#xff08;ip&#xff0c;端口&#xff09;等硬编码到了代码中&a…