色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

重點介紹所有綜合編譯器都支持的for和repeat循環

OpenFPGA ? 來源:OpenFPGA ? 作者:碎碎思 ? 2022-11-03 09:10 ? 次閱讀

經過幾周的更新,SV核心部分用戶自定義類型和包內容已更新完畢,接下來就是RTL表達式和運算符。

馬上HDLBits-SystemVerilog版本也開始準備了,基本這一部分完成后就開始更新~

循環語句允許多次執行編程語句或begin-end語句組。SystemVerilog中的循環語句有:for、repeat、while、do..while、foreach和forever。其中,所有綜合編譯器只支持for和repeat循環。其他類型的循環可能由一些綜合編譯器支持,但這些限制限制了這些循環的用途。本系列重點介紹所有綜合編譯器都支持的for和repeat循環。

for循環語句

for循環的一般語法是:

poYBAGNjFVKAdU8mAABCI3_K8Jo656.jpg

循環開始時,initial_assignment只執行一次。

end_expression在循環第一次通過之前進行計算。如果表達式為true,則執行語句或語句組。如果表達式為false,則循環退出。

在每次循環結束時執行step_assignment。再次計算end_expression。如果為真,則循環重復,否則退出循環。

下面的代碼片段演示了使用for循環的一個簡單示例,該示例使用b_bus中的反向位位置對a_bus的每個位進行異或。對于4位總線,a_bus[0]與b_bus[3]進行異或,a_bus[1]與b_bus[2]進行異或,以此類推。

poYBAGNjFWKAJ1JtAABYSVj8G2w492.jpg

綜合編譯器“展開”循環體來實現循環,這意味著循環中的語句或begin…end語句組被復制到循環迭代的次數。在上面的代碼片段中,賦值語句被復制了四次,因為循環從0迭代到3。綜合時展開循環后看到的代碼是:

poYBAGNjFXKAGNSSAAA9JSOKqFY077.jpg

循環將執行的迭代次數必須是固定的次數,以便綜合器進行循環展開。迭代次數固定的循環稱為靜態循環。

循環的優勢在迭代次數越多時越明顯,如果a和b在上面的for循環片段中是64位總線,則需要64行代碼來手動異或兩條64位總線,對于for循環,無論總線的向量大小如何,只需要兩行代碼。

示例6-7展示了上述代碼片段的完整參數化模型,圖6-7顯示了綜合該模型的結果。

示例6-7:使用for循環對向量位進行操作

//`begin_keywords"1800-2012"http://useSystemVerilog-2012keywords
modulebus_xor
#(parameterN=4)//bussize
(inputlogic[N-1:0]a,b,//scalableinputsize
outputlogic[N-1:0]y//scalableoutputsize
);
timeunit1ns;timeprecision1ns;

