当前位置: 首页 > news >正文

【数字IC设计】DC自动添加门控时钟

简介

数字电路的动态功耗主要是由于寄存器翻转带来的,为了降低芯片内部功耗,门控时钟的方案应运而生。作为低功耗设计的一种方法,门控时钟是指在数据无效时将寄存器的时钟关闭,以此来降低动态功耗

在下图中,展示了加入门控时钟前后电路的变化。由图可知,采取门控时钟技术后,原先的MUX单元消失了(MUX数目和寄存器bit数目有关),但会增加1个额外的门控时钟单元。因此,插入门控时钟并不总是能带来面积上的收益,需要综合数据位宽来考虑。总结一下,就是:

  • 插入门控时钟单元后,电路中的MUX就不需要了,如果数据D是多bit的(一般都是如此),插入CG后的面积可能反而会减少;
  • 如果D是单bit信号,节省的功耗就比较少,但是如果D是一个32bit的信号,那么插入CG后节省的功耗就比较多了。

这里的决定因素就是D的位宽,若D的位宽很小,那么可能插入的CG面积比原来的MUX大很多,而且节省的功耗又很少,得不偿失。只有当D的位宽超过了一定的bit数后,插入CG的收益才会比较大。
关于这个临界值,不同的工艺可能不同,DC工具给的默认值是3。即,如果D的位宽超过了3bit,那么DC就会默认插入CG。
我们可以通过DC命令:

set_clock_gating_style -minimum_bitwidth 4

来控制芯片中,对不同位宽的寄存器是否自动插入CG。然而,一般情况我们都不会去修改它。
在这里插入图片描述

关于门控时钟的详细介绍,在文章中已经给出,这里不再赘述。

DC添加门控时钟

在实际的ASIC设计过程中,门控时钟不需要开发者自己写代码实现,完全可以通过对综合工具进行相应配置,让工具完成对电路添加合适的门控时钟。
下面是一个简单的关于门控时钟的实验:

RTL代码

数据宽度为3bit时:

module cg_top_w3 
(input  logic         clk,   input  logic         rst_n,   input  logic         vld_in,   input  logic [3-1:0] data_in,   output logic         vld_out,   output logic [3-1:0] data1_out,output logic [3-1:0] data2_out
);always@(posedge clk or negedge rst_n) beginif(!rst_n) beginvld_out <= 1'b0;   endelse beginvld_out <= vld_in;   end
endalways@(posedge clk or negedge rst_n) beginif(!rst_n) begindata1_out <= 'b0;   endelse if(vld_in) begindata1_out <= data_in;   end
endalways@(posedge clk or negedge rst_n) beginif(!rst_n) begindata2_out <= 'b0;endelse if(vld_in) begindata2_out <= data_in;endelse begindata2_out <= '0;end
endendmodule

数据宽度为8bit时:

module cg_top_w8 
(input  logic            clk,   input  logic            rst_n,   input  logic            vld_in,   input  logic [8-1:0]    data_in,   output logic            vld_out,   output logic [8-1:0]    data1_out,   output logic [8-1:0]    data2_out                                   
);always@(posedge clk or negedge rst_n) beginif(!rst_n) beginvld_out <= 1'b0;   endelse beginvld_out <= vld_in;   end
endalways@(posedge clk or negedge rst_n) beginif(!rst_n) begindata1_out <= 'b0;   endelse if(vld_in) begindata1_out <= data_in;   end
endalways@(posedge clk or negedge rst_n) beginif(!rst_n) begindata2_out <= 'b0;endelse if(vld_in) begindata2_out <= data_in;endelse begindata2_out <= '0;end
endendmodule

两者对应的tcl文件分别为:

set_app_var search_path ./LM
set_app_var target_library sc_max.db
set_app_var link_library sc_max.db
read_file -format sverilog {./cg_top_w3.sv}
check_design
create_clock -period 10 [get_ports clk]
check_design
set_clock_gating_style -minimum_bitwidth 4
compile -gate_clock
report_clock
report_timing
report_area
write_file -format verilog -output cg_top_w3_netlist.v

