Verilog基礎:時序調度中的競爭(一)

相關閱讀

Verilog基礎icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482


????????作為一個硬件描述語言,Verilog HDL常常需要使用語句描述并行執行的電路,但其實在仿真器的底層,這些并行執行的語句是有先后順序的,然而Verilog標準并沒有將這些事件調度的順序定死,而是給予了仿真器廠商一定的自由去實現自己的產品,這就導致了設計者如果不遵循一定的編程習慣,會導致意想不到的仿真結果,下面是一些相關的規則。

1、不要在兩個及以上的always或initial結構中對同一個變量賦值

? ? ? ??當兩個以上的過程結構同時執行時,它們之間的執行順序是不一定的,Verilog標準只規定了在一個順序塊(begin end)中的所有語句是按照其先后順序執行的,但并沒有規定同一個時間執行的多個結構的執行順序,下面舉例詳細說明。

//例1
`timescale 1ns/1ps
module test();initial $display("The initial_0 execute");initial $display("The initial_1 execute");initial $display("The initial_2 execute");
endmodule

? ? ? ? 在上例中,三個initial結構在0ns時同時執行,仿真器執行他們的順序是不定的,但測試表明,許多仿真器都選擇順序執行這三個initial結構,如下所示。

對于Mentor Modelsim SE,輸出結果為
The initial_0 execute
The initial_1 execute
The initial_2 execute對于Aldec Riviera Pro,輸出結果為
The initial_0 execute
The initial_1 execute
The initial_2 execute對于Cadence Xcelium,輸出結果為
The initial_0 execute
The initial_1 execute
The initial_2 execute對于Mentor Questa,輸出結果為
The initial_0 execute
The initial_1 execute
The initial_2 execute對于Synopsys VCS,輸出結果為
The initial_0 execute
The initial_1 execute
The initial_2 execute對于Icarus Verilog,輸出結果為
The initial_0 execute
The initial_1 execute
The initial_2 execute

? ? ? ? ?雖然看起來仿真器的行為都是一致的,但其實這只是一個巧合,下面的例子就體現出了各種仿真器對同一段代碼之間的不同行為。

//例2
`timescale 1ns/1ps
module test();reg a;initial #5 a = 1;initial @(a) $display("The initial_0 execute");initial @(a) $display("The initial_1 execute");initial @(a) $display("The initial_2 execute");
endmodule

????????這段代碼的三個initial結構都對事件a敏感,所以在5ns時,三個initial結構同時被觸發,而他們的執行順序是不定的,如下所示。

對于Mentor Modelsim SE,輸出結果為
The initial_2 execute
The initial_1 execute
The initial_0 execute對于Aldec Riviera Pro,輸出結果為
The initial_0 execute
The initial_1 execute
The initial_2 execute對于Cadence Xcelium,輸出結果為
The initial_0 execute
The initial_1 execute
The initial_2 execute對于Mentor Questa,輸出結果為
The initial_2 execute
The initial_1 execute
The initial_0 execute對于Synopsys VCS,輸出結果為
The initial_0 execute
The initial_1 execute
The initial_2 execut對于Icarus Verilog,輸出結果為
The initial_2 execute
The initial_1 execute
The initial_0 execute

? ? ? ? 下面的代碼中仍然體現了同一時間的多個結構的執行順序是不定的,即使觸發這些結構的事件在同一時間是有前后關系的。

//例3
`timescale 1ns/1ps
module test();reg a, b, c;initial begin#5;a = 1;b = 1;c = 1;endalways @(a) $display("The initial_0 execute");always @(b) $display("The initial_1 execute");always @(c) $display("The initial_2 execute");
endmodule

? ? ? ? 在5ns時,a、b、c先后被賦值為1,Verilog標準保證了begin end塊中的賦值順序從上到下。但由這些賦值語句觸發的其他always結構呢?是否也會按照a、b、c的順序執行呢?

對于Mentor Modelsim SE,輸出結果為
The initial_2 execute
The initial_1 execute
The initial_0 execute對于Aldec Riviera Pro,輸出結果為
The initial_0 execute
The initial_1 execute
The initial_2 execute對于Cadence Xcelium,輸出結果為
The initial_0 execute
The initial_1 execute
The initial_2 execute對于Mentor Questa,輸出結果為
The initial_2 execute
The initial_1 execute
The initial_0 execute對于Synopsys VCS,輸出結果為
The initial_0 execute
The initial_1 execute
The initial_2 execut對于Icarus Verilog,輸出結果為
The initial_0 execute
The initial_1 execute
The initial_2 execute

????????依然可以注意到不同仿真器之間的差異,為什么不都是按照a賦值,always @(a)執行,b賦值,always @(b)執行,c賦值,always @(c)執行的順序執行呢?還是那句話,Verilog標準只規定了一個順序塊(begin end)中的所有語句是按照其先后順序執行的,并沒有保證其他行為。當a賦值后,always @(a)被調度了,但他不一定會在b賦值之前執行,有可能在執行完b賦值、c賦值之后再來執行always @(a),此時always @(b)和always @(c)也應該在隊列中,他們執行的先后順序是標準沒有保證的(但需要注意的是,最基本的調度者和被調度者的先后關系是無法改變的,即always @(a)一定在a賦值后,b、c亦然)。下面是一個經典的兩個結構交錯執行的例子。

//例4
`timescale 1ns/1ps
module test();reg a;wire b;initial begin#1;a = 1;#1;a = 0;$display("b is %b", b);endassign b = a;endmodule

