[SystemVerilog] Clocking

SystemVerilog Clocking用法詳解

SystemVerilog 的 clocking 塊(Clocking Block)是一種專門用于定義信號時序行為的構造,主要用于驗證環境(如 UVM)中,以精確控制信號的采樣和驅動時序。clocking 塊通過將信號與特定時鐘關聯,簡化了測試環境中對時序敏感信號的處理,減少了手動時序管理的復雜性。本文將詳細介紹 SystemVerilog 中 clocking 塊的各種用法,包括基本定義、輸入輸出信號、時序控制、接口中的使用、以及在驗證中的應用,并提供示例代碼和最佳實踐。

1. Clocking 塊概述

clocking 塊是 SystemVerilog 中用于封裝信號與時鐘關系的構造,通常定義在 interface 或模塊中。它的主要功能是:

  • 信號采樣與驅動:定義信號相對于時鐘的采樣和驅動時序。
  • 時序抽象:屏蔽底層時序細節,簡化測試用例開發。
  • 驗證支持:在驗證環境中(如 UVM)提供標準化的時序控制接口。
  • 避免競爭:通過明確的采樣和驅動時間點,減少仿真中的競爭與冒險。

主要用途

  • 在驗證環境中精確控制信號的采樣和驅動。
  • 簡化測試環境中對 DUT(待測設計)的時序交互。
  • interface 結合,提供模塊化的時序接口。

基本語法

clocking clocking_name @(clock_event);input input_signal;output output_signal;
endclocking
  • clocking_name:時鐘塊的名稱。
  • clock_event:觸發時鐘塊的時鐘事件(如 @(posedge clk))。
  • input_signal:輸入信號,定義采樣時序。
  • output_signal:輸出信號,定義驅動時序。

2. 基本 Clocking 塊定義與使用

clocking 塊通過指定信號的采樣和驅動時序,簡化了驗證代碼的編寫。

示例:基本 Clocking 塊

module top;logic clk = 0;logic [7:0] data;logic valid;// 定義 clocking 塊clocking cb @(posedge clk);input data;input valid;endclocking// 測試邏輯initial beginforever #5 clk = ~clk;endinitial begin@(cb); // 等待 clocking 塊的時鐘邊沿if (cb.valid)$display("Sampled data: %h", cb.data);end
endmodule

說明

  • clocking cb 定義了一個時鐘塊,基于 clk 的上升沿。
  • input datainput valid 指定信號在時鐘上升沿前采樣。
  • 測試邏輯通過 cb.datacb.valid 訪問同步信號。

優點

  • 信號采樣自動與時鐘邊沿對齊,避免手動時序控制。
  • 提高了代碼的可讀性和可維護性。

3. 輸入與輸出信號的時序控制

clocking 塊支持通過 inputoutput 關鍵字定義信號的采樣和驅動時序,并可以通過延遲指定具體的時序偏移。

3.1 輸入信號采樣

input 信號在時鐘邊沿前采樣,默認采樣時間點為時鐘邊沿前的非阻塞賦值(NBA)區域。可以通過 input #delay 指定采樣延遲。

3.2 輸出信號驅動

output 信號在時鐘邊沿后驅動,默認驅動時間點為時鐘邊沿后的非阻塞賦值區域。可以通過 output #delay 指定驅動延遲。

示例:帶時序延遲的 Clocking 塊

interface simple_bus (input logic clk);logic [7:0] data;logic valid;logic ready;clocking cb @(posedge clk);input #1ns data, valid; // 采樣延遲 1nsoutput #2ns ready;     // 驅動延遲 2nsendclocking
endinterfacemodule receiver (simple_bus bus);always @(bus.cb) beginbus.cb.ready <= 1; // 在時鐘邊沿后 2ns 驅動 readyif (bus.cb.valid)$display("Received data: %h", bus.cb.data);end
endmodulemodule top;logic clk = 0;always #5 clk = ~clk;simple_bus bus_inst(.clk(clk));receiver u_receiver (.bus(bus_inst));initial beginbus_inst.data = 8'hA5;bus_inst.valid = 1;#20 $finish;end
endmodule

