Design Compiler工具学习笔记(1)

news2024/12/23 23:46:38


 


本人做过FPGA设计的项目,后面想转 IC 设计方向。现在从 DC 工具的使用开始学起,DC 是新思科技的EDA软件,具体的安装见下面的文章:

Synopsys EDA Tools 安装问题记录https://blog.csdn.net/qq_43045275/article/details/127630241学习的过程就是啃书+看视频+看帖子。随我的学习进度同步更新~~~~

本篇文章就记录一下,DC的使用和配置。


目录

知识储备

实际操作

DC setup

1、.synopsys_dc.setup 配置

2、当前用户的目录

3、工程路径下添加 .synopsys_dc.setup

启动 DC

1、输入命令

2、读取设计文件

其他

list_libs

report_lib <库名称>

-help

 man

打印环境变量

 list_designs

 current_design

参考说明



知识储备

 target library 是最基本的一些门、触发器等基本器件的工艺信息。

link library 包括一些 第三方 IP对应的db格式文件。

 

 文件权限 3  > 2 >1

 

 

 




实际操作

DC setup

DC在启动前会加载配置文件,下面分别说明。分布在3个地方:DC的安装目录、

1、.synopsys_dc.setup 配置

1、软件安装目录

1、在DC安装的如下路径下面打开终端:

/Synopsys/DC2016_install_loc/admin/setup

2、在终端输入:

ls -al

3、执行如下命令:

gvim .synopsys_dc.setup

或者使用 :

gedit .synopsys_dc.setup

如果没有安装 vim,可以通过以下的命令来完成:

sudo apt install vim-gtk

打开后可以看到:

2、当前用户的目录

1、终端输入如下命令,切换到当前用户目录

cd ~

2、通过下面命令可以看到配置文件

ls -al

我的用户目录没有找到 .synopsys_dc.setup 文件,但是并不影响使用 DC。

3、工程路径下添加 .synopsys_dc.setup

下面是我的启动文件。

echo "=============-----------------\\\\\\\\-----------------============="
echo "********************* START LOAD MY .synopsys_dc.setup *********************"
echo "=============-----------------\\\\\\\\-----------------============="

set SYN_ROOT_PATH 		/home/xyb-ubuntu1604/XYB/MY_DC/Example_1
set RTL_PATH      		$SYN_ROOT_PATH/rtl
set CONFIG_PATH      	$SYN_ROOT_PATH/config
set SCRIPT_PATH      	$SYN_ROOT_PATH/script
set MAPPED_PATH      	$SYN_ROOT_PATH/mapped
set UNMAPPED_PATH      	$SYN_ROOT_PATH/unmapped


# define work directory
set WORK_PATH 			$SYN_ROOT_PATH/work
set DC_PATH				/home/xyb-ubuntu1604/XYB/Synopsys_Tool/DC2016
define_design_lib work  -path $WORK_PATH


set SYMBOL_PATH			/home/xyb-ubuntu1604/XYB/MY_STUDY_LIB/smic180/std_cell/fb_2005q4v1/aci/sc-x/symbols/synopsys
set LIB_PATH 			/home/xyb-ubuntu1604/XYB/MY_STUDY_LIB/smic180/std_cell/fb_2005q4v1/aci/sc-x/synopsys

set_app_var				search_path [list . $search_path $LIB_PATH \
										    $SYMBOL_PATH $RTL_PATH \
										    $SCRIPT_PATH		   \
										    ${DC_PATH}/libraries/syn]

# This virables are automatically set if you perform ultra command.
# Specify for use during optimization
# You do not need to be anything to access the standard library.
# DC is setup to use this lirary by default

set_app_var 			synthetic_library 	[list dw_foundation.sldb standard.sldb]
set_app_var 			target_library 		[list typical.db]

set_app_var 			link_library 		[list * ${target_library} dw_foundation.sldb]
set_app_var 			symbol_library 		[list smic18.sdb]

echo "=============-----------------\\\\\\\\-----------------============="
echo "********************* END OF LOAD MY .synopsys_dc.setup ********************"
echo "=============-----------------\\\\\\\\-----------------============="