? ? ? ? ?當時間來到1ns,a被賦值為1,同時觸發assign結構,對b連續賦值為1。1ns后,a被更改為0,緊接著打印b的值,結果是1還是0呢?

對于Mentor Modelsim SE,輸出結果為
b is 1對于Aldec Riviera Pro,輸出結果為
b is 1對于Cadence Xcelium,輸出結果為
b is 1對于Mentor Questa,輸出結果為
b is 1對于Synopsys VCS,輸出結果為
b is 0對于Icarus Verilog,輸出結果為
b is 0

????????上面的結果顯示,仿真器可能在執行了a=0的賦值后立刻執行被調度的assign連續賦值,再返回initial結構執行顯示語句,也可能繼續執行下面的顯示語句,再去執行被調度的assign連續賦值。

? ? ? ? 這就給了我們一個啟示,在改變了一個全組合邏輯的電路的輸入后,緊接著顯示輸出,可能無法得到更新后的輸出。一個更好的做法是給$display語句一定的延時,這樣就能確保在執行$display前,連續賦值已經執行完畢,因為不同時間的語句執行是不會產生競爭的。

//例5
`timescale 1ns/1ps
module test();reg a;wire b;initial begin#1;a = 1;#1;a = 0;#0.01 $display("b is %b", b);endassign b = a;endmodule

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

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

相關文章

機器學習數據集整理:圖像、表格

前言 如果你對這篇文章感興趣,可以點擊「【訪客必讀 - 指引頁】一文囊括主頁內所有高質量博客」,查看完整博客分類與對應鏈接。 表格數據 Sklearn 提供了 13 個表格型數據,且數據處理接口統一;LIBSVM 提供了 131 個表格型數據&a…

【TypeScript】常見數據結構與算法(二):鏈表

文章目錄 鏈表結構(LinkedList)鏈表以及數組的缺點數組鏈表的優勢 什么是鏈表?封裝鏈表相關方法源碼鏈表常見面試題237-刪除鏈表中的節點206 - 反轉鏈表 數組和鏈表的復雜度對比 鏈表結構(LinkedList) 鏈表以及數組的缺點 鏈表…

AcWing103.電影——離散化

題目 莫斯科正在舉辦一個大型國際會議,有 n n n 個來自不同國家的科學家參會。 每個科學家都只懂得一種語言。 為了方便起見,我們把世界上的所有語言用 1 到 109 之間的整數編號。 在會議結束后,所有的科學家決定一起去看場電影放松一下。…

Interactive Visual Data Analysis

Words&Contents Home | Interactive Visual Data Analysis Book Outline 這本書對視覺、互動和分析方法進行了系統而全面的概述,作為數據可視化方面比較好的讀物; 目錄 Words&Contents Book Outline (一)Introduct…

AIGC 3D即將爆發,混合顯示成為產業數字化的生產力平臺

2023年,大語言模型與生成式AI浪潮席卷全球,以文字和2D圖像生成為代表的AIGC正在全面刷新產業數字化。而容易為市場所忽略的是,3D圖像生成正在成為下一個AIGC風口,AIGC 3D宇宙即將爆發。所謂AIGC 3D宇宙,即由文本生成3D…

VBA_MF系列技術資料1-227

MF系列VBA技術資料 為了讓廣大學員在VBA編程中有切實可行的思路及有效的提高自己的編程技巧,我參考大量的資料,并結合自己的經驗總結了這份MF系列VBA技術綜合資料,而且開放源碼(MF04除外),其中MF01-04屬于定…

安裝compiler version 5

這個compiler version5 在我的資源里面可以免費下載; 另外這個東西還需要安裝,安裝教程在這里:Keil最新版保姆教程(解決缺少V5編譯器問題) - 嗶哩嗶哩 (bilibili.com) 看吧安裝好了year

C語言鏈表使用

目錄 雙鏈表增刪改查鏈表帶功能函數 雙鏈表增刪改查 #include <stdio.h> #include <stdlib.h>// 雙鏈表結點的定義 typedef struct DNode{int data;struct DNode *prev;struct DNode *next; } DNode;// 創建雙鏈表 DNode *createDoublyLinkedList() {int n, i;pri…

【C語言】qsort的秘密

一&#xff0c;本文目標 qsort函數可以對任意類型數據甚至是結構體內部的數據按照你想要的規則排序&#xff0c;它的功能很強大&#xff0c;可是為什么呢&#xff1f; 我將通過模擬實現qsort函數來讓你對這整個過程有一個清晰的深刻的理解。 二&#xff0c;qsort函數原型 v…

leetcode刷題詳解一

算法題常用API std::accumulate 函數原型&#xff1a; template< class InputIt, class T > T accumulate( InputIt first, InputIt last, T init );一般求和的&#xff0c;代碼如下&#xff1a; int sum accumulate(vec.begin() , vec.end() , 0);詳細用法參考 lo…

【python海洋專題四十七】風速的風羽圖

【python海洋專題四十七】風速的風羽圖 圖片 往期推薦 圖片 【python海洋專題一】查看數據nc文件的屬性并輸出屬性到txt文件 【python海洋專題二】讀取水深nc文件并水深地形圖 【python海洋專題三】圖像修飾之畫布和坐標軸 【Python海洋專題四】之水深地圖圖像修飾 【Pyth…

記一次linux操作系統實驗

前言 最近完成了一個需要修改和編譯linux內核源碼的操作系統實驗&#xff0c;個人感覺這個實驗還是比較有意思的。這次實驗總共耗時4天&#xff0c;從對linux實現零基礎&#xff0c;通過查閱資料和不斷嘗試&#xff0c;直到完成實驗目標&#xff0c;在這過程中確實也收獲頗豐&…

pytorch模型優化簡介,未完結版

如有幫助&#xff0c;點贊收藏關注&#xff01; 如需轉載&#xff0c;請注明出處&#xff01; 今天來介紹torch模型中的優化器 優化是指在每個訓練步驟中調整模型參數以減少模型誤差的過程。 優化算法定義如何執行這個過程 所有優化邏輯都封裝在優化器對象中。在這里&#xf…

【黑馬甄選離線數倉day04_維度域開發】

1. 維度主題表數據導出 1.1 PostgreSQL介紹 PostgreSQL 是一個功能強大的開源對象關系數據庫系統&#xff0c;它使用和擴展了 SQL 語言&#xff0c;并結合了許多安全存儲和擴展最復雜數據工作負載的功能。 官方網址&#xff1a;PostgreSQL: The worlds most advanced open s…

音視頻項目——RTSP服務器解析(1)

介紹 利用線程池&#xff0c;實現 RTSP 服務器的高并發請求處理。 RTSP 是音視頻的控制視頻的協議&#xff0c;如果您還不了解&#xff0c;可以看看之前我解析 RTSP 協議的文章。音視頻協議解析(RTP/RTCP/RTSP/RTMP)——RTSP解析-CSDN博客 解析 我們先來看 RTP 的實現。RTP 是音…

Django框架之auth模塊

目錄 一、Auth模塊引入 二、創建超級用戶(管理員) 三、依賴于auth_user表完成登錄注冊功能 【1】基礎登陸 【2】保存用戶狀態 【3】登錄后跳轉 (1) 登錄后才能訪問頁面 -- 局部配置 (2) 登錄后才能訪問頁面 -- 全局配置 (3) 小結 三、修改密碼 四、注銷 五、注冊…

Springboot將多個圖片導出成zip壓縮包

Springboot將多個圖片導出成zip壓縮包 將多個圖片導出成zip壓縮包 /*** 判斷時間差是否超過6小時* param startTime 開始時間* param endTime 結束時間* return*/public static boolean isWithin6Hours(String startTime, String endTime) {// 定義日期時間格式DateTimeFormatt…

【數據結構】—搜索二叉樹(C++實現,超詳細!)

&#x1f3ac;慕斯主頁&#xff1a;修仙—別有洞天 ??今日夜電波&#xff1a;消えてしまいそうです—真夜中 1:15━━━━━━?&#x1f49f;──────── 4:18 &#x1f504; ?? ? ??…

函數計算的新征程:使用 Laf 構建 AI 知識庫

Laf 已成功上架 Sealos 模板市場&#xff0c;可通過 Laf 應用模板來一鍵部署&#xff01; 這意味著 Laf 在私有化部署上的擴展性得到了極大的提升。 Sealos 作為一個功能強大的云操作系統&#xff0c;能夠秒級創建多種高可用數據庫&#xff0c;如 MySQL、PostgreSQL、MongoDB …

js實現獲取原生form表單的數據序列化表單以及將數組轉化為一個對象obj,將數組中的內容作為對象的key轉化為對象,對應的值轉換為對象對應的值

1.需求場景 哈嘍 大家好啊&#xff0c;今天遇到一個場景&#xff0c; js實現獲取原生form表單的數據序列化表單以及將數組轉化為一個對象obj&#xff0c;將數組中的內容作為對象的key轉化為對象&#xff0c;對應的值轉換為對象對應的值 數組對象中某個屬性的值&#xff0c;轉…