set_app_var search_path ./LM
set_app_var target_library sc_max.db
set_app_var link_library sc_max.db
read_file -format sverilog {./cg_top_w8.sv}
check_design
create_clock -period 1 [get_ports clk]
check_design
set_clock_gating_style -minimum_bitwidth 4
compile -gate_clock
report_clock
report_timing
report_power > cg_top_w8.power.rpt
report_area > cg_top_w8.area.rpt
write_file -format verilog -output cg_top_w8_netlist.v

其中,set_clock_gating_style -minimum_bitwidth 4用于告诉综合工具数据位宽大于等于多少的时候,开启门控时钟。在进行编译的时候,需要加上-gate_clock选项,即compile -gate_clock

运行综合

输入dc进入dc shell后,输入source ./xxx.tcl文件运行,可以得到综合后的网表文件。
数据位宽为3bit:

/
// Created by: Synopsys DC Expert(TM) in wire load mode
// Version   : L-2016.03-SP1
// Date      : Sat Oct 14 10:44:29 2023
/module cg_top_w3 ( clk, rst_n, vld_in, data_in, vld_out, data1_out, data2_out);input [2:0] data_in;output [2:0] data1_out;output [2:0] data2_out;input clk, rst_n, vld_in;output vld_out;wire   N4, N5, N6, n1;dfcrq1 vld_out_reg ( .D(vld_in), .CP(clk), .CDN(rst_n), .Q(vld_out) );decrq1 \data1_out_reg[2]  ( .D(data_in[2]), .ENN(n1), .CP(clk), .CDN(rst_n), .Q(data1_out[2]) );decrq1 \data1_out_reg[1]  ( .D(data_in[1]), .ENN(n1), .CP(clk), .CDN(rst_n), .Q(data1_out[1]) );decrq1 \data1_out_reg[0]  ( .D(data_in[0]), .ENN(n1), .CP(clk), .CDN(rst_n), .Q(data1_out[0]) );dfcrq1 \data2_out_reg[2]  ( .D(N6), .CP(clk), .CDN(rst_n), .Q(data2_out[2]));dfcrq1 \data2_out_reg[1]  ( .D(N5), .CP(clk), .CDN(rst_n), .Q(data2_out[1]));dfcrq1 \data2_out_reg[0]  ( .D(N4), .CP(clk), .CDN(rst_n), .Q(data2_out[0]));inv0d1 U3 ( .I(vld_in), .ZN(n1) );an02d1 U4 ( .A1(vld_in), .A2(data_in[2]), .Z(N6) );an02d1 U5 ( .A1(data_in[1]), .A2(vld_in), .Z(N5) );an02d1 U6 ( .A1(data_in[0]), .A2(vld_in), .Z(N4) );
endmodule

可以看到,数据位宽为3bit时,网表中没有门控时钟单元。
数据位宽为8bit时:

