SV 仿真的常識

文章目錄

  • SV對verilog的擴展
      • 📘 標準文檔名稱:
  • 從SV到仿真
    • 通用過程解讀
    • 實例解讀
  • SV的仿真過程
    • 并行
    • 仿真顆粒度
    • SV仿真調度
        • 調度區域

SV對verilog的擴展

SystemVerilog 和 Verilog 的語法標準由 **IEEE(美國電氣和電子工程師協會)**制定,正式文檔如下:


📘 標準文檔名稱:

名稱簡稱最新版本標準編號是否免費
VerilogVerilog HDLIEEE 1364-2005IEEE Std 1364-2005? 付費
SystemVerilogSystemVerilog HDLIEEE 1800-2017IEEE Std 1800-2017? 付費
SystemVerilog 最新合并版Unified HDL (Verilog + SystemVerilog)IEEE 1800-2023IEEE Std 1800-2023? 付費
  • SystemVerilog(SV)相對于傳統 Verilog 的主要擴展和增強,涵蓋語法、數據類型、驗證特性等方面。
類別Verilog 特性SystemVerilog 擴展說明參考文獻
數據類型regwire新增 logicbitintbyteshortintlonginttimeenumstructunionstringchandle更強的類型安全、結構化數據、枚舉和字符串支持(代碼覆蓋率原理簡介原創 - CSDN博客) (see [1])
數組與集合連續向量 reg [7:0] a;動態數組 int da[];、關聯數組 int aa[string];、隊列 int q[$];支持可變長度和哈希索引結構(代碼覆蓋率原理簡介原創 - CSDN博客) (see [2])
接口與包modulefunctiontaskinterfaceprogrampackageimport/export接口封裝信號集合,package 封裝共享聲明(代碼覆蓋率原理簡介原創 - CSDN博客) (see [3])
模塊化 & 生成generategenerate 擴展語法、localparamtypedef更靈活的生成語法,本地參數和類型重命名(代碼覆蓋率原理簡介原創 - CSDN博客) (see [4])
線程 & 時間控制alwaysinitialalways_ffalways_combalways_latchuniquepriority明確組合/時序/鎖存塊,優化仿真和綜合(代碼覆蓋率原理簡介原創 - CSDN博客) (see [5])
約束隨機化classrandconstraintsolve...before面向驗證的隨機化對象支持(代碼覆蓋率原理簡介原創 - CSDN博客) (see [6])
面向對象支持 class、繼承 extends、多態、new() 構造函數引入面向對象編程,驗證組件化(代碼覆蓋率原理簡介原創 - CSDN博客) (see [7])
斷言 & 覆蓋率SVA 斷言 assertcovergroupcoverpointcross內置斷言和功能覆蓋率建模(代碼覆蓋率原理簡介原創 - CSDN博客) (see [8])
TLM 接口uvm_sequence_itemuvm_portuvm_exportuvm_analysis_port事務級建模接口,為 UVM 提供通信通道(代碼覆蓋率原理簡介原創 - CSDN博客) (see [9])
并發擴展fork/joinfork...join_anyfork...join_none-多種 join 語義更靈活的并發控制(代碼覆蓋率原理簡介原創 - CSDN博客) (see [10])

簡要說明:

  1. 數據類型和數組:SV 增加了豐富的強類型和容器類型,解決了 Verilog 只有 reg/wire、固定向量的限制。
  2. 接口與包:通過 interfacepackage,SV 實現了代碼重用與封裝,提高了可維護性。
  3. 線程與時間控制:引入更語義化的 always_ff 等,幫助綜合工具和仿真工具區分不同用途。
  4. 面向對象 & 約束隨機:SV 將驗證帶入語言層面,結合 UVM 形成強大的驗證生態。
  5. 斷言 & 覆蓋率:SystemVerilog Assertions (SVA) 和功能覆蓋率讓驗證更加系統化。
  6. 事務級建模 (TLM):提供通用接口,讓組件間事務通信高度解耦,支撐 UVM 框架。

從SV到仿真