always_combbegin
for(inti=0;i

poYBAGNjFY-AWWQLAAC5TVOCVek564.jpg


圖6-7:示例6-7的綜合結果:循環對向量位進行操作

在圖6-7中可以看到,for循環的四次迭代是如何展開的,以及如何成為異或操作的四個實例。

靜態循環與依賴數據的循環 (Static loops versus data-dependent loops)

靜態循環,也稱為數據獨立循環,在這種循環中,可以確定迭代次數,而不必知道任何變量網絡的值。for (int i=0;i <= 3;i++)是一個靜態循環。可以確定循環將迭代4次(i=0 ?到i = 3),這種不依賴于其他信號,就能確定循環迭代次數的循環就是靜態循環。

依賴數據的循環(data-dependent loop)是一種非靜態循環,需要評估網絡或變量的值,以確定循環將執行多少次。for (int i=0; i<=count; i++)依賴于count具體的數值,因為在不知道count值的情況下,無法確定循環將迭代多少次。

零延遲和定時循環(Zero-delay and timed loops)

零延遲循環不包含任何形式的時序。零延遲循環代表組合邏輯。在仿真中,零延遲循環會立即執行。在由綜合器生成的門級電路實現中,零延遲循環在單個時鐘周期內執行。前例6-7中所示的for循環是零延遲靜態循環。

定時循環是需要消耗時間來執行循環的每個過程。定時循環并不代表組合邏輯的行為,因為循環的執行可能需要超過一個時鐘周期才能完成。

最佳實踐指南6-3
for循環是靜態的、零延遲的循環,迭代次數固定。

為了展開循環,綜合編譯器需要能夠靜態地確定循環迭代次數。雖然有些for循環代碼寫的是靜態循環,并且仿真也是正確的,但是可能是不可綜合的。這方面的一個例子是:

pYYBAGNjFaiAQv1rAACE_Xd8prs836.jpg

代碼片段的目的是遍歷數據向量,以找到為1的最低編號位。循環從數據的最低有效位0開始,并向上迭代,直到數據中的一位為l。通過修改end_count(循環結束條件)的值,找到第一個為l的位后,循環立即終止。雖然在循環開始之前結束計數被初始化為32,但它的值可以隨著循環的執行而改變。

綜合編譯器在這個代碼片段中遇到的問題是,不可能靜態地確定循環將迭代多少次,因為循環的結束條件可能會根據輸入的數據值(data值)發生變化而變化。為了展開循環,綜合需要循環執行固定的次數。

無需依賴數據即可退出循環的可綜合方式。示例6-8顯示了前面代碼段的可綜合編碼樣式。示例6-8使用一個執行固定次數的靜態循環,避免不是在循環結束時提前終止循環,而不是根據數據的值(data值)來確定循環的結束。

當找到最低的為1的位時,循環對剩余的迭代不做任何操作,圖6-8顯示了綜合該示例的結果。在本例中,數據的總線大小是參數化的,并設置為4位寬,以便減小綜合后的原理圖的大小。

例6-8;使用for循環查找向量中為1的最低位

//`begin_keywords"1800-2012"http://useSystemVerilog-2012keywords
modulefind_lowest_bit
#(parameterN=4)//bussize
(inputlogic[N-1:0]data,
outputlogic[$clog2(N):0]low_bit
);
timeunit1ns;timeprecision1ns;

logicdone;//localflag

always_combbegin
//findlowestbitthatissetinavector
low_bit='0;
done='0;
for(inti=0;i<=N-1;?i++)?begin?
??????if?(!done)?begin?
????????if?(data[i])?begin?
??????????low_bit?=?i;
??????????done?=?'1;
????????end?
??????end?
????end?
??end?
??
endmodule:?find_lowest_bit
//`end_keywords
圖6-8:示例6-8的綜合結果

pYYBAGNjFb2AEEQSAACAn8ilslM164.jpg

最佳實踐指南6-4
以固定的迭代大小對所有循環進行編碼,這種編碼風格確保循環可以展開,并且將得到所有綜合編譯器的支持。

循環迭代器變量壽命和可見性(For-loop iterator variable lifetime and visibility)

用于控制for循環的變量稱為循環迭代器變量。通常,循環迭代器變量被聲明為initial assignment(初始賦值)的一部分,如下所示:

poYBAGNjFcyAT429AAAQut6xcoA619.jpg

當作為初始賦值的一部分聲明時,循環迭代器變量是for循環的局部變量,不能在循環外引用。循環迭代器變量是自動生成的,這意味著該變量在循環開始的時間創建,并在循環退出時消失。

循環迭代器變量也可以在for循環之外聲明,例如在模塊級別或在命名的begin-end組中聲明。外部聲明的循環迭代器變量在循環退出后仍然存在,可以在聲明變量的同一范圍內的其他地方使用。當循環退出時,外部變量的值將是在結束條件評估為false之前,賦值步驟所指定的最后一個值。

Repeat循環

Repeat循環執行循環一定次數。Repeat循環的一般語法是:

pYYBAGNjFdyAXMY5AAAi2Kj4xxc318.jpg

以下示例使用Repeat循環將data信號提高到3的冪(數據立方)。

pYYBAGNjFeyASZRHAAA0q-VZGAM332.jpg

SystemVerilog有一個指數冪運算符,但一些綜合編譯器不支持該運算符。上面的代碼片段顯示了如何使用Repeat循環算法執行指數運算(將一個值與自身重復相乘)。

與for循環一樣,如果循環的邊界是靜態的,則Repeat循環是可綜合的,這意味著循環迭代的次數要求是固定的,并且不依賴于運行過程中可能發生變化的值。

示例6-9顯示了上述指數運算片段的完整示例。在本例中,數據輸入的寬度和指數或冪運算被參數化,以使示例更通用。這些參數在編譯時是固定的常量。因此,使用參數作為迭代次數的Repeat循環是可綜合的靜態循環。這個模型的輸出q是時序邏輯,因此q要使用非阻塞賦值,循環中的迭代是組合邏輯,其最終結果記錄在阻塞賦值的臨時變量中,因此,它的新值可用于循環的下一次迭代。

示例6-9:使用Repeat循環實現冪運算

//`begin_keywords"1800-2012"http://useSystemVerilog-2012keywords
moduleexponential
#(parameterE=3,//powerexponent
parameterN=4,//inputbussize
parameterM=N*2//outputbussize
)
(inputlogicclk,
inputlogic[N-1:0]d,
outputlogic[M-1:0]q
);
timeunit1ns;timeprecision1ns;

