今天在HDLbits网站学习的时候遇到一个有趣的东西,记录一下,也是第一次翻译文章。

为了更加方便操作,将相关联的信号用一个名字组成向量。比如,wire [ 7:0 ] w ; 声明了一个8位的向量w,这等价于w拥有8根分离的线。

声明向量

向量必须被声明:  类型  [ 最高位:最低位 ]  向量名字

类型指的是向量的数据类型,最常用的是wire和reg。当声明输出或输入端口时,类型除数据类型外,还包括端口类型。比如:

wire [7:0] w;         // 8位wire
reg  [4:1] x;         // 4位reg
output reg [0:0] y;   // 1位输出端口reg(仍是向量)
input wire [3:-2] z;  // 6位输入wire(允许负数范围)
output [3:0] a;       // 4位输出wire。未声明类型时默认为wire
wire [0:7] b;         // 8位wire,b[0]为最高有效位

向量的字节顺序(或者通俗的来说,方向)决定了最低有效位是较低的指针(小端:[ 3:0 ])还是较高的指针(大端:[ 0:3 ])。在Verilog中,一旦向量被声明为特定的字节顺序,被使用时也必须以这个顺序。比如,声明为wire [3:0] vec时,在代码中如果出现vec[0:3] 则是非法的。和声明时的字节顺序保持一致是一个很好的习惯,因为如果使用不同的字节顺序去赋值或者使用将会出现奇怪的bugs。

隐式网络

隐式网络经常是很难发现的bugs来源之一。在Verilog中,网络类型信号可以通过2种方式被隐含的创造出来,一是赋值语句,二是被附加到未被声明的模块端口上。隐式网络总是1位wire类型,并且在你试图使用一个向量时出现bugs。可以使用“default_nettype none“指令禁用隐式网络的创建。

wire [2:0] a,c;     // 2个向量
assign a = 3'b101;        // a = 101
assign b = a[1:1];      // b = 1 隐含的被创造出wire类型
assign c = b; // c = 001 <--bug 结果不是想传递的a的值
my_module i1(d,e);      // 如果没有声明,d和e就是隐含的一位宽,如果端口是一个向量将会出现bug

添加 "default_nettype none "指令会使第三行报错,这会使bug更加明显。

解压缩数组和压缩数组

你可能已经注意到了在声明中,向量的指针写在向量名字的前面。这声明了数组的“压缩”维度,这些位宽被压缩为一团(只和仿真有关,和硬件没有关系),解压缩维度声明在向量名字的后面。以上通常用来声明内存数组。真正的压缩数组用于systemVerilog中,使用bit数据类型,了解更多传送门http://www.asic-world.com/systemverilog/data_types10.html

reg [7:0] mem [255:0];   // 256 个解压缩元素,其中每一个都是8位reg类型向量
reg mem2 [28:0];         // 29 个解压缩元素,其中每一个都是1位reg类型向量

访问向量元素:部分选择

访问一整个向量可以用向量的名字,例如:

assign w = a;

将整个4位向量a赋值给整个8位向量w。如果左右位宽不匹配,将会适当的用0扩充或者截断。

访问一个向量的一部分时可以用部分选择操作:

w[3:0]      // 只有w的低4位
x[1]        // x的最低位
x[1:1]      // 同上
z[-1:-2]    // z的最低2位
b[3:0]      // 非法的,向量的部分选择必须和声明的方向相匹配
b[0:3]      // b的“高”4位
assign w[3:0] = b[0:3];    //把b的高4位赋给w的低4位 w[3]=b[0], w[2]=b[1]等等

