verilog數組定義及其初始化

來源:互聯網
上載者:User

標籤:使用   檔案   資料   art   new   res   

這裡的記憶體模型指的是記憶體的行為模型。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不允許讀/寫一個位。這時,就需要使用一個變數轉換一下:(wolf點評:菜鳥易犯的錯誤,注意!)

         例如:

         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 (wolf點評:段注釋也可以,空行空格不影響!)

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定義為:

CC

AA

55 

5A

 

69

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.