echo "=============-----------------\\\\\\\\-----------------============="
echo "*********************** START source hs_name_rules.v ***********************"
echo "=============-----------------\\\\\\\\-----------------============="

# source -v -e ./hs_name_rules.tcl

echo "=============-----------------\\\\\\\\-----------------============="
echo "********************** END OF source hs_name_rules.v ***********************"
echo "=============-----------------\\\\\\\\-----------------============="

关于hs_name_rules.tcl 文件我没有在网上找到可用的文件,后面的命令暂且注释。

启动 DC

1、输入命令

dc_shell |tee dc_start.log

启动 DC 的同时,记录启动的log信息。

启动完成:

 

2、读取设计文件

read_verilog -rtl [list TOP.v]

 

设计文件源代码:

`define   RESET_STATE  3'b000 
`define   FETCH_INSTR  3'b001
`define   READ_OPS     3'b010
`define   EXECUTE      3'b011
`define   WRITEBACK    3'b100

module TOP(Clk, Reset, Crnt_Instrn, Zro_Flag, Carry_Flag, Neg_Flag, Return_Addr, Current_State, PC);
        input                   Clk;
        input                   Reset;
        input   [31:0]  Crnt_Instrn;            // Current Executing Inst
        input           Zro_Flag, Carry_Flag, Neg_Flag; // Flags from ALU or Stack
        input   [7:0]   Return_Addr;
        output  [2:0]   Current_State;          // CurrentState from Control FSM 
        output  [7:0]   PC;     // Program Count

        wire                    Incrmnt_PC, Ld_Brnch_Addr, Ld_Rtn_Addr;
        wire    [2:0]   CurrentState;

        FSM     I_FSM (
                .Clk(Clk),
                .Reset(Reset),
                .CurrentState(CurrentState)
        );


        DECODE  I_DECODE (
                .Zro_Flag(Zro_Flag),
                .Carry_Flag(Carry_Flag),
                .Neg_Flag(Neg_Flag),
                .CurrentState(CurrentState),
                .Crnt_Instrn(Crnt_Instrn),
                .Incrmnt_PC(Incrmnt_PC),
                .Ld_Brnch_Addr(Ld_Brnch_Addr),
                .Ld_Rtn_Addr(Ld_Rtn_Addr)
        );


        COUNT   I_COUNT (
                .Reset(Reset),
                .Clk(Clk),
                .Incrmnt_PC(Incrmnt_PC),
                .Ld_Brnch_Addr(Ld_Brnch_Addr),
                .Ld_Rtn_Addr(Ld_Rtn_Addr),
                .Imm_Addr(Crnt_Instrn[7:0]),
                .Return_Addr(Return_Addr),
                .PC(PC)
        );


        assign  Current_State   = CurrentState;

endmodule


module FSM(Clk, Reset, CurrentState);

        input                   Clk, Reset;     // CPU Clock
                                                // CPU Reset
        output  [2:0] CurrentState;     // Current State of FSM

        reg [2:0]       Current_State, Next_State;

        always @(Reset or Current_State) begin
                case (Current_State)
                `RESET_STATE: begin
                        Next_State      <= `FETCH_INSTR;
                end
                `FETCH_INSTR: begin
                        Next_State      <= `READ_OPS;
                end
                `READ_OPS: begin
                        Next_State      <= `EXECUTE;
                end
                `EXECUTE: begin
                        Next_State      <= `WRITEBACK;
                end
                `WRITEBACK: begin
                        Next_State      <= `FETCH_INSTR;
                end
default : begin
Next_State <= `RESET_STATE;
end
                endcase
        end


        always @( posedge Clk) begin
                if (Reset == 1'b1) begin
                        Current_State   <= `RESET_STATE;
                end else begin
                        Current_State   <= Next_State;
                end
        end


        assign  CurrentState    = Current_State;

endmodule




module DECODE(Zro_Flag, Carry_Flag, Neg_Flag, CurrentState, Crnt_Instrn, Incrmnt_PC, Ld_Brnch_Addr, Ld_Rtn_Addr);
        input                   Zro_Flag, Carry_Flag, Neg_Flag; // "Zero" Flag from DATA_PATH
                                                                // "Carry" Flag from DATA_PATH
                                                                // "Negative" Flag from DATA_PATH


        input [2:0]     CurrentState;                           // CurrentState from FSM


        input   [31:0]  Crnt_Instrn;                            // Current instruction under execution
                                                                // from Instruction Latch


        output                  Incrmnt_PC, Ld_Brnch_Addr, Ld_Rtn_Addr; // Increments PC (in WRITEBACK cycle)
        reg                     Incrmnt_PC;                     // appended automatically by vhdl2verilog.

        // Load Immediate add from Instrn Latch 
        // into PC (in WRITEBACK cycle)
        // Load Return addr from Stack into PC (in WRITEBACK cycle)

        reg                     Brnch_Addr, Rtn_Addr, Take_Branch;
        reg                     Neg, Carry, Zro, Jmp;

        always @(Take_Branch or CurrentState or Crnt_Instrn or Zro_Flag or Carry_Flag or Neg_Flag or Brnch_Addr or Rtn_Addr) begin


                Brnch_Addr      <= 1'b0;
                Rtn_Addr        <= 1'b0;

                //  Determine if Jmp on False or Jmp on True
                if ((Crnt_Instrn[25]) == 1'b1) begin
                        Neg     =  ~Neg_Flag;
                        Carry   =  ~Carry_Flag;
                        Zro     =  ~Zro_Flag;
                        Jmp     = 1'b0;
                end else begin
                        Neg     = Neg_Flag;
                        Carry   = Carry_Flag;
                        Zro     = Zro_Flag;
                        Jmp     = 1'b1;
                end


                //  Determines which of the CONDITIONs needs to be checked and whether to jmp
                if (Crnt_Instrn[23:16] == 8'b00000000) begin
                        Take_Branch     <= Neg;
                end else if (Crnt_Instrn[23:16] == 8'b00000001) begin
                        Take_Branch     <= Zro;
                end else if (Crnt_Instrn[23:16] == 8'b00000010) begin
                        Take_Branch     <= Carry;
                end else if (Crnt_Instrn[23:16] == 8'b00111111) begin
                        Take_Branch     <= Jmp;
                end else begin
                        Take_Branch     <= 1'b0;
                end


                case (CurrentState)
                `WRITEBACK: begin
                        if (Crnt_Instrn[31:30] == 2'b00) begin
                                // For Jmp/Call with condition check
                                if ((Crnt_Instrn[29] == 1'b1 || Crnt_Instrn[28] == 1'b1) && Take_Branch == 1'b1) begin
                                        Brnch_Addr      <= 1'b1;
                                end
                                // For Return
                                if (Crnt_Instrn[27] == 1'b1) begin
                                        Rtn_Addr        <= 1'b1;
                                end
                        end
                        // If not Jmping or Rtrning the increment PC
                        if (Rtn_Addr == 1'b1 || Brnch_Addr == 1'b1) begin
                                Incrmnt_PC      <= 1'b0;
                        end else begin
                                Incrmnt_PC      <= 1'b1;
                        end
                end
                default: begin
                        Incrmnt_PC      <= 1'b0;
                end
                endcase
        end


        assign  Ld_Brnch_Addr   = Brnch_Addr;
        assign  Ld_Rtn_Addr     = Rtn_Addr;

endmodule



module COUNT(Reset, Clk, Incrmnt_PC, Ld_Brnch_Addr, Ld_Rtn_Addr, Imm_Addr, Return_Addr, PC);
        input                   Reset, Clk, Incrmnt_PC, Ld_Brnch_Addr, Ld_Rtn_Addr;     // Reset for the PC
                                                                                        // CPU Clock
                                                                                        // Increment PC
                                                                                        // Load Jmp/Call Addr from instruction
                                                                                        // Load Return Addr
        input   [7:0]   Imm_Addr, Return_Addr;  // Immediate Addr for Jmp/Call
                                                // Return addr from Stack

        output  [7:0]   PC;     // Addr of instruction to be fetched in
                                // the next Fetch Cycle

        reg     [7:0]   PCint;

        always @(posedge Clk) begin
                if (Reset == 1'b1) begin
                        PCint   <= 8'b00000000;
                end else if (Incrmnt_PC == 1'b1) begin          // Occurs in WRITEBACK cycle
                        PCint   <= PCint + 3'b001;
                end else if (Ld_Rtn_Addr == 1'b1) begin         // Occurs in WRITEBACK cycle
                        PCint   <= Return_Addr;
                end else if (Ld_Brnch_Addr == 1'b1) begin       // Occurs in WRITEBACK cycle
                        PCint   <= Imm_Addr;
                end
        end


        assign  PC      = PCint;

endmodule


其他

list_libs

report_lib <库名称>

 此命令可以查看某一工艺库的信息。我这里报错主要因为没安装 library compiler

-help

示例:

 man

查看某一个命令的详细用法

示例:

打印环境变量

 list_designs

 current_design

 


 


参考说明

1、数字IC设计之综合工具Synopsys DC(2)

2、新新新手Icer练习(二):Synopsys Design Compiler (DC) 基础操作


欢迎交流~~~ 

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

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

相关文章

5G无线技术基础自学系列 | CloudRAN架构

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 5G在核心网实现云化之后&#xff0c;更…

2.旋转的骰子(1)

1.动画——旋转的骰子 我们想用纯html 和CSS, 做一个旋转的筛子,骰子要有立体感,每个面上要有圆点,表示点数,并且骰子可以原地旋转。 2.分析需求——庖丁解牛

【DELM回归预测】基于matlab多元宇宙优化算法改进深度学习极限学习机数据回归预测【含Matlab源码 2230期】

⛄一、多元宇宙优化算法 MVO是Seyedali Mirjalili受到多元宇宙理论的启发提出来的元启发式优化算法。主要根据多元宇宙理论的3个主要概念-白洞、黑洞和虫洞&#xff0c;来建立数学模型。 MVO算法中的可行解对应宇宙&#xff0c;解的适应度对应该宇宙的膨胀率&#xff0c;在每…

【第三部分 | 移动端开发】2:流式布局

目录 | 移动端布局 | 流式布局&#xff08;百分比布局&#xff09; | 案例&#xff1a;京东搜索页相关知识点 | 移动端布局 | 流式布局&#xff08;百分比布局&#xff09; 介绍 核心思想&#xff1a;不使用固定布局&#xff0c;而是使用百分比 为了保护盒子的内容不因拉伸…

Spring AOP使用与原理

AOP介绍 SpringAOP核心概念 上述中已经出现的关键词有Advice(顶级的通知类/拦截器)、MethodInvocation(方法连接点)、MethodInterceptor(方法拦截器) SpringAOP在此基础上又增加了几个类&#xff0c;丰富了AOP定义及使用概念&#xff0c;包括 Advisor&#xff1a;包含通知(拦截…

基于密度的划分、DBSCAN(机器学习)

目录 居于密度的划分 DBSCAN算法 居于密度的划分 基于划分聚类和基于层次聚类的方法在聚类过程中根据距离来划分类簇&#xff0c;因此只能够用于挖掘球状簇。 为了解决这一缺陷&#xff0c;基于密度聚类算法利用密度思想&#xff0c;将样本中的高密度区域(即样本点分布稠密的…

图的概念(1)

图是什么&#xff1f; 首先&#xff0c;我们导入需要的包&#xff1f; import numpy as np import random import networkx as nx from IPython.display import Image import matplotlib.pyplot as plt 图的定义&#xff1f; 图表示物件与物件之间关系的数学对象&#xff0c;…

Metasploit入门用法

靶机介绍 Difficult&#xff1a; As always, it’s a very easy box for beginners. Goal&#xff1a; Get flag Download&#xff1a;https://www.vulnhub.com/entry/funbox-scriptkiddie,725/ 解题过程&#xff1a; 1.使用nmap进行端口扫描:Nmap -sV IP 2.使用search命令查…

yolov5加入分割头,多任务头

Yolov5同时进行目标检测和分割分割_MidasKing的博客-CSDN博客_yolov5分割 用YOLOv5ds训练自己的数据集,注意点!_用猪头过日子.的博客-CSDN博客 基于pytorch用yolov5算法实现目标检测与分割_无损检测小白白的博客-CSDN博客 原理 代码:

一种三自由度机器人的设计(CAD+Solidworks+文档)

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1课题研究背景及其意义 1 1.2三自由度机器人的发展与现状 1 1.3三自由度机器人的原理和介绍 3 1.4三自由度机器人目前存在问题 4 1.5三自由度机器人的力控制问题 4 1.6三自由度机器人的发展趋势 5 第2章 总体技术方案及系统组成 7 2.…

[附源码]SSM计算机毕业设计电子病历信息管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

AVL的单旋和双旋—附图超详细

文章目录前言&#xff1a;AVL 的插入寻找插入位置更新平衡因子调整AVL右旋左旋左右双旋右左双旋完整代码前言&#xff1a; 我们知道二叉排序树的搜索效率很高&#xff0c;能达到(logn)的时间复杂度&#xff0c;但是当元素有序导致二叉搜索树变成了一个长条&#xff08;图左&am…

游戏优化之空间划分

使用的动机 定义&#xff1a;将对象根据它们的位置存储在数据结构中&#xff0c;来高效地定位对象。 在游戏中&#xff0c;AI向最近的敌人攻击是很常见的&#xff0c;但如果有很多单位的话&#xff0c;他们AI需要频繁的查找单位&#xff0c;然后在检测是不是距离最近的单位&a…

Git工具使用全解

Git工具使用全解 文章目录Git工具使用全解1.企业开发中的版本控制器2.Git工具的使用场景3.Git工具操作流程(三板斧操作)4.Git工具的安装与常用命令4.1 Git的安装4.2 Git基本操作指令5.Git工具常见问题解决5.1 常见问题&#xff1a;分支冲突解决办法5.2 常见问题&#xff1a;合并…

Linux | 动静态库 | 动静态链接 | makefile库打包 | 第三方库使用

文章目录何为动静态库库文件的链接静态链接静态库打包动态链接动态库打包第三方库的使用静态库的使用动态库的使用在系统层面上的动态链接理解何为动静态库 静态库(.a)&#xff1a;在程序编译链接时将静态库二进制码拷贝到程序代码中&#xff0c;程序运行时不再需要外部的静态库…

面试:类相关---Java、Android有哪些类加载器

Android类加载器与Java类加载器的对比 - 掘金 Android | 类加载器与插件化 - 简书 相关复习&#xff1a; 面试&#xff1a;热修复原理_沙漠一只雕得儿得儿的博客-CSDN博客_android 热修复原理面试 面试&#xff1a;类的初始化过程_沙漠一只雕得儿得儿的博客-CSDN博客 什么…

内置 230+ 工具,它值得被官方纳入标准库

经过了几十年的发展&#xff0c;Python 的轮子生态越来越丰富&#xff0c;例如针对网络请求有 requests&#xff0c;针对命令行开发有 typer 等等&#xff0c;这些第三方库给我们的日常开发带来了极大的便利。 今天我推荐另一个第三方库 – Boltons&#xff0c;和大多数第三方…

go语言之不必要的拷贝

其实我也是个golang开发者~~ Go语言本来就以轻量快速著称&#xff0c;一位GitHub员工却偶然发现&#xff1a; 只改变一个字符的位置&#xff0c;能把一段代码运行速度提高足足42%。 简直就像是…… 这个简单有效的技巧一经发布&#xff0c;就引来众多程序员围观。 原作者自己…

论文中常见的拟合散点验证图(R语言版)

论文中常见的拟合散点验证图&#xff08;R语言版&#xff09; 如上图所示&#xff0c;是论文中常见的validation图&#xff0c;python也能实现相似的图绘。 今天先介绍R语言版&#xff0c;python改期再介绍吧 这张图需要依次实现下列功能&#xff1a; data实测与data模拟的散…

RabbitMQ系列【11】延迟队列

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言1. 过期消息实现延迟队列2. 过期队列实现延迟队列3. 插件实现延迟队列3.1 安装插件3.2 代码实现3.3 测试前言 延迟队列&#xff1a;即消息进入队列后不会立即被消费&#xff0c;只有到达指…