veilog數組操作

這裏的內存模型指的是內存的行爲模型。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'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
       而$readmemh("memory.list", my_memory, 100, 104);就指定使用memory.list來初始化my_memory的100-104單元。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章