always_ff@(posedgeclk)begin:power_loop
logic[M-1:0]q_temp;//tempvariableforinsidetheloop
if(E==0)
q<=?1;??//?do?to?power?of?0?is?a?decimal?1
????else?begin?
??????q_temp?=?d;
??????repeat?(E-1)?begin?
????????q_temp?=?q_temp?*?d;
??????end?
??????q?<=?q_temp;
????end?
??end:?power_loop
??
endmodule:?exponential
//`end_keywords?

圖6-9顯示了示例6-9的綜合結果,當E的值為3時,Repeat循環執行2次,綜合結果創建了乘法器的2個實例。輸出向量q的每一位都由一個通用觸發器進行賦值,圖中只顯示了第一個輸出寄存器觸發器,

07515738-5b14-11ed-a3b6-dac502259ad0.png

圖6-9:示例6-9的綜合結果:Repeat循環實現冪運算

綜合時間考慮。靜態、零延遲的循環或Repeat循環將綜合為組合邏輯。如果該組合邏輯的輸出被記錄在觸發器中,那么由循環推斷的組合邏輯的總傳播延遲必須小于一個時鐘周期。

筆記
每個特定ASICFPGA設備的功能和限制可能會有很大的不同。使用乘法、除法、模和冪運算符的RTL模型應與目標設備的功能相匹配。

注意,在圖6-9中,示例6-9中Repeat循環推斷的乘法器是級聯的。乘法器鏈的總傳播延遲需要小于等于一個時鐘周期,以便在輸出觸發器中記錄有效且穩定的結果。一些綜合編譯器可以進行寄存器重定時,插入或移動寄存器,以在組合邏輯中創建流水。寄存器重定時是綜合編譯器的一項功能,不在本文的范圍內。有關此主題的更多信息,請參閱綜合編譯器的文檔。

如果寄存器重定時不可用,則不滿足設計時鐘周期的循環將需要重新編碼為流水或狀態機形式,手動將循環展開為多個時鐘周期。

While和do-While循環

最佳實踐指南6-5
使用for循環和repeat循環進行RTL建模。不要使用while和Do-while循環。

盡管許多綜合編譯器都支持這些循環,但它們有一些限制,比如使代碼難以維護和重用,這就限制了它們在RTL建模中的實用性。相反,使用for循環或repeat循環,由于循環迭代的次數是靜態的,所以增加了它們在RTL建模中的實用性。為了完整起見,本文簡單介紹了while和do-while循環,但不推薦使用。

