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;核心区别特性过滤器…