Verilog陣列表示及初始化

2021-06-05 06:26:30 字數 2833 閱讀 2998

這裡的記憶體模型指的是記憶體的行為模型。

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);

endendmodule

這裡使用

記憶體檔案

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'h00

,8'h01

,8'h55

和8'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

選項來指定初始化的範圍。

例如,只初始化

100到

104這

5個單元,就可以這麼做:

記憶體檔案

memory.list

定義為:

ccaa

55 5a69而

$readmemh("memory.list", my_memory

,100

,104);

就指定使用

memory.list

來初始化

my_memory

的100-104

單元。

Verilog陣列初始化賦值

verilog陣列表示及初始化,以三維陣列為例,二維及一維應該類似 reg 19 0 array1 0 7 0 15 0 8 3維陣列,用來儲存梯度直方圖 always posedge clk or negedge rst n begin if rst n begin array1 0 7 0 15...

陣列宣告及初始化

陣列宣告 int a int a 最好使用這種方法 注意事項 1.宣告的時候並沒有例項化任何物件,只有在例項化陣列物件時,jvm才分配空間。2.宣告乙個陣列的時候並沒有陣列真正被建立。3.建立乙個陣列,必須指定長度。建立基本型別的一維陣列 建立引用型別一維陣列 陣列的初始化方式總共有三種 靜態初始化...

陣列初始化

cpp中陣列初始化方法 簡單的初始化 利用定義變數時賦初值進行初始化。int a 10 float f 10 char ch 5 大括號中的為初始值。較為複雜的初始化 利用memset函式初始化。memset函式用法 void memset void s,int c,size t n 將已開闢記憶體...