国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

SystemVerilog語言簡介(上)

發(fā)布時(shí)間:2010-10-9 22:22    發(fā)布者:conniede
關(guān)鍵詞: SystemVerilog , 變量 , 寄存器 , 語言
SystemVerilog是一種硬件描述和驗(yàn)證語言(HDVL),它基于IEEE 1364-2001 Verilog硬件描述語言(HDL),并對其進(jìn)行了擴(kuò)展,包括擴(kuò)充了C語言數(shù)據(jù)類型、結(jié)構(gòu)、壓縮和非壓縮數(shù)組、接口、斷言等等,這些都使得SystemVerilog在一個(gè)更高的抽象層次上提高了設(shè)計(jì)建模的能力。

SystemVerilog由Accellera開發(fā),它主要定位在芯片的實(shí)現(xiàn)和驗(yàn)證流程上,并為系統(tǒng)級的設(shè)計(jì)流程提供了強(qiáng)大的連接能力。下面我們從幾個(gè)方面對SystemVerilog所作的增強(qiáng)進(jìn)行簡要的介紹,期望能夠通過這個(gè)介紹使大家對SystemVerilog有一個(gè)概括性的了解。

1. 接口(Interface)

Verilog模塊之間的連接是通過模塊端口進(jìn)行的。為了給組成設(shè)計(jì)的各個(gè)模塊定義端口,我們必須對期望的硬件設(shè)計(jì)有一個(gè)詳細(xì)的認(rèn)識。不幸的是,在設(shè)計(jì)的早期,我們很難把握設(shè)計(jì)的細(xì)節(jié)。而且,一旦模塊的端口定義完成后,我們也很難改變端口的配置。另外,一個(gè)設(shè)計(jì)中的許多模塊往往具有相同的端口定義,在 Verilog中,我們必須在每個(gè)模塊中進(jìn)行相同的定義,這為我們增加了無謂的工作量。

SystemVerilog提供了一個(gè)新的、高層抽象的模塊連接,這個(gè)連接被稱為接口(Interface)。接口在關(guān)鍵字interface和endinterface之間定義,它獨(dú)立于模塊。接口在模塊中就像一個(gè)單一的端口一樣使用。在最簡單的形式下,一個(gè)接口可以認(rèn)為是一組線網(wǎng)。例如,可以將PCI總線的所有信號綁定在一起組成一個(gè)接口。通過使用接口,我們在進(jìn)行一個(gè)設(shè)計(jì)的時(shí)候可以不需要首先建立各個(gè)模塊間的互連。隨著設(shè)計(jì)的深入,各個(gè)設(shè)計(jì)細(xì)節(jié)也會變得越來越清晰,而接口內(nèi)的信號也會很容易地表示出來。當(dāng)接口發(fā)生變化時(shí),這些變化也會在使用該接口的所有模塊中反映出來,而無需更改每一個(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è)信號

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的接口不僅僅可以表示信號的綁定和互連。由于SystemVerilog的接口中可以包含參數(shù)、常量、變量、結(jié)構(gòu)、函數(shù)、任務(wù)、initial塊、always塊以及連續(xù)賦值語句,所以SystemVerilog的接口還可以包含內(nèi)建的協(xié)議檢查以及被使用該接口的模塊所共用的功能。

2. 全局聲明和語句

在Verilog中,除了一個(gè)模塊可以作為模塊實(shí)例引用其他模塊外,并不存在一個(gè)全局空間。另外,Verilog允許任意數(shù)目的頂層模塊,因此會產(chǎn)生毫無關(guān)聯(lián)的層次樹。

SystemVeriog增加了一個(gè)被稱為$root的隱含的頂級層次。任何在模塊邊界之外的聲明和語句都存在于$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è)源代碼的不同仿真會出現(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)邏輯值,通常用來在底層上對硬件進(jìn)行建模和驗(yàn)證。線網(wǎng)數(shù)據(jù)類型還具有多個(gè)強(qiáng)度級別,并且能夠?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ù)類型,以便能夠在更抽象的層次上建模硬件。

char:一個(gè)兩態(tài)的有符號變量,它與C語言中的char數(shù)據(jù)類型相同,可以是一個(gè)8位整數(shù)(ASCII)或short int(Unicode);

