Verilog 變量聲明與數據類型二


Verilog 變量聲明與數據類型二
上節介紹了wire,reg數據類型及其用法,並對變量定義中的向量的定義及使用做了說明。本節主要介紹其它幾種類型。常用的有如下幾種:整數integer,實數 real, 時間time,字符串等,他們本質上也是寄存器類型。
  1. 整形integer
整形變量用關鍵字integer 聲明,在聲明時不用指定位寬,位寬的大小和編譯器有關,一般默認為32位。和reg關鍵字不同,如沒有特別指定,reg型變量是無符號數,而integer聲明的變量是有符號數的。integer類型的數據一般作為循環變量用在循環語句中。
例:
reg [31:0] a;
reg [31:0] b;
 
integer i;
 
always@(*)
for (i = 1; i <= 4; i = i + 1)
b[(i*8-1)-:8] = a[(i*8-1)-:8];
上例中,變量i只起到循環輔助作用,真正綜合后該變量不存在,實際綜合后與下面的代碼等效。
reg [31:0] a;
reg [31:0] b;
 
integer i;
 
always@(*)
b[31:0] = a[31:0];
2. 實數(real)類型
實數用關鍵字 real 來聲明,可用十進制或科學計數法來表示。實數聲明不能帶有范圍,默認值為 0。如果將一個實數賦值給一個整數,則只有實數的整數部分會賦值給整數(采用四舍五入)。例如:
real ra ;
integer ib ;
reg [7:0] temp;
 
initial begin
ib=0;
ra = 4e5 ;
#10
ra=8.7; //ra可以真實得到8.7
ib = ra ; //ib=9
#10 ib=8.49; //ib=8
end
 
always@(*)
temp = ib ; //temp 值變化0----9---8
實數類型不是可以綜合的類型,一般在高層建模時用做算法仿真。真正在RTL是現實時應用浮點RTL邏輯實現。
  • 整數,實數仿真文件:
`timescale 1ns/1ps module tb_sim(); reg [31:0] a = 0; reg [31:0] b = 0; integer i; always@(*) for (i = 1; i <= 4; i = i + 1) b[(i*8-1)-:8] = a[(i*8-1)-:8]; initial begin a=0; b=0; #10 a=32'habcd_ef98; #10; end //========================================================== real ra; integer ib; reg [7:0] temp; initial begin ib=0; ra = 4e5; #10 ra=8.7; //ra可以真實得到8.7 ib = ra; //ib=9 #10 ib=8.49; //ib=8 #10 ra=8.49; //ra = 8.49 #10 ib=ra; //ib=8 #200; $stop(); end always@(*) temp = ib; //temp 值變化0----9---8 endmodule
  • modelsim下的仿真波形如圖1,
 
 
圖1
 
3. 時間(time)
Verilog 使用特殊的時間寄存器 time 型變量,對仿真時間進行保存。其寬度一般為 64 bit,通過調用系統函數 $time 獲取當前仿真時間。例如:
time current_time ; initial begin #100 ; current_time = $time ;
//current_time 的大小為 100
end
time類型也是不可綜合的,但在仿真時可以提高非常方便的時間統計信息。
4. 存儲器類型
存儲器變量不是一個新的的變量類型,是reg類型的數組。可用來描述 RAM ,ROM ,FIFO等存儲器的行為。
例如:
reg membit [0:15] ;
// 15個1bit存儲器,位寬1bit
reg [7:0] mem [0:1023];
// 1Kbyte存儲器,位寬8bit
mem[0] = 8'b0 ;
// 令第0個8bit的存儲單元值為0
存儲器賦初值可以用for循環語句實現。目前在
Intel,Xilinx的FPGA中都有block memory, 只要設置得當在綜合時會自動引用block memory。
細節內容見 Verilog ROM 的建模與使用及Verilog RAM 的建模與使用。
5. 字符串
字符串保存在 reg 類型的變量中,每個字符占用一個字節(8bit)。因此寄存器變量的寬度應該足夠大,以保證不會溢出。
字符串不能多行書寫,即字符串中不能包含回車符。如果寄存器變量的寬度大於字符串的大小,則使用 0 來填充左邊的空余位;如果寄存器變量的寬度小於字符串大小,則會截去字符串左邊多余的數據。例如,為存儲字符串 “www.icfedu.cn”, 需要 13*8byte 的存儲單元:
  • 實例
reg [0: 13*8-1] str ;
initial
begin
str = “www.icfedu.cn”;
end


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM