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

news2025/1/11 6:05:05

简介

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

在下图中,展示了加入门控时钟前后电路的变化。由图可知,采取门控时钟技术后,原先的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) begin
    if(!rst_n) begin
        vld_out <= 1'b0;   
    end
    else begin
        vld_out <= vld_in;   
    end
end

always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        data1_out <= 'b0;   
    end
    else if(vld_in) begin
        data1_out <= data_in;   
    end
end

always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        data2_out <= 'b0;
    end
    else if(vld_in) begin
        data2_out <= data_in;
    end
    else begin
        data2_out <= '0;
    end
end

endmodule

数据宽度为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) begin
    if(!rst_n) begin
        vld_out <= 1'b0;   
    end
    else begin
        vld_out <= vld_in;   
    end
end

always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        data1_out <= 'b0;   
    end
    else if(vld_in) begin
        data1_out <= data_in;   
    end
end
    
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        data2_out <= 'b0;
    end
    else if(vld_in) begin
        data2_out <= data_in;
    end
    else begin
        data2_out <= '0;
    end
end

endmodule

两者对应的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%的面积。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1092921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Matlab】二维绘图函数汇总

目录 1. plot() 2. subplot() 3. fplot() 4. polarplot() 1. plot() plot() 函数是 Matlab 中最常用的绘图函数&#xff0c;用于在平面直角坐标系中绘制直线或曲线。 用法&#xff1a; plot(X,Y) plot(X,Y,LineSpec) plot(X1,Y1, ... ,Xn,Yn) 说明&#xff1a; plot(X,Y) …

【软考-中级】系统集成项目管理工程师-立项管理历年案例

持续更新。。。。。。。。。。。。。。。 目录 2023 上 试题一(18分) 2023 上 试题一(18分) A公司跨国收购了B公司的主营业务&#xff0c;保留了B公司原有的人员组织结构和内部办公系统。 为了解决B公司内部办公系统与A公司原有系统不兼容的问题&#xff0c;财务、人力和行政部…

ES6 -- 模块化(CommonJS、AMD、ES Module)

模块模式 将代码拆分成独立的块&#xff0c;然后再将这些块连接起来可以通过模块模式来实现。这种模式背后的思想很简单&#xff1a;把逻辑分块&#xff0c;各自封装&#xff0c;相互独立&#xff0c;每个块自行决定对外暴露什么&#xff0c;同时自行决定引入执行哪些外部代码…

springboot 制造装备物联及生产管理ERP系统

springboot 制造装备物联及生产管理ERP系统 liu1113625581

什么是js?(初步了解)

Javascript简称js,js是一种脚本语言,是不需要进行编译的,也是浏览器中的一部分,经常用在web客户端脚本语言,主要是用来给html增加动态功能。 而现在&#xff0c;由于Node.js的出现&#xff0c;JavaScript以及不局限与浏览器&#xff0c;用户也可以在服务端进行代码的编写&#…

gpt4.0和3.5区别在哪里:什么样的人适合使用gpt4.0?

GPT-4和GPT-3.5相比&#xff0c;就像是智能手机的新一代和上一代。升级了&#xff0c;功能多了&#xff0c;但核心都是让你的工作和生活更便捷。 联网能力 GPT-3.5&#xff1a;与世隔绝&#xff0c;不联网。 GPT-4&#xff1a;5月17日后能上网浏览&#xff0c;信息获取能力加…

Zabbix7.0 LTS新功能

一、简介 LTS是长期支持。LTS版本支持5年。如果更喜欢稳定性&#xff0c;未涉及到最新的功能&#xff0c;可以选次新的LTS或者更低解决方案。而Zabbix6.4是最新的主要版本不属于LTS版本。 二、新功能 从以下几个方面介绍部分新功能&#xff1a; 性能提升&#xff1a;内存储存…

二十四、【参考素描三大面和五大调】

文章目录 三种色面(黑白灰)五种色调 这个可以参考素描对物体受光的理解&#xff1a;素描调子的基本规律与素描三大面五大调物体的明暗规律 三种色面(黑白灰) 如下图所示&#xff0c;我们可以看到光源是从亮面所对应的方向射过来的,所以我们去分析图形的时候&#xff0c;首先要…

SpringMVC之WEB-INF下页面跳转@ModelAttributeIDEA tomcat控制台中文乱码问题处理