int:一個(gè)兩態(tài)的有符號變量,它與C語言中的int數(shù)據(jù)類型相似,但被精確地定義成32位;

shortint:一個(gè)兩態(tài)的有符號變量,被精確地定義成16位;

longint:一個(gè)兩態(tài)的有符號變量,它與C語言中的long數(shù)據(jù)類型相似,但被精確地定義成64位;

byte:一個(gè)兩態(tài)的有符號變量,被精確地定義成8位;

bit:一個(gè)兩態(tài)的可以具有任意向量寬度的無符號數(shù)據(jù)類型,可以用來替代Verilog的reg數(shù)據(jù)類型;

logic:一個(gè)四態(tài)的可以具有任意向量寬度的無符號數(shù)據(jù)類型,可以用來替代Verilog的線網(wǎng)或reg數(shù)據(jù)類型,但具有某些限制;

shortreal:一個(gè)兩態(tài)的單精度浮點(diǎn)變量,與C語言的float類型相同;

void:表示沒有值,可以定義成一個(gè)函數(shù)的返回值,與C語言中的含義相同。

SystemVerilog的bit和其他數(shù)據(jù)類型允許用戶使用兩態(tài)邏輯對設(shè)計(jì)建模,這種方法對仿真性能更有效率。由于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類型能夠以下面的任何一種方法賦值:

通過任意數(shù)目的過程賦值語句賦值,能夠替代Verilog的reg類型;

通過單一的連續(xù)賦值語句賦值,能夠有限制地替代Verilog的wire類型;

連接到一個(gè)單一原語的輸出,能夠有限制地替代Verilog的wire類型;

由于logic數(shù)據(jù)類型能夠被用來替代Verilog的reg或wire(具有限制),這就使得能夠在一個(gè)更高的抽象層次上建模,并且隨著設(shè)計(jì)的不斷深入能夠加入一些設(shè)計(jì)細(xì)節(jié)而不必改變數(shù)據(jù)類型的聲明。logic數(shù)據(jù)類型不會表示信號的強(qiáng)度也不具有線邏輯的解析功能,因此logic數(shù)據(jù)類型比 Verilog的wire類型更能有效地仿真和綜合。

5. 有符號和無符號限定符

缺省情況下,Verilog net和reg數(shù)據(jù)類型是無符號類型,integer類型是一個(gè)有符號類型。Verilog-2001標(biāo)準(zhǔn)允許使用signed關(guān)鍵字將無符號類型顯式地聲明成有符號類型。SystemVerilog加入了相似的能力,它可以通過unsigned關(guān)鍵字將有符號數(shù)據(jù)類型顯式地聲明成有無符號數(shù)據(jù)類型。例如:  


int unsigned j;

值得注意的是unsigned在Verilog中是一個(gè)保留字,但并沒有被Verilog標(biāo)準(zhǔn)使用。

6. 用戶定義的類型

Verilog不允許用戶定義新的數(shù)據(jù)類型。SystemVerilog通過使用typedef提供了一種方法來定義新的數(shù)據(jù)類型,這一點(diǎn)與C語言類似。用戶定義的類型可以與其它數(shù)據(jù)類型一樣地使用在聲明當(dāng)中。例如:

typedef unsigned int uint;

uint a, b;

一個(gè)用戶定義的數(shù)據(jù)類型可以在它的定義之前使用,只要它首先在空的typedef中說明,例如:

typedef int48; // 空的typedef,在其他地方進(jìn)行完整定義

int48 c;

7. 枚舉類型

在Verilog語言中不存在枚舉類型。標(biāo)識符必須被顯式地聲明成一個(gè)線網(wǎng)、變量或參數(shù)并被賦值。SystemVerilog允許使用類似于C的語法產(chǎn)生枚舉類型。一個(gè)枚舉類型具有一組被命名的值。缺省情況下,值從初始值0開始遞增,但是我們可以顯式地指定初始值。枚舉類型的例子如下:

enum {red, yellow, green} RGB;

enum {WAIT=2’b01, LOAD, DONE} states;

我們還可以使用typedef為枚舉類型指定一個(gè)名字,從而允許這個(gè)枚舉類型可以在許多地方使用。例如:

typedef enum {FALSE=1’b0, TRUE} boolean;

boolean ready;

boolean test_complete;

8. 結(jié)構(gòu)體和聯(lián)合體

在Verilog語言中不存在結(jié)構(gòu)體或聯(lián)合體,而結(jié)構(gòu)體或聯(lián)合體在將幾個(gè)聲明組合在一起的時(shí)候非常有用。SystemVerilog增加了結(jié)構(gòu)體和聯(lián)合體,它們的聲明語法類似于C。

struct {

reg [15:0] opcode;

reg [23:0] addr;

} IR;

union {

int I;

shortreal f;

} N;

結(jié)構(gòu)體或聯(lián)合體中的域可以通過在變量名和域名字之間插入句點(diǎn)(.)來引用:

IR.opcode = 1; // 設(shè)置IR變量中的opcode域

N.f = 0.0; // 將N設(shè)置成浮點(diǎn)數(shù)的值

我們可以使用typedef為結(jié)構(gòu)體或聯(lián)合體的定義指定一個(gè)名字。

typedef struct {

reg [7:0] opcode;

reg [23:0] addr;

} instruction; // 命名的結(jié)構(gòu)體

instruction IR; // 結(jié)構(gòu)體實(shí)例

一個(gè)結(jié)構(gòu)體可以使用值的級聯(lián)來完整地賦值,例如:

instruction = {5, 200};

結(jié)構(gòu)體可以作為一個(gè)整體傳遞到函數(shù)或任務(wù),也可以從函數(shù)或任務(wù)傳遞過來,也可以作為模塊端口進(jìn)行傳遞。

9. 數(shù)組

在Verilog中可以聲明一個(gè)數(shù)組類型,reg和線網(wǎng)類型還可以具有一個(gè)向量寬度。在一個(gè)對象名前面聲明的尺寸表示向量的寬度,在一個(gè)對象名后面聲明的尺寸表示數(shù)組的深度。例如:

reg [7:0] r1 [1:256]; // 256個(gè)8位的變量

在SystemVerilog中我們使用不同的術(shù)語表示數(shù)組:使用“壓縮數(shù)組(packed array)”這一術(shù)語表示在對象名前聲明尺寸的數(shù)組;使用“非壓縮數(shù)組(unpacked array)”這一術(shù)語表示在對象名后面聲明尺寸的數(shù)組。壓縮數(shù)組可以由下面的數(shù)據(jù)類型組成:bit、logic、reg、wire以及其它的線網(wǎng)類型。無論是壓縮數(shù)組還是非壓縮數(shù)組都可以聲明成多維的尺寸。

bit [7:0] a; // 一個(gè)一維的壓縮數(shù)組

bit b [7:0]; //一個(gè)一維的非壓縮數(shù)組

bit [0:11] [7:0] c; //一個(gè)二維的壓縮數(shù)組

bit [3:0] [7:0] d [1:10]; // 一個(gè)包含10個(gè)具有4個(gè)8位字節(jié)的壓縮數(shù)組的非壓縮數(shù)組
非壓縮尺寸在壓縮尺寸之前引用,這就允許將整個(gè)壓縮數(shù)組作為一個(gè)單一的元素進(jìn)行引用。在上面的例子中,d引用非壓縮數(shù)組的一個(gè)單一元素,這個(gè)元素是一個(gè)包含4個(gè)字節(jié)的數(shù)組。

10. 在為命名的塊中聲明

Verilog允許變量在一個(gè)命名的begin-end或fork-join語句組中聲明。相對于語句組來說,這些變量是本地的,但它們可以被層次化地引用。在SystemVerilog中,既可以在命名的塊中也可以在未命名的塊中聲明。在未命名的塊中,不能夠使用層次名來訪問變量。所有的變量類型,包括用戶定義的類型、枚舉類型、結(jié)構(gòu)體和聯(lián)合體都可以在begin-end或fork-join語句組中聲明。  

11. 常量

在Verilog中有三種特性類型的常量:parameter、specparam和localparam。而在SystemVerilog中,允許使用const關(guān)鍵字聲明常量。例如:

const char colon = “:”;

12. 可重定義的數(shù)據(jù)類型