通用過程解讀

  • 編譯
語法和語義分析 , 進行編譯 , 編譯出 中間文件
  • 建模
按照設計集成關系, 組成頂層模塊1. 模塊例化2. 接口例化3. 程序例化4. 層次集成5. 計算參數6. 解決層次信號引用7. 建立模塊連接
// 類似C代碼的link階段
  • 仿真
建立RTL模型和參數驗證環境, 以周期驅動(cycle-driven)或事件驅動(event-driven)的方式進行仿真

實例解讀

  • Icarus Verilog(iverilog), VCS 和 Verilator 的典型使用流程
階段vcsverilatoriverilog
編譯(compilation).sv.o.sv.oiverilog -g2005-sv -o tb.vvp <files>.sv
建模(elaboration).osimv.oobj_dir/V$(TB_NAME)隱式在生成 tb.vvp 時完成,不再單獨產物
仿真(simulation)./simv./obj_dir/V$(TB_NAME)vvp tb.vvp
與 VCS 和 Verilator 不同,
Icarus Verilog **不生成可執行 ELF**,也不生成 C++ 代碼。
它在編譯階段就完成了 elaboration,將所有模塊實例化和連接,并將結果編碼進 `tb.vvp`。
無需單獨生成可執行文件(`.o` 或 `simv`)。

SV的仿真過程


并行

