Verilog数组表示及初始化

转载 2012年03月24日 09:58:33

这里的内存模型指的是内存的行为模型。Verilog中提供了两维数组来帮助我们建立内存的行为模型。具体来说,就是可以将内存宣称为一个reg类型的数组,这个数组中的任何一个单元都可以通过一个下标去访问。这样的数组的定义方式如下:

reg [wordsize : 0] array_name [0 : arraysize];

      例如:

reg [7:0] my_memory [0:255];

其中 [7:0] 是内存的宽度,而[0:255]则是内存的深度(也就是有多少存储单元),其中宽度为8位,深度为256。地址0对应着数组中的0存储单元。

         如果要存储一个值到某个单元中去,可以这样做:

         my_memory [address] = data_in;

      而如果要从某个单元读出值,可以这么做:

         data_out = my_memory [address];

         但要是只需要读一位或者多个位,就要麻烦一点,因为Verilog不允许读/写一个位。这时,就需要使用一个变量转换一下:

         例如:

         data_out = my_memory[address];

data_out_it_0 = data_out[0];

      这里首先从一个单元里面读出数据,然后再取出读出的数据的某一位的值。

      初始化内存

       初始化内存有多种方式,这里介绍的是使用$readmemb  $readmemh系统任务来将保存在文件中的数据填充到内存单元中去。$readmemb  $readmemh是类似的,只不过$readmemb用于内存的二进制表示,而$readmemh则用于内存内容的16进制表示。这里以$readmemh系统任务来介绍。

      语法

$readmemh("file_name", mem_array, start_addr, stop_addr);

         注意的是:

         file_name是包含数据的文本文件名,mem_array是要初始化的内存单元数组名,start_addr  stop_addr是可选的,指示要初始化单元的起始地址和结束地址。

         下面是一个简单的例子:

module  memory ();

reg [7:0] my_memory [0:255];

 

initial begin

$readmemh("memory.list", my_memory);

end

endmodule

       这里使用内存文件memory.list来初始化my_memory数组。

         而下面就是一个内存文件的例子。

//  Comments are allowed 

CC         // This is first address i.e 8'h00

AA         // This is second address i.e 8'h01

@55     // Jump to new address 8'h55

5A         // This is address 8'h55

69         // This is address 8'h56

 

         对于内存文件,要注意的是下列几点:

a、注释标记//在内存文件中是被允许的;

b、使用@符号将跳到新的目标地址,没有@符号就表示地址将顺序递增。

 

         关于这个系统任务,有下列常见的用法:

1、顺序初始化所有的数组单元;

这种情况下,可以使用@符号来指示地址,也可以不使用它,而只在每一行存放要存放的数据。

这样数据将顺序按地址递增存放,从0地址开始。

 

2、只初始化部分的数组单元;

这种情况下,可以使用@符号来指示下一个要初始化的地址,然后对该地址单元进行初始化。例

如下列的内存文件就只初始化8'h008'h018'h558'h564个内存地址单元。

//  Comments are allowed 

CC         // This is first address i.e 8'h00

AA         // This is second address i.e 8'h01

@55     // Jump to new address 8'h55

5A         // This is address 8'h55

69         // This is address 8'h56

 

3、只初始化数组的地址区间的一部分单元。

这个时候,还可以使用$readmemh任务的start_addr  stop_addr选项来指定初始化的范围。

例如,只初始化1001045个单元,就可以这么做:

内存文件memory.list定义为:

CC

AA

55 

5A

69

       $readmemh("memory.list", my_memory 100 104);就指定使用memory.list来初始化my_memory100-104单元。

Verilog中如何对数组赋值(存储器memory详解)

http://blog.sina.com.cn/s/blog_9424755f0101rhrh.html 存储器是一个寄存器数组。存储器使用如下方式说明: reg [ msb: 1sb...

Verilog多维数组

http://blog.csdn.net/qp314/article/details/5157276 12.Verilog-2001多维数组 Verilog-1995只允许一维数组,而Verilo...

verilog中的向量与数组

verilog中向量与数组是两个不同的概念。 reg [7:0] count表示一个位宽为8位的向量;reg count [7:0] 表示一个一维数组,数组中的元素是位宽为1的变量;reg [7:0]...

Verilog数组初始化赋值

Verilog数组表示及初始化,以三维数组为例,二维及一维应该类似; reg [19:0] array1 [0:7][0:15][0:8];    //3维数组,用来存储梯度直方图 always@(p...

[转]Verilog-2001

1.Verilog-2001的由来      Verilog HDL 虽然得到了广泛应用,但是人们在应用过程中也发现了Verilog的不少缺陷。在2001年,OVI(Open Verilog Init...
  • qp314
  • qp314
  • 2010年01月08日 12:46
  • 5069

关于复位时的REG变量初始化

看一下下面的MODULE /*简单上电复位模块 当计数器到0xffff时复位信号为1 */ module reset( input clk, output rst_n ); reg[15:0] cnt...
  • USB_ABC
  • USB_ABC
  • 2016年10月01日 08:38
  • 554

Verilog中的常量、变量、常用的关键词

一.常量 (1)整数        1)表示方法         进制表示(二、十、十六、八)符号:b(B)、d(D)、h(H)、o(O);        2)格式:        a.,这...

Systemverilog的一个牛人总结

Systemverilog 数据类型 l       合并数组和非合并数组 1)合并数组: 存储方式是连续的,中间没有闲置空间。 例如,32bit的寄存器,可以看成是4个8bit的数据,...

SystemVerilog学习笔记 - 动态数组

今天遇到了一个动态数组的问题,作一记录,区分开了动态数组与嘟列的区别,总是有些分不清,虽然接触sv三年有余,这种小问题还是没有能摸得很透彻,很惭愧,不在家没有vcs的环境,于是借用eda playgr...

转一篇Systemverilog的一个牛人总结

Systemverilog 数据类型 l       合并数组和非合并数组 1)合并数组: 存储方式是连续的,中间没有闲置空间。 例如,32bit的寄存器,可以看成是4个8bit的数据,或者也可以看...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Verilog数组表示及初始化
举报原因:
原因补充:

(最多只允许输入30个字)