SystemVerilog擴(kuò)展了Verilog的parameter,使其可以包含類型。這個(gè)強(qiáng)大的功能使得一個(gè)模塊中的數(shù)據(jù)類型在模塊的每一個(gè)實(shí)例中重新定義。例如:

module foo;

# (parameter type VAR_TYPE = shortint;)

(input logic [7:0] i, output logic [7:0] o);

VAR_TYPE j = 0; // 如果不重新定義,j的數(shù)據(jù)類型為shortint



endmodule

module bar;

logic [3:0] i, o;

foo #(.VAR_TYPE(int)) u1 (i, o); // 重新將VAR_TYPE定義成int類型

endmodule

13. 模塊端口連接

在Verilog中,可以連接到模塊端口的數(shù)據(jù)類型被限制為線網(wǎng)類型以及變量類型中的reg、integer和time。而在SystemVerilog中則去除了這種限制,任何數(shù)據(jù)類型都可以通過端口傳遞,包括實(shí)數(shù)、數(shù)組和結(jié)構(gòu)體。

14. 字母值

在Verilog中,當(dāng)指定或賦值字母值的時(shí)候存在一些限制。而SystemVerilog則為字母值如何指定作了下面的增強(qiáng):

一個(gè)字母值的所有位均可以使用`0、`1、`z或`x作相同的填充。這就允許填充一個(gè)任意寬度的向量,而無需顯式地指定向量的寬度,例如:

bit [63:0] data;

data = `1; //將data的所有位設(shè)置成1

一個(gè)字符串可以賦值成一個(gè)字符數(shù)組,象C語言一樣加入一個(gè)空結(jié)束符。如果尺寸不同,它象C中一樣進(jìn)行左調(diào)整,例如:

char foo [0:12] = “hello worldn”;

加入了幾個(gè)特殊的串字符:

v:垂直TAB

f:換頁

a:響鈴

x02:用十六進(jìn)制數(shù)來表示一個(gè)ASCII字符

數(shù)組可以使用類似于C初始化的語法賦值成字符值,但它還允許復(fù)制操作符。括號的嵌套必須精確地匹配數(shù)組的維數(shù)(這一點(diǎn)與C不同),例如:

int n [1: 2] [1:3] = {{0, 1, 2}, {3{4}}};
本文地址:http://www.qingdxww.cn/thread-31210-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
wwof3w 發(fā)表于 2011-12-1 22:06:42
正好,學(xué)習(xí)前有個(gè)初步了解,謝樓主!
jimcmwang 發(fā)表于 2016-4-9 13:05:59
SystemVerilog語言簡介(上)
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • PIC18-Q71系列MCU概述
  • 基于CEC1712實(shí)現(xiàn)的處理器SPI FLASH固件安全彈性方案培訓(xùn)教程
  • 了解一下Microchip強(qiáng)大的PIC18-Q24 MCU系列
  • 為何選擇集成電平轉(zhuǎn)換?
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)在線工具

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费人成网站在线播放 | 日韩欧美一区二区不卡 | 日韩一本在线 | 青青青视频在国线观看伊人 | 玖玖福利| 最新国产精品自拍 | www视频在线观看天堂 | 青青草国产免费 | 四虎永久免费884hutv | 四虎网站在线观看 | 亚洲免费色视频 | 欧美色图综合 | 日日夜操| 国产一区第一页 | 日韩a毛片免费全部播放完整 | 成人激情黄色 | 四虎永久在线观看视频精品 | 国产美女白丝袜精品_a不卡 | 国产微拍| 亚洲第一视频网 | 精品亚洲一区二区 | 成人性生交大片免费看中文 | 亚洲日本在线观看 | 国内精品不卡一区二区三区 | 青草资源视频在线高清观看 | 一级毛片aaaaaa视频免费看 | 亚洲一卡二卡三卡四卡无卡麻豆 | 韩国一级特黄清高免费大片 | 成人综合网址 | 99香蕉国产精品偷在线观看 | 国产成人a一在线观看 | 日日夜夜操美女 | 日韩在线视频观看 | 香蕉视频观看 | 91香蕉视频网址 | 日韩一级不卡 | 久久久久免费精品国产小说 | 国产精品视频一区二区三区w | 天天综合色天天综合色sb | 欧美影院| 国产色区 |