Verilog:实例数组(重复实例化的快捷方法)

相关阅读

Verilog基础icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482


前言 

        谈到重复实例化,一般都会想到for generate结构,但其实有一种更加简单的语法,只是使用的人不多,它就是实例数组(其实在Verilog 1995标准它就已被引入,早于generate结构被引入的Verilog 2001标准)。

        首先来看看门的例化和模块的例化时实例数组的BNF范式(语法),有关BNF范式相关内容,可以参考之前的文章。Verilog基础:巴科斯范式(BNF)icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_45791458/article/details/132567389?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172381461616800207085955%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=172381461616800207085955&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-132567389-null-null.nonecase&utm_term=BNF&spm=1018.2226.3001.4450

图1 门例化时的实例数组

图2 模块例化时的实例数组

实例数组范围(range)

        在许多场合下,我们需要重复多个实例。这些实例之间的唯一差异通常只是它们所连接的向量的索引。比如,你可能需要四个与门,每个与门的输入和输出连接到不同的位上,像A[0]、A[1]等,此时就可以使用实例数组,如图1和图2所示。

        可选的范围和声明一个数组型变量/线网时的范围很相似,由两个常量表达式指定,即左侧索引(lhi)和右侧索引(rhi),它们之间用冒号分隔,并用方括号括起来,如例1所示。

// 例1
and and_inst [3: 0] (Y, A, B); // 当对门使用实例数组时, 名字是必须的, 不能省略
test_module test_module_inst [3: 0] (Y, A, B); 

        范围[lhi, rhi]表示有|lhi-rhi|+1个实例生成,如例2所示。

// 例2
and and_inst [3: 0] (Y, A, B); // 生成了四个实例, 名字分别为and_inst[0], and_inst[1], and_inst[2], and_inst[3]
test_module test_module_inst [3: 0] (Y, A, B); // 生成了四个实例, 名字分别为test_module_inst[0], test_module_inst[1], test_module_inst[2], test_module_inst[3]

        左侧索引和右侧索引的相对大小和绝对大小可以随意,如例3所示。

// 例3
and and_inst [-1: 3] (Y, A, B); // 生成了四个实例, 名字分别为and_inst[-1], and_inst[0], and_inst[1], and_inst[2]
test_module test_module_inst [-1: 3] (Y, A, B); // 生成了四个实例, 名字分别为test_module_inst[-1], test_module_inst[0], test_module_inst[1], test_module_inst[2]

        如果左侧索引和左侧索引相等,那么只会生成一个实例,如例4所示。

// 例4
and and_inst [3: 3] (Y, A, B); // 生成了一个实例, 名字为and_inst[3]
test_module test_module_inst [3: 3] (Y, A, B); // 生成了一个实例, 名字为test_module_inst[3]

        同一个实例标识符只能与一个范围关联,以声明实例数组,也就是说不能用一个标识符分批实例数组,如例5所示。

// 例5
and and_inst [3: 0] (Y, A, B); // 生成了四个实例, 名字分别为and_inst[0], and_inst[1], and_inst[2], and_inst[3]
and and_inst [5: 4] (Y, A, B); // 错误的
test_module test_module_inst [3: 0] (Y, A, B); // 生成了四个实例, 名字分别为test_module_inst[0], test_module_inst[1], test_module_inst[2], test_module_inst[3]
test_module test_module_inst [5: 4] (Y, A, B); // 错误的

        范围说明是可选的,如果没有给出范围说明,那么只会创建一个实例,且其无需索引,普通的实例就是这种情况,如例6所示。

// 例6
and and_inst (Y, A, B); // 名字可以省略
test_module test_module_inst  (Y, A, B); 

普通模块实例的端口连接

        在说明实例数组的端口连接前,首先复习一下普通模块实例的端口连接,如图3所示。

图3 普通模块实例的连接规则

        每个实例的端口可以以命令端口连接或位置端口连接的方式,连接到该实例外部的一个端口expression。

        对于输入端口,该端口expression可以是任意的,比如一个简单的标量信号、一个矢量信号、一个矢量信号的位选、一个矢量信号的域选、前面各项的加减乘除、前面各项的拼接.....,如例7所示。

// 例7
module example_module (input wire [3:0] a,input wire b,input wire c,output wire y
);assign y = (a[0] & b) | c;
endmodulemodule top_module;wire [3:0] in_vec;wire scalar1, scalar2;wire out;example_module inst3 (.a({in_vec[2:1], scalar1, scalar2}),  .b(in_vec[0] ^ scalar1),              .c(in_vec[3] + scalar2),              .y(out));
endmodule

        对于输出端口, 该端口expression只能是一个简单的标量信号、一个矢量信号、一个矢量信号的位选、一个矢量信号的域选以及前面各项的拼接,或者说是一个net_lvalue,即能作为一个连续赋值语句(assign)左值的表达式,如图4和例8所示。

图4 net_lvalue的定义

