0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是程序塊

汽車電子技術(shù) ? 來源:OpenFPGA ? 作者:碎碎思 ? 2023-02-09 16:04 ? 次閱讀

數(shù)字硬件建模SystemVerilog-程序塊 (procedural blocks)

pYYBAGPkp3GAdrOZAATgIrhwgI4856.png

經(jīng)過幾周的更新,SV核心部分用戶自定義類型和包內(nèi)容已更新完畢,接下來就是RTL編程語句。

pYYBAGPkp4CAd-xmAACqN7roJZ8298.png

程序塊是編程語句的容器。程序塊的主要目的是控制何時(shí)應(yīng)執(zhí)行編程語句,例如每當(dāng)時(shí)鐘上升沿出現(xiàn)時(shí),或每當(dāng)信號(hào)或總線改變值時(shí)。SystemVerilog有兩種主要類型的程序塊: initial 程序塊和always 程序塊。

initial 程序是一種驗(yàn)證結(jié)構(gòu);綜合編譯器不支持。但是有一個(gè)例外是,綜合編譯器支持使用或readmemh系統(tǒng)任務(wù)加載內(nèi)存塊或分配給特定內(nèi)存地址的 initial 程序。FPGA綜合器可能還允許使用 initial 程序?qū)υO(shè)備通電狀態(tài)進(jìn)行建模,本文不討論或使用 initial 程序,因?yàn)樗鼈儾挥糜趯?duì)RTL功能進(jìn)行建模。

過程是無限循環(huán)。它們執(zhí)行編程語句,完成后自動(dòng)重新開始。一般的概念是,當(dāng)電源打開時(shí),硬件在做一些連續(xù)的事情。這種連續(xù)行為是使用always 程序建模的。

SystemVerilog有四種類型的always 程序:使用關(guān)鍵字always的通用過程和使用關(guān)鍵字always_ff, always_comb 和 always_latch的專用always 過程。

always 程序塊可用于多種類型建模,包括可綜合RTL模型、抽象行為模型(如不會(huì)綜合的RAM)以及驗(yàn)證代碼(如時(shí)鐘振蕩器或連續(xù)響應(yīng)檢查器)。雖然通用always程序的靈活性使其在各種建模和驗(yàn)證項(xiàng)目中都很有用,但同樣的靈活性意味著軟件工具不知道always的預(yù)期用途是什么,什么時(shí)候用于可綜合的RTL模型。為了將RTL模型準(zhǔn)確地轉(zhuǎn)換為ASIC或FPGA設(shè)備,綜合器對(duì)通用always程序設(shè)置了許多編碼限制。

專用的RTL程序。Always_ff、always_comb和always_latch專用always程序塊的行為與通用always程序塊相同,但會(huì)施加綜合所需的特殊編碼限制。這些額外的限制有助于確保RTL仿真的行為與實(shí)際ASIC或FPGA的門級(jí)行為相匹配。正如這些專用程序的名稱所表明的,Always_ff對(duì)仿真觸發(fā)器等時(shí)序邏輯器件施加了某些綜合限制。Always_comb為建模組合邏輯(如解碼器)施加了某些綜合限制,always_latch為建模鎖存行為施加了某些綜合限制。后面會(huì)詳細(xì)說明每個(gè)過程塊功能及驗(yàn)證。

敏感列表

always 程序告訴仿真,應(yīng)該“always”評(píng)估被建模的功能(一個(gè)無限循環(huán)),但仿真和綜合都需要了解更多信息,以便準(zhǔn)確地建模硬件行為。這些工具還需要知道何時(shí)執(zhí)行程序塊中的語句。對(duì)于RTL建模,時(shí)間要么在表示時(shí)序邏輯的時(shí)鐘邊沿上,要么在表示組合邏輯或鎖存邏輯的過程更改值所使用的任何信號(hào)上。

為了控制在可綜合RTL模型中何時(shí)執(zhí)行編程語句,程序是以敏感列表開始,敏感列表是一個(gè)信號(hào)列表,值的變化將觸發(fā)程序的執(zhí)行。通用always和RTL特定always_ff程序要求RTL設(shè)計(jì)工程師明確規(guī)定靈敏度列表。RTL特定的always_comb和always_latch程序?qū)⑼茢喑鲆粋€(gè)隱式靈敏度列表。

顯式指定的敏感度列表與@標(biāo)記一起引入,口頭上稱為“at”。在可綜合RTL建模中,靈敏度列表包含一個(gè)或多個(gè)網(wǎng)絡(luò)或變量名的列表。名稱可以用逗號(hào)(,)或關(guān)鍵字”or”分隔。

