Loading

Verilog memory类型数据

引言

verilog中具有多种数据类型,当我们用reg类型元素构建一维数组时,这时候的变量也称之为memory。可以用于模拟只读存储器(ROMs)或随机存取存储器(RAMs)或者寄存器堆(regfiles)。

数组中的每个reg被称为元素或字,由单个数组索引来处理。

赋值等操作

一个n-bit的reg可以在单个分配中赋值,但完整的memory内存不能这样赋值。要对memory的字进行赋值,必须要指定一个索引。索引可以是一个表达式,这样有利于数据的访问。比如,计算机的程序计数器(program counter)的reg值可以作为索引去访问RAM。

在之前的文章同步FIFO中,对ram进行初始化就是使用for循环对位宽为8,深度为8的ram赋值0。这里的深度就是每次操作需要的索引。

数组声明

下图中第一个声明是表示一个memory,但是第二个数组arrayb是一个二维数组,位宽为1。这里需要区分。

第三个声明是线网变量的阵列。

 声明的合法性

下图的声明是对上图声明变量的赋值,可以看出对memory进行整体赋值是非法的!

而第二个声明也是非法的,对于二维数组不可以只声明第一维度,第二维度也要表明。

第4,5条声明是正确的,可以与上面3条进行对照。

 访问数组元素(system verilog扩展)

可以用数组索引引用未压缩数组的每个元素,多维数组需要多组方括号来选择数组中的单个元素:

logic [15:0] mem [0:4095];

data007 = mem[7];

real lookuptable [0:15] [0:15];

lookuptable [0] [15] =  2.15;

数组索引也可以是网络或变量的值:

always_ff @(posedge clk)

  data <= mem[address];

数组元素的位选择和部分选择(system verilog扩展)

可以从数组元素中选择一位或一组位。但必须首先选择数组的单个元素,然后再进行位选择或部分选择。

logic [15:0] mem [0:4096];

logic [15:0] data;

logic [3:0]   nibble;

logic           lsb;

data = mem[5];

lsb = mem [5] [0];

nibble = mem [5] [11:8];

posted @ 2022-04-20 20:06  月光小猪(已长膘)  阅读(1150)  评论(0编辑  收藏  举报