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

SystemVerilog語言簡介(上)

發布時間:2010-10-9 22:22    發布者:conniede
SystemVerilog是一種硬件描述和驗證語言(HDVL),它基于IEEE 1364-2001 Verilog硬件描述語言(HDL),并對其進行了擴展,包括擴充了C語言數據類型、結構、壓縮和非壓縮數組、接口、斷言等等,這些都使得SystemVerilog在一個更高的抽象層次上提高了設計建模的能力。

SystemVerilog由Accellera開發,它主要定位在芯片的實現和驗證流程上,并為系統級的設計流程提供了強大的連接能力。下面我們從幾個方面對SystemVerilog所作的增強進行簡要的介紹,期望能夠通過這個介紹使大家對SystemVerilog有一個概括性的了解。

1. 接口(Interface)

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

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

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引用接口中的一個信號

endmodule

module CPU(chip_bus io, input clk);

...

endmodule

module top;

reg clk = 0;

chip_bus a; // 實例接口

// 將接口連接到模塊實例

RAM mem(a, clk);

CPU cpu(a, clk);

endmodule

實際上,SystemVerilog的接口不僅僅可以表示信號的綁定和互連。由于SystemVerilog的接口中可以包含參數、常量、變量、結構、函數、任務、initial塊、always塊以及連續賦值語句,所以SystemVerilog的接口還可以包含內建的協議檢查以及被使用該接口的模塊所共用的功能。

2. 全局聲明和語句

在Verilog中,除了一個模塊可以作為模塊實例引用其他模塊外,并不存在一個全局空間。另外,Verilog允許任意數目的頂層模塊,因此會產生毫無關聯的層次樹。

SystemVeriog增加了一個被稱為$root的隱含的頂級層次。任何在模塊邊界之外的聲明和語句都存在于$root空間中。所有的模塊,無論它處于哪一個設計層次,都可以引用$root中聲明的名字。這樣,如果某些變量、函數或其它信息被設計中的所有模塊共享,那么我們就可以將它們作為全局聲明和語句。全局聲明和語句的一個使用實例如下:

reg error _flag; // 全局變量

function compare (...); // 全局函數

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. 時間單位和精度

在Verilog中,表示時間的值使用一個數來表示,而不帶有任何時間單位。例如:

forever #5 clock = ~clock;

