這裡的記憶體模型指的是記憶體的行為模型。
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 將已開闢記憶體...