while循環執行編程語句或begin-end語句組,直到end_expression變為false。在循環的頂部計算結束表達式(end_expression)。如果第一次輸入循環時結束表達式為false,則根本不執行語句或語句組。如果結束表達式為true,則執行語句或語句組,然后循環返回頂部并再次計算結束表達式(end_expression)。

do-while循環也執行編程語句或begin-end語句組,直到end_expression變為false。通過do-while循環,結束表達式(end_expression)在循環的底部進行計算。因此,第一次必進入循環。如果循環到達底部時結束表達式(end_expression)為false,則循環退出。如果結束表達式(end_expression)為true,循環將返回頂部并再次執行語句或語句組,

下面的代碼顯示了一個使用while循環的不可綜合示例:

077a683a-5b14-11ed-a3b6-dac502259ad0.png

此示例統計16位data信號中有多少位被設置為l。data值被復制到名為temp的臨時變量中。如果設置了temp的位0為l,則num_ones計數器將遞增。然后將temp變量右移一次,這將移出位0,并將位0移到位15。只要至少有一位temp被設置為1,temp的計算結果為true,循環就會繼。當temp的計算結果為false時,循環退出。temp中的某個值在某些位中有X或Z,但沒有將任何位設置為1,這也會導致while循環退出。

本示例不可綜合,因為循環執行的次數取決于data,不是靜態的,如上一節所述。綜合無法明確地確定循環將執行多少次,因此無法展開循環,就無法綜合。

For each循環和通過向量的循環

For each循環遍歷未壓縮數組的所有維度。未壓縮數組是網絡或變量的集合,其中集合可以通過使用數組名稱作為一個整體進行操作,或者數組的單個元素可以使用數組中的索引進行操作。數組的元素可以是任何數據類型和向量大小,但數組的所有元素必須是相同的類型和大小。數組可以有任意數量的維度。數組聲明的一些示例如下:

07a155c6-5b14-11ed-a3b6-dac502259ad0.png