/
// Created by: Synopsys DC Expert(TM) in wire load mode
// Version   : L-2016.03-SP1
// Date      : Sat Oct 14 10:44:38 2023
/module cg_top_w8 ( clk, rst_n, vld_in, data_in, vld_out, data1_out, data2_out);input [7:0] data_in;output [7:0] data1_out;output [7:0] data2_out;input clk, rst_n, vld_in;output vld_out;wire   N4, N5, N6, N7, N8, N9, N10, N11, net21;SNPS_CLOCK_GATE_HIGH_cg_top_w8 clk_gate_data1_out_reg ( .CLK(clk), .EN(vld_in), .ENCLK(net21) );dfcrq1 vld_out_reg ( .D(vld_in), .CP(clk), .CDN(rst_n), .Q(vld_out) );dfcrq1 \data1_out_reg[7]  ( .D(data_in[7]), .CP(net21), .CDN(rst_n), .Q(data1_out[7]) );dfcrq1 \data1_out_reg[6]  ( .D(data_in[6]), .CP(net21), .CDN(rst_n), .Q(data1_out[6]) );dfcrq1 \data1_out_reg[5]  ( .D(data_in[5]), .CP(net21), .CDN(rst_n), .Q(data1_out[5]) );dfcrq1 \data1_out_reg[4]  ( .D(data_in[4]), .CP(net21), .CDN(rst_n), .Q(data1_out[4]) );dfcrq1 \data1_out_reg[3]  ( .D(data_in[3]), .CP(net21), .CDN(rst_n), .Q(data1_out[3]) );dfcrq1 \data1_out_reg[2]  ( .D(data_in[2]), .CP(net21), .CDN(rst_n), .Q(data1_out[2]) );dfcrq1 \data1_out_reg[1]  ( .D(data_in[1]), .CP(net21), .CDN(rst_n), .Q(data1_out[1]) );dfcrq1 \data1_out_reg[0]  ( .D(data_in[0]), .CP(net21), .CDN(rst_n), .Q(data1_out[0]) );dfcrq1 \data2_out_reg[7]  ( .D(N11), .CP(clk), .CDN(rst_n), .Q(data2_out[7]));dfcrq1 \data2_out_reg[6]  ( .D(N10), .CP(clk), .CDN(rst_n), .Q(data2_out[6]));dfcrq1 \data2_out_reg[5]  ( .D(N9), .CP(clk), .CDN(rst_n), .Q(data2_out[5]));dfcrq1 \data2_out_reg[4]  ( .D(N8), .CP(clk), .CDN(rst_n), .Q(data2_out[4]));dfcrq1 \data2_out_reg[3]  ( .D(N7), .CP(clk), .CDN(rst_n), .Q(data2_out[3]));dfcrq1 \data2_out_reg[2]  ( .D(N6), .CP(clk), .CDN(rst_n), .Q(data2_out[2]));dfcrq1 \data2_out_reg[1]  ( .D(N5), .CP(clk), .CDN(rst_n), .Q(data2_out[1]));dfcrq1 \data2_out_reg[0]  ( .D(N4), .CP(clk), .CDN(rst_n), .Q(data2_out[0]));an02d1 U3 ( .A1(vld_in), .A2(data_in[5]), .Z(N9) );an02d1 U4 ( .A1(data_in[4]), .A2(vld_in), .Z(N8) );an02d1 U5 ( .A1(data_in[3]), .A2(vld_in), .Z(N7) );an02d1 U6 ( .A1(data_in[2]), .A2(vld_in), .Z(N6) );an02d1 U7 ( .A1(data_in[1]), .A2(vld_in), .Z(N5) );an02d1 U8 ( .A1(data_in[0]), .A2(vld_in), .Z(N4) );an02d1 U9 ( .A1(data_in[7]), .A2(vld_in), .Z(N11) );an02d1 U10 ( .A1(data_in[6]), .A2(vld_in), .Z(N10) );
endmodule

可以看到,数据位宽为8bit时,网表中出现了门控时钟单元,即:

SNPS_CLOCK_GATE_HIGH_cg_top_w8 clk_gate_data1_out_reg ( .CLK(clk), .EN(vld_in), .ENCLK(net21) );

同时,由网表可知,data1_out是被门控了的,而data2_out没有被门控,这是因为data2_out在使能信号无效的时候没有保持自身的值,而是将它赋值为0。

面积比较

为了比较插入门控时钟前后电路的面积,我们进行了一个实验,即采用如下tcl脚本对数据位宽为8bit的设计进行了综合:

set_app_var search_path ./LM
set_app_var target_library sc_max.db
set_app_var link_library sc_max.db
read_file -format sverilog {./cg_top_w8.sv}
check_design
create_clock -period 1 [get_ports clk]
check_design
compile 
report_clock
report_timing
report_power > cg_top_w8_nocg.power.rpt
report_area > cg_top_w8_nocg.area.rpt
write_file -format verilog -output cg_top_w8_nocg_netlist.v

