在verilog中整數常量的表示是比較複雜的,在這根據ieee verilog 2005版標準做了一下梳理
1. 十進位制表示法,被視為有符號整數。
2. 基數表示法,《位寬》《進製》《數字》
1)無位寬和進製即十進位制表示法,表示有符號整數。
2)《進製》《數字》
3)《位寬》《進製》《數字》
x代表不確定值,z代表高阻,?是z的同意替換。x和z在16, 8和二進位制中的解釋分別是4位,3位和1位。其中10進製表示中不能包含x和z,除非整個10進製僅用乙個x或z表示,代表每一位都是x或z。
對於無符號整數,若給定數值位數小於指定尺寸則左邊補0,若數值最左邊是x或z則補x或z。若給定數值位數大於指定尺寸,則在左邊進行截斷。對於未指定尺寸的表示形式,至少填充到32位。
基數格式由乙個「撇號+可選的s+基數指示字母」s指示數值解釋成有符號整數還是有符號整數。例如4』[s]b1111加s代表數值為有符號整數解釋成-1,不加s代表無符號整數解釋成7,實際儲存的二進位制內容是不變的(尺寸範圍內最高位為符號位其餘位為資料位)。
s標誌只影響對後面數值的解釋,不影響數值的內容。
正負號應放在尺寸之前,放在數值前是不合法的語法。前為負號取數值的補碼,如-4』b0011,指的是3的補碼1101,ise測試中將他賦給8位匯流排時賦值結果為1111_1101。實際標準中並沒規定超過指定尺寸位數如何取值,實際應用中中應盡量讓右值長度等於左值的長度。
在於s的組合中比較麻煩,文件給了這樣乙個例子:
-4 'sd15 // this is equivalent to -(-4'd 1), or '0001'
因此在解釋有負號和s的基數時,要先根據尺寸內的最高位確定數值的符號,再按照負號的規則進行處理。
用ise進行綜合測試
4』hf賦給8位的匯流排,賦值結果為
4』shf賦給8位的匯流排,賦值結果為}
-4』hf賦給8位的匯流排,賦值結果為;
-4』shf賦給8位的匯流排,賦值結果為。
ieee標準中有尺寸的負數和有尺寸的符號整數賦給暫存器時會進行負號拓展,而不管暫存器自身是否有符號的。ieee標準未規定尺寸外的位元位如何處理,尺寸外的數值結果傾向於編譯器的特性。s影響對數值的解釋(即根據尺寸內最高符號位進行符號拓展),不影尺寸內位元位的結果,4』shf解釋為-1所以最高位四位都是1。而負號則是最後處理的,對之前解釋的值進行取補碼( two's complement)操作,尺寸範圍內的值是從低位截斷的結果。
如果僅考慮尺寸內位元位的結果,則遇s不變化,遇負號各位取反再加1。為了避免意外結果,賦值時,整數應有足夠的尺寸進行賦值。
example 1—unsized constant numbers
659 // is a decimal number
'h 837ff // is a hexadecimal number
'o7460 // is an octal number
4af // is illegal (hexadecimal format requires 'h)
example 2—sized constant numbers
4'b1001 // is a 4-bit binary number
5 'd 3 // is a 5-bit decimal number
3'b01x // is a 3-bit number with the least
// significant bit unknown
12'hx // is a 12-bit unknown number
16'hz // is a 16-bit high-impedance number
example 3—using sign with constant numbers
8 'd -6 // this is illegal syntax
-8 'd 6 // this defines the two's complement of 6,
// held in 8 bits—equivalent to -(8'd 6)
4 'shf // this denotes the 4-bit number '1111', to
// be interpreted as a 2's complement number,
// or '-1'. this is equivalent to -4'h 1
-4 'sd15 // this is equivalent to -(-4'd 1), or '0001'
16'sd? // the same as 16'sbz
example 4—automatic left padding
reg [11:0] a, b, c, d;
initial begin
a = 'h x; // yields ***
b = 'h 3x; // yields 03x
c = 'h z3; // yields zz3
d = 'h 0z3; // yields 0z3
endreg [84:0] e, f, g;
e = 'h5; // yields ,3'b101}
f = 'hx; // yields }
g = 'hz; // yields }
example 5—using underscore character in numbers
27_195_000
16'b0011_0101_0001_1111
32 'h 12ab_f001
最後關於下劃線,放在數字中任何地方都可以,除了開頭。 Verilog中的函式
verilog中的函式 verilog hdl與大多數可程式語言一樣,將使用率很高的 按照軟體工程的思想,寫成函式,這樣,該函式可以被多次呼叫。verilog中函式常用語三種情況 verilog中的函式與c語言中的函式的主要不同之處是 在verilog中,呼叫函式時,需要將乙個或則多個自變數傳給函式...
Verilog任意整數分頻電路
define n 5module div n input clk,基準時鐘output clk div n,n分頻後得到的時鐘input rst wire 31 0 n 5 n為分頻係數,n 2即可,n的值為clk除以clk div n後取整 四捨五入 產生備用時鐘1 reg 31 0 cnt1 r...
verilog中的task用法
定義乙個任務。task task demo 任務定義結構開頭,命名為 task demo input 7 0 x,y 輸入埠說明 output 7 0 tmp 輸出埠說明 if x y 給出任務定義的描述語句 tmp x else tmp y endtask 上述 定義了乙個名為 task demo...