转载:IC设计之脚本语言

高风亮节 2022年10月13日 1,976次浏览

本文主要是想简单介绍一些常用的脚本(script)语言,学以致用,一个看似复杂的脚本,其实也是由很多简单的linux指令&语法构成,掌握后,对提高学习工作效率有很大帮助

目前,我在工作中接触得最多脚本&编程类语言如下

Cshell bashell perl tcl skill makefile C++ Verilog
我当时自学的时候发现把以上的电子书初略看了一下 ,发现对于初学者来说确实不那么友好,看完后久了没接触就忘得差不多了,现在脑子里回忆下,就只剩下一个大概印象,语言的这种东西啊,真的还是得平时积累memo,多看多写。

后来发现很多脚本语言都与C语言类似,后悔当初没有好好学习C++

什么是shell?

Shell 是一个用 C 语言编写的程序,既是一种命令语言,又是一种程序设计语言。
Linux 的 Shell 种类有很多,我常见的是Bashell 和 Cshell

Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
先简单介绍一下Bashell吧,Bash 也是大多数Linux系统默认的Shell

下图是以synopsys的hspice工具环境变量设置

我用bashell写的
a1bc095e000d03da9a51cf4f734b510e_v2-9c90ab9960912172a636f621d350e174_1440w

#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序

从脚本第一句能看出来#!/bin/bash,是用bashell写的,一般读脚本前我都会有意识看一下

alias命令

Linux alias命令用于设置指令的别名。
export命令

Linux export命令用于设置或显示环境变量。
比如:export Synopsys_Dir=/opt/synopsys
export的效力仅及于该次登陆操作。注销或者重新开一个窗口,export命令给出的环境变量都不存在了
输入export可以查看当前的所有环境变量。
如果你要在某个环境变量(比如PATH)中加入一些新的路径(如/bin/bash),可以使用如下命令格式
export PATH=/bin/bash:$PATH
执行命令

执行一个bashell脚本
1 bash filename
2 sh filename
3 ./filename
区别:在bash&sh命令下,filename文件可以无"执行权限",即没有rwx中的x权限。
对于./命令,filename文件必须要有x执行权限。
source命令

source命令是bash shell的内置命令,从c shell而来
. shell 与source命令相同,从Bourne shell而来
source 会强制执行脚本中的全部权限,忽略文件的权限
source 可以影响脚本的父shell权限,export只能影响子shell权限
其实上图的Bashell也可换用Cshell来写,里面的命令也有所不同
05f16ee8daa1237a0f6faad27f928b8f_v2-b9c8091a7cde56b40f2047fc12f11f5d_1440w

export换成setenv,其实类似

关于shell的话,我觉得最容易入手的脚本,也是我目前最常用的脚本语言

比如下图我用cshell,写的一个calibre lvs验证脚本
5c0f5ea2f7f0739fd5578547972aef07_v2-52502962055c3b1d0f532b6cb7ab8dd5_1440w

linux指令结合cshell语法,(foreach/if else/pushd popd sed awk )等,在工作中用处实在是太广了

接下来是perl语言

我觉得perl是真的强大,有秒杀shell的感觉,唯一缺点就是语法太苦涩了,看完我表示太难了

现在,我只会写一些简单的perl脚本,下图举了一个例子

#! /usr/bin/perl
如果一直都需要警告(warning),可以在 #! 这一行加上-w,如: #! /usr/bin/perl –w

$line就是变量 ,STDIN是用户输入的内容 eq 就是 = 的意思
c6196b2909cc1bb6e72adb574a414f23_v2-3cd699b8ef8c79f8f6855ab03ca9993a_1440w

当输入内容是\n时,那么结果输出:That was just a blank line!\n

如果输入是123时,那么结果输出:That line of input was: 123

上图举了个简单的例子,perl的语法中有很多函数,调用子程序,特别有意思

比如用perl写一个tree的脚本

[crazy@crazy_one calibre]$ tree -L 2
.
├── a.csh
├── cds.lib -> …/cds.lib
├── celllist
├── inv1
│ ├── CDL
│ ├── DRC
│ ├── GDS
│ └── LVS
├── inv2
│ ├── CDL
│ ├── DRC
│ ├── GDS
│ └── LVS
├── inv3
│ ├── CDL
│ ├── DRC
│ ├── GDS
│ └── LVS
└── run_all.csh
perl用途:在IC设计中一些需要统计仿真结果,文本格式转换的地方非常适用,执行速度快,比如用perl来处理各种log,在模拟IC中统计LPE抽出信息&各种条件下的仿真结果等

关于tcl脚本

Tcl = Tool Command Language (tickle) ,接触mentor和synopsy的工具的人应该有所了解
c5352a1ab8c7b53a8a4eb9152d013d06_v2-6fae3f1148756c658c738acae1f3f55e_1440w

tcl脚本中一些语法还是比较容易理解,在数字ic后端中分析时序,desin的信息等,非常推荐初学者学习

关于skill
Cadence提供二次开发的SKILL语言,它是一种基于通用人工智能语言—Lisp的交互 式高级编程语言 。SKILL可以与底层系统交互,也提供了访问Cadence各个工具的丰富接口。用户可以通过Skill语言来访问,并且可以开发自己的基于Cadence平台的工具。

下图是一个 Skill 程序的栗子,这个程序是用来把版图中不在格点上的图形,移到格点上
704e736ddfa2a3145a11f82a0feee4a3_v2-64c1f4cf797787cf2766a22be0f02bb9_1440w

skill的话用途也很广泛,在一些需要鼠标点击操作的地方,可以通过skill实现脚本自动化操作,提高效率,自动化,这个也是未来IC设计发展的趋势。

之前看过一篇关于将人工智能机器学习应用在IC设计中的文章,事实也不是没有可能,目前看来不成熟,没有大数据还是有点难以实现,涉及到专利的问题,核心技术非公开

关于makefile

Linux 的程序员应该很了解,主要是GNU make的用法、语法 ,使用Makefile的好处是能够使用一行命令来完成“自动化编译” ,make 是一个命令工具,它解释 Makefile 中的指令(应该说是规则),Makefile 中描述了工程中所有文件的编译顺序、规则。

makefile 关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、 功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能 操作,因为 makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。
makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率

之前有用makefile写过仿真教程 ,北冥有鱼:VCS和Verdi联合仿真教程

其实很多脚本语言深入的用法,我也不是很清楚,时间和精力有限,个人建议掌握一种常用的脚本语言,在工作中的话,正好可以学以致用。