可以看到,该脚本和先前脚本的区别是取消了compile命令的-gate_clock选项。下面是综合报告给出的面积数据:
开启门控时钟的,总面积为114.9:
在这里插入图片描述

关闭门控时钟的,总面积为133.6:
在这里插入图片描述
由此可见,在数据位宽为8bit的情况下,对当前设计开启门控时钟可以节约14%的面积。

相关文章:

【数字IC设计】DC自动添加门控时钟

简介 数字电路的动态功耗主要是由于寄存器翻转带来的&#xff0c;为了降低芯片内部功耗&#xff0c;门控时钟的方案应运而生。作为低功耗设计的一种方法&#xff0c;门控时钟是指在数据无效时将寄存器的时钟关闭&#xff0c;以此来降低动态功耗。 在下图中&#xff0c;展示了…...

前端开发工具vscode

一、下载安装 https://code.visualstudio.com/ 二、安装插件 三、使用 ①、创建一个空目录 ②、利用vscode工具打开该目录 ③、将该目录设置为工作区 在工作区中添加文件&#xff0c;还可以进行浏览器访问&#xff08;提前安装了Live Server插件&#xff09; 为工具…...

网络基础2(1)

HTTP 1.应用层协议2.send和recv单独使用不安全3.URL4.urlencode和urldecode5.HTTP协议格式6.HTTP中的常见请求方法POST&&GET7.HTTP的状态码8.HTTP常见Header &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f6…...

系统文件IO、文件描述符fd、重定向、文件系统、动态库和静态库

目录 C文件接口系统文件I/O系统调用和库函数文件描述符0 & 1 & 2FILE和fd的关系文件描述符的分配规则 重定向重定向的本质输出重定向输入重定向追加重定向 dup2函数 FILE理解文件系统了解磁盘的物理结构逻辑抽象文件系统文件系统的图解和解析通过文件系统来理解ls -al通…...

一、K8S第一步搭建

一、初始化操作 1.1、关闭防火墙 systemctl stop firewalld systemctl disable firewalld关闭交换空间 swapoff -a # 临时 sed -ri s/.*swap.*/#&/ /etc/fstab # 永久重启才能生效 根据规划设置主机名 hostnamectl set-hostname <hostname>映射主机 cat >>…...

pwnable-1-fd

pwn的学习周期确实比较长&#xff0c;需要的前置内容也很多&#xff0c;了解到第一题还算比较简单的&#xff0c;那就先来体验一波~顺带附一波网站链接:&#x1f449;网站链接 题目 WP 最后一行给出了ssh链接方式&#xff0c;那就先连接一波 第一次连接会有第四行的询问&…...

队列的实现(c语言)

队列也是线性表&#xff0c;也是分为两种的&#xff1a;1、顺序队列 2、链队列 顺序队列 #include <stdio.h> #include <stdlib.h>typedef struct {char *base;int front;int erer;int size; }SqQueue;void initSqQueue(SqQueue *queue,int size){queue->base…...

雷电模拟器上使用第一个frida(五)用python实现逆向分析并模拟登陆

上篇通过hook确定了登录代码的位置&#xff0c;参考雷电模拟器上使用第一个frida&#xff08;四&#xff09;第一个HOOK之抓包-CSDN博客 接下来逆向分析一下&#xff0c;并用python实现其功能&#xff0c;并模拟登陆。...

基于Linux上MySQL8.*版本的安装-参考官网

本地hadoop环境安装好,并安装好mysql mysql下载地址及选择包 MySQL :: Download MyS的QL Community Server (Archived Versions) mysql安装步骤 下载与上传解压给权限 #mysql安装包上传到/opt下 cd /usr/local/ #解压到此目录 tar -xvf /opt/mysql-8.0.33-linux-glibc2.12-…...

git 项目管理操作