WEB-INF下页面跳转 ModelAttribute来注解非请求处理方法 用途&#xff1a;预加载数据&#xff0c;会在每个RequestMapping方法执行之前调用。 特点&#xff1a;无需返回视图&#xff0c;返回类型void IDEA tomcat控制台中文乱码问题处理 复制此段代码&#xff1a;-Dfile.e…

Fooocus AI绘画多种风格阿弥陀佛像

ai绘画越来越简单了&#xff0c;fooocus就是最近比较多人议论的一个stable diffusion 变种&#xff0c;由control net 作者针对 标midJourney的一款同类开源绘画工具。作为工具开发来说&#xff0c;肯定是越简单&#xff0c;用户越多。当然&#xff0c;模型用的还是SD官方模型。…

【运算符+逻辑控制】

文章目录 1.类型转换2.类型提升3.如何求字符串长度 4.字符串类型String的神奇用法 4.运算符算术运算符关系运算符逻辑运算符 5.位运算符移位运算符条件运算符6.java的输入7. 判断是否为闰年8.switch 语句9.while循环计算1~100之间的和计算1~100之间的奇数的和计算1~100之间偶数…

如何在小程序的个人中心页面进行装修

个人中心页面是小程序中非常重要的页面之一&#xff0c;它是用户与小程序进行互动和管理的主要入口。为了提升用户体验和个性化定制&#xff0c;商家可以对个人中心页面进行装修&#xff0c;包括设置顶部的背景图片和标题图片、我的服务项目等等。 下图&#xff0c;是小程序个人…

顺序表之(条条有注释助你吃透顺序表以及基于顺序表实现的通讯录)

顺序表 顺序表是线性表的一种&#xff0c;而线性表指的是具有相同特性的一类数据结构的统称&#xff0c;这些相同特性即在逻辑结构&#xff08;人为想象&#xff09;上一定是线性的&#xff0c;在物理结构&#xff08;内存存储中&#xff09;上不一定是线性的 顺序表的底层结构…

Java应用的防破解方案

前言 自从Java诞生以来&#xff0c;其字节码容易被反编译的问题就为程序员所诟病。由此也诞生了不少Java混淆工具和加壳软件。 Java应用的打包 exe4jlaunch4jJSmooth: 已经过时了jpackage&#xff1a;JDK自带的打包工具Installer工具&#xff1a;Inno Setup、NSIS(https://s…

Redis 最流行的图形化界面下载及使用超详细教程(带安装包)! redis windows客户端下载

另一个完全不同的redis图形化界面教程链接&#xff08;带安装包&#xff09;&#xff1a; https://blog.csdn.net/dream_ready/article/details/133817466 redis图形化界面的压缩包&#xff0c;直接解压缩即可&#xff0c;双击 Another Redis Desktop Manager.exe 即可打开 1、…

数据结构--》掌握数据结构中的查找算法

当你需要从大量数据中查找某个元素时&#xff0c;查找算法就变得非常重要。 无论你是初学者还是进阶者&#xff0c;本文将为你提供简单易懂、实用可行的知识点&#xff0c;帮助你更好地掌握查找在数据结构和算法中的重要性&#xff0c;进而提升算法解题的能力。接下来让我们开启…

IDEA中SpringBoot的启动类文件变成了一个J文件的解决方案

错误如下&#xff1a; 解决方案&#xff1a; 此时可以发现已经恢复成功了

使用Python进行钻石价格分析

钻石是最昂贵的宝石之一。钻石的质量通常以其重量&#xff08;克拉&#xff09;、净度、颜色和切工来评估。重量越大、净度越高、色彩纯净、切工精细的钻石价格也越高。其中&#xff0c;4C标准是衡量钻石质量的国际标准&#xff0c;即克拉&#xff08;Carat&#xff09;、净度&…

java中将数组转换成字符串

方法1&#xff1a;使用StringBuilder拼接 基本类型和引用类型兼容 int[] arr {1,2,4,6,9};StringBuilder sb new StringBuilder();for (int i 0; i < arr.length ; i) {if (i!arr.length-1){sb.append(arr[i]",");}else {sb.append(arr[i]);}}System.out.prin…

面向对象特征【封装性】

文章目录 OOP封装性内聚&#xff08;Cohesion&#xff09;耦合&#xff08;Coupling&#xff09; 封装性的优势最佳实践实际应用示例 OOP 面向对象编程&#xff08;OOP&#xff09;是计算机科学中的一个核心范例&#xff0c;它的其中一个重要特征是封装性。封装性有助于提高代码…