說明

  • input #1ns 表示 datavalid 在時鐘上升沿前 1ns 采樣。
  • output #2ns 表示 ready 在時鐘上升沿后 2ns 驅動。
  • 模塊通過 bus.cb 訪問同步信號。

注意

  • 延遲值必須為非負,且在仿真中有效(綜合通常忽略)。
  • 延遲值應根據 DUT 的時序要求設置。

4. Clocking 塊與 Interface 的結合

clocking 塊通常定義在 interface 中,與信號和 modport 結合,提供模塊化的時序接口。

示例:接口中的 Clocking 塊

interface simple_bus (input logic clk);logic [7:0] data;logic valid;logic ready;clocking cb @(posedge clk);input data, valid;output ready;endclockingmodport slave (input data, valid,output ready);
endinterfacemodule receiver (simple_bus.slave bus);always @(bus.cb) beginbus.cb.ready <= 1;if (bus.cb.valid)$display("Received data: %h", bus.cb.data);end
endmodulemodule top;logic clk = 0;always #5 clk = ~clk;simple_bus bus_inst(.clk(clk));receiver u_receiver (.bus(bus_inst));initial beginbus_inst.data = 8'hA5;bus_inst.valid = 1;#20 $finish;end
endmodule

說明

  • clocking cb 定義在 interface 中,與接口信號關聯。
  • receiver 模塊通過 bus.cb 訪問同步信號。
  • modport slave 定義了信號方向,增強接口的模塊化。

優點

  • 將時序控制與信號封裝結合,簡化驗證代碼。
  • 支持模塊化的 DUT 和測試環境連接。

5. 多時鐘 Clocking 塊

clocking 塊支持定義多個時鐘塊,用于處理多時鐘域的信號。

示例:多時鐘 Clocking 塊

interface multi_clock_bus (input logic clk1, clk2);logic [7:0] data;logic valid;clocking cb1 @(posedge clk1);input data, valid;endclockingclocking cb2 @(posedge clk2);input data, valid;endclocking
endinterfacemodule monitor (multi_clock_bus bus);always @(bus.cb1) beginif (bus.cb1.valid)$display("clk1 domain: data = %h", bus.cb1.data);endalways @(bus.cb2) beginif (bus.cb2.valid)$display("clk2 domain: data = %h", bus.cb2.data);end
endmodulemodule top;logic clk1 = 0, clk2 = 0;always #5 clk1 = ~clk1;always #7 clk2 = ~clk2;multi_clock_bus bus_inst(.clk1(clk1), .clk2(clk2));monitor u_monitor (.bus(bus_inst));initial beginbus_inst.data = 8'hA5;bus_inst.valid = 1;#50 $finish;end
endmodule

說明

  • cb1cb2 分別基于 clk1clk2 定義時鐘塊。
  • monitor 模塊在不同時鐘域中采樣信號。
  • 支持多時鐘域驗證。

注意

  • 確保時鐘信號正確連接到接口。
  • 在多時鐘域中,注意信號的跨時鐘域處理。

6. Clocking 塊在驗證中的應用

clocking 塊在驗證環境(如 UVM)中廣泛使用,用于連接 DUT 和測試環境,提供標準化的時序接口。

示例:UVM 驗證中的 Clocking 塊