以下兩個(gè)明確的敏感度列表功能相同:

pYYBAGPkp4yAZfy1AAAxeJOv0Wc393.png

在敏感度列表的上下文中,or關(guān)鍵字只是一個(gè)分隔符:它不是or操作。逗號(hào)與關(guān)鍵字or的使用取決于用戶的偏好。一種風(fēng)格在功能上并不優(yōu)于另一種風(fēng)格。

靈敏度列表還可以指定標(biāo)量(l位)信號(hào)的特定邊沿,該邊沿將觸發(fā)always 程序。邊沿由關(guān)鍵詞posedge和negedge指定,邊沿靈敏度對(duì)于基于時(shí)鐘的功能非常重要:

always@(posedgeelkornegedgerstN)…

posedge關(guān)鍵字是“正邊沿”的縮寫,negedge是“負(fù)邊沿”的縮寫。正邊沿是任何可能被硅晶體管感知為正向過渡的過渡。因此,posedge將在0-to-1、0-to-z、0-to-x、z-to-1、x-to-l、z-to-x和x-to-z轉(zhuǎn)換時(shí)觸發(fā),相反,negedge將在1-to-0、1-to-z、1-to-x、z-to-0、x-to-0、z-to-x和x-to-z轉(zhuǎn)換時(shí)觸發(fā).

時(shí)序邏輯靈敏度。時(shí)序邏輯元件,如觸發(fā)器,在時(shí)鐘邊沿觸發(fā),通常是該時(shí)鐘的上升沿。(一些ASIC和FPGA設(shè)備具有在時(shí)鐘下降沿觸發(fā)的組件,很少有在時(shí)鐘兩側(cè)觸發(fā)的組件。)為了指示always 程序代表時(shí)鐘觸發(fā)的時(shí)序邏輯行為,always或always_ff關(guān)鍵字后跟:

@(posedge或者@(negedge)name>

例如:

always_ff@(posedgeclk)

q<=?d;?//時(shí)序邏輯觸發(fā)器

一些時(shí)序元件具有異步輸入,例如set或reset控制。這些異步信號(hào)也會(huì)影響仿真或綜合時(shí)評(píng)估always程序的運(yùn)行時(shí)間,因此也應(yīng)該包括在靈敏度列表中。

后面章節(jié)更詳細(xì)地討論了時(shí)序邏輯的建模,包括同步和異步set、enable控制,以及正確使用通用always和專用always_ff程序塊的指南。

組合邏輯靈敏度。組合邏輯(如加法器或解碼器)的輸出反映了該邏輯塊當(dāng)前輸入值的組合。因此,每當(dāng)組合邏輯的任何輸入值改變時(shí)(即敏感度列表),就需要重新評(píng)估組合邏輯中的編程語句。為了仿真這種行為,always關(guān)鍵字后面是一個(gè)明確的敏感度列表,其中包括該邏輯塊讀取的所有信號(hào),其形式為:

@(,,…)name>

例如:

always@(a,b)

sum=a+b;

always_comb專用always程序的一個(gè)特點(diǎn)是,它自動(dòng)推斷出一個(gè)合適的組合邏輯靈敏度列表。上述加法器代碼使用always_comb建模為:

always_comb@(a,b)

sum=a+b;

后面章節(jié)將更詳細(xì)地討論組合邏輯建模,以及always和always_comb程序塊的正確使用指南。

latch邏輯靈敏度。鎖存是組合邏輯塊的一種形式,可以存儲(chǔ)其當(dāng)前狀態(tài),建模鎖存行為遵循與建模組合邏輯行為相同的敏感度列表規(guī)則。Always_latch關(guān)鍵字后面是一個(gè)靈敏度列表,其中包括該邏輯塊讀取的所有信號(hào),格式為:

@(,,…)name>

如下所示:

poYBAGPkp5qAfp_yAAAsXOMHP1k520.png

Always_latch專用always程序自動(dòng)推斷出正確的組合邏輯靈敏度列表。

poYBAGPkp6WAY0EqAAAk070jTb4620.png

后續(xù)章節(jié)將更詳細(xì)地討論了鎖存邏輯的建模,包括使用always和always_latch程序塊的最佳實(shí)踐編碼指南。

不可綜合的敏感度列表。從語法上講,靈敏度列表可以包含操作,例如@(a+b)或iff保護(hù)條件,posedge和negedge限定符也可以用于大于1位寬的向量,但只使用向量的最低有效位(最右邊的位),向量中其他位的更改不會(huì)觸發(fā)敏感度列表,RTL綜合編譯器通常不支持操作:iff和向量邊沿(posedge和negedge)。

begin-end語句組

所有形式的程序塊都可以包含一條語句或一組語句。語句組包含在關(guān)鍵字begin和end之間,可以包含任意數(shù)量的語句,包括none語句。下面的代碼片段顯示了一個(gè)包含單個(gè)語句的always 程序和一個(gè)包含begin end組的always 程序。

pYYBAGPkp7aAJEfAAAC-PqgJIfg107.png

一條語句可以嵌套在另一條語句中,如:

poYBAGPkp8GADtpiAACIjxC3aNc451.png

在前面的代碼段中,外部語句是always 程序中的單個(gè)語句,因此不需要begin-end語句組。

可以使用以下語法命名begin-end語句組:

begin:

命名語句組可以包含局部變量聲明,局部變量可以在語句組內(nèi)使用,但不能在可綜合RTL模型的組外引用,(SystemVerilog的更高版本增加了在未命名的begin端組中聲明局部變量的功能,但在編寫本文時(shí),大多數(shù)綜合編譯器都不支持這種功能。)

也可以選擇命名組的匹配端。命名語句組的結(jié)尾可以幫助直觀地匹配嵌套的語句組。SystemVerilog要求用于開始和結(jié)束的名稱必須完全匹配。

局部變量的使用有助于確保在某些情況下得到適當(dāng)?shù)木C合結(jié)果。在時(shí)序always程序中計(jì)算并由另一個(gè)程序使用的臨時(shí)中間變量可能在仿真中起作用,但可能綜合出與RTL仿真行為不匹配的門級(jí)功能,在過程中聲明局部變量將防止此編碼錯(cuò)誤-無法從過程外部訪問局部變量,