從這一句中我們無法判斷5代表的是5ns? 5ps? 還是其他。Verilog的時間單位和精度是作為每一個模塊的屬性,并使用編譯器指令`timescale來設置。使用這種方法具有固有的缺陷,因為編譯器指令的執行依賴于源代碼的編譯順序,編譯器總是將它遇到的最后一個`timescale設置的時間單位和精度作為之后的標準。那么,假如有些模塊之前沒有使用`timescale設置時間單位和精度,這就有可能出現同一個源代碼的不同仿真會出現不同結果的情況。  
SystemVerilog為了控制時間單位加入了兩個重要的增強。首先,時間值可以顯式地指定一個單位。時間單位可以是s、ms、ns、ps或fs。時間單位作為時間值的后綴出現。例如:

forever #5ns clock = ~clock;

其次,SystemVerilog允許使用新的關鍵字(timeunits和timeprecision)來指定時間單位和精度。這些聲明可以在任何模塊中指定,同時也可以在$root空間中全局指定。時間單位和精度必須是10的冪,范圍可以從s到fs。例如:

timeunits 1ns;

timeprecision 10ps;

4. 抽象數據類型

Verilog提供了面向底層硬件的線網、寄存器和變量數據類型。這些類型代表了4態邏輯值,通常用來在底層上對硬件進行建模和驗證。線網數據類型還具有多個強度級別,并且能夠為多驅動源的線網提供解析功能。

SystemVerilog包括了C語言的char和int數據類型,它允許在Verilog模型和驗證程序中直接使用C和C++代碼。Verilog PLI不再需要集成總線功能模型、算法模型和C函數。SystemVerilog還為Verilog加入了幾個新的數據類型,以便能夠在更抽象的層次上建模硬件。

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

int:一個兩態的有符號變量,它與C語言中的int數據類型相似,但被精確地定義成32位;

shortint:一個兩態的有符號變量,被精確地定義成16位;

longint:一個兩態的有符號變量,它與C語言中的long數據類型相似,但被精確地定義成64位;

byte:一個兩態的有符號變量,被精確地定義成8位;

bit:一個兩態的可以具有任意向量寬度的無符號數據類型,可以用來替代Verilog的reg數據類型;

logic:一個四態的可以具有任意向量寬度的無符號數據類型,可以用來替代Verilog的線網或reg數據類型,但具有某些限制;

shortreal:一個兩態的單精度浮點變量,與C語言的float類型相同;

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

SystemVerilog的bit和其他數據類型允許用戶使用兩態邏輯對設計建模,這種方法對仿真性能更有效率。由于Verilog語言沒有兩態數據類型,因此許多仿真器都通過將這種功能作為仿真器的一個選項提供。這些選項不能夠在所有的仿真器之間移植,而且在需要時用三態或四態邏輯的設計中強制使用兩態邏輯還具有副作用。SystemVerilog的bit數據類型能夠極大改進仿真器的性能,同時在需要的時候仍然可以使用三態或四態邏輯。通過使用具有確定行為的數據類型來代替專有的仿真器選項,兩態模型能夠在所有的SystemVerilog仿真器間移植。

SystemVerilog的logic數據類型比Verilog的線網和寄存器數據類型更加靈活,它使得在任何抽象層次上建模硬件都更加容易。logic類型能夠以下面的任何一種方法賦值:

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

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

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

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

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

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


int unsigned j;

值得注意的是unsigned在Verilog中是一個保留字,但并沒有被Verilog標準使用。

6. 用戶定義的類型

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

typedef unsigned int uint;

uint a, b;

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

typedef int48; // 空的typedef,在其他地方進行完整定義

int48 c;

7. 枚舉類型

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

enum {red, yellow, green} RGB;

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

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

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

boolean ready;

boolean test_complete;

8. 結構體和聯合體

在Verilog語言中不存在結構體或聯合體,而結構體或聯合體在將幾個聲明組合在一起的時候非常有用。SystemVerilog增加了結構體和聯合體,它們的聲明語法類似于C。

struct {

reg [15:0] opcode;

reg [23:0] addr;

} IR;

union {

int I;

shortreal f;

} N;

結構體或聯合體中的域可以通過在變量名和域名字之間插入句點(.)來引用:

IR.opcode = 1; // 設置IR變量中的opcode域

N.f = 0.0; // 將N設置成浮點數的值

我們可以使用typedef為結構體或聯合體的定義指定一個名字。

typedef struct {

reg [7:0] opcode;

reg [23:0] addr;

} instruction; // 命名的結構體

instruction IR; // 結構體實例

一個結構體可以使用值的級聯來完整地賦值,例如:

instruction = {5, 200};

結構體可以作為一個整體傳遞到函數或任務,也可以從函數或任務傳遞過來,也可以作為模塊端口進行傳遞。

9. 數組

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

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

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

bit [7:0] a; // 一個一維的壓縮數組

bit b [7:0]; //一個一維的非壓縮數組

bit [0:11] [7:0] c; //一個二維的壓縮數組

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

10. 在為命名的塊中聲明

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

11. 常量

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

const char colon = “:”;

12. 可重定義的數據類型

SystemVerilog擴展了Verilog的parameter,使其可以包含類型。這個強大的功能使得一個模塊中的數據類型在模塊的每一個實例中重新定義。例如:

module foo;

# (parameter type VAR_TYPE = shortint;)

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

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



endmodule

module bar;

logic [3:0] i, o;

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

endmodule

13. 模塊端口連接

在Verilog中,可以連接到模塊端口的數據類型被限制為線網類型以及變量類型中的reg、integer和time。而在SystemVerilog中則去除了這種限制,任何數據類型都可以通過端口傳遞,包括實數、數組和結構體。

14. 字母值

在Verilog中,當指定或賦值字母值的時候存在一些限制。而SystemVerilog則為字母值如何指定作了下面的增強:

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

bit [63:0] data;

data = `1; //將data的所有位設置成1

一個字符串可以賦值成一個字符數組,象C語言一樣加入一個空結束符。如果尺寸不同,它象C中一樣進行左調整,例如:

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

加入了幾個特殊的串字符:

v:垂直TAB

f:換頁

a:響鈴

x02:用十六進制數來表示一個ASCII字符

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

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

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

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區

相關在線工具

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧洲精品成人久久曰影片 | 丝瓜视频黄瓜视频| 亚色在线| 王王的视频ivk| 一级女性全黄生活片免费看| 97在线国内自拍视频| 国产亚洲精品字幕在线观看| 欧美在线视频一区| 在线观看免费av网站| 色综合免费视频| 野外一级毛片| 欧美一区2区三区4区公司| 天天爽夜夜爽天天做夜夜做| 色视频综合| 伊人久久国产精品| 国产精品久久久久影院色老大| 欧美亚洲高清国产| 欧美亚洲一区| 欧美在线看欧美高清视频免费| 亚洲aⅴ天堂| 伊人逼逼| 男人插女人动态| 有人有片的观看免费视频| 香蕉国产成版人视频在线观看| 日韩中文字幕精品视频在线| 在线看91| 伊人影院中文字幕| 国精产品砖一区二区三区糖心 | 午夜成人免费影院| 97国产露脸精品国产麻豆| 麻豆成人久久精品二区三区网站| 一级毛片西西人体44rt高清| 欧美性久久| 婷婷六月天在线| 香蕉大久久| 被室友C哭调教双性| 蜜臀色欲AV无人A片一区| 中文字幕午夜福利片| 亚洲欧美日韩精品久久| 天天看天天做| 一个人看的免费高清视频www|