SystemVerilog語言簡(jiǎn)介
1. 接口(Interface)
Verilog模塊之間的連接是通過模塊端口進(jìn)行的。為了給組成設(shè)計(jì)的各個(gè)模塊定義端口,我們必須對(duì)期望的硬件設(shè)計(jì)有一個(gè)詳細(xì)的認(rèn)識(shí)。不幸的是,在設(shè)計(jì)的早期,我們很難把握設(shè)計(jì)的細(xì)節(jié)。而且,一旦模塊的端口定義完成后,我們也很難改變端口的配置。另外,一個(gè)設(shè)計(jì)中的許多模塊往往具有相同的端口定義,在Verilog中,我們必須在每個(gè)模塊中進(jìn)行相同的定義,這為我們?cè)黾恿藷o謂的工作量。
SystemVerilog提供了一個(gè)新的、高層抽象的模塊連接,這個(gè)連接被稱為接口(Interface)。接口在關(guān)鍵字interface和endinterface之間定義,它獨(dú)立于模塊。接口在模塊中就像一個(gè)單一的端口一樣使用。在最簡(jiǎn)單的形式下,一個(gè)接口可以認(rèn)為是一組線網(wǎng)。例如,可以將PCI總線的所有信號(hào)綁定在一起組成一個(gè)接口。通過使用接口,我們?cè)谶M(jìn)行一個(gè)設(shè)計(jì)的時(shí)候可以不需要首先建立各個(gè)模塊間的互連。隨著設(shè)計(jì)的深入,各個(gè)設(shè)計(jì)細(xì)節(jié)也會(huì)變得越來越清晰,而接口內(nèi)的信號(hào)也會(huì)很容易地表示出來。當(dāng)接口發(fā)生變化時(shí),這些變化也會(huì)在使用該接口的所有模塊中反映出來,而無需更改每一個(gè)模塊。下面是一個(gè)接口的使用實(shí)例:
interface chip_bus; // 定義接口
wire read_request, read_grant;
wire [7:0] address, data;
endinterface: chip_bus
module RAM (chip_bus io, // 使用接口
input clk);
// 可以使用io.read_request引用接口中的一個(gè)信號(hào)
endmodule
module CPU(chip_bus io, input clk);
...
endmodule
module top;
reg clk = 0;
chip_bus a; // 實(shí)例接口
// 將接口連接到模塊實(shí)例
RAM mem(a, clk);
CPU cpu(a, clk);
endmodule
實(shí)際上,SystemVerilog的接口不僅僅可以表示信號(hào)的綁定和互連。由于SystemVerilog的接口中可以包含參數(shù)、常量、變量、結(jié)構(gòu)、函數(shù)、任務(wù)、initial塊、always塊以及連續(xù)賦值語句,所以SystemVerilog的接口還可以包含內(nèi)建的協(xié)議檢查以及被使用該接口的模塊所共用的功能。
2. 全局聲明和語句
在Verilog中,除了一個(gè)模塊可以作為模塊實(shí)例引用其他模塊外,并不存在一個(gè)全局空間。另外,Verilog允許任意數(shù)目的頂層模塊,因此會(huì)產(chǎn)生毫無關(guān)聯(lián)的層次樹。
SystemVeriog增加了一個(gè)被稱為$root的隱含的頂級(jí)層次。任何在模塊邊界之外的聲明和語句都存在于$root空間中。所有的模塊,無論它處于哪一個(gè)設(shè)計(jì)層次,都可以引用$root中聲明的名字。這樣,如果某些變量、函數(shù)或其它信息被設(shè)計(jì)中的所有模塊共享,那么我們就可以將它們作為全局聲明和語句。全局聲明和語句的一個(gè)使用實(shí)例如下:
reg error _flag; // 全局變量
function compare (...); // 全局函數(shù)
always @(error_flag) // 全局語句
...
module test;
chip1 u1 (...)
endmodule
module chip1 (...);
FSM u2 (...);
always @(data)
error_flag = compare(data, expected);
endmodule
module FSM (...);
...
always @(state)
error_flag = compare(state, expected);
endmodule
3. 時(shí)間單位和精度
在Verilog中,表示時(shí)間的值使用一個(gè)數(shù)來表示,而不帶有任何時(shí)間單位。例如:
forever #5 clock = ~clock;
從這一句中我們無法判斷5代表的是5ns? 5ps? 還是其他。Verilog的時(shí)間單位和精度是作為每一個(gè)模塊的屬性,并使用編譯器指令`timescale來設(shè)置。使用這種方法具有固有的缺陷,因?yàn)榫幾g器指令的執(zhí)行依賴于源代碼的編譯順序,編譯器總是將它遇到的最后一個(gè)`timescale設(shè)置的時(shí)間單位和精度作為之后的標(biāo)準(zhǔn)。那么,假如有些模塊之前沒有使用`timescale設(shè)置時(shí)間單位和精度,這就有可能出現(xiàn)同一個(gè)源代碼的不同仿真會(huì)出現(xiàn)不同結(jié)果的情況。
SystemVerilog為了控制時(shí)間單位加入了兩個(gè)重要的增強(qiáng)。首先,時(shí)間值可以顯式地指定一個(gè)單位。時(shí)間單位可以是s、ms、ns、ps或fs。時(shí)間單位作為時(shí)間值的后綴出現(xiàn)。例如:
forever #5ns clock = ~clock;
其次,SystemVerilog允許使用新的關(guān)鍵字(timeunits和timeprecision)來指定時(shí)間單位和精度。這些聲明可以在任何模塊中指定,同時(shí)也可以在$root空間中全局指定。時(shí)間單位和精度必須是10的冪,范圍可以從s到fs。例如:
timeunits 1ns;
timeprecision 10ps;
4. 抽象數(shù)據(jù)類型
Verilog提供了面向底層硬件的線網(wǎng)、寄存器和變量數(shù)據(jù)類型。這些類型代表了4態(tài)邏輯值,通常用來在底層上對(duì)硬件進(jìn)行建模和驗(yàn)證。線網(wǎng)數(shù)據(jù)類型還具有多個(gè)強(qiáng)度級(jí)別,并且能夠?yàn)槎囹?qū)動(dòng)源的線網(wǎng)提供解析功能。
SystemVerilog包括了C語言的char和int數(shù)據(jù)類型,它允許在Verilog模型和驗(yàn)證程序中直接使用C和C++代碼。Verilog PLI不再需要集成總線功能模型、算法模型和C函數(shù)。SystemVerilog還為Verilog加入了幾個(gè)新的數(shù)據(jù)類型,以便能夠在更抽象的層次上建模硬件。
l char:一個(gè)兩態(tài)的有符號(hào)變量,它與C語言中的char數(shù)據(jù)類型相同,可以是一個(gè)8位整數(shù)(ASCII)或short int(Unicode);
l int:一個(gè)兩態(tài)的有符號(hào)變量,它與C語言中的int數(shù)據(jù)類型相似,但被精確地定義成32位;
l shortint:一個(gè)兩態(tài)的有符號(hào)變量,被精確地定義成16位;
l longint:一個(gè)兩態(tài)的有符號(hào)變量,它與C語言中的long數(shù)據(jù)類型相似,但被精確地定義成64位;
l byte:一個(gè)兩態(tài)的有符號(hào)變量,被精確地定義成8位;
l bit:一個(gè)兩態(tài)的可以具有任意向量寬度的無符號(hào)數(shù)據(jù)類型,可以用來替代Verilog的reg數(shù)據(jù)類型;
l logic:一個(gè)四態(tài)的可以具有任意向量寬度的無符號(hào)數(shù)據(jù)類型,可以用來替代Verilog的線網(wǎng)或reg數(shù)據(jù)類型,但具有某些限制;
l shortreal:一個(gè)兩態(tài)的單精度浮點(diǎn)變量,與C語言的float類型相同;
l void:表示沒有值,可以定義成一個(gè)函數(shù)的返回值,與C語言中的含義相同。
SystemVerilog的bit和其他數(shù)據(jù)類型允許用戶使用兩態(tài)邏輯對(duì)設(shè)計(jì)建模,這種方法對(duì)仿真性能更有效率。由于Verilog語言沒有兩態(tài)數(shù)據(jù)類型,因此許多仿真器都通過將這種功能作為仿真器的一個(gè)選項(xiàng)提供。這些選項(xiàng)不能夠在所有的仿真器之間移植,而且在需要時(shí)用三態(tài)或四態(tài)邏輯的設(shè)計(jì)中強(qiáng)制使用兩態(tài)邏輯還具有副作用。SystemVerilog的bit數(shù)據(jù)類型能夠極大改進(jìn)仿真器的性能,同時(shí)在需要的時(shí)候仍然可以使用三態(tài)或四態(tài)邏輯。通過使用具有確定行為的數(shù)據(jù)類型來代替專有的仿真器選項(xiàng),兩態(tài)模型能夠在所有的SystemVerilog仿真器間移植。
SystemVerilog的logic數(shù)據(jù)類型比Verilog的線網(wǎng)和寄存器數(shù)據(jù)類型更加靈活,它使得在任何抽象層次上建模硬件都更加容易。logic類型能夠以下面的任何一種方法賦值:
l 通過任意數(shù)目的過程賦值語句賦值,能夠替代Verilog的reg類型;
l 通過單一的連續(xù)賦值語句賦值,能夠有限制地替代Verilog的wire類型;
l 連接到一個(gè)單一原語的輸出,能夠有限制地替代Verilog的wire類型;
由于logic數(shù)據(jù)類型能夠被用來替代Verilog的reg或wire(具有限制),這就使得能夠在一個(gè)更高的抽象層次上建模,并且隨著設(shè)計(jì)的不斷深入能夠加入一些設(shè)計(jì)細(xì)節(jié)而不必改變數(shù)據(jù)類型的聲明。logic數(shù)據(jù)類型不會(huì)表示信號(hào)的強(qiáng)度也不具有線邏輯的解析功能,因此logic數(shù)據(jù)類型比Verilog的wire類型更能有效地仿真和綜合。
5. 有符號(hào)和無符號(hào)限定符
缺省情況下,Verilog net和reg數(shù)據(jù)類型是無符號(hào)類型,integer類型是一個(gè)有符號(hào)類型。Verilog-2001標(biāo)準(zhǔn)允許使用signed關(guān)鍵字將無符號(hào)類型顯式地聲明成有符號(hào)類型。SystemVerilog加入了相似的能力,它可以通過unsigned關(guān)鍵字將有符號(hào)數(shù)據(jù)類型顯式地聲明成有無符號(hào)數(shù)據(jù)類型。例如:
int unsigned j;
值得注意的是unsigned在Verilog中是一個(gè)保留字,但并沒有被Verilog標(biāo)準(zhǔn)使用。
評(píng)論