git stash: 保存当前工作进度 git stash save message... : 添加一些注释。 git stash pop : 恢复最新的进度到工作区 git remote prune origin&#xff1a;将本地分支与已删除的远程分支同步 git branch -d <branch-name> &#xff1a;删除分支 git branch -D <branc…...

数据结构--》掌握数据结构中的排序算法

当我们面对海量数据时&#xff0c;如何高效地将其排序是数据结构领域中一个重要的问题。排序算法作为其中的关键部分&#xff0c;扮演着至关重要的角色。 无论你是初学者还是进阶者&#xff0c;本文将为你提供简单易懂、实用可行的知识点&#xff0c;帮助你更好地掌握排序算法在…...

Kubernetes实战(三)-k8s节点设置cpu高于多少就不调度

1 k8s节点设置的概念和原理 k8s是Google开源的容器集群管理系统&#xff0c;用于自动化部署、扩展和管理容器化应用程序。在k8s中&#xff0c;Node是指容器运行的物理或虚拟机器。Node可以是一个物理机或一个虚拟机器&#xff0c;k8s通过其调度器将Pod调度到每个Node上。对于一…...

数学建模——平稳时间序列分析方法

目录 1、平稳性的Daniel检验 &#xff08;1&#xff09;Spearman相关系数假设检验 &#xff08;2&#xff09;时间序列平稳性的Danniel假设检验 案例 【模型分析】 1、原始数据at的平稳性检验 2、一阶差分序列的平稳性检验 3、二阶差分序列的平稳性检验 4、建立AR&#…...

Vuex使用方式及异步问题处理

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 目录 1.Vuex简介&#xff1a; 2.vuex获取值 2.1安装 2.2.菜单栏 2.3.模块 2.4使用 3.改…...

【Vue面试题二十七】、你了解axios的原理吗?有看过它的源码吗?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说下你的vue项目的目录结…...

LocalDateTime与时间戳

众所周知&#xff0c;如果想把 LocalDateTime 转为时间戳&#xff0c;需要先指定时区&#xff0c;然后才能转为时间戳&#xff0c;例如&#xff1a; LocalDateTime localDateTime LocalDateTime.now(); ZonedDateTime zonedDateTime localDateTime.atZone(ZoneId.systemDe…...

【Power BI】Power BI 入门指南:版本、下载和报表创建的步骤

文章目录 一、前言二、了解 Power BI 版本三、下载 Power BI Desktop四、如何开始使用 Power BI Desktop五、在 Power BI Desktop 中创建报表六、文末总结 一、前言 Power BI 是微软于 2013 年推出的产品&#xff0c;为一款商业智能与数据可视化工具。它通过引人注目的视觉效果…...

代码随想录算法训练营第23期day21| 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

目录 一、&#xff08;leetcode 235&#xff09;二叉搜索树的最近公共祖先 二、&#xff08;leetcode 701&#xff09;二叉搜索树中的插入操作 三、&#xff08;leetcode 450&#xff09;删除二叉搜索树中的节点 一、&#xff08;leetcode 235&#xff09;二叉搜索树的最近公…...

小程序页面路由传参的方法?

小程序页面路由传参的方法有三种&#xff1a; 1.URL参数传递&#xff1a;通过在页面跳转的URL中携带参数实现传参。可以使用wx.navigateTo或wx.redirectTo等跳转方法&#xff0c;并在URL中添加参数。 示例&#xff1a; // PageA.wxml <button bindtap"navigateToPage…...

Ubuntu下安装Python

Ubuntu下安装Python 预备知识一、Python安装Python 二、Anaconda安装Anaconda卸载Anaconda 三、Miniconda安装Miniconda 四、异同比较 预备知识 (1) Python是一种编程语言。 (2) Anaconda是一款包管理工具&#xff0c;用来管理Python及其他语言的安装包&#xff0c;预装了很多…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析

目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork&#xff08;创建个人副本&#xff09;步骤 2: Clone&#xff08;克隆…...