建立乙個簡單的systemverilog程式

2021-10-04 11:15:44 字數 3846 閱讀 5017

作為乙個物件導向的語言,免不了來乙個國際慣例: hello world!

下面是完整的**:

program tb();

initial begin

$display("hello, world!");

endendprogram

用modelsim進行編譯和執行:

hello, world!

**解釋:跟c語言的main函式類似,sv語言需要乙個**開始的入口,這個入口可以是module,program,inte***ce等,這裡使用的program,如果把program替換成module,**結果也完全一樣。program跟module的區別以後再講。然後在program裡面需要呼叫initial 語句來表明**的各個執行緒。乙個program裡面可以用很多個initial塊,他們並行從時間0開始執行。initial塊裡面只有一句列印,所以最終**的輸出只有一句列印資訊:hello, world!$display是sv語言規定的列印函式,跟c語言類似。

sv中的結構體和聯合體的宣告遵從c語言的語法,但在「len_type; //聯合體

}eth_pkt; //eth_pkt結構體名稱

eth_pkt m_pkt;

initial

begin

m_pkt.data = new[2]; //建立乙個含有3個元素陣列

m_pkt.data[0] = 'h5a;

m_pkt.len_type.pkt_len =10;

m_pkt.sa = '1;

$display("sa='h%h",m_pkt.sa);

$display("data.size",m_pkt.data.size);

$display("len=%d,tpye=%d",m_pkt.len_type.pkt_len,m_pkt.len_type.pkt_type);

end

endprogram**輸出為:

sa='hffffffffffff

data.size=2

len=10,type=10

注:若m_pkt.sa = '0;則列印結果為sa='h000000000000;m_pkt.sa賦其它值則報錯。

對於處理成員數目會動態改變的連續變數集合而言,動態陣列非常有用。然而,當集合的尺寸是未知的或者資料空間緊缺的時候,聯合陣列則是更好的選擇。聯合陣列在使用之前不會分配任何儲存空間,並且索引表示式不再被限制成integral表示式,而是可以具有任何資料型別。

聯合陣列實現了乙個所宣告型別的元素的查詢表。用作索引的資料型別作為查詢表的查詢鍵值,並強制了一種順序。 聯合陣列本質上是一種key-value的對應關係的hash表。

聯合陣列的宣告語法如下:

data_type array_id [index_type];

其中:data_type是陣列元素的資料型別。固定尺寸陣列可以使用的任何型別都可以作為聯合陣列的資料型別。

array_id是聯合陣列的名字。

index_type是用作索引的資料型別, 或者是*。如果指定了*,那麼陣列可以使用任意尺寸的integral表示式來索引。採用資料型別作為索引的聯合陣列將索引表示式限制成乙個特定的資料型別。

聯合陣列的元素被動態地分配;乙個條目在它第一次寫入的時候產生。聯合陣列維護已經被賦值的條目並根據索引資料型別維護相對順序。聯合陣列元素是非壓縮的,也就是說,除了拷貝或比較陣列之外,當聯合陣列在大多數表示式中使用之前,你必須從陣列中選擇單獨的元素。

聯合陣列只能被賦值為另外乙個具有相容型別並且具有相同索引型別的聯合陣列。其它的陣列型別不能賦值給乙個聯合陣列,而聯合陣列也不能賦值給其它型別的陣列,無論是固定尺寸陣列還是動態動態陣列。將聯合陣列賦值給另外乙個聯合陣列會先將目的陣列中所有現存條目清除,然後再將源陣列中的每乙個條目拷貝到目的陣列。

除了索引操作符之外,systemverilog提供了幾個內建方法來允許使用者分析和處理聯合陣列,同時提供了對聯合陣列的索引或鍵值的迭代處理。

**結果為:

array num =4

tony』s age =14

last tony』s age = 14

pre lucy』s age = 12

first jack』s age = 9

next lily』s age = 10

array num =3

mailbox的好處?

mailbox是一種通訊機制,他使得資料可以在程序間傳遞和通訊,資料被乙個程序傳送到乙個mailbox中,而另乙個程序可以從中取出。

mailbox是乙個內建的類,它也提供了幾種常用的方法:

new();//建立乙個mailbox

put();//將乙個資料放到mailbox中

try_put();//嘗試將乙個資料無阻塞的放到mailbox中

get()/peek();//從mailbox中取出乙個資料

try_get()/try_peek();//嘗試無阻塞的從mailbox中取出乙個資料

num();//查詢mailbox中資料的個數

引數化的mailbox

預設的mailbox是無型別的,也就是說,單個mailbox可以傳送和接收任何型別的資料。如果這樣的話,我們可以試想,往mailbox中儲存資料的變數和從中取資料的變數的型別不匹配怎麼辦?這樣豈不是會在執行的過程中發生嚴重的錯誤?因此,我們在定義mailbox的時候,經常會定義乙個用來傳輸特定型別的資料,在這種情況下,在編譯的時候就可以發現型別是不是匹配,從而避免執行時候發生的錯誤。

定義格式:

mailbox #(type=dynamic_type)

例子:

typedef mailbox #(string) my_mailbox;//自定義mailbox

my_mailbox sm;//建立乙個物件

sm=new;//例項化乙個物件,分配空間

string s;//定義乙個字串變數,用來儲存字串

sm.put("hello");//將hello放進定義的mailbox中

sm.get(s);//從mailbox中將hello取出,並傳遞給s

具體例項:

module mailbox_example;

mailbox#(int) my_mailbox=new(2);//一次性完成mailbox的定義

/上面一步等於下面幾步

//mailbox #(int) my_mailbox;

//my_mailbox my_mailbox1;

//my_mailbox1=new(2);//深度為2

task send();//定義乙個傳送任務

for(int i=0;i<4;i++)

begin

my_mailbox.put(i);//以此將0,1,2,3放進my_mailbox中

#5;endendtask

task receive();//定義乙個接收任務

int temp;//定義乙個變數,用來儲存值

while(1) begin//一直去執行下面的語句

my_mailbox.get(temp);//將取得的值賦給temp變數

$display("received:%d",temp);

endendtask

initial begin

fork

send();

receive();

join

endendmodule

建立乙個簡單的執行緒

handle createthread in opt lpsecurity attributes lpthreadattributes,security attributes 結構指定了這個執行緒的安全屬性,如果填 null 則就以預設的安全描述子建立,並且返回的控制代碼不會被繼承。in size ...

建立乙個簡單的畫板

1.cv.createtrackbar 有5個引數 滑動條的名字 視窗的名字 數值的最小值 數值的最大值 函式2.cv.gettrackbarpos 有2個引數 滑動條的名字 視窗的名字 函式的返回值是滑動條的數值。import cv2 as cv import numpy as np def no...

建立乙個簡單WindowsService

建立乙個簡單windowsservice 1.建立乙個專案 選擇windows 服務 名稱為servicetest 2.重新命名為servicetest 彈出下列彈框時選擇是 3.新增安裝程式 雙擊 在設計視窗對應標籤下右擊 選擇新增安裝程式 右擊 serviceinstaller1 選擇屬性 se...