// 例8
module example_module (input wire [3:0] a,input wire b,input wire c,output wire y_1, y_2, y_3 
);assign y_1 = (a[0] & b) | c;assign y_2 = (a[0] & b) | c;assign y_3 = (a[0] & b) | c;
endmodulemodule top_module;wire [3:0] in_vec;wire scalar1, scalar2;wire out_1, out_2;wire [3:0] out_vec;example_module inst3 (.a({in_vec[2:1], scalar1, scalar2}),  .b(in_vec[0] ^ scalar1),              .c(in_vec[3] + scalar2),              .y_1(out_1+out_2), // 错误.y_2({out_vec[0], out_2}), // 正确但位宽不匹配, 会有警告.y_3(out_vec[3]) // 正确);
endmodule

        当发生连接位宽不匹配时,仿真器会产生警告但不会报错,因为其实端口连接就相当于使用连续赋值语句(assign)连接外部的端口expression和内部的端口,例如上例中的y_2端口,相当于

assign {out_vec[0], out_2} = y_2

        右侧表达式的位宽为1,左侧信号位宽为2,因此右侧表达式会被位宽拓展(高位补0)至2位再进行赋值,因此out_vec[0]会被赋值0。有关位宽拓展的相关内容,见Verilog基础:表达式位宽的确定(位宽拓展)。

门实例的端口连接

        门实例的端口连接,如图5所示。

图5 门实例的连接规则

        对于门实例,连接到输出端口的表达式位宽必须是标量,这与普通模块实例的端口连接是不同的,如例9所示,其余的限制与普通模块实例的端口连接相同。

// 例9
module gate (output [3:0] Y, input [3:0] A, B);and (Y, A, B);    \\ 错误and (Y[0], A, B); \\ 正确但位宽不匹配
endmodule

实例数组的端口连接

        对于实例数组的端口连接而言,首先需要对实例数组中的端口表达式的位宽应该与单个模块实例或门实例中的对应端口的位宽进行比较:

        1、如果实例数组的端口expression的位宽与单个实例的端口的位宽相同,那么整个数组的端口expression会连接到每个单个实例的端口,如例10所示。

// 例10
module and_gate (input wire [3:0] A, B,output wire [3:0] Y
);assign Y = A & B;
endmodulemodule and_array (output [3:0] Y,input [3:0] A, B
);// 实例化4个and_array, 每个都连接到了位宽为4的A,B,Y端口and_gate and_inst [3:0] (.A(A),    .B(B),    .Y(Y)     );
endmodule

        2、如果位宽不同,单个实例的端口将从相应的端口expression中根据实例数组大小平均获得域选,从右侧索引开始,如例11所示。

// 例11
module and_gate (input wire [3:0] A, B,output wire [3:0] Y
);assign Y = A & B;
endmodulemodule and_array (output [15:0] Y,input [15:0] A, B
);// 实例化4个and_array, and_inst[0]连接到A[3:0], B[3:0], Y[3:0], and_inst[1]连接到A[7:4], B[7:4], Y[7:4], 以此类推// 如果声明时使用[0:15], 则and_inst[0]连接到A[12:15], B[12:15], Y[12:15], and_inst[1]连接到A[8:11], B[8:11], Y[8:11], 以此类推and_gate and_inst [3:0] (.A(A),    .B(B),    .Y(Y)     );
endmodule

        3、如果域选结果的位宽与单个实例端口的位宽不匹配,将被视为错误(这与之前两种实例化不同)。这也就代表要么像例10,实例数组的端口expression的位宽与单个实例的端口的位宽相同;要么像例11,实例数组的端口expression的位宽等于单个实例的端口的位宽乘以实例数组大小。 

        最后要说的是,在例10和例11中, 端口expression都是简单的矢量信号,实际上它可以是更加复杂的表达式,如例7和例8所示。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript 使用 Graham 扫描的凸包(Convex Hull using Graham Scan)

先决条件: 如何检查两个给定的线段是否相交? c https://blog.csdn.net/hefeng_aspnet/article/details/141713655 java https://blog.csdn.net/hefeng_aspnet/article/details/141713762 python https://blog.csdn.net/hefeng_aspnet/article/details/…

智能监控,守护绿色能源:EasyCVR在电站视频监控中心的一站式解决方案

随着科技的飞速发展,视频监控技术在社会安全、企业管理及智慧城市建设等领域中扮演着越来越重要的角色。特别是在电力行业中,电站作为能源供应的关键设施,其安全性和稳定性至关重要。传统的人工监控方式已难以满足现代电站复杂多变的运行需求…

基于SpringBoot+Vue+MySQL的甜品店管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在数字化浪潮的推动下,甜品店行业也面临着转型与升级的需求。传统的线下经营模式已难以满足现代消费者对于便捷、高效购物体验的追求。为了提升运营效率、优化顾客体验,我们设计了一款基于SpringBoot后端…

Ubuntu 16.04安装填坑记录

一. 问题描述: (1)Ubuntu 16.04使用USB启动盘安装时,出现"try ubuntu without installation"或“install ubuntu”选择,Enter选择安装后,显示器黑屏无任何显示。 原因分析: 显示黑…

遥感图像变换检测实践上手(TensorRT+UNet)

目录 简介 分析PyTorch示例 onnx模型转engine 编写TensorRT推理代码 main.cpp测试代码 小结 简介 这里通过TensorRTUNet,在Linux下实现对遥感图像的变化检测,示例如下: 可以先拉去代码:RemoteChangeDetection 分析PyTorch示…

网络攻击DDOoS的原理、攻击手段及防范措施详解

一、DDoS的原理 1. 原理 DDoS(分布式拒绝服务攻击)是利用大量的僵尸主机对受害者发起攻击,从而造成受害者的资源被耗尽无法为合法用户提供服务。DDoS一般采用三级结构,包括: 攻击者:攻击指令的发起方僵尸…

【鸿蒙HarmonyOS NEXT】数据存储之分布式键值数据库

【鸿蒙HarmonyOS NEXT】数据存储之分布式键值数据库 一、环境说明二、分布式键值数据库介绍三、示例代码加以说明四、小结 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、分布式键值数据库介绍 KVStore简介: 分布式键值数据库…

OpenHarmony(鸿蒙南向)——平台驱动指南【DAC】

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DAC(Digital to Analog Converter&…

Python办公自动化之Word

在现代办公环境中,自动化无疑是提升工作效率的关键。特别是处理文档的工作,很多人可能花费大量时间在重复性任务上。那么,有没有一种方法可以让我们用 Python 来自动化 Word 文档的操作呢?今天,我们来聊聊如何用 Pytho…

AI Agent应用出路到底在哪?

1 Agent/Function Call 的定义 Overview of a LLM-powered autonomous agent system: Agent学会调用外部应用程序接口,以获取模型权重中缺失的额外信息(预训练后通常难以更改),包括当前信息、代码执行能力、专有信息源…

Docker安装与应用

前言 Docker 是一个开源的应用容器引擎,基于 Go 语言开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻 量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互 之间…

大语言模型之LlaMA系列- LlaMA 2及LLaMA2_chat(上)

LlaMA 2是一个经过预训练与微调的基于自回归的transformer的LLMs,参数从7B至70B。同期推出的Llama 2-Chat是Llama 2专门为对话领域微调的模型。 在许多开放的基准测试中Llama 2-Chat优于其他开源的聊天模型,此外Llama 2-Chat还做了可用性与安全性评估。 …

物联网系统中基于IIC通信的数字温度传感器测温方案

01 物联网系统中为什么要使用数字式温度传感器芯片 物联网系统中使用数字式温度传感器芯片的原因主要有以下几点: 高精度与稳定性 高精度测量:数字式温度传感器芯片,如DS18B20,采用芯片集成技术,能够有效抑制外界不…

2024-9-28 QT登录框基础练习

1.头文件 #ifndef LOGINWINDOW_H #define LOGINWINDOW_H#include <QWidget> #include <QPushButton> #include <QLineEdit> #include <QVBoxLayout>class LoginWindow : public QWidget {Q_OBJECTpublic:// 构造函数LoginWindow(QWidget *parent nul…

打造备份一体机,群晖科技平台化战略再进阶

数字经济时代&#xff0c;海量数据不断涌现&#xff0c;并成为核心生产要素&#xff0c;驱动着企业生产方式和商业模式发生深刻变革。 与其他生产要素不同&#xff0c;数据要素具有非稀缺性、非竞争性等特征&#xff0c;且只有在具体业务场景中才能充分释放其价值。尤其是近年…

Element-Plus中上传文件upload取消提示按钮与文字

去除提示按钮与文字 添加样式&#xff0c;让这个div进行隐藏 .el-upload__input {display: none !important; }

物联网系统中高精度压力检测方案_压力变送器

01 物联网系统中为什么要使用压力变送器 在物联网系统中使用压力变送器的原因主要基于以下几个方面&#xff1a; 感知层的核心作用 物联网系统主要由感知层、传输层、平台层和应用层组成。感知层作为物联网的“排头兵”&#xff0c;负责收集物理世界中的各种信息。压力变送…

在二维平面中,利用时差定位(TDOA)技术,结合N个锚点,通过三边法进行精确定位,采用MATLAB实现

文章目录 主程序程序代码运行结果 主程序 主程序代码如下&#xff1a; % TDOA测距定位&#xff0c;二维平面&#xff0c; 4个锚节点的情况 % author:Evand&#xff08;VX&#xff1a;matlabfilter&#xff0c;除前期达成一致外&#xff0c;讲解需付费&#xff09; % 2024年9月…

node-rtsp-stream、jsmpeg.min.js实现rtsp视频在web端播放

1. 服务地址&#xff08;私有&#xff09;&#xff1a;https://gitee.com/nnlss/video-node-server 2.node-rtsp-stream 需要安装FFMPEG&#xff1b; 3.给推拉流做了开关&#xff0c;可借助http请求&#xff0c;有更好方式可联系&#xff1b; 4.存在问题&#xff1a; 1&…

单点登录(SSO)基础

单点登录&#xff08;SSO, Single Sign-On&#xff09; 是一种身份认证机制&#xff0c;允许用户在多个独立的应用系统中只进行一次登录操作&#xff0c;即可访问所有授权的应用或服务&#xff0c;而无需每次切换应用时都进行登录。SSO 提高了用户体验的便捷性&#xff0c;同时…