可以使用[ starting_address:ending_address]樣式,如上面的mem數組,或使用[dimension_sizel風格,與查找表數組一樣,前面更詳細地討論了聲明和使用未壓縮數組。

foreach循環用于迭代數組元素,foreach循環將自動聲明其循環控制變量,自動確定數組的開始和結束索引,并自動確定索引的方向(增加或減少循環控制變量)。

下面的示例遍歷一個二維數組,該數組表示帶有一些數據的查找表。對于數組中的每個元素,都會調用一個函數來對該值進行某種操作(函數未顯示)。

07abf95e-5b14-11ed-a3b6-dac502259ad0.png

請注意,i和j變量沒有聲明——foreach循環會在內部自動聲明這些變量。也不需要知道數組的每個維度的邊界。foreach循環會自動從每個維度的最低索引值迭代到最高索引值。

在整理這個系列時,一些綜合編譯器不支持foreach循環。在RTL模型中使用之前,工程師應該確保項目中使用的所有工具都支持哪種循環類型。

筆記
迭代數組所有維度的另一種編碼方式是使用for循環。前面的示例可以使用所有綜合編譯器支持的靜態for循環重寫。

07c3fedc-5b14-11ed-a3b6-dac502259ad0.png

請注意,在這個嵌套for循環示例中,每個數組維度的大小及其起始和結束索引值必須進行硬編碼(即需要明確的數值),以匹配數組聲明的大小。SystemVerilog還提供數組查詢系統功能,適用于不同大小或參數化大小的數組,可使for循環更通用。前面的例子可以寫成:

07dc0d38-5b14-11ed-a3b6-dac502259ad0.png

筆記
在編寫本文時,一些綜合編譯器不支持數組查詢系統函數。在RTL模型中使用之前,工程師應該確保項目中使用的所有工具都支持這些功能。

以下是數組查詢系統功能的簡要說明。有關這些查詢功能的更多信息,請參閱IEEE 1800 SystemVerilog語言參考手冊。

(數組名,維度)-返回指定維度的最右邊索引號。維度以數字1開頭,從最左邊的未壓縮維度開始。在最右邊的未壓縮維度之后,維度編號與最左邊的壓縮維度繼續,并以最右邊的壓縮維度結束。

(數組名,維度)-返回指定維度最左邊的索引號。尺寸標注的編號與相同。

(數組名,維度)-如果大于或等于,則返回1;如果小于,則返回-1。

(數組名,維度)-返回指定維度的最低索引號,可以是左索引或右索引。

(數組名,維度)-返回指定維度的最高索引號,可以是左索引或右索引。

(數組名,維度)-返回指定維度中的元素總數(與-+1相同)。

(數組名)返回數組中的維度數,包括壓縮維度和未壓縮維度,





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Verilog
    +關注

    關注

    28

    文章

    1351

    瀏覽量

    110161
  • 編譯器
    +關注

    關注

    1

    文章

    1636

    瀏覽量

    49173
  • 門級電路
    +關注

    關注

    0

    文章

    15

    瀏覽量

    1995

原文標題:數字硬件建模SystemVerilog-循環語句

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    循環模型編譯器Verilog和System Verilog語言支持指南

    本節介紹循環模型編譯器響應不受支持或被忽略的構造的行為。 一般而言,Cycle Model Compiler支持Verilog和System
    發表于 08-12 06:55

    編譯器是如何工作的_編譯器的工作過程詳解

    隨著計算機的發展,編譯器已經發揮著十分重要的作用。本文主要介紹編譯器的種類、編譯器的工作原理以及編譯器工作的具體操作過程及步驟詳解。
    發表于 12-19 12:54 ?1.6w次閱讀

    關于KEIL ARM編譯器的使用介紹

    KEIL ARM編譯器的使用
    的頭像 發表于 07-10 10:50 ?6348次閱讀

    主流的C語言編譯器詳細介紹

    于Windows操作系統之外,主要用于Unix/Linux操作系統。像現在很多版本的Linux默認使用GCC作為C語言編譯器。而像FreeBSD、macOS等系統默認使用LLVM Clang編譯器
    發表于 09-05 17:27 ?2次下載
    主流的C語言<b class='flag-5'>編譯器</b>詳細<b class='flag-5'>介紹</b>

    主流C語言編譯器的詳細資料介紹

    于Windows操作系統之外,主要用于Unix/Linux操作系統。像現在很多版本的Linux默認使用GCC作為C語言編譯器。而像FreeBSD、macOS等系統默認使用LLVM Clang編譯器
    發表于 05-22 18:00 ?1次下載
    主流C語言<b class='flag-5'>編譯器</b>的詳細資料<b class='flag-5'>介紹</b>

    華為方舟編譯器開源官網正式上線,代碼沒有放在GitHub

    方舟編譯器是為支持多種編程語言、多種芯片平臺的聯合編譯、運行而設計的統一編程平臺,包含編譯器、工具鏈、運行時等關鍵部件。
    的頭像 發表于 09-13 16:04 ?5017次閱讀

    Verilog可綜合循環語句

    Verilog中提供了四種循環語句,可用于控制語句的執行次數,分別為:for,while,repeat,forever。其中,for,while,repeat是可綜合的,但
    發表于 10-13 12:23 ?2w次閱讀

    華為方舟編譯器正式支持C語言,將繼續完全開源

    2019年8月底,華為方舟編譯器(OpenArkCompiler)正式開源,邁出了跨越性的一步。一年多來,方舟編程體系陸續實現了編譯器、引擎、調試的開源,其中編譯器
    的頭像 發表于 10-14 17:38 ?2281次閱讀

    為什么要學習編譯器課程

    所有優秀的計算機科學學院提供了編譯器課程,但是相對比較少的學校把它作為本科課程的必修部分。這篇文章回
    的頭像 發表于 03-30 10:49 ?1608次閱讀

    基于GCC實現支持MISRAC的安全編譯器

    基于GCC實現支持MISRAC的安全編譯器(通信電源技術雜志簡介)-基于GCC實現支持MISRAC的安全編譯器? ? ? ? ? ? ? ? ? ??
    發表于 09-24 11:09 ?9次下載
    基于GCC實現<b class='flag-5'>支持</b>MISRAC的安全<b class='flag-5'>編譯器</b>

    交叉編譯器安裝教程

    交叉編譯器中“交叉”的意思就是在一個架構上編譯另外一個架構的代碼,相當于兩種架構“交叉”起來了。Ubuntu 自帶的 gcc 編譯器是針對 X86 架構的,而我們現在要編譯的是 ARM
    的頭像 發表于 09-29 09:12 ?3543次閱讀

    領域編譯器發展的前世今生

    近年來,隨著GPU和DSA架構在不同領域的廣泛應用,特別是AI系統相關技術的飛速發展,對于編譯器的需求越來越強烈。編譯器已經從一個相對小眾的研究領域,變為學界和業界高度關注并大量投入的方向
    的頭像 發表于 02-03 10:37 ?1730次閱讀

    Triton編譯器功能介紹 Triton編譯器使用教程

    。以下是 Triton 編譯器的一些功能介紹和使用教程。 Triton 編譯器功能介紹 多語言支持 :Triton
    的頭像 發表于 12-24 17:23 ?453次閱讀

    Triton編譯器與其他編譯器的比較

    的GPU編程框架,使開發者能夠編寫出接近手工優化的高性能GPU內核。 其他編譯器 (如GCC、Clang、MSVC等): 定位:通用編譯器支持多種編程語言,廣泛應用于各種軟件開發場景。 目標:提供穩定、高效的
    的頭像 發表于 12-24 17:25 ?388次閱讀

    Triton編譯器支持的編程語言

    Triton編譯器支持的編程語言主要包括以下幾種: 一、主要編程語言 Python :Triton編譯器通過Python接口提供了對Triton語言和編譯器的訪問,使得用戶可以在Pyt
    的頭像 發表于 12-24 17:33 ?384次閱讀
    主站蜘蛛池模板: 日韩成人黄色| 中文字幕亚洲无线码一区| ewp绞死vk失禁编| 欧美日韩精品不卡在线观看| YELLOW视频在线观看最新| 日日操日日射| 狠狠爱亚洲五月婷婷av| 中文在线无码高潮潮喷在线| 女人爽得直叫免费视频| 国产成人精品永久免费视频| 亚洲人视频在线观看| 男女作爱在线播放免费网页版观看 | AV亚洲精品少妇毛片无码| 色综合久久天天影视网| 国产中文在线| beeg日本高清xxxx| 亚洲成人三级| 欧美日韩亚洲一区视频二区| 国产婷婷综合在线视频中文| 91福利国产在线观看网站| 网友自拍区视频精品| 美女被强奷到抽搐的动态图| 国产精品亚洲精品日韩电影| 4399亚洲AV无码V无码网站 | 亚洲国产中文在线视频免费| 欧美成a人片免费看久久| 国产亚洲欧美在线观看三区| 99久久免费精品| 亚洲精品久久久久中文字幕二区 | 国产普通话精品久久| 99re8热视频这在线视频| 性欧美xxxxporn| 男生jj插入女生jj| 国精产品一区二区三区有限公司| jzz大全18| 在线免费观看亚洲视频| 少妇久久久久久被弄高潮| 男女爽爽无遮挡午夜视频在线观看| 国产最新地址| 国产GV天堂亚洲国产GV刚刚碰| 26uuu老色哥|