SystemVerilog 采用 模塊(module 作為設計的基本單元,整個電路從 頂層模塊 開始,逐層實例化與端口互聯,最終形成完整的層次化結構。

在 SV世界中, 仿真一旦運行起來, 一個module 就類似于 軟件世界中的 一個線程(不區分線程進程)
那么就必然有線程之間的同步與通信1. 信號的變化(事件觸發)  //  @(posedge clk)2. 對特定事件的等待(時鐘周期) // wait 3. 延時(固定延時) // #200
一般來說, module 中的語句都是順序的, 但是如果你想 并行, 就需要用fork 關鍵字 來創建 并行結構(即創建新線程)即 軟件世界中的 一個線程 在硬件世界中的類比為 // 拓展知識 請查看 https://blog.csdn.net/u011011827/article/details/1474447921. module2. initial 包圍的 硬件代碼 3. always  包圍的 硬件代碼2. fork 包圍的 硬件代碼

仿真顆粒度

仿真需要指定 仿真時的 時間單位和精度不管是 用戶TB ,還是設計指定的 時間都要 以 timeprecision  算(四舍五入)出來.
搞 timeunit 這個關鍵字,只是為了 代碼的可讀性 : 讓用戶無需每次都寫帶單位的延時,只需寫 #1 即可代表 #(1 * timeunit)
一般 timeprecision 指定的單位 比 timeunit 小
timeprecision 不是越小越好,太細反而開銷大(調度器要管理的時間槽變多,導致仿真慢). // 這個要解讀 調度, 來深入理解
合適的 timeprecision看設計的最快時鐘——假如最高 500 MHz(周期 2ns),那么 timeprecision 設 100ps 就夠(20 個步)。看需要模擬的最小延時——如果你要模擬 #0.5ns 這類延時,就要精度細于 500ps;否則會被舍入。按 10 的級數對齊——常用 1ns/100ps、1ns/10ps、100ps/10ps 這樣的十倍關系,既好計算又利于讀寫。

SV仿真調度

sv代碼中module是并行的,但是cpu(仿真sv代碼的時候)是順序執行
那么在 0 時刻 ,有很多 并行代碼(假設有10條語句) 需要仿真那么 誰先做誰后做呢 , 這就是 仿真調度 要考慮的事情部分規則:時間片   : timeprecision指定的單位 // 如果 timeprecision = 100ps , 那么帶 時間槽所在的時刻 只能是 100ps的倍數同槽不同事:同一槽位的多條語句,靠 “事件區域” + “申明順序” 決定先后。效率至上  :調度器只跳到下一個有事的槽位,不會浪費時間檢查空槽 // 即 存在一種可能, 200ps 時, 沒有事件位于這一時刻, 那么 根本就不會 檢查 200ps 是否有 事情要做 // 即 不會 在 200ps 這個刻度 浪費 一丁點cpu時間
  1. 同一時間槽內的執行次序就是“仿真調度”
    在每個離散的時間點(時間槽)上,仿真器會把所有待執行的事件分到幾個“事件區域”(Active、Inactive、NBA、Monitor…),再在各區域內按聲明順序執行。這套從區域到區域、從語句到語句的調度機制,就稱作仿真調度(event scheduling)。
  2. 仿真調度是為模擬并行硬件而設計的
    真實 CPU 是串行執行指令的,而硬件模塊在同一時刻是并行更新歐。仿真器內部用“調度”來用順序算法準確地再現硬件的并行行為——保證同時發生的并行事件能在同一個時間點“好像同時”地被執行,只是按照調度規則分批跑完。
  3. 實際硬件里沒有“調度器”這層概念
    硬件的寄存器、門電路、互連網是真正同時更新的,不存在“先做 A 再做 B”的軟件調度。調度只是仿真環境里用來序列化并行行為的實現細節。
  4. 仿真的時候 有 仿真調度, 但是硬件上沒有, 怎么保證在仿真時能過的代碼在硬件上一定沒問題呢?
    • 可綜合子集:設計時只用可綜合的 SV/Verilog 語法(符合綜合工具的語義),這樣仿真行為和綜合后硬件邏輯在功能上是等價的。
    • 靜態時序分析 (STA):綜合后用 STA 工具檢查硬件的時序收斂,保證所有信號路徑在目標時鐘下都能按預期收斂。
    • 門級仿真:在部分關鍵場景下,還會跑門級網表加 SDF back-annotation 仿真,驗證時序與 RTL 仿真的一致性。
      通過以上流程,仿真“看得見”的并行邏輯,以及綜合后驗證的時序約束,都能確保最終硅片上真實并行電路的正確性。
調度區域

SystemVerilog 離散事件調度器在每個時間槽(time slot)內依次執行的主要仿真調度區域(也稱為“事件區域”)及其作用:

區域序號調度區域英文名 / 縮寫執行內容示例說明
1ActiveActive Regionalwaysinitial 塊中無延時語句之后的語句執行所有因為當前時間到達而“就緒”的過程后的第一批語句
2InactiveInactive Regiondisable fork@(事件觸發)處理在 Active 區域產生的新就緒過程,但不再執行延時、NBATasks
3NBANon-Blocking Assigns所有<=非阻塞賦值更新收集并一次性更新非阻塞賦值,避免與 Active 中的順序沖突
4MonitorMonitor Regionuvm_monitor$monitor、覆蓋率采集、斷言觀察信號變化,不影響驅動;常用于更新覆蓋率、斷言檢查
5ObservedObserved Region@(<signal>) 等帶延時或事件觸發的觀察者用于“觀察”在 Monitor 區域中改變的信號或變量
6ReactiveReactive RegionPLI/VPI/VHPI 回調、DPI-C 調用外部仿真接口的回調處理,保證與內部更新同步

調度流程簡述:
在仿真器中,每到一個時間槽,依次從 Active → Inactive → NBA → Monitor → Observed → Reactive 執行對應區域的所有就緒事件;然后仿真時間跳到下一個有事件的槽位。

這樣設計可以:

  • 將順序、非阻塞賦值、監視、外部回調等不同種類的操作有序分隔,
  • 保證同一時間點內的并行硬件行為被準確、可預測地“序列化”執行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78857.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78857.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78857.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

蘇德戰爭前期蘇聯損失慘重(馬井堂)

蘇德戰爭前期&#xff08;1941年6月22日德國發動“巴巴羅薩行動”至1941年底至1942年初&#xff09;是蘇聯在二戰中損失最慘重的階段之一。以下是主要方面的損失概述&#xff1a; ?一、軍事損失? ?人員傷亡與俘虜? 至1941年底&#xff0c;蘇軍傷亡約?300萬人?&#xff…

聯邦學習的收斂性分析(全設備參與,不同本地訓練輪次)

聯邦學習的收斂性分析 在聯邦學習中,我們的目標是分析全局模型的收斂性,考慮設備異構性(不同用戶的本地訓練輪次不同)和數據異質性(用戶數據分布不均勻)。以下推導從全局模型更新開始,逐步引入假設并推導期望損失的遞減關系,最終給出收斂性結論。 1. 全局模型更新與泰…

多線程爬蟲中實現線程安全的MySQL連接池

多線程爬蟲中實現線程安全的MySQL連接池 在日常開發中&#xff0c;數據庫操作頻繁建立/關閉連接會帶來性能損耗&#xff0c;尤其在多線程場景中更容易出現連接復用、阻塞等問題。因此&#xff0c;本文介紹如何使用 Python 封裝一個 線程安全的 MySQL 連接池&#xff0c;并通過…

HTML:常用標簽(元素)匯總

文章目錄 一、標簽分類1、塊標簽與行標簽 二、排版標簽三、文本標簽1、常用2、不常用 四、圖片標簽五、超鏈接1、跳轉頁面2、跳轉文件或下載文件3、跳轉到錨點4、喚起本地應用 六、列表七、表格八、表單九、框架十、HTML實體十一、全局屬性十二、meta元信息 一、標簽分類 1、塊…

20250430在ubuntu14.04.6系統上完成編譯NanoPi NEO開發板的FriendlyCore系統【嚴重不推薦,屬于沒苦硬吃】

【開始編譯SDK之前需要更新源】 rootrootubuntu:~/friendlywrt-h3$ sudo apt update 【這兩個目錄你在ubuntu14.04.6系統上貌似git clone異常了】 Y:\friendlywrt-h3\out\wireguard Y:\friendlywrt-h3\kernel\exfat-nofuse 【需要單線程編譯文件系統&#xff0c;原因不明】 Y:…

【AI論文】CipherBank:通過密碼學挑戰探索LLM推理能力的邊界

摘要&#xff1a;大型語言模型&#xff08;LLMs&#xff09;已經展現出非凡的能力&#xff0c;尤其是最近在推理方面的進步&#xff0c;如o1和o3&#xff0c;推動了人工智能的發展。盡管在數學和編碼方面取得了令人印象深刻的成就&#xff0c;但在需要密碼學專業知識的領域&…

藝術與科技的雙向奔赴——高一鑫榮獲加州聯合表彰

2025年4月20日,在由M.A.D公司協辦的“智藝相融,共赴價值巔峰”(Academic and Artistic Fusion Tribute to the Summit of Value)主題發布會上,音樂教育與科技融合領域的代表人物高一鑫,因其在數字音樂教育與中美文化交流方面的杰出貢獻,榮獲了圣蓋博市議員Jorge Herrera和爾灣市…

【深度學習的靈魂】圖片布局生成模型LayoutPrompt(1)

&#x1f308; 個人主頁&#xff1a;十二月的貓-CSDN博客 &#x1f525; 系列專欄&#xff1a; &#x1f3c0;《深度學習理論直覺三十講》_十二月的貓的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻擋不了春天的腳步&#xff0c;十二點的黑夜遮蔽不住黎明的曙光 目…

Compose筆記(二十)--TextField

這一節主要了解一下Compose的TextField,TextField 是一個用于接收用戶文本輸入的 UI 組件,允許用戶通過鍵盤輸入、編輯或刪除文本。簡單用法總結如下: API value&#xff1a;當前輸入的文本內容。 onValueChange 含義&#xff1a;當用戶輸入文本時觸發的回調函數&#xff0c;參…

在Linux虛擬機下使用vscode,#include無法跳轉問題

總結&#xff1a;需要通過Linux指令來添加編譯器和壓縮文件&#xff0c;解壓&#xff0c;這樣獲得的編譯器會具有可執行權限類似于 -rwxr-xr-x 1 user user 12345 Apr 26 14:22 myscript.sh 如果你直接從window中拖入文件到Linux文件下&#xff0c;你需要自己來再度開啟可編譯…

ArcGIS+GPT:多領域地理分析與決策新方案

技術點目錄 AI大模型應用ArcGIS工作流程及功能prompt的使用技巧AI助力工作流程AI助力數據讀取AI助力數據編輯與處理AI助力空間分析AI助力遙感分析AI助力二次開發AI助力科研繪圖ArcGISAI綜合應用了解更多 ——————————————————————————————————…

基礎術語說明

車間&#xff1a;工廠內集中進行加工或裝配的獨立空間&#xff0c;配備設備、工具及人員&#xff0c;是生產活動的核心載體。 比如裝配車間、總裝車間、油漆車間等 生產線&#xff1a;以流水作業形式將原材料轉化為成品的設備與人員的組合系統&#xff0c;強調連續性和效率。…

Splunk 使用Role 實現數據隔離

很多人知道 Splunk 有很多自帶的Role, 今天我就要說說定制化的Role: 1: 在創建新role 的界面: 2: 在如下的界面,可以定制allow index name: 3: 創建好新Role 后,在SAML 添加新的group 的時候,就可以看到Role 給某個group: 4: 這樣一個特定組的人來申請Splunk 權限,就可…

利用李雅普諾夫穩定性理論設計模型參考自適應系統(2.0)

上一篇介紹了利用李雅普諾夫穩定性理論設計模型參考自適應系統&#xff0c;通過在被控對象前面添加一個可調增益&#xff0c;然后利用李雅普諾夫穩定性理論設計增益的自適應率&#xff0c;使得被控對象輸出與參考模型輸出一致。本文將介紹在系統結構中引入前饋和反饋的結構&…

前端封裝WebSocket工具n

Web API 提供的 WebSocket 類&#xff0c;封裝一個 Socket 類 // socket.js import modal from /plugins/modal const baseURL import.meta.env.VITE_APP_BASE_WS; const EventTypes [open, close, message, error, reconnect]; const DEFAULT_CHECK_TIME 55 * 1000; // 心…

TCP和UDP傳輸層協議

TCP&#xff08;Transmission Control Protocol&#xff09;和 UDP&#xff08;User Datagram Protocol&#xff09;是兩種常見的傳輸層協議&#xff0c;它們在網絡通信中發揮著不同的作用。二者在連接建立、可靠性、傳輸效率等方面存在顯著差異&#xff0c;適用于不同的應用場…

空域倫理與AI自主邊界的系統建構

在AI無人系統逐步參與城市空域治理的過程中&#xff0c;系統的“自主性”已不再僅是技術指標&#xff0c;而是直接影響合規性、安全性與社會接受度的倫理邊界議題。AI決策系統是否擁有“強干預能力”&#xff1f;行為觸發責任應歸屬何方&#xff1f;算法可否調優至“自我糾偏”…

在原生代碼(非webpack)里使用iview的注意事項

最近公司在做一個項目&#xff0c;使用的框架是iview,使用過程中同事遇到一些問題&#xff0c;這些問題對于有些同學來說根本就不是問題&#xff0c;但總會有同學需要&#xff0c;為了幫助不太會用的同學快速找到問題&#xff0c;做了如下整理&#xff1a; 下載vue,iview.min.j…

java代碼混淆

生成jar的時候混淆 目前最常用的Proguard,網上有很多介紹的文章&#xff0c;這種安全性較低 對已經生成的jar進行加密 加密庫:https://github.com/li571312729/classfinal 測試對jar進行加密 加密后如果正常調用的話會失敗 加密后jar反編譯查看不到代碼 使用密碼才能調用機…

【Linux】第十三章 訪問Linux文件系統

目錄 1. 存儲設備是什么&#xff1f;怎么理解分區和格式化&#xff1f; 2. 文件系統是什么&#xff1f; 3. 掛載是什么&#xff1f;掛載點是什么&#xff1f; 4. 怎么理解塊設備&#xff1f; 5. 在SATA附加存儲中&#xff0c;第一磁盤上的第一個分區和第二磁盤的第二個分區…