【Verilog】延時和時序檢查

Verilog中延時和時序檢查

  • 1. 延時模型
    • 1.1 分布延遲
    • 1.2 集總延遲
    • 1.3 路徑延遲
  • 2. specify 語法
    • 2.1 指定路徑延時
      • 基本路徑延時
      • 邊沿敏感路徑延時
      • 狀態依賴路徑延時
    • 2.2 時序檢查
      • $setup, $hold, $setuphold
      • $recovery, $removal, $recrem
      • $width, $period
      • notifier


1. 延時模型


真實的邏輯元器件和它們之間的互連線上都會有延時的存在。雖然 Verilog 設計主要考慮的是邏輯功能的正確性,但是 Verilog 語法是支持定義延時的。

Verilog 中延時模型有三種:分布延遲、集總延遲(lumped) 和路徑延遲。


1.1 分布延遲

分布延遲指的是給電路中每個獨立的元件進行延遲定義,不同的路徑有不同的延時,如下圖所示。

在這里插入圖片描述

對應的 verilog 描述為:

// 例化邏輯門單元的時候指定延時
module and4(output       out,input        a, b, c, d);wire         an1, an2 ;and #1       (an1, a, b);and #2       (an2, c, d);and #1.5     (out, an1, an2);
endmodule// assign 語句中指定延時
module and4(output       out,input        a, b, c, d);wire         an1, an2 ;assign #1    an1 = a & b ;assign #2    an2 = c & d ;assign #1.5  out = an1 & an2 ;
endmodule

1.2 集總延遲

集總延遲是將全部路徑累計的延時集中到最后一個門單元上。

到最后一個門單元上的延遲會因路徑的不同而不同,此時取最大延時作為最后一個門單元的延時。

將上述分布延遲圖轉化為集總延遲圖,如下所示。

在這里插入圖片描述

對應的 verilog 描述如下:

module and4(output       out,input        a, b, c, d);wire         an1, an2 ;and          (an1, a, b);and          (an2, c, d);and #3.5     (out, an1, an2); //set the max delay at the last gate
endmodule

1.3 路徑延遲

路徑延遲是對每個輸入引腳到每個輸出引腳的所有路徑指定延遲時間。

在這里插入圖片描述

路徑延遲模型需要使用 specify 關鍵字來定義,上圖對應的 verilog 描述如下所示:

module and4(output       out,input        a, b, c, d);specify(a => out) = 2.5 ;(b => out) = 2.5 ;(c => out) = 3.5 ;(d => out) = 3.5 ;endspecifywire         an1, an2 ;and          (an1, a, b);and          (an2, c, d);and          (out, an1, an2);
endmodule

2. specify 語法


Verilog 中的路徑延遲使用 specify 塊語句來描述,從 specify 為開始,到 endspecify 結束。

specify 是 module 中獨立的一部分,不能出現在其他語句塊(initial, always 等)中。

specify 塊語句的主要功能是:指定所有路徑中引腳到引腳的延遲、在電路中設置時序檢查。


2.1 指定路徑延時


基本路徑延時


specify 塊語句有兩種基本的語法來定義延時:

方法一: 并行連接,每條路徑都有一個源引腳和目的引腳,將這些路徑的延遲依次用 specify 語句描述出來。

基本語法為:

(<source_io> => <destination_io>) = <delay_value>;

一個帶有路徑延時的 4 輸入與門的 verilog 描述如下:

module and4(output       out,input        a, b, c, d);specify(a => out) = 2.5 ;(b => out) = 2.5 ;(c => out) = 3.5 ;(d => out) = 3.5 ;endspecifywire         an1, an2 ;and          (an1, a, b);and          (an2, c, d);and          (out, an1, an2);
endmodule

在使用 specify 定義路徑延時的時候,也可以定義參數,如下所示:

specifyspecparam ab_2_out = 2.5 ;specparam cd_2_out = 3.5 ;(a => out) = ab_2_out ;(b => out) = ab_2_out ;(c => out) = cd_2_out ;(d => out) = cd_2_out ;
endspecify