Verilog语言之向量vector和解压缩数组unpacked array相关推荐

  1. r语言中矩阵QR分解_从零开始学R语言Day4|向量、矩阵和数组

    从零开始学R语言Day4|向量.矩阵和数组 1.1向量 1.1.1向量 在Day2中我们提及过用和c()函数来构建向量,具体实例如下. 我们还可以采用vector("类型",长度) ...

  2. R语言学习笔记:矩阵与数组(array)

    元素可以保存在多个维度的对象中,数组存储的是多维数据元素,矩阵的是数组的特殊情况,它具有两维. 创建数组的几种方法. 1. > m<-c(45,23,66,77,33,44,56,12,7 ...

  3. R语言入门之创建数据集——向量、矩阵、数组、数据框和列表

    码字不易,转发请注明出处:http://blog.csdn.net/qq_28945021/article/details/52100765 摘要 随着大数据的火爆发展,适合数据分析及生成图表的R语言 ...

  4. 浅析向量(Vector),迭代器(Iterator)和数组(Array)

    目录 前言(Foreword): 向量(Vector): 1.何为向量? 2.如何初始化Vector向量? 3.向量的基本操作: 4.Range-based For Statement: 5.向量的插 ...

  5. R语言向量vector数据类型元素索引、访问:使用length函数计算向量的长度、元素个数

    R语言向量vector数据类型元素索引.访问:使用length函数计算向量的长度.元素个数 目录 R语言向量vector数据类型元素索引.访问:使用length函数计算向量的长度.元素个数 R 语言特 ...

  6. r 字符串转化为数值_【R语言】数据结构Ⅰ—向量,矩阵,数组

    数据结构是为了便于存储不同类型的数据而设计的. R中常用的数据结构包括: 同质数据类型(homogeneous data types),即所存储的一定是相同类型的元素,包括向量.矩阵.数组: 异质数据 ...

  7. c语言二维vector大小,vector作为二维数组

    vector本来就是可以用来代替一维数组的,vector提供了operator[]函数,可以像数组一样的操作,而且还有边界检查,动态改变大小. 这里只介绍用它来代替二维的数组,二维以上的可以依此类推. ...

  8. R语言head函数和tail函数获取dataframe、列表list、向量vector的头部和尾部数据:tail提取数据对象的尾部数据、head提取数据对象的头部数据、默认6条数据、自定义设置返回条数

    R语言head函数和tail函数获取dataframe.列表list.向量vector的头部和尾部数据:tail提取数据对象的尾部数据.head提取数据对象的头部数据.默认6条数据.自定义设置返回条数 ...

  9. R语言unlist函数将复杂数据(list列表、dataframe、字符串String)对象处理成简单向量vector形式:将包含dataframe和字符串的向量列表转换为单个向量(删除数据名称)

    R语言unlist函数将复杂数据(list列表.dataframe.字符串String)对象处理成简单向量vector形式:将包含dataframe和字符串的向量列表转换为单个向量(删除数据名称) 目 ...

最新文章

  1. @程序员:这些瓜没吃到,可以告别互联网了!
  2. Linux bind-utils
  3. React Native 开发环境搭建
  4. 那些不可一世的安全软件巨头没落了吗?
  5. docker 安装依赖_史上最全Docker环境安装指南-让安装docker简单到爆
  6. SQL 基础教程:SQL 通配符
  7. python中show函数的用法_python学习笔记之——函数模块
  8. dockerfile的端口映射
  9. NOIWC2018滚粗记
  10. 洛谷 桶哥的问题——送桶——题解
  11. 【诺奖-1】2018年诺贝尔生理学或医学奖
  12. 自学前端应该如何入门
  13. 打开Windows任务管理器的七种方法
  14. TI芯片GPIO的内部上拉
  15. 【CodeForces727E/CF727E】Games on a CD (字符串哈希)
  16. Unity流水账9:Timeline
  17. 下午到英东游泳馆游泳了
  18. TPM零知识学习九 —— tpm全安装流程复盘(上)
  19. Redhat更换yum源
  20. 如何查看计算机网络密码是什么意思,电脑网络共享密码要怎么查找

热门文章

  1. 数据库的学习笔记(一)
  2. iPhone开发秘籍(一)--第一章 iPhone SDK简介
  3. P20到P23js知识点
  4. usrp b210 参数记录
  5. centos9 intel集显直通方法
  6. 一场美好的婚礼对女孩子来说意味着什么?
  7. 英特尔核显自定义分辨率_如何在新版英特尔核芯显卡控制面板中自定义显示器分辨率...
  8. python|简单实现英文单词大小写转化
  9. 数组与数字之间的转换
  10. 手机屏幕尺寸、分辨率,图像像素、分辨率、实际大小解惑