interface simple_bus (input logic clk);logic [7:0] data;logic valid;logic ready;clocking cb @(posedge clk);input data, valid;output ready;endclocking
endinterfacemodule dut (simple_bus bus);always @(posedge bus.clk) beginif (bus.valid && bus.ready)$display("DUT received: %h", bus.data);end
endmoduleprogram testbench;import uvm_pkg::*;`include "uvm_macros.svh"logic clk = 0;always #5 clk = ~clk;simple_bus bus_if(.clk(clk));initial begin// 設置 UVM 接口uvm_config_db#(virtual simple_bus)::set(null, "*", "bus_if", bus_if);run_test();end
endprogram

說明

  • simple_bus 包含 clocking cb,為測試環境提供同步信號訪問。
  • UVM 測試環境通過 uvm_config_db 獲取虛擬接口。
  • dut 通過接口與測試環境交互。

優點

  • 簡化了 UVM 驅動器和監視器的時序控制。
  • 提供標準化的信號訪問接口。

7. Clocking 塊的高級用法

7.1 默認時鐘塊

可以使用 default clocking 指定默認的時鐘塊,簡化代碼中的時序引用。

interface simple_bus (input logic clk);logic [7:0] data;logic valid;clocking cb @(posedge clk);input data, valid;endclockingdefault clocking cb; // 設置默認時鐘塊
endinterfacemodule monitor (simple_bus bus);always @(*) beginif (valid) // 直接引用信號,等效于 bus.cb.valid$display("Data: %h", data);end
endmodule

說明

  • default clocking cbcb 設置為默認時鐘塊。
  • 信號可以直接引用(如 valid),等效于 bus.cb.valid

注意

  • 默認時鐘塊在復雜接口中可能降低可讀性,謹慎使用。

7.2 動態時序調整

clocking 塊支持在仿真中動態調整時序(通過屬性),但主要用于驗證。

interface simple_bus (input logic clk);logic [7:0] data;logic valid;clocking cb @(posedge clk);input #1step data, valid; // 使用 1step 采樣endclocking
endinterface

說明

  • #1step 表示在時鐘邊沿前的最小時間步長采樣。
  • 適合需要精確時序控制的驗證場景。

8. 注意事項與最佳實踐

  1. 時序定義

    • 確保采樣和驅動延遲與 DUT 的時序要求一致。
    • 避免過大的延遲值,以免影響仿真性能。
  2. 接口結合

    • clocking 塊定義在 interface 中,與信號和 modport 結合。
    • 使用 modport 明確信號方向,增強模塊化。
  3. 驗證環境

    • 在 UVM 中,使用虛擬接口傳遞 clocking 塊。
    • 結合 clocking 塊簡化驅動器和監視器的開發。
  4. 綜合限制

    • clocking 塊主要用于驗證,不支持綜合。
    • 確保 DUT 代碼不依賴 clocking 塊。
  5. 多時鐘域

    • 為每個時鐘域定義獨立的 clocking 塊。
    • 注意跨時鐘域信號的同步。
  6. 代碼可讀性

    • clocking 塊和信號提供清晰的命名。
    • 添加注釋說明采樣和驅動時序。
  7. 調試與驗證

    • 使用仿真工具驗證 clocking 塊的時序行為。
    • 檢查采樣和驅動時間點是否符合預期。

9. 總結

SystemVerilog 的 clocking 塊是一種強大的驗證工具,用于定義信號的采樣和驅動時序,簡化測試環境的時序管理。通過基本定義、輸入輸出信號、時序控制、接口結合、多時鐘支持等功能,clocking 塊在 UVM 等驗證環境中發揮了關鍵作用。特別是在復雜設計中,clocking 塊與 interface 的結合提供了模塊化的時序接口,顯著提高了驗證效率和代碼質量。遵循最佳實踐并根據具體場景選擇合適的 clocking 用法,能夠有效提升驗證的可靠性和可維護性。

10. 設計工具推薦

  • SZ901
    SZ901 是一款基于XVC協議的FPGA網絡下載器。
    • 最高支持53M
    • 支持4路JTAG獨立使用
    • 支持端口合并
    • 支持國產FLASH燒寫
    • 下載器無限擴展
    • 配備專屬程序固化軟件,一鍵燒寫,能大大減小程序固化時間!

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

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

相關文章

kong網關基于header分流灰度發布

kong網關基于header分流灰度發布 在現代微服務架構中&#xff0c;灰度發布&#xff08;Canary Release&#xff09;已經成為一種常用且安全的上線策略。它允許我們將新版本的功能僅暴露給一小部分用戶&#xff0c;從而在保證系統穩定性的同時收集反饋、驗證效果、規避風險。而作…

Go語言gin框架原理

在gin框架中&#xff0c;最關鍵的就是前綴樹&#xff0c;是很重要的。gin框架本質上是在http包的基礎之上&#xff0c;對其的一個二次封裝。這里借鑒一下小徐先生的圖&#xff0c;可能當前版本的gin可能內容有所改變&#xff0c;但大致思想還是這樣。gin框架所做的就是提供一個…

4、Sending Messages

本節介紹如何發送消息。Using KafkaTemplate本節介紹如何使用KafkaTemplate發送消息。OverviewKafkaTemplate封裝了一個生產者&#xff0c;并提供了向Kafka主題發送數據的便利方法。以下列表顯示了KafkaTemplate的相關方法&#xff1a;CompletableFuture<SendResult<K, V…

CSS長度單位問題

在 CSS 中&#xff0c;100px 的邏輯長度在不同分辨率的手機屏幕上是否表現一致&#xff0c;取決于 設備的像素密度&#xff08;devicePixelRatio&#xff09; 和 視口&#xff08;viewport&#xff09;的縮放設置。以下是詳細分析&#xff1a;1. 核心概念 CSS 像素&#xff08;…

基于Java+SpringBoot的圖書管理系統

源碼編號&#xff1a;S606源碼名稱&#xff1a;基于SpringBoot的圖書管理系統用戶類型&#xff1a;雙角色&#xff0c;用戶、管理員數據庫表數量&#xff1a;12 張表主要技術&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven運行環境&#xff1a;Windows/Mac、JDK1.8及以…

XTOM工業級藍光三維掃描儀用于筆記本電腦背板模具全尺寸檢測

鎂合金具有密度小、強度高、耐腐蝕性好等優點&#xff0c;成為筆記本電腦外殼主流材料。沖壓模具作為批量生產筆記本電腦鎂合金背板的核心工具&#xff0c;其精度直接決定了產品的尺寸一致性、結構可靠性與外觀品質。微米級模具誤差可能在沖壓過程中被放大至毫米級&#xff08;…

運維打鐵: MongoDB 數據庫集群搭建與管理

文章目錄思維導圖一、集群基礎概念1. 分片集群2. 副本集二、集群搭建1. 環境準備2. 配置副本集步驟 1&#xff1a;修改配置文件步驟 2&#xff1a;啟動 MongoDB 服務步驟 3&#xff1a;初始化副本集3. 配置分片集群步驟 1&#xff1a;配置配置服務器副本集步驟 2&#xff1a;啟…

HCIP-Datacom Core Technology V1.0_5 OSPF特殊區域及其他特性

在前面的章節中&#xff0c;OSPF可以劃分區域&#xff0c;減輕單區域里面LSDB的規模&#xff0c;從而減輕路由器的負荷&#xff0c;雖然OSPF能夠劃分區域&#xff0c;但是依舊需要維護域間路由和外部路由&#xff0c;這樣隨著網絡規模的不斷擴大&#xff0c;路由器所維護的LSDB…

實時開發IDE部署指南

&#x1f525;&#x1f525; AllData大數據產品是可定義數據中臺&#xff0c;以數據平臺為底座&#xff0c;以數據中臺為橋梁&#xff0c;以機器學習平臺為中層框架&#xff0c;以大模型應用為上游產品&#xff0c;提供全鏈路數字化解決方案。 ?杭州奧零數據科技官網&#xff…

深入解析 RAGFlow:文件上傳到知識庫的完整流程

在 RAGFlow 這樣的檢索增強生成&#xff08;RAG&#xff09;系統中&#xff0c;知識庫是其核心。用戶上傳的文檔如何高效、可靠地轉化為可檢索的知識&#xff0c;是系統穩定運行的關鍵。今天&#xff0c;我們就來深入探討 RAGFlow 中文件上傳到知識庫的完整流程&#xff0c;揭秘…

cad_recognition 筆記

Hubch/cad_recognition | DeepWiki https://github.com/Hubch/cad_recognition winget install python.python.3.10 python -m venv venv micromamba activate ./venv pip install paddleocr2.9.0 pip install poetry pip install moviepy1.0.3 下次要用conda建環境 或者…

基于odoo17的設計模式詳解---構建模式

大家好&#xff0c;我是你的Odoo技術伙伴。在Odoo開發中&#xff0c;創建一個簡單的記錄可能只需要一行 self.env[res.partner].create({name: New Partner})。但如果我們要創建一個復雜的對象&#xff0c;比如一個包含了特定上下文、具有多個可選配置、并且需要執行一系列關聯…

暑假算法日記第四天

目標?&#xff1a;刷完靈神專題訓練算法題單 階段目標&#x1f4cc;&#xff1a;【算法題單】滑動窗口與雙指針 LeetCode題目:2953. 統計完全子字符串1016. 子串能表示從 1 到 N 數字的二進制串其他: 今日總結 往期打卡 2953. 統計完全子字符串 跳轉: 2953. 統計完全子字符串…

Linux 常用命令大全(2025簡明版)

&#x1f9ed; 一、文件和目錄操作命令說明ls列出目錄內容ls -l以列表形式顯示&#xff08;含權限&#xff09;cd /path切換目錄pwd顯示當前路徑mkdir dir創建目錄mkdir -p dir/subdir遞歸創建目錄rm file刪除文件rm -r dir刪除目錄&#xff08;遞歸&#xff09;rm -rf dir強制…

React Ref 指南:原理、實現與實踐

前言 React Ref&#xff08;引用&#xff09;是React中一個強大而重要的概念&#xff0c;它為我們提供了直接訪問DOM元素或組件實例的能力。雖然React推崇聲明式編程和數據驅動的理念&#xff0c;但在某些場景下&#xff0c;我們仍需要直接操作DOM或訪問組件實例。本文將深入探…

4.權重衰減(weight decay)

4.1 手動實現權重衰減 import torch from torch import nn from torch.utils.data import TensorDataset,DataLoader import matplotlib.pyplot as plt def synthetic_data(w,b,num_inputs):Xtorch.normal(0,1,size(num_inputs,w.shape[0]))yXwbytorch.normal(0,0.1,sizey.shap…

OpenCV開發-初始概念

第一章 OpenCV核心架構解析1.1 計算機視覺的基石OpenCV&#xff08;Open Source Computer Vision Library&#xff09;作為跨平臺計算機視覺庫&#xff0c;自1999年由Intel發起&#xff0c;已成為圖像處理領域的標準工具。其核心價值體現在&#xff1a;跨平臺性&#xff1a;支持…

LeetCode 930.和相同的二元子數組

給你一個二元數組 nums &#xff0c;和一個整數 goal &#xff0c;請你統計并返回有多少個和為 goal 的 非空 子數組。 子數組 是數組的一段連續部分。 示例 1&#xff1a; 輸入&#xff1a;nums [1,0,1,0,1], goal 2 輸出&#xff1a;4 解釋&#xff1a; 有 4 個滿足題目要求…

【論文解讀】Referring Camouflaged Object Detection

論文信息 論文題目&#xff1a;Referring Camouflaged Object Detection 論文鏈接&#xff1a;https://arxiv.org/pdf/2306.07532 代碼鏈接&#xff1a;https://github.com/zhangxuying1004/RefCOD 錄用期刊&#xff1a;TPAMI 2025 論文單位&#xff1a;南開大學 ps&#xff1a…

Spring中過濾器和攔截器的區別及具體實現

在 Spring 框架中&#xff0c;過濾器&#xff08;Filter&#xff09; 和 攔截器&#xff08;Interceptor&#xff09; 都是用于處理 HTTP 請求的中間件&#xff0c;但它們在作用范圍、實現方式和生命周期上有顯著區別。以下是詳細對比和實現方式&#xff1a;核心區別特性過濾器…