需要注意的是,specparam 只能在 specify 內部聲明及使用,而 parameter 只能在 specify 語句塊的外部聲明及使用。

在并行連接中,源引腳和目的引腳是一一對應的。并行連接也支持多位寬信號間的路徑延遲描述,但是位寬必須保持一致。

module paral_conn(input [3:0]         d,output [3:0]        q);specify(d => q) = 3 ;endspecifyassign q = d & 0101 ;
endmodule

上例的路徑延時定義等價于:

specify(d[0] => q[0]) = 3 ;(d[1] => q[1]) = 3 ;(d[2] => q[2]) = 3 ;(d[3] => q[3]) = 3 ;
endspecify

方法二: 全連接,源引腳中的每一位與目標引腳的每一位相連接。源引腳和目的引腳的連接是組合遍歷的,且不要求位寬對應。

基本語法為:

(<multiple_source_io> *> <multiple_destination_io>) = <delay_value> ;

如下所示,4 輸入的與邏輯模塊的路徑延時可以為:

module and4(output       out,input        a, b, c, d);specify(a,b *> out) = 2.5 ;(c,d *> out) = 3.5 ;endspecifywire         an1, an2 ;and          (an1, a, b);and          (an2, c, d);and          (out, an1, an2);
endmodule

邊沿敏感路徑延時


邊沿敏感路徑延時用于對時序電路的輸入到輸出延遲進行建模,需要使用邊緣標識符指明觸發條件。如果沒有指明的話,任何變化都會觸發源引腳到目的引腳的延遲值的變化。

示例1:

(posedge clk => (out +: in)) = (1,2);

在 clk 的上升沿,對于從 clk 到 out 的路徑,其上升延時是 1,下降延時是 2。+: 的意思是 in 到 out 的數據路徑是同向傳輸,即 out = in。

示例2:

(negedge clk => (out -: in)) = (1,2);

在 clk 的下降沿,對于從 clk 到 out 的路徑,其上升延時是 1,下降延時是 2。-: 的意思是 in 到 out 的數據路徑是反向傳輸,即 out = ~in。

示例3:

(negedge clk => (out : in)) = (1,2);

clk 的任何變化,從clk到out的模塊路徑,其上升延時是1,下降延時是2,從in到out的數據路徑的傳輸是不可預知的,同向或者反向或者不變。


狀態依賴路徑延時


Verilog 也允許模型中根據信號值的不同,有條件的給路徑延遲進行不同的賦值。

一個簡單的示例如下所示:

specifyif (a)    (a => out) = 2.5 ;if (~a)   (a => out) = 1.5 ;if (b & c)        (b => out) = 2.5 ;if (!(b & c))     (b => out) = 1.5 ;if ({c, d} == 2'b01)(c,d *> out) = 3.5 ;ifnone    (c,d *> out) = 3 ;
endspecify

需要注意的是:

  1. if語句的操作數可以是標量,也可以是向量,條件表達式也可以包含任意操作符;
  2. 所有輸入狀態都應該說明,否則沒有說明的路徑使用分布延時,如果也沒有聲明分布延時的話,那么使用零延時(zero delay)。如果路徑延時和分布延時同時聲明的話,則選擇最大的延時作為路徑延時;
  3. 可以使用ifnone語句,在其它所有條件都不滿足的情況下,說明一個缺省的狀態依賴路徑延時。

2.2 時序檢查


使用 specify 指定路徑延遲之后,可以讓仿真的時序更加接近實際數字電路的時序。

除此之外,specify 還可以定義一些系統任務,用來進行時序檢查。

Verilog 中常用的用于時序檢查的系統任務包括:$setup, $hold, $recovery, $removal, $widt, $period,這些系統任務只能在 specify 塊中調用。


$setup, $hold, $setuphold


$setup 用來進行建立時間檢查,$hold 用來進行保持時間檢查,基本語法格式如下:

$setup(data_event, reference_event, limit, notifier);

data_event:被檢查的信號,判斷它是否違反約束

reference_event:用于檢查的參考信號,一般為時鐘信號的跳變沿

limit:最小建立時間

當 reference_event time - limit < data_event time < reference_event time 的時候,仿真的時候會打印出 Timing Violation 的報告。

$hold (reference_event, data_event, limit, notifier);

當 reference_event time < data_event time < reference_event time + limit 的時候,仿真的時候會報告 Hold Timing Violation。

這里需要注意的是,$setup$hold 中輸入端口的位置是不一樣的。setup 檢查中,數據要先到,hold 檢查中,數據要晚走,所以可以按照事件的事件順序來記憶。

此外,Verilog 還提供了同時檢查setup 和 hold 的系統任務:

$setuphold (reference_event, data_event, setup_limit, hold_limit, notifier)

該系統函數等價于:

$setup(data_event, reference_event, setup_limit, notifier);
$hold (reference_event, data_event, hold_limit, notifier);

當 reference_event time - setup_limit < data_event time < reference_event time + hold_limit 的時候,仿真的時候會報時序違例。


$recovery, $removal, $recrem


對于異步復位的觸發器來說,異步復位信號也需要滿足 recovery time(恢復時間)和 removal time(去除時間),才能有效的復位和釋放復位,防止出現亞穩態。

$recovery, $removal, $recrem 的基于語法如下:

$recovery (reference_event, data_event, limit, notifier);

reference_event:用于檢查的參考信號,一般為清零或復位信號跳變沿;

data_event:被檢查的信號,一般為時鐘信號跳變沿。

limit:設置的最小 removal time。

當data_event time - limit(clk) < reference_event time(async rst) < data_event time(clk) 時,就會報告recovery time violations。

$removal (reference_event, data_event, limit, notifier);

當 data_event time < reference_event time < data_event time + limit時,就會報告removal time violations。

$recrem (reference_event, data_event, recovery_limit, removal_limit, notifier)

$width, $period


有些數字設計,例如 flash 存儲器,還需要對脈沖寬度或周期進行檢查,為此 Verilog 分別提供了系統任務 $width$period。用法如下:

$width (ref_event, time_limit, notifier);$period(ref_event, time_limit, notifier);

ref_event:邊沿觸發事件
time_limit:脈沖的最小寬度

這里data_event是隱含的,它等于reference_event的相反邊沿。

$width 用于檢查邊沿觸發事件 ref_event 到下一個反向跳變沿之間的時間,常用于脈沖寬度的檢查。如果兩次相反跳邊沿之間的時間小于 time_limit,則會報告 violation。

$period 用于檢查邊沿觸發事件 ref_event 到下一個同向跳變沿之間的時間,常用于時鐘周期的檢查。如果兩次同向跳邊沿之間的時間小于 time_limit,則報告中會打印 violation。

在這里插入圖片描述


notifier


任意一條 timing check 語句檢測到timing violation發生時,對應的 timing check 語句就會把 notifier 的值做一次 toggle。

notifier 的初始默認值是 x,第1次 timing violation 時,notifier 的值會從x變為0或1。后續每發生一次 timing violation,notifier 的值也會被做一次toggle。如果舊值為0,則新值為1。如果舊值為1,則新值為0。

notifier 的 toggle,會導致寄存器的Q端變為 x。

如下圖所示,notifier 是 dff 的一個輸入端口,當前發生任意跳變的時候,dff 的輸出都將變為 x 態。

在這里插入圖片描述

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

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

相關文章

DigitalOcean Gradient AI平臺現已支持OpenAI gpt-oss

OpenAI 的首批開源 GPT 模型&#xff08;200 億和 1200 億參數&#xff09;現已登陸 Gradient AI 平臺。此次發布讓開發者在構建 AI 應用時擁有更高的靈活度和更多選擇&#xff0c;無論是快速原型還是大規模生產級智能體&#xff0c;都能輕松上手。新特性開源 GPT 模型&#xf…

藏在 K8s 幕后的記憶中樞(etcd)

目錄1&#xff09;etcd 基本架構2&#xff09;etcd 的讀寫流程總覽a&#xff09;一個讀流程b&#xff09;一個寫流程3&#xff09;k8s存儲數據過程源碼解讀4&#xff09;watch 機制Informer 機制etcd watch機制etcd的watchableStore源碼解讀5&#xff09; k8s大規模集群時會存在…

騰訊云EdgeOne安全防護:快速上手,全面抵御Web攻擊

為什么需要專業的安全防護&#xff1f; 在當今數字化時代&#xff0c;網站面臨的安全威脅日益增多。據統計&#xff0c;2023年全球Web應用程序攻擊超7千億次&#xff0c;持續快速增長。 其中最常見的包括&#xff1a; DDoS攻擊&#xff1a;通過海量請求使服務器癱瘓Web應用攻…

SpringBoot中的條件注解

文章目錄前言什么是條件注解核心原理常用條件注解詳解1. ConditionalOnClass和ConditionalOnMissingClass2. ConditionalOnBean和ConditionalOnMissingBean3. ConditionalOnProperty應用場景&#xff1a;多數據源配置在SpringBoot自動配置中的核心作用自動配置的工作原理經典自…

LightGBM時序預測詳解:從原理到 PSO 參數優化

前言 在時間序列預測領域&#xff0c;集成學習方法一直占據重要地位。此前我們介紹了基于傳統集成思想的時序預測方法&#xff08;查看前文&#xff09;&#xff0c;而梯度提升樹&#xff08;GBDT&#xff09;作為集成學習的佼佼者&#xff0c;在時序預測中表現尤為突出。本文…

django生成遷移文件,執行生成到數據庫

當報錯時 重新拉取git&#xff0c;重新生成遷移文件&#xff0c;重新執行 1、生成遷移文件 python manage.py makemigrations 子應用2、執行建表、建字段、修改字段 python manage.py migrate 子應用3、當手動已經在數據庫創建字段時&#xff0c; 用 --fake 標記遷移為 “已應用…

2025軟件供應鏈安全技術路線未來趨勢預測

軟件供應鏈安全已從一個技術圈的議題演變為全球企業的治理焦點。近幾年&#xff0c;APT滲透、惡意包植入、開發者誤操作等不同類型的供應鏈安全事件頻發&#xff0c;使得“安全的代碼來源”和“可信的交付鏈路”成為企業數字化轉型的生命線。2025年的軟件供應鏈安全&#xff0c…

用戶登錄Token緩存Redis實踐:提升SpringBoot應用性能

前言在現代Web應用中&#xff0c;用戶認證和授權是至關重要的功能。傳統的基于數據庫的Token存儲方式雖然簡單易用&#xff0c;但在高并發場景下容易成為性能瓶頸。本文將介紹如何將SpringBoot項目中的用戶Token從數據庫存儲遷移到Redis緩存&#xff0c;顯著提升系統性能。一、…

深度解析Structured Outputs:讓AI輸出嚴格遵循JSON Schema的結構化響應

深度解析Structured Outputs&#xff1a;讓AI輸出嚴格遵循JSON Schema的結構化響應 引言 在現代應用開發中&#xff0c;JSON 是最流行的數據交換格式之一。為了提升 API 接口的健壯性和數據一致性&#xff0c;結構化輸出&#xff08;Structured Outputs&#xff09;成為了大模…

關于 微服務中服務注冊與發現 的詳細說明,涵蓋主流框架/解決方案的對比、核心功能、配置示例及總結表格

以下是關于 微服務中服務注冊與發現 的詳細說明&#xff0c;涵蓋主流框架/解決方案的對比、核心功能、配置示例及總結表格&#xff1a;1. 服務注冊與發現的核心概念 服務注冊與發現是微服務架構的基礎能力&#xff0c;主要解決以下問題&#xff1a; 服務注冊&#xff1a;服務實…

08高級語言邏輯結構到匯編語言之邏輯結構轉換 continue break 完結匯編按邏輯結構

目錄 &#x1f4da; 1. continue 語句的原理與實現 &#x1f6e0; 1.1 continue 語句的基本概念 ?? 1.2 底層原理 &#x1f4d6; 1.3 案例分析&#xff1a;跳過偶數&#xff0c;累加奇數 &#x1f680; 2. break 語句的原理與實現 &#x1f6e0; 2.1 break 語句的基本概…

AI出題人給出的Java后端面經(二十二)(日更)

鏈接雙端鏈表 前一篇&#xff1a;AI出題人給出的Java后端面經&#xff08;二十一&#xff09;&#xff08;日更&#xff09; 后一篇&#xff1a;null 目錄 &#x1f535; 一、Java基礎&#xff08;集合/流式/OOP&#xff09; 答案&#xff1a; 題目1&#xff1a;集合遍歷性…

AI賦能體育訓練突破:AI動作捕捉矯正精準、戰術分析系統提效率,運動員破瓶頸新路徑

傳統體育訓練長期受限于 “動作矯正依賴教練主觀判斷”“戰術分析滯后于賽場變化”“運動員體能分配憑經驗摸索” 的難題&#xff0c;而 AI 技術的深度介入&#xff0c;正讓體育訓練從 “經驗驅動” 轉向 “數據驅動”&#xff0c;既能實時捕捉動作偏差&#xff0c;又能動態優化…

【python實用小腳本-194】Python PNR一鍵查票:輸入號碼秒出座位狀態——再也不用刷12306

Python PNR一鍵查票&#xff1a;輸入號碼秒出座位狀態——再也不用刷12306 PNR查詢, 實時座位, 離線腳本, 零廣告, 瑞士軍刀 故事開場&#xff1a;一把瑞士軍刀救了趕火車的你 周五傍晚&#xff0c;你拎著行李沖向站臺&#xff0c;手機信號一格&#xff0c;12306 死活刷不出座位…

【python】python進階——推導式

目錄 一、推導式介紹 二、推導式的用法 2.1 列表推導式 2.2 字典推導式 2.3 集合推導式 2.4 生成器表達式 三、推導式的嵌套和復雜用法 3.1 嵌套推導式 3.2 多重條件推導式 四、推導式對比傳統循環 4.1 性能比較 4.2 可讀性比較 五、常見應用場景 5.1 數據清…

數字安全隱形基石:隨機數、熵源與DRBG核心解析與技術關聯

前言&#xff1a;數字安全的 “隱形基石” 在數字化浪潮席卷全球的今天&#xff0c;從金融交易的密鑰生成到區塊鏈的共識機制&#xff0c;從量子通信的加密協議到智能汽車的身份認證&#xff0c;隨機數如同空氣般滲透在信息系統的每一個安全節點。然而&#xff0c;看似簡單的 …

TDengine IDMP 最佳實踐

最佳實踐 IDMP 提供了一強大的數據建模能力&#xff0c;讓數據標準化、情景化&#xff0c;從而可以更好地利用 AI 技術&#xff0c;從數據中挖掘出業務價值&#xff0c;但數據建模本身是一個很難用 AI 完成的事情。 為最大程度減少建模的成本&#xff0c;TDengine 推薦在數據…

8.20網絡編程——sqlite3數據庫

文章目錄一、思維導圖二、學生管理系統1、myhead.h2、代碼三、牛客網刷題一、思維導圖 二、學生管理系統 1、myhead.h #ifndef __MYHEAD_H__ #define __MYHEAD_H__#include <string.h> #include <stdio.h> #include <stdlib.h> #include <errno.h>#d…

電腦不能訪問服務器磁盤,連不上服務器。解決辦法:在窗口中輸入 regedit 確定即可打開注冊表,。。。。0改為1,確認;

打開注冊表&#xff1a; 按鍵盤上的 WinR 鍵&#xff0c;打開運行窗口&#xff0c;在窗口中輸入 regedit 確定即可打開注冊表。&#xff08;或者直接在左下角搜索框中搜索“注冊表”&#xff09; 依次打開以下目錄 計算機\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service…

EP4CE40F23I7N Altera FPGA Cyclone IV E

EP4CE40F23I7N 阿爾特拉 Altera Cyclone IV E 系列的一顆中等密度、低功耗 FPGA&#xff0c;通信接口與工業控制等應用。該器件采用成熟的工藝制程&#xff0c;器件規模約為 39k 左右的邏輯單元&#xff08;Logic Elements&#xff09;&#xff0c;由若干邏輯陣列塊&#xff08…