下面的示例聲明了一個(gè)臨時(shí)變量,該變量位于always_ff 過程的局部。臨時(shí)變量用于計(jì)算中間結(jié)果,然后用于計(jì)算最終結(jié)果(本例中的計(jì)算特意保持簡單,以便專注于局部變量的聲明,而不是一些可能需要中間計(jì)算的復(fù)雜算法

pYYBAGPkp82ANQc0AAB7rygNNsA668.png

請(qǐng)注意,冒號(hào)前后允許有空白,如上面的begin后面所示。但是,end后面不能有空白,如上圖所示。使用空格有助于使復(fù)雜的代碼更易于閱讀。

在程序塊中使用變量和網(wǎng)絡(luò)

程序賦值的左側(cè)只能是變量類型,包括基于變量的用戶自定義類型。在運(yùn)算符或賦值語句更新之前,變量仍然保持其先前的值,變量的這種特性會(huì)影響仿真和綜合。

在下面的代碼段中,sum必須聲明為變量類型,因?yàn)樗挥谶^程賦值的左側(cè)。有關(guān)RTL建模中可使用的可綜合變量類型的討論,請(qǐng)參見之前的文章。

poYBAGPkp9iAF0blAABuby7azoE347.png

只有程序賦值的左側(cè)必須是變量。賦值的右側(cè)可以使用變量、網(wǎng)絡(luò)、參數(shù)或文字值。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110100
  • System
    +關(guān)注

    關(guān)注

    0

    文章

    165

    瀏覽量

    36943
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    495

    瀏覽量

    22061
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【轉(zhuǎn)】淺談西門子plc程序加密和程序加密及解密

    (保護(hù))選項(xiàng),選擇所需加密方式,設(shè)置密碼后保存編譯重新下載硬件組態(tài)就可以了。注意:如何設(shè)置密碼忘記或丟失,那么只有通過編程軟件在線連接PLC,清空PLC程序,(包括程序,系統(tǒng)和數(shù)據(jù)
    發(fā)表于 12-18 22:20

    Siemens S7-1200學(xué)習(xí)筆記程序相關(guān)資料推薦

    Siemens S7-1200 學(xué)習(xí)筆記 程序自學(xué)S7-1200PLC系列一、S7-1200中的程序程序
    發(fā)表于 07-01 12:42

    S7-1200中的程序是怎樣執(zhí)行的

    S7-1200中的程序是什么?S7-1200中的程序分為哪幾類?S7-1200中的程序是怎
    發(fā)表于 08-12 07:57

    在c語言中的程序相關(guān)資料分享

    0.0 程序在c語言中{ 多條聲明 多條語句} 程序這種復(fù)合語句叫程序。接下來我們就開始學(xué)
    發(fā)表于 12-09 08:17

    在STEP7中對(duì)程序加密

    您能夠通過STEP7軟件的KNOW_HOW_PROTECT功能實(shí)現(xiàn)對(duì)您程序代碼的加密保護(hù)。如果您雙擊鼠標(biāo)打開經(jīng)過加密的程序時(shí),您只能看到該程序
    發(fā)表于 06-21 11:51 ?2424次閱讀

    如何暫停GRAPH程序

    Graph程序在運(yùn)行過程中,某些情況下需要將Sequence暫停去解決問題,當(dāng)問題解決后,需要接著當(dāng)前的步繼續(xù)執(zhí)行Graph程序。而OFF_SQ這個(gè)引腳只能將Sequence停止,這時(shí)就需要使用HALT_SQ暫停這個(gè)引腳。
    的頭像 發(fā)表于 03-02 13:56 ?2253次閱讀

    西門子PLC密碼三種保護(hù)級(jí)別和程序加密方法

    西門子PLC密碼三種保護(hù)級(jí)別和程序加密方法說明。
    發(fā)表于 04-30 09:45 ?20次下載

    TIA Portal的程序保護(hù)功能實(shí)現(xiàn)

    IA Portal為程序提供 KNOW_HOW_PROTECT 保護(hù)功能。如果沒有使用正確密碼打開使用此保護(hù)功能的時(shí),僅接口參數(shù) Input、Output、 InOut 、Sta
    的頭像 發(fā)表于 03-14 16:35 ?2703次閱讀
    TIA Portal的<b class='flag-5'>程序</b><b class='flag-5'>塊</b>保護(hù)功能實(shí)現(xiàn)

    Sivarc畫面規(guī)則:建立程序與畫面的鏈接

    7) 完成后,可以看到在HMI中自動(dòng)生成一個(gè)畫面,名稱為“B_DB”,查看是否與程序B的背景數(shù)據(jù)名稱相同。畫面中生成兩個(gè)棒圖,每一個(gè)棒圖對(duì)應(yīng)的過程值自動(dòng)與程序
    的頭像 發(fā)表于 07-06 14:29 ?2470次閱讀

    上載程序--STEP7 V12及其以上版本軟件

    在在線訪問的電腦網(wǎng)卡下雙擊“更新可訪問的設(shè)備”,則會(huì)自動(dòng)顯示出電腦可訪問到的設(shè)備,選擇需要訪問的PLC,展開目錄,將程序拖拽到離線的程序,就會(huì)自動(dòng)彈出上載對(duì)話框。
    的頭像 發(fā)表于 09-06 16:11 ?1777次閱讀

    決策語句允許程序的執(zhí)行流程

    SystemVerilog case語句與C switch語句類似,但有重要區(qū)別。SystemVerilog不能使用break語句(C使用break從switch語句的分支退出)。case語句在執(zhí)行分支后自動(dòng)退出(使用break退出case語句是非法的。),不能執(zhí)行break語句。
    的頭像 發(fā)表于 10-27 08:57 ?913次閱讀

    西門子S7-1200/1500程序加密,你真的了解嗎?

    程序的的防拷貝保護(hù),可分為兩種:綁定存儲(chǔ)卡的序列號(hào)和綁定CPU的序列號(hào),兩者只能選其一。建議選擇綁定存儲(chǔ)卡的序列號(hào),如果激活該功能,在下載程序時(shí),會(huì)自動(dòng)比對(duì)序列號(hào),如果與實(shí)際存儲(chǔ)卡的序列號(hào)不一致,則無法完成
    的頭像 發(fā)表于 12-22 10:13 ?5458次閱讀

    程序結(jié)構(gòu)介紹

    程序的規(guī)范性在代碼中有重要的作用。
    的頭像 發(fā)表于 04-15 15:04 ?932次閱讀

    如何實(shí)現(xiàn)暫停GRAPH程序

    博圖Graph 程序在運(yùn)行過程中,某些情況(報(bào)警,互鎖等)下需要將Graph 程序暫停去解決問題,當(dāng)問題解決后,需要接著當(dāng)前的步繼續(xù)執(zhí)行Graph 程序。而OFF_SQ 這個(gè)引腳是讓Graph
    的頭像 發(fā)表于 05-22 09:41 ?2237次閱讀
    如何實(shí)現(xiàn)暫停GRAPH<b class='flag-5'>程序</b><b class='flag-5'>塊</b>?

    如何在STL中的EN/ENO機(jī)制仿真示例呢?

    從 STL 程序調(diào)用的程序不提供 EN 和 ENO 參數(shù)。無論創(chuàng)建程序時(shí)采用何種編程語言,
    的頭像 發(fā)表于 09-01 09:45 ?1070次閱讀