Vim 是 UNIX 文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff),语法高亮,全面的帮助系统,本地脚本(Vimscript),和便于选择的可视化模式。 Vim 专注于键盘操作,这意味着带来丝滑操作的同,你需要花时间来学习,并值得花上更多的时间来掌握。在一般工作中更多的使用gvim,它是vim添加图形化界面后的版本,在linux与windows环境使用都很便捷。
获取GVIM很容易,输入vim.org,下载你喜欢的vim版本即可,或者从任何你喜欢的途径获取。接下来为了使得演示同步进行,也会在本机安装系统(WIN11)下最新版本的GVIM。同时请确保你的PC已经安装了GVIM。
你也可以点击这里直接下载,或者进入vim官网,打开下载栏目,选择你要下载的文件下载。如下图所示,下载成功,你将会得到一个gvim.exe的可执行文件在你的下载目录。
最后选择一个安装地址即可完成安装。安装完成后会在桌面创建三个快捷方式,点击桌面快捷方式gVim 9.0即可打开gvim,其余删除即可。如下图所示。请不要进行其他操作,直接关闭该页面即可。接下来的章节会有更详细的介绍。
首先为了使得你的GVIM打开变得更加美丽,请将如下代码粘贴到你的_vimrc文件中。选中快捷方式,左键,选择打开文件所在位置,接下来向后退出一级即可找到该文件。该文件的作用以及下述代码的作用将会在后文进行介绍。更详细的GVIM配置将会在后文给出。
"---------User define set option----------- |
VIM有三种模式,分别是命令模式(Command mode/normal mode),输入模式(Insert mode)和底线命令模式(Last line mode)。如下图所示,输入模式是用来编辑文本的,底线命令模式与命令模式分别用来处理用户命令。下图也分别展示了进入与退出各个模式的按键。
这两种命令模式下有很多命令,一般在不需要过多的关注,在使用中慢慢学习,下面给出两个地址,为VIM命令大全,有关命令不在这里进行展示。
菜鸟教程 vim教程以及W3Cschool VIM教程重点推荐后者。
VIM本身提供了详细的帮助手册。打开你的VIM,输入:h
即可打开帮助界面,可以用:h _subject_
命令来访问。_subject_主题可以是命令,配置选项,热键绑定,插件等。使用:h
命令(不带任何subject)来获取帮助系统的相关信息以及在不同的主题之间切换。
VIM Tutor学习——基本的VIM操作经过简单的学习,练习就应该可以操作vim了。
我们前面打开的_vimrc
文件就是VIM的配置。个人理解VIM受欢迎的原因,就是因为精简,其将大量的功能交给用户自定义。因此刚刚开始使用VIM的新手可能不是很习惯,甚至使用了很久的老鸟,使用别人的VIM也会不习惯。这其中除去基本的操作,VIM的配置是一个定义用户个人使用方案的文件。
在Linux环境下,该文件为位于~/.vimrc
,在windows环境下,该文件位于你的你的VIM安装目录的后一级目录。名称为_vimrc
在_任意_系统中,在Vim中执行:echo $MYVIMRC
命令可以快速得知这个文件的位置和名称。 文件的路径会在屏幕的底部显示。
使用插件来提高效率,它能改变Vim的界面,添加新命令,代码自动补全,整合其他程序和工具,添加其他编程语言等功能。VIM提供了很多有用户分享的插件,可以理解为自定义的功能,这将是一个及其强大的功能,在vim官网首页也有对应的栏目,可以用户上传分享自己的插件。在后续将会更详细的介绍vim插件。
小贴士: 参阅Vim Awesome获取一些热门插件
同时vim8.0以上的版本提供了自身的插件管理器,对于入门以及不是很复杂的插件管理已经足够了,这里简单介绍使用方式,后续插件的安装就直接使用插件管理器进行管理即可。使用如下命令可以进行查看:help packages
插件管理器使安装和管理插件有相似的方法,而与在何种平台上运行Vim无关。它是一个像包管理器一样的用来管理其它Vim插件的插件。这里使用vim自带的插件管理器package。首先确保你的vim版本是在8.0以上。
然后在你的.vim
文件夹下新建一个文件夹,pack
,进入后执行
mkdir -p package/start |
这里其实是新建两个文件夹,作为以后插件安装更方便的使用。可以理解为,package可以是任何名称,主要用于表明你的插件是做什么的,可以是一个大的类,然后可以将你需要执行的插件解压缩放在对应插件的start目录下同样是一个文件夹,是一个小的类型,该文件夹中就是下载的插件,将暂时不需要执行的插件放置在opt目录下。使用可以调用:packadd package
目录下opt中的插件。这样一个插件新建一个文件夹,就可以不用担心插件管理的问题了。可以随时删除更新而不会影响其他的插件。同样还有一个好处是不需要联网,可以直接使用安装包进行插件的安装。更详细的使用将在后续的插件使用部分进行展示。
小贴士: windows环境下,将.vim
文件夹换成vimfiles
即可,问价的位置与_vimrc
在同级目录下哦
前面经过简单的介绍,同时经过一段时间的学习,GVIM的相关命令的进一步熟练,接下来的部分将会帮助你更好的使用GVIM,不仅炫酷且简洁,强大且灵活!!!!!!
本文参考艰难地学习 Vimscript本书大致分为三个部分:
~/.vimrc
可以快速、 方便地定制你的Vim环境。我也会将其概括性的总结,将其进一步总结精炼。按自己的理解进行重新划分,完成下面的部分。
Vim拥有很多选项可以设置以改变其展现方式。主要有两种选项:布尔选项(值为”on”或”off”)和键值选项。
执行如下命令:
:set number |
如果之前屏幕左侧没有显示行号,那么现在你就会看见行号。执行命令:
:set nonumber |
行号应该消失。number
是一个布尔选项:可以off、可以on。通过:set number
命令打开、 :set nonumber
命令关闭。所有的布尔选项都是这种配置方法。:set <name>
打开选项、:set no<name>
关闭选项。
你可以”切换”布尔选项的值,即从开启切为关闭或从关闭切为开启。执行命令:
:set number! |
行号会再次显示出来。再次执行命令:
:set number! |
行号应该会再次消失。添加一个!
(感叹号)至布尔选项后面就会切换对于选项的值。
你可以使用一个?
符号向Vim获取一个选项的当前值。执行如下命令并查看每个命令的 返回结果:
:set number |
注意第一次:set number?
命令返回的是number
而第二次返回的是nonumber
。
有些选项并不只有off或on两种状态,它们需要一个值。执行如下命令,查看返回结果:
:set number |
numberwidth
选项改变行号的列宽。你可以通过:set <name>=<value>
命令改变 非布尔选项的选项值,并使用:set <name>?
命令查看选项的当前值。来看看一些常用选项的值:
:set wrap? |
阅读:help 'number'
(注意有单引号)帮助文档。
阅读:help relativenumber
帮助文档。
阅读:help numberwidth
帮助文档。
阅读:help wrap
帮助文档。
阅读:help shiftround
帮助文档。
阅读:help matchtime
帮助文档。
按你自己的喜好在你的~/.vimrc
文件中添加几个设置选项。
简单来说就是,当我按下这个键时,我需要你放弃默认操作,按我的想法做。
我们先从normal模式,就是命令模式的键盘映射开始。随意在文本中敲写几行文字,然后运行命令:
:map - x |
将光标置于文本中的某处,按下-
。注意Vim删除了当前光标下的字符,就好像你按了x
一样。我们本来就有个按键用于 “删除当前光标下的字符” ,所以我们将-
重新映射到稍微有用的 功能。执行命令:
:map - dd |
现在移动光标到任意一行,再按下-
,这次Vim删除了整行的文本,因为dd
的功能就是删除整行。同时注意可以映射特殊字符,但是注释是不被允许的。如下举例:map <space> viw " Select word
。可以自行尝试。我们了解到,vim有三种模式,命令模式,输入模式与命令行模式,可以使用nmap
、vmap
和imap
命令分别指定映射仅在normal、visual、insert模式有效。同时还有这里还需要考虑递归。
尝试添加如下命令
:nmap x dd |
尝试将第二第三行分别使用"
来进行注释,查看在normal模式下的x的行为以及\
的行为。在使用非递归模式的时候,使用\
删除的是光标所在的字符,不加nore时,删除的是整个行。需要清楚,每一个*map
系列的命令都有个对应的*noremap
命令,包括:noremap
/nnoremap
、 vnoremap
和inoremap
。这些命令将不递归解释映射的内容。该何时使用这些非递归的映射命令呢?答案是: 任何时候 。是的,没开玩笑, *任何时候* 。
键盘映射方法可以使得我们使用一个按键具有一个新的功能,但是他会将按键原有的功能覆盖掉。vim提供了leader来解决这个问题。我们称这个“前缀”为“leader”。你可以按你的喜好设置你的leader键。运行命令:
:let mapleader = "," |
你可以替换,
为你喜欢的按键。推荐使用,
,因为这个键比较 比较容易按到。当你创建新的映射时,你可以使用<leader>
表示“我设置的leader按键”。运行命令:
:nnoremap <leader>d dd |
现在试试按下你的leader按键和d
,也就是,d
。Vim会删除当前行。Vim有另外一个“leader”成为“local leader“。这个leader用于那些只对某类文件 (如Python文件、HTML文件)而设置的映射。阅读:help mapleader
,help maplocalleader`获取相关信息
许多论文或文献中含有大量较复杂的公式或者符号,为了使文章中的公式符号更加规范、美观,现在很多人选用MathType软件来编辑公式。MathType具有非常强大的公式编辑能力,和我们常用的Office软件结合非常紧密,能非常便捷的嵌入word和ppt文档。
MathType与Office中自带的公式编辑器相比,具有以下的特点:
1.MathType对每一项符号都有简单说明
2.MathType分类更明细,说明更清楚,输入更方便
3.MathType输入公式时可在常用公式类型下整体输入
4.具有一些Office没有的符号
详见MathType与Office公式编辑器区别
1.首先打开MathType中文网的下载链接(https://www.mathtype.cn/xiazai.html),点击“免费下载”,目前最新版本是MathType7。
详见如何正确地安装MathType 7?
安装完成后,创建一个Mathtype7.reg
文件,将其移动到你的安装目录。文本内容如下。
Windows Registry Editor Version 5.00 |
然后放到你的安装目录下,运行即可,出现的警告点击确认。就可以完成修改,然后查看mathtype即可看到。帮助/关于MathType。
恭喜你哦!!!实现了MathType自由!!!
参考这里MathType7.x的破解使用
这里大致解释下,大致原理就是通过修改注册表来延长试用时间。你可以在对于对应目录下看到对应添加的内容。如下所示。
打开word。打开MathType。选择内联
然后在输入框输入你的公式,使用Ctrl+S
即可将输入框内的公式放到你的word鼠标所在位置。
参考这里 MathType的基本使用
本节为dc_labs系列的第一篇,主要根据自己对于lab的理解,简述实验的过程,同时对于笔者自己觉得需要进一步理解的进行总结学习。本节重点在于理解启动文件与DC的综合流程。建议与对应博文(DC学习笔记正式篇之零——综述与基本流程介绍)进行结合起来进行学习。该文为对应部分的实践篇的内容。本系列博文不会只是带着进行实验内容,个人觉得单纯跑一遍实验意义不大。会结合自己学习的理解进行部分展开。有问题欢迎留言一起学习。同时会对lab的内容进行一定的简化,完整的lab_guide(笔者已经进行了简单的翻译)请加入QQ群获取。
1,通过该实验可以学会配置DC的启动文件,同时对其中的配置部分进行理解学习
2,理解DC做综合的流程,在topo拓扑模式下完成综合,体验synthesis flow
3,学会自己获取DC的帮助界面进行相关命令的查询
该实验流程简单的对DC综合进行了一个概述,简单来说就是设置dc的启动文件,然后读入设计,读入约束,综合,生成报告,写入编译好的文件并保存,退出。这只是一个很top层的一个理解,重点在于清楚这些步骤,以及简单了解这些步骤是做什么就可以了,后续对于每一步,都有相关的实验。了解一个完整的过程,后续在一点点的深入。
对于该部分的重点这里再赘述一遍,理解启动文件的内容是什么,尽可能的学习自己进行相关文件的配置,其次是学习体验整个综合流程,最后是学会自己使用帮助命令查询自己需要理解的指令
进入lab1的目录,然后查看启动文件.synopsys_dc.setup
文件
cd lab1 |
我们可以看到对应的内容如下,其中重点在于source的两个文件,其余设置并不是必须的。aliases
相当于别名的设置,history
设置保存历史命令的条数,suppress_message
用来屏蔽相关的警告信息
第一个是common_setup.tcl
。另一个是dc_setup.tcl
文件,我们分别打开两个文件来看其中的内容。
更详细的库的设置说明在DC学习笔记正式篇之零——综述与基本流程介绍已经进行了解释,这里进行概述性的解释,其中左边的common文件就是对于一些变量进行定义,然后再dc_setup中调用进行设置,因此source的顺序也是有先后的。对其中的解释如下:
$mw_design_library
(实际上是变量设置的TOP_LIB)这里解释一些为什么还需要这些Milkyway相关的设置,这里使用的综合是dc在topo模式下的综合,已经有了相对严格真实的延时,而不需要使用线负载模型中的延时参数,会使得综合时序更接近真实情况。一般在自己实验阶段compile就已经可以了,这里我们需要使用的编译命令是compile_ultra。
我们前面介绍dc在启动时候会加载启动文件,这里启动DC以后进一步检查DC是否已经正确设置了我们启动文件中指定的路径以及相关库的信息。输入 dc_shell -topo
,看到如下打印信息,由于我并不是第一次打开,会出现 Error: Library 'TOP_LIB' already exists. (MWUI-004)
可以忽略。可以看到已经进入了topo模式,然后输入gui_start
就可以看到弹出来的GUI界面了。
[icer@ICer lab1]$ dc_shell -topo |
查看是否与设置的启动文件中的内容一致
printvar target_library |
输出如下:
dc_shell-topo> printvar target_library |
check_library |
请注意,检查报告逻辑库中缺少 4 个单元格。有一个表格列出了缺少的单元格。它们是“馈通”和“分接单元”,在物理布局中是必需的,但在逻辑设计中不需要(也称为“仅物理”单元)。因此可以忽略警告。输出如下
check_tlu_plus_files |
看到三个pass信息。
在GUI界面读入设计文件。成功以后link
设计。
命令行与log栏打印的成功信息如下
dc_shell-topo> link |
可以打开原理图,进行相关的探索。这里不进行详述,可以查看lab_guide相关内容,鼠标点开查看其标准单元为GRTCH的形式。同时是有逻辑层次的,注意可以和综合后进行对比。
write -hier -f ddc -out unmapped/TOP.ddc |
打印信息如下
dc_shell-topo> write -hier -f ddc -out unmapped/TOP.ddc |
查看dc内存中的设计与库文件
list_designs |
打印结果如下
dc_shell-topo> list_designs |
source scripts/TOP.con |
打印信息如下
dc_shell-topo> source scripts/TOP.con |
这里对于其中的约束内容不进行介绍,后续会有更详细的分析。
compile_ultra |
等待编译完成。在编译过程中监控日志。您将看到编译的不同优化阶段的各种表格。 “AREA”栏表示设计尺寸。 “WORST NEG SLACK”列指示设计中的关键或最差路径违反了多少,相对于其约束(实际延迟 - 预期延迟)。 “TOTAL NEG SLACK”是所有违反路径松弛的总和。当优化达到“收益递减”点,或者松弛数达到零时,这意味着设计中没有违反时序路径,compile_ultra结束。compile ultra 已自动展平或“取消分组”子设计 DECODE、FSM 和 COUNT,以生成最佳时序和面积结果。这里的原理图中的标准单元就已经不是GETCH的形式了。
这里笔者综合以后,原本的界面就会消失,需要重新打开。
注意如下是TOP层,已经没有层次划分了。
使用滚轮将其放大,看到,其中的标准单元已经不是GETCH的形式了。而是目标库里的。
write -hierarchy -format ddc -output /home/icer/Desktop/lab/dc_lab/DC_2013.12/lab1/unmapped/TOP.ddc |
也可以使用图形化的界面进行保存,选择TOP,选择file->save as,选择保存的目录即可。
rc |
其对应的意义在alias中已经进行定义,可以自行查看。
alias rc "report_constraint -all_violators" |
键入exit退出dc。
exit |
我们前面就是将命令一步一步输入的,也可以直接执行脚本来一步操作以上所有步骤,这里我们直接使用solution里提供的脚本即可。.solution
相当于答案,里边有对应的脚本,查看脚本,如下图所示,这里需要对source TOP.con的位置进行修改。
然后执行
dc_shell -topo -f .solutions/dc.tcl | tee dc.log |
等待编译结束即可。
假设我们需要查找带有clock的命令。先使用如下命令进行查找:
help *clock* |
输出结果如下:
dc_shell-topo> help *clock* |
假设我们需要查看all_clock这条命令,输入如下命令即可:
man all_clocks |
这里的man就是manual,手册的意思。就可以查看相关命令的解释举例等相关信息。
]]>原文标题:How to install Xilinx ISE Design Suite 14.7 on Ubuntu 18.04 (with drivers)
如何在lunux下安装ISE14.7!!升级了win11,发现ise彻底用不了了,然后在网上找相关的博文,基本上是明确了用不了了。只能使用替代方案,然后发现有两个方式linux或者是使用Xilinx提供的方案(个人感觉很蠢)。两种方式都会在后续给出,本文采取的是第一种,在linux下安装。你要是你不想自己安装,也可以直接使用博主提供的虚拟机直接使用。会在文末给出。亲测方法可行,不建议小白自行安装
首先说明,Ubuntu18.04是博主经过很多测试,redhat6.6/7.8.Ubuntu20多种环境测试安装后选择的可以实现功能的系统,建议使用该系统版本进行安装!!!折腾了两三天的时间……其中Ubuntu20版本太高,更多问题,redhat6.6等资料太少,而且驱动没有办法安装,换源,挂载本地源都试过了,ISE与modelsim都是可以的,就是没有办法安装驱动……
第一是自行搭建一个linux下的环境,第二是使用xilinx的方案。
下载安装文件。解压缩: sudo tar -xvf Xilinx_ISE_DS_Lin_14.7_1015_1.tar
打开终端,进入解压好的文件夹执行: sudo ./xsetup
注意!!!!不要改变文件夹的安装位置,默认就可以了,否则后续的安装配置将会与教程中的不一致。
source环境(就是配置ISE的执行环境)通过修改.bashrc来实现ise环境的配置。
添加下面的语句。执行vi ~/.bashrc
,添加source /opt/Xilinx/14.7/ISE_DS/settings64.sh
同时重新打开或者source ~/.bashrc
使得配置生效。最后打开ISE安装license即可。
执行下面的命令
sudo /opt/Xilinx/14.7/ISE_DS/ISE/bin/lin64/install_script/install_drivers/./install_drivers |
(This will give error code 1. Don’t worry about it.)
cd /opt/Xilinx/14.7/ISE_DS/ISE/bin/lin64/digilent/ |
sudo ./install_digilent.sh |
sudo apt-get install gitk git-gui libusb-dev build-essential libc6-dev-i386 fxload libftdi-dev |
cd /opt/Xilinx/14.7 |
sudo git clone git://git.zerfleddert.de/usb-driver |
cd usb-driver |
sudo make |
(Use make for both 32-bit and 64-bit)
./setup_pcusb /opt/Xilinx/14.7/ISE_DS/ISE/ |
最后提一句,自行测试的时候需要重新生成一个bit来进行测试,之前的环境的bit不知道怎么,好像是不能直接用的。
参考这里:
参考油管视频:https://www.youtube.com/watch?v=R-JE19thgi8
听声音像是一个印度的妹子……咖喱味,hhh
参考这里。
先看第一个老哥的,安装配置,这里提一句,不使用wine也是可以的,安装一个在你的windows环境下,然后生成一个,然后修改hostname以及ipconfig下对应的地址就可以了。地址进行批量替换,hostname只有一个。
ipconfig |
然后ether后面的就是需要替换的地址,输入hostname就可以查看自己的用户名,替换了就可以了,不需要再自己生成了。详细教程见:
Ubuntu 16.04 64位 安装 modelsim
ubuntu16.04 64位下ISE+modelsim的联合安装
然后关联使用就可以了。后续使用的问题会更新在本文中。
所有需要的文件我都放在下面的链接了。
包括
Xilinx_ISE_DS_Lin_14.7_1015_1 Linux下的ISE14.7及其安装教程
链接:https://pan.baidu.com/s/1KYKkWp4l_qn8v7ydW0Iarg?pwd=4kyo |
moselsim10.2所有组件,win以及linux下的,将其破解文件
链接:https://pan.baidu.com/s/1FtSNgaWf-8SDPazZwAmlwg?pwd=t5p2 |
lic。博主将自己生成的放进去,后续使用只需要进行修改即可。
链接:https://pan.baidu.com/s/1TB8ahm1oMQU98WAyE_PMRQ?pwd=isck |
下面是自己的虚拟机
链接:https://pan.baidu.com/s/138Ic5v0X3gPxo_Vil82KrA?pwd=hvqa |
经过前面的学习,已经知道了STA是在查什么,也对DC有了一定的了解,该部分对时钟的建模进行总结,对应的实践篇也在本文后给出。
我们需要分析时序路径,最基本的需要一个时钟,只要有了时钟,就可以解决寄存器到寄存器(Register to Register)的时序问题,换而言之,即计算建立时间保持时间,来验证是否符合预期,这将是占比很大的一部分时序路径。本节将主要介绍时钟的建模方式。
首先对时钟相关的基本知识进行介绍,然后在对DC中对时钟的处理进行总计学习。需要知道时钟的同步与异步与亚稳态的概念。
]]>前面介绍了STA部分,综合库的内容结束了基础部分,接下来是DC的使用篇。该部分首先会介绍DC的流程,然后对时序部分进行介绍,接下来是环境属性与较为复杂的时序约束的介绍。期间会有与之对应的dc_labs来帮助进行理解。dc_labs将会同步更新在对应的专栏下。需要结合起来进行学习!
本文将会首先回顾DC在IC flow中的位置与作用,然后介绍相关DC的理论,最后是实践部分,该实践部分使用的是lab 1中的内容。
DC Synthesis是IC设计前端与后端的分界线,或者说是桥梁,将RTL代码转化为门级网表的形式。需要使用SDC约束来体现PAP。更具体的可以参见博主的另一篇博文:数字IC设计流程总结
综合是使用软件的方法来设计硬件, 然后将门级电路实现与优化的工作留给综合工具的一种设计方法。 它是根据一个系统逻辑功能与性能的要求, 在一个包含众多结构、 功能、 性能均已知的逻辑元件的单元库的支持下, 寻找出一个逻辑网络结构的最佳实现方案。 即实现在满足设计电路的功能、 速度及面积等限制条件下, 将行为级描述转化为指定的技术库中单元电路的连接。 如图所示,一般综合分为三个阶段,转换,映射与优化。
先通过将RTL代码转化为通用的布尔(Boolean)等式,即GTECH(Generic Technology)格式;然后执行compile命令,该命令按照设计的约束对电路进行逻辑综合和优化,使电路能满足设计的目标或约束,并且使用目标工艺库中的逻辑单元映射成门级网表。
对于 2000.11 版的 Design Compiler, 用户可以通过四种方式启动 Design Compiler,他们是——dc_shell 命令行方式、 dc_shell -t 命令行方式、 design_analyzer 图形方式和design_vision
图形方式。 其中后面两种图形方式是分别建立在前面两种命令行方式的基础上的。
该方式以文本界面运行 Design Compiler。在 shell 提示符下直接输入”dc_shell”就可以进入这种方式。 也可以在启动 dc_shell 的时候直接调用 dcsh 的脚本来执行(dc_shell –f script)。目前这种方式用的已经不是很普遍。
该方式是以 TCL(Tool Command Language 相关专栏已经进行总结) 为基础的,在该脚本语言上扩展了实现 Design Compiler 的命令。用户可以在 shell 提示符下输入”dc_shell-t
”来运行该方式。 该方式的运行环境也是文本界面。 也可以在启动 dc_shell -t 的时候直接调用 tcl 的脚本来执行(dc_shell-t – f script
)。 TCL 命令行方式是现在推荐使用的命令行方式, 相对 shell 方式功能更强大, 并且在 Synopsys 的其他工具中也得到普遍使用。 注意这里shell与-t之间没有空格。
Design Analyzer 使用图形界面, 如菜单、 对话框等来实现 Design Compiler 的功能,并提供图形方式的显示电路。 用户可以在 shell 提示符下打“design_analyzer” 来运行该方式。 Design_analyzer 图形方式是今后要经常用到的图形界面方式。 由于它所对应的是dc_shell 的命令行方式, 所以我们不能在 design_analyzer 里运行 tcl 命令。 另外需要注意的是: Design analyzer 的工作模式不是用于编辑电路图的, 它只能用于显示 HDL 语言描述电路的电路图。
Design_vision 是与 tcl 对应的图形方式, 用户可以在 shell 提示符下打”design_vision”来运行该方式。由于它是在 Windows NT 下开发的,在工作站环境下不太普及。
Synopsys产品很类似,他们都有启动文件.synopsys_dc.setup
。其中PT需要单独的启动文件 .synopsys_pt.setup
。在后面ICC的学习中,我们也会看到启动文件。这是一个隐藏文件,需要使用ls -a
来查看。
启动文件顾名思义, 就是 DC 在启动的时候首先读入的文件, DC 在启动的时候, 会自动在三个目录下搜索该文件(如上图所示),对 DC 的工作环境进行初始化:
1,$SYNOPSYS/admin/setup 目录下, DC 安装的标准初始化文件
2,当前用户的$HOME 目录下, 一般用于设置一些用户本人使用的变量以及一些个性化设置。
3,DC 启动所在的目录下,一般用于与所在设计相关的设置。
其中后面的 setup 文件可以覆盖前面文件中的设置。 该文件主要包括库的设置、 工作路径的设置以及一些常用命令别名的设置等等。
由于 dcshell 的启动脚本和 tcl 的脚本语法不一致, 所以如果只有一种方式的启动脚本,那么运行另一种方式的时候会报错。 因此, DC 的启动脚本有一种兼容两种方式的格式。 下面是这种脚本的举例 。
它区别与其他启动脚本的特征是第一行有一个”#”, 说明它是 dc_shell 的一个子集, 同时兼容两种方式。 文件的第一段设置工艺库和链接库, 第二段设置符号库和搜索路径, 第三段设置 DC 命令的别名, 这一点与 Shell 相似。
这里不是很理解,大致就是加了#以后,就是可以运行两种模式的脚本了。这里一般保持启动方式与你的脚本语法一致就可以了,一般使用tcl形式启动dc,就是dc_shell-t
,语法也是tcl,同我们后面学习的保持一致就可以了。
要把DCSH脚本my_script.scr转化为DC-Tcl脚本my_script.tcl,可执行如下命令:
unix% dc-transcript my_scripts.scr my_script.tcl |
有了启动文件,我们需要在启动文件中定义一些变量。对应DC最少的信息为search_path、target_library、和link_library,下面对一般常用的系统变量进一步的解释。
顾名思义就是用来查找相关需要使用的工艺库呀,设计文件,脚本呀等
例如:
set search_path "./source/rtl ./scripts ./unmapped" |
指定工艺库的名称,是综合后电路网表要最终映射到的库, 读入的 HDL 代码首先由 synopsys 自带的 GTECH 库转换成 Design Compiler 内部交换的格式, 然后经过映射到工艺库和优化生成门级网表。 工艺库他是由 Foundary 提供的,一般是.db 的格式。 这种格式是 DC 认识的一种内部文件格式, 不能由文本方式打开。 .db
格式可以由文本格式的.lib
转化过来,他们包含的信息是一致的。 在基础篇中已经进行过介绍,这里不多赘述。命令示例如下:
set target_library my_tech.db |
link_library 设置模块或者单元电路的引用,对于所有 DC 可能用到的库,我们都需要在link_library 中指定, 其中也包括要用到的 IP。
值得注意的一点是: 在 link_library 的设置中必须包含’’, 表示 DC 在引用实例化模块或者单元电路时首先搜索已经调进 DC memory 的模块和单元电路, 如果在 link library中不包含’’,DC 就不会使用 DC memory 中已有的模块, 因此,会出现无法匹配的模块或单元电路的警告信息(unresolved design reference)。
图中设置了 link_library, 但是 DC 在 link 的时候却报错, 找不到 TOP 中引用的 DECODE
模块, 这说明 link_library 默认是在运行 DC 的目录下寻找相关引用。要使上例的 DECODE
能被找到, 需要设置 search_path。
举例:
set link_library " * my_tech.db" |
在初始化 DC 的时候,不需要设置标准的 DesignWare 库 standard.sldb 用于实现Verilog 描述的运算符,对于扩展的 DesignWare,需要在 synthetic_library 中设置,同时需要在 link_library中设置相应的库以使得在链接的时候 DC 可以搜索到相应运算符的实现。
symbol_library 是定义了单元电路显示的 Schematic 的库。用户如果想启动design_analyzer 或 design_vision 来查看、 分析电路时需要设置 symbol_library。 符号库的后缀是.sdb,加入没有设置,DC会用默认的符号库取代。
设计(Design) :一种能完成一定逻辑功能的电路,可以是独立的,也可以是层次化的设计。(当前设计)
单元(Cell):设计中包含的子设计的实例,也称为instance。
参考(Reference) :所指向的设计原型,即单元是参考的实例。
端口(Port):设计的基本输入、输出和双向的输入输出。
引脚(Pin):单元的输入输出和双向的输入输出。
线网(Net):端口和引脚间及引脚和引脚间的连线。
时钟(Clock):作为时钟信号源的引脚或端口。
库(Library):直接与工艺相关的一组单元的集合,是生成门级网表的基本单元或设计中被实例化的单元。
可以使用相关命令来搜索对象,后续我们将学习对对象进行约束,从而建立时序模型用来做时序仿真。
get_cells \*U* get_nets * get_ports CLK |
该部分分为理论与实践部分,理论部分根据DC User Guide 的The Synthesis Flow部分进行总结,会有一些自己的理解,实践部分根据dc_labs的lab1内容总结完成。这边介绍的会比较简单,因为是概述性的,有一个大体的印象,后续使用的时候会进一步说明。
图中列出了流程各步骤常用的基本 DC Expert 和 DC Ultra 命令。图中显示的所有命令都可以接受选项。但图中没有显示任何选项。
以下步骤概述了综合流程:
Design Compiler 的输入设计文件使用诸如 Verilog 或 VHDL 之类的硬件描述语言 (HDL) 编写。
指定链接、目标、符号、合成和物理库。可以在启动文件中指定。相关的作用在前文中已有介绍。
Design Compiler 可以读取 RTL 设计和门级网表。Design Compiler 使用 HDL Compiler 读取 Verilog 和 VHDL RTL 设计以及 Verilog 和 VHDL 门级网表。您还可以读取 .ddc 格式的门级网表。这里读入的方式一般有read或者是analyze&elaborate
read命令可以一步完成analyze&elaborate的工作,并且read命令还可以用来读取db、EDIF等格式的设计(analyze+elaborate仅能用于VHDL和verilog)。但是,read命令无法支持参数传递以及VHDL中的构造体选择等功能。语法格式为:
read_file [-format format_name] file_list |
•-format:指定设计读入的格式,可以ddc、db、verilog、vhdl、sverilog、edif、equation、pla、st等,对应不同格式命令可以替换为read_db、read_edif、read_verilog、read_vhdl、read_sverilog等。
•file_list:源代码文件名列表,文件名的指定可以通过TCL的链表命令{}、“”、[list file_name]等三种方法之一完成。
analyze命令用以分析HDL代码,在为设计建立通用库上的逻辑结构前检查设计的错误,并将中间结果存入指定的库中。语法格式为:
analyze [-library library_name] [-format verilog | vhdl | sverilog] file_list |
•-library:指定中间结果存放的库,即Linux系统下的一个目录,默认为当前目录,也可以用define_design_lib命令指定。
•-format:HDL源文件的类型,即verilog或vhdl或sverilog。
•file_list:源代码文件名列表,文件名的指定可以通过TCL的链表命令{}、“”、[list file_name]等三种方法之一完成。
举例:
dc_shell-t>analyze -f verilog [list ctrl_0723.v、datapath_0723.v、ram16s.v、ram16x1s.v、regfile.v、xram16.v、xr16.v、memctrl.v、vga.v、xsoc.v] |
elaborate命令用于建立设计的与工艺无关、即GTECH库上的结构级描述,为后续的优化和映射做好准备,支持参数传递;对设计进行描述,需要对各个设计单独进行。语法格式为:
elaborate design_name [-library library_name] [-parameters param_list] |
•deisgn_name:指需要进行描述的设计。
•-library:用于保存设计的结构级描述。
•-parameters:指定给设计传递的参数,若省略则参数使用缺省值;参数用“”括起来。
Design Compiler 要求您对要综合的设计环境进行建模。该模型包括外部操作条件(制造过程、温度和电压)。负载、驱动器、扇出等。它直接影响设计综合和优化结果。如果您不使用地形模式,则需要指定电线负载模型来估计电线长度对设计性能的影响。
注意:设计约束设置受您选择的编译策略的影响。流程步骤 5 和 6 是相互依赖的。编译策略在步骤 6 中讨论。
设计约束描述了设计目标,它们可包括时序或面积约束。依据设计是如何约束的,DC试图满足目标集。因为不实际的规范会导致面积增大、功耗增加和/或时序恶化,所以设计人员必须指定实际的约束。约束设计的基本命令如图所示。
您可以使用自上而下或自下而上的策略。这两种策略都有优点和缺点,具体取决于您的特定设计和设计目标。
用 Compile 命令执行综合与优化过程,还可以利用一些选项指导编译和优化过程。compile_ultra or compile
报告可以帮助我们进行迭代,分析,后续关于报告的使用也会跟进一步的介绍。
使用 write_file 命令保存综合设计。 Design Compiler 在退出前不会自动保存设计。您可以用 .ddc、Milkyway 或 Verilog 格式写出设计。
该部分参见dc_labs的lab1
该部分介绍了一些不需要知道但是不会特别影响你做综合的一些点,作为补充知识,进一步帮助理解。
术语“Synopsys公司设计约束”(又名SDC,Synopsys Design Constraints)用于描述对时序、功率和面积的设计要求,是EDA工具中用于综合、静态时序分析和布局布线最常用的格式。
DC命令基于Tcl语言。“工具命令语言”(又称Tcl,Tool Command Language)是一种非常流行的脚本语言,是常用于开发用户接口和嵌入式系统平台的应用程序。通过使SDC扩展到Tcl,特定于工具的命令可以与原生的Tcl结构,如变量、表达式、语句和子程序相混合,使其成为实现工具非常强大的语言。
真正的综合现在一般都是使用的是Ultra来进行的,一般是先使用compile来预编译,然后使用design_vision -topo模式来进行Compile_ultra的。这里我们可以看到哈,其加入了真正的RC,线延时等等一些真实的内容。所以可以简单的理解,一般我们实验或是学习,普通的dc_shell-t的compile,更高级,或是说更接近实际情况的其实是拓扑模式下的Compile_ultra。
参考DC_SG_11,点击这里 FLAG!!会单独开一篇
我们知道,你做设计最好是需要理解DC,STA的,一个设计的水平就取决于你对STA的理解。不可否认,功能是首先应该去考虑的问题,随着工具的逐渐强大,越来越多的设计问题可以通过工具来进行避免,但是这依旧不是一个设计人员不应该不懂得STA的理由。如下图所示
你需要给你的DC一个好的起点,记得看过一句话,大义是说,好的代码综合出来是好的电路,垃圾代码综合处理是垃圾电路!!我们需要注意下面的几点
该部分后续可能会开一个类似的系列!!留下一个坑:Verilog编码的艺术~ FLAG!!!!
]]>个人博客的搭建首先需要知道自己为什么需要搭建,才能选择一个合适的平台。笔者本身并不是做软件前端设计,基本上是没有基础的,搭建博客的目的就是为了给自己一个小小的慰藉,有一个自己的小平台,可以记录自己的留下来的痕迹,因为比较喜欢念旧啦~也是喜欢,并不要很多人来看,做一件事情开心最重要啦 ,只要自己开心,有没有关注其实也并不是那么重要的了,不是吗?有了自己的选择,就可以开始进一步的环境搭建。至于网站的内容,可以选择自己熟悉的内容,可以是你自己领域内的专业笔记,也可以是自己小小的心得体会,不想对别人说的话。
最后笔者也是小白,本文的角度同样如此。
github-page/gitee-page–>github-page+vercel–>云服务器
这里需要安装git与基本的使用。然后是安装nvs。nvs是用来安装配置node的。可以很方便的进行node的版本管理。强烈建议使用nvs来进行nodejs的安装。
想搭建一个人博客,开始接触的可能是部署在GitHub上。笔者自己使用的是Hexo框架,使用的主题开始是ayer,后来使用的是butterfly,建议使用比较多的主题,好处是有对应的群,而且相对应的参考方案比较多。选的方式是看⭐标数目。后续根据自己需要进行修改的时候更加方便。
注意千万选择使用的人比较多的主题,完全不用担心你的博客最后会没有特点!!!博客最开始只是提供的一个框架而已
图床开始的时候选择的是GitHub+PicGo+jsd。然后jsd挂了……但是要是可以科学上网的话是可以访问的,我可以随时挂代理,所以可以对于GitHub Page继续使用该方案。
该路径就是GitHub图床的路径,然后本地push,后续使用的时候只需要将路径进行全部替换,就可以将使用cos的图片换到使用jsd加速的图片,然后再服务器以及GitHub上分别进行部署.同时图片也会再本地进行保留,数据的安全有了更好的保证.就算图床无法使用,本地的图片也还是在的.
这里简单总结下 准备部署如下
部署平台 | 对应图床 | 其他 |
---|---|---|
GitHub | jsd+GitHub | PicGo+Typora+vercel |
CSDN(独立) | 独立 | 独立 |
开始的时候很喜欢折腾,后来太累了,只有心思维护一个平台,选择了CSDN以及自己的网站。
]]>该文章配合hexo博文写作——Typora的使用进一步完善博文写作的准备部分。
在新建文章时,Hexo 会根据 scaffolds
文件夹内相对应的文件来建立文件。打开scaffolds
目录下,修改post.md
的内容。如下是博主设置的文章模板,以后新建文章如下模板会自动添加在文章头。
--- |
他是Hexo的一种特殊布局:draft
,这种布局在建立时会被保存到 source/_drafts
文件夹,您可通过 publish
命令将草稿移动到 source/_posts
文件夹,该命令的使用方式与 new
十分类似,您也可在命令中指定 layout
来指定布局。
hexo publish [layout] <title> |
草稿默认不会显示在页面中,您可在执行时加上 --draft
参数,或是把 render_drafts
参数设为 true
来预览草稿。
hexo new [layout] <title> |
您可以在命令中指定文章的布局(layout),默认为 post
,可以通过修改 _config.yml
中的 default_layout
参数来指定默认布局。Hexo
有三种默认布局:post
、page
和 draft
。
布局 | 路径 |
---|---|
post | source/_posts |
page | source |
draft | source/_drafts |
simple
{% note simple %} |
默認 提示塊標籤
default 提示塊標籤
primary 提示塊標籤
success 提示塊標籤
info 提示塊標籤
warning 提示塊標籤
danger 提示塊標籤
modern
{% note modern %} |
默認 提示塊標籤
default 提示塊標籤
primary 提示塊標籤
success 提示塊標籤
info 提示塊標籤
warning 提示塊標籤
danger 提示塊標籤
使用mermaid标签可以绘制Flowchart(流程图)、Sequence diagram(时序图 )、Class Diagram(类别图)、State Diagram(状态图)、Gantt(甘特图)和Pie Chart(圆形图),具体可以查看mermaid文档。
修改 主題配置文件
# mermaid |
写法:
{% mermaid %} |
举例:
pie title Key elements in Product X "Calcium" : 42.96 "Potassium" : 50.05 "Magnesium" : 10.01 "Iron" : 5
Demo 1 - 预设选择第一个【默认】
{% tabs test1 %} |
*This is Tab 1.*
*This is Tab 2.*
*This is Tab 3.*
Demo 2 - 预设选择tabs
{% tabs test2, 3 %} |
This is Tab 1.
This is Tab 2.
This is Tab 3.
Demo 3 - 没有预设值
{% tabs test3, -1 %} |
This is Tab 1.
This is Tab 2.
This is Tab 3.
Demo 4 - 自定义Tab名 + 只有icon + icon和Tab名
{% tabs test4 %} |
tab名字為第一個Tab
只有圖標 沒有Tab名字
名字+icon
This is my website, click the button {% btn 'https://butterfly.js.org/',Butterfly %} |
This is my website, click the button Butterfly
This is my website, click the button Butterfly
This is my website, click the button Butterfly
This is my website, click the button Butterfly
This is my website, click the button Butterfly
{% btn 'https://butterfly.js.org/',Butterfly,far fa-hand-point-right,larger %} |
臣亮言:{% label 先帝 %}创业未半,而{% label 中道崩殂 blue %}。今天下三分,{% label 益州疲敝 pink %},此诚{% label 危急存亡之秋 red %}也!然侍衞之臣,不懈于内;{% label 忠志之士 purple %},忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气;不宜妄自菲薄,引喻失义,以塞忠谏之路也。 |
臣亮言:先帝 创业未半,而中道崩殂 。今天下三分,益州疲敝 ,此诚危急存亡之秋 也!然侍衞之臣,不懈于内;忠志之士 ,忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气;不宜妄自菲薄,引喻失义,以塞忠谏之路也。
宫中、府中,俱为一体;陟罚臧否,不宜异同。若有作奸 、犯科 ,及为忠善者,宜付有司,论其刑赏,以昭陛下平明之治;不宜偏私,使内外异法也。
在前一部分介绍了什么是STA,STA在数字IC设计流程中的位置,优点。该博文继续介绍STA,先通过一个简单的例子来引入,然后介绍一些STA的有关定义。我们的目的是为了建立一个模型,将我们的Verilog HDL语言综合的Schematic原理图转换为数学模型,这样就能使用计算机来进行分析时序。从而可以保证时序收敛。
先看下面一个例子,先做一个简单的介绍,有没有接触过的定义会在后面进行介绍,主要是通过引例使得后面的定义更好理解。可以暂时不需要理解,但是看完本后可以通过这个引例来进一步进行学习。下面的几个图可以理解是时序分析的核心了,理解他们可以帮助理解很多问题
T1:为基准时钟与时钟到达一级寄存器的偏斜时间
T2:为基准时钟与时钟到达二级寄存器的偏斜时间
Tco:数据在寄存器中传输的延时
Tsu:建立时间,寄存器的时钟信号有效沿到来之前数据必须稳定的最小时间
Thold:保持时间,寄存器的时钟信号有效沿到来之后数据必须稳定的最小时间
Tdata:数据经过一级寄存器(或经过组合逻辑),进入二级寄存器输入端的延时时间
CLK1:基准时钟经过延时后达到一级寄存器的时钟
CLK2:基准时钟经过延时后达到二级寄存器的时钟
数据到达时间(Data arrival time):数据从D发送寄存器的D到接收寄存器的D端的时间 T1+ Tco+ Tdata
要求数据到达时间(Data Require time):根据两级寄存器的是时钟偏移,加上数据的建立时间,计算要求数据到达的时间(T-Tsu)+Tcycle。这里的数据到达时间计算以及数据到达时间的计算都是从基准时钟的发射沿开始计算的。
上边的是建立时间的例子,下面的图用来展示保持时间的例子。
对于情况1,由于数据到达时间太短了,数据还没有取到,而下一个数据已经来了,因此就会使得错过这个数据。
情况2是正常的保持时间的情况。
1:从输入端口到FF的D端;Input To Register
2:从FF1的CLK端到FF2的D端;Register To Register
3:从FF2的CLK端到输出端口;Register To Output
4:从输入端口到输出端口。Input To Output,一般设计中这种情况是尽量避免的,具体原因在后续的学习中将会进行解释。
本质上传播延时是一个人为定义的逻辑门质量指标,没有实际的物理意义。
举例如下:
转换时间是指信号在两个特定电平之间转换所需要的时间。与之有关的是下降沿阈值与上升沿阈值的设置。如下所示。
时序弧是静态时序分析的基础,静态时序分析是基于时序弧数据的时序分析。时序弧是用来描述两个节点之间的时序信息来定义的,一般分为连线延时与单元延时。
连线延时是单元输出端口和扇出网络负载之间的延时信息。1,理想导线2,集总模型3,集总RC模型4,分布式RC模型5,传输线模型等一些模型是用来计算RC的值的。至于为什么计算,参考补充定义的CMOS逻辑设计补充知识点部分,后续的博文还有有对其的解释与使用方式。
单元延时是单元输入到输出端口之间的延时。
逻辑通过逻辑路径传播的总延迟称为路径延迟(path delay),包括了逻辑路径中经过各个逻辑单元(cell)和网络走线(net)的延迟。
组合时序弧是最基本的单元延时信息时序弧,主要用于表示组合逻辑单元的延时信息在时序信息文件中通过时序弧类型信息Combinational进行声明,如下所示。timing_type : combinational;
由于组合时序弧也是默认的时序弧类型,因此没有特别声明的时序弧就默认为组合时序弧。组合时序弧根据单元功能逻辑的不同,分为基于3种不同逻辑状态下的延时弧。
同向时序弧表示输入端信号变化方向与输出端信号变化方向一致的时序弧
反向时序弧表示输人端信号变化方向与输出端信号变化方向相反的时序弧
不定态时序弧表示输入信号变化方向与输出端信号变化方向无固定确定关系的时序弧
边沿时序弧用来表示时序单元从时钟信号有效沿到输出信号有效的延时信息。
复位清零时序弧用来表示具有复位清零端口的时序单元从复位清零信号有效沿到输出信号有效的延时信息。
三态使能时序弧用来表示三态逻辑单元从使能信号有效到输出的延时信息
建立时序弧用来表示时序单元获得正确数据信号所需要的约束信息,即在时钟沿有效前数据输入信号保持有效的时间信息。
保持时序弧也是用来表示时序单元获得正确信号所需要的约束信息,即在时钟沿有效后数据输入信号继续维持有效的时间信息。
类似于复位的建立时间。恢复时序弧用来表示具有复位清零端口的时序单元成功使能所需要的约束信息,即在时钟沿有效前使能信号保持有效的时间信息。
移除时序弧也是用来表示具有复位清零端口的时序单元成功使能所需要的约束信息,即在时钟沿有效后使能信号维持有效的时间信息。
脉宽时序弧也是用来表示时序单元获得正确信号所需要的约束信息,即时钟信号同一状态下维持有效的最小总时间信息。时钟信号脉冲过窄会导致时序单元本身无法工作,或是在组合逻辑路径传输中慢慢削弱而失真。
通过使用SDC
命令set min pulse width
来定义时钟信号的最小脉宽(minimum pulse width)
,示例命令如下:set_min_pulse_width-high 1.5[all_clocks]
set_min_pulse_width-low 1.0[all_clocks]
以上命令定义所有时钟高电平最小脉宽为1.5s,低电平最小脉宽为1ns。
在后续的逻辑单元库的内容可以与之相互补充,这里再解释定义的同时其实对逻辑单元库进行了一部分的解释。
时钟周期也称为振荡周期,定义为时钟频率的倒数。
时钟占空比是指时钟信号高电平在一个周期之内所占的时间比率,一般设计中,大部分的时钟占空比为50%,即占空比为0.5,说明高、低电平所占时间都为0.5个周期。但根据设计需要,也可以设计占空比不同的时钟信号。
指两个时钟周期之间存在的差值,这个误差是在时钟发生器内部产生。可能是PLL等固有原因引起的。
时钟偏斜(clock skew)是集成电路中一个时钟翻转的到达时间在空间上的差别(到达不同时钟树终点的时间差)。
可以使用set_clock_uncertainty命令显式指定时钟不确定度的值。在实现时钟树前,set_clock_uncertainty命令指定的值将包括时钟抖动、时钟偏斜估计值以及额外悲观度。看一个例子。
set_clock_uncertainty 0.2 [get_clocks USBCLK] |
上面这条命令中200ps的时钟不确定度可能是由50ps时钟抖动、100ps时钟偏斜以及50ps的额外悲观度组成的。
时钟延迟(clock latency)是指从时钟源到终点所花费的总时间。在逻辑设计的早期阶段,STA通常使用理想的时钟树来执行,因此分析的重点是数据路径(data path)
静态时序分析通常是在特定的工作条件(operating condition)下执行的,工作条件定义为工艺(process)、电压(voltage)和温度(temperature)的组合,简称PVT。
其中电压越高越好,温度越低越好,工艺偏差越小越好
半导体代工厂(foundry)为数字设计提供了3种加工工艺模型:慢速(slow)工艺模型,典型(typical)工艺模型和快速(fast)工艺模型,快速和慢速工艺模型代表了半导体代工厂加工的两个极端工艺角(process corner)。
可以使用set_operating_conditions
命令明确指定设计的工作条件。
set_operating_conditions “WCCOM” -library mychip |
上述命令使用了在单元库mychip中定义的名为WCCOM的工作条件。
WCS(Worst-Case Slow)
工艺慢(slow)、温度最高(例如125°C)并且电压最低(例如额定1.2V减去10%)
TYP(Typical)
典型(typical)工艺,温度是额定值(例如25°C),电压是额定值(例如1.2V)
BCF(Best-Case Fast)
工艺快(fast),温度最低(例如-40°C),电压最高(例如额定1.2V加10%)
ML(Maximal Leakage):工艺快,温度最高(例如125°C),电压也最高(例如1.2V加10%)。
该工作条件有最大的漏电功耗(leakage power),对于大多数设计,也有着最大的有效功耗(active power)。
TL(Typical Leakage):经典工艺,温度最高(例如125°C),电压是额定值(例如1.2V)
该工作条件下的漏电功耗比较具有代表性,因为由于正常工作时的功耗,芯片温度往往会更高。
Power Area Performance 。这是一个需要进行折中的选择,你很难或者你不能做到这三个方面同时达到最优解。也是我们DC约束需要考虑的问题,也是你的约束应该体现的部分。在后续的学习中会进一步进行解释。
时序收敛(英语:Timing closure)是现场可编程逻辑门阵列、特殊应用积体电路等集成电路设计过程中,调整、修改设计,从而使得所设计的电路满足时序要求的过程。一般也会称这项工作为收时序。
说明:该部分对《数字集成电路:电路、系统与设计(第二版)》的数字部分进行总结,主要以反相器为代表的一些电路的典型性质,帮助理解后续的相关概念,具体学习可以参考该部分的内容
一般的逻辑电平就是0-1.是我们数字电路中可以接收的两种状态。
看一个两输入与非门的定义
使用P做上拉网络,N管做下拉网络。由于其本身的强1弱0以及强0弱1的性质决定的。同时解释了我们为什么需要做一个布尔表达式的转换,就是由于基本单元都是与非门或非门这种形式,一个与门实际上是由6个管子(与非门四个+反相器两个)来构成的。
对于一个单元的时序关系,可以看到这里的转换时间与两个因素有关,负载电容与电阻有关,这就是是RC在电路中的影响,对于单元延时的影响。当然主要是C,因为R已经确定了,但是你的负载是不确定的。
因此在DC中确定一个单元延时的方式就是根据其负载电容来查表获取的。
其次影响一个单元延时的还有输入转换时间。因为我们输出的负载确定了,但是你的输入转换时间也是对单元延时有影响的。
我们总结一下就是这几个因素:
我们在后续的学习中都会见到对其进行的建模的相关指令
时序分析中需要基于温度、电压、电流、电阻、电容负载和时间等不同类型的变量因子进行计算,因此需要在时序信息文件中定义不同类型的变量因子的单位。以下为时序信息文件中所定义的变量因子单位:
该部分会在第三节的单元库学习中进一步学习。
举例read_db <target_library_FILE>
读入一个库文件list_libs
确定与该库文件对应的库的名称redirect -file lib.rpt {report_lib cb13fs120_tsmc_max}
为上述的库生成一个库报告文件
这里我们使用重定向的命令,将报告的结果保存到lib.rpt这个文件中。redirect是重定向的命令,-file是将命令产生信息保存到文件中,lib.rpt是要保存信息到文件,后面的{}中存放的是要执行的命令。
本文是DC笔记系列的第一篇,也是第一次来尝试写这种系列文章,有不足的地方非常欢迎同学们指出,该部分主要介绍什么是STA,有一个感性的认识,了解其使用的好处,什么地方再用,怎么用等。是基础部分的第一篇~主要分三个部分,什么是STA,CMOS数字设计中STA的使用于STA的局限性三个部分展开,参考《Static Timing Analysis for Nanometer Designs 》(第一章)的内容。
静态时序分析(简称STA)是用来验证数字设计时序的技术之一。下面将就时序与验证两个部分对STA进行一定的解释。
简单介绍时序检查的内容及其优点。
时序检查是指建立时间与保持时间检查:建立时间检查是用来保证数据可以在给定时钟周期内到达触发器;保持时间检查是用来保证数据在被触发器采样后还能保持一定时间,即保证触发器不要漏采数据。
这些时序检查的目的都是为了保证触发器可以发送并且采样到正确的数据。
STA是一种可以验证设计中所有时序要求的详尽方法,而其他时序分析方法例如时序仿真则只能验证到被当前激励执行到的那部分时序路径。基于时序仿真的验证完备性取决于施加激励的完备性。如果使用时序仿真来验证一个千万门级别的设计,速度将会非常慢,并且实际上也无法充分验证。因此,想要基于时序仿真的方法来进行详尽的时序验证是非常困难的。
相比之下,STA则提供了一种更快更简单的方法去分析并检查设计中的全部时序路径。鉴于如今的ASIC设计规模已达千万门级别,STA已经成为了详尽地验证设计时序的必要方法。
施加外部输入激励到所设计的电路模型,判断它所产生的输出响应是否符合预期功能,主要用于验证电路功能。施加一组激励,观察在这组激励下电路行为是否符合要求,然后换一组激励再重复以上过程,以此类推。
其对于设计的分析是静态地执行的,并不依赖于施加在输入端口上的激励
分析电路所有路径的时序,或者将待验证的电路与参考电路进行对照比较,主要用于验证电路性能指标,限于数字逻辑电路
检查版图是否符合预定的设计规则,是否与电路一致
类型为DRC, ERC, LVS。设计规则检查(DRC, Design Rule Check)、 电气规则检查(ERC, Electronic Rule Check)、版图-原理图一致性检查(LVS, Layout Versus Schematic)
首先明确在设计流程中的位置,如下图所示
主要是对门级电路进行的静态时序分析。STA很少在RTL级完成,因为在这一抽象层级上,验证设计的功能更为重要,而非时序。 同样,由于块(block)的描述处于行为级,因此时序信息也并非都是可用的。可以结合检查的内容进行理解,只有综合出来寄存器以后才可以进行检查。简单来说就是门级网表。
但是,需要明确的是,作为一名IC设计工程师,你需要在写RTL代码的时候,就需要有一定的STA意识。更具体的内容后续会单独展开,该部分不属于本系列分析的内容。
在逻辑级(未进行物理设计的门级),STA可采用以下模型:
在物理设计阶段,除了上述模型,STA还可采用以下模型:
这里的局限性可以理解为STA不能做的,经过后续的学习,也可以从本质上理解为什么不能处理这些问题,相关的内容将会在下节展开~
跨时钟周期的功能行为:STA无法建模或仿真跨时钟周期变化的功能行为
IO接口时序:可能仅根据STA约束无法规定IO接口要求。例如,设计人员可能使用SDRAM仿真模型为DDR接口选择详细的电路级仿真
未知态X的处理:STA技术仅处理逻辑0和逻辑1(或高电平/低电平)的逻辑域,或者是上升沿和下降沿的逻辑域。 设计中的未知态X导致不确定的值在整个设计中传播,这也是无法使用STA进行检查。
PLL设置:PLL的配置可能未被正确加载或设置
跨异步时钟域
FIFO指针不同步
跨时钟周期的功能行为
伪路径(false path):当系统应用程序从不使用此类路径时,或者在时序违例路径的敏感列表中使用了互斥的条件时,可能会发生这种情况。 这种时序路径被称为伪路径,因为这种时序路径实际上不会被执行。
当在设计中指定了正确的时序约束(包括伪路径和多周期路径约束)时,STA结果的质量会更好。 在大多数情况下,设计人员可以利用设计的固有知识并指定约束条件,以便在STA期间消除伪路径。
模拟模块和数字模块之间的接口:由于STA不处理模拟模块,因此验证方法需要确保这两种类型的模块之间的连接正确。
复位顺序:检查所有触发器在异步或同步复位后是否都复位为所需的逻辑值,这是无法使用静态时序分析来检查的。
说明:该配置基于Butterfly主题版本为 4.2.0,基本参考官方教程,不修改pug文件,主题已经集成了相关的设置,该博文对其部分内容进行补充。参考链接在文章末尾给出。
安装 hexo-tag-aplayer 这款插件。执行如下指令:
npm install --save hexo-tag-aplayer |
插件配置方式为修改Hexo 的配置文件中进行如下修改。就是你的Hexo根目录下的_config.yml
文件。
aplayer: |
开启主题配置文件中的aplayerInject
如下所示
# Inject the css and script (aplayer/meting) |
主题配置文件的就是自己建立的_config.butterfly.yml
文件。建议使用vscode,可以进行全局搜索。更加方便进行修改。
至此就已经可以使用了。下面介绍两种最常用的使用。
以本博客为例,在博客的音乐页面(\source\music\index.md文件)添加如下:
{% meting "7422861869" "netease" "playlist" "autoplay" "mutex:false" "listmaxheight:400px" "preload:none" "theme:#ad7a86"%} |
常用的选项如下所示:server
可选:netease
(网易云音乐),tencent
(QQ音乐),kugou
(酷狗音乐),xiami
(虾米音乐),baidu
(百度音乐)。建议网易云type
可选:song
(歌曲),playlist
(歌单),album
(专辑),search
(搜索关键字),artist
(歌手)。添加单曲选的歌曲,歌单选择playlist,可以自行尝试。id
获取示例: 打开网易云音乐,选择喜欢的歌单,在网页版打开,获取歌单list,填入即可。使用的时候将上边的ID号换为自己喜欢的歌单即可。==注意歌单中不能包括VIP音乐,否则无法解析==。建议单独建立一个歌单,以后有喜欢的音乐添加进去,网页也会自动同步添加。lrcType
设置为 -1
默认显示歌词,放在fixed模式下比较合适。
基本上修改的参数以上就已经足够了。ID获取的方式如下。完整的参数表见附录,也可以去参考链接中查看。
也可以直接添加HTMI格式。
<div class="aplayer" data-id="000PeZCQ1i4XVs" data-server="tencent" data-type="artist" data-preload="auto" data-theme="#3F51B5"></div> |
需要修改的参数已经给出,可以自行修改。
把 aplayer代码 插入到主题配置文件的 inject.bottom 即可。
inject: |
需要修改的参数就只有data-id、data-server、data-type、data-autoplay="true"、data-lrcType="-1"
一些常用的参数,可以自行根据需要修改。
最后,如果你想切换页面时,音乐不会中断。请把主题配置文件的 pjax
设为 true即可。
pjax: |
css文件的建立参考个人博客搭建与美化中的鼠标样式部分。
/* 隐藏 Aplayer 的全局吸底音乐标签,在css中添加 */ |
对应代码注意这里将 “listmaxheight:100px”列表高度调整为100,为了方便展示
{% meting "7422861869" "netease" "playlist" "autoplay" "mutex:false" "listmaxheight:100px" "preload:none" "autoplay = false" "theme:#ad7a86"%} |
插入单曲使用如下方式
<div class="aplayer no-destroy" data-id="1441758494" data-server="netease" data-type="song" data-autoplay="true" data-lrcType="-1"> </div> |
<div class="aplayer no-destroy" data-id="1441758494" data-server="netease" data-type="song" data-mini="true" data-autoplay="true" data-lrcType="-1"> </div> |
hexo-tag-aplayer的GitHub地址
aplayer官方说明文档
butterfly官方教程
下面是官方所示的完整可选配置参数。
Name | Default | Description |
---|---|---|
container | document.querySelector(‘.aplayer’) | player container |
fixed | false | enable fixed mode, see more details |
mini | false | enable mini mode, see more details |
autoplay | false | audio autoplay |
theme | ‘#b7daff’ | main color |
loop | ‘all’ | player loop play, values: ‘all’, ‘one’, ‘none’ |
order | ‘list’ | player play order, values: ‘list’, ‘random’ |
preload | ‘auto’ | values: ‘none’, ‘metadata’, ‘auto’ |
volume | 0.7 | default volume, notice that player will remember user setting, default volume will not work after user set volume themselves |
audio | - | audio info, should be an object or object array |
audio.name | - | audio name |
audio.artist | - | audio artist |
audio.url | - | audio url |
audio.cover | - | audio cover |
audio.lrc | - | see more details |
audio.theme | - | main color when switching to this audio, it has priority over the above theme |
audio.type | ‘auto’ | values: ‘auto’, ‘hls’, ‘normal’ or other custom type, see more details |
customAudioType | - | see more details |
mutex | true | prevent to play multiple player at the same time, pause other players when this player start play |
lrcType | 0 | see more details |
listFolded | false | indicate whether list should folded at first |
listMaxHeight | - | list max height |
storageName | ‘aplayer-setting’ | localStorage key that store player setting |
介绍控制流命令,对之前系列TCL脚本语言的学习(一)进行补充
语法: if test1 body1 ?elseif test2 body2 elseif…. ? ?else bodyn?
TCL 先把 test1 当作一个表达式求值,如果值非 0,则把 body1 当作一个脚本执行并返回所得值,否则把 test2 当作一个表达式求值,如果值非 0,则把 body2 当作一个脚本执行并返回所得值……。例:
if { $x<0 } { |
这里需要注意的是,
if 和{之间应该有一个空格,否则TCL解释器会把’if{‘作为一个整体当作一个命令名,从而导致错误。
‘{‘一定要写在上一行,因为如果不这样,TCL 解释器会认为if命令在换行符处已结
束,下一行会被当成新的命令,从而导致错误的结果需要将}{
分开写,
否则会报错extra characters after close-brace
语法为: while test body
参数 test 是一个表达式,body 是一个脚本,如果表达式test 的值非 0,就运行脚本,直到表达式为0 才停止循环,此时 while 命令中断并返回一个空字符串。
例如:
set a {a b c d e} |
对代码进行分析
set 变量a为一个list,b为一个空list
然后计算列表里有几个元素,将其减一后的值赋值给i,这里减一的目的是从零开始计数会多一个
开始进行循环,首先i的值是4大于0,表达式为真,开始执行脚本。
脚本为将数组a的第i个位置的元素添加到b list 里,然后给i减一同时进行下一次判断即可。
最后输出b的值
b=e d c b a |
语法为: for init test reinit body
参数init是一个初始化脚本,第二个参数test是一个表达式,用来决定循环什么时候中断,第三个参数reinit是一个重新初始化的脚本,第四个参数body也是脚本,代表循环体。
for {set p 0} {$p<=10} {incr p} { |
执行结果为
0 squared is : 0 |
foreach varName list body 第一个参数 varName 是一个变量,第二个参数 list 是一个表(有序集合),第三个参数 body 是循环体。每次取得链表的一个元素,都会执行循环体一次。这里对于复杂的操作不进行解释,参考文章一
set a [list A B C D E F G] |
运行结果为
G F E D C B A |
赋值给变量
% foreach {x y} {a b c d } { |
又例如:
% foreach i {a b} {j k} {v W x y z} { |
在循环体中,可以用break和continue命令中断循环。其中break命令结束整个循环过程,并从循环中跳出,continue只是结束本次循环
这里有一个特别好的例子
说明:这里首先进行给一个list,然后使用foreach循环进行写入数据当遇见break时候直接退出了循环,而continue仅仅只是跳出此次循环继续向b里写入数
% set b {} |
% set b {} |
和 C 语言中 switch 语句一样,TCL 中的 switch 命令也可以由 if 命令实现。只是书写起来较为烦琐。 switch 命令的语法为: switch ? options? string { pattern body ? pattern body …?}
注意这里进行的是字符匹配
set x a; |
x=a时执行的是t1加2
其中 a 的后面跟一个’-’表示使用和下一个模式相同的脚本。default 表示匹配任意值。一旦switch 命令 找到一个模式匹配,就执行相应的脚本,并返回脚本的值,作为 switch 命令的返回值。
set grade B; |
source 命令读一个文件并把这个文件的内容作为一个脚本进行求值
以上边的switch第一段代码为例
使用VIM新建一个文件,写入文件后保存退出
vim switch1.tcl |
键入wish
然后输入source switch1.tcl
TCL 支持过程的定义和调用,在 TCL 中,过程可以看作是用 TCL 脚本实现的命令,效果与 TCL的固有命令相似。我们可以在任何时候使用 proc 命令定义自己的过程,TCL 中的过程类似于 C中的函数。
TCL 中过程是由 proc 命令产生的:
例如:
% proc add {x y } {expr $x+$y} |
proc 命令的第一个参数是你要定义的过程的名字,第二个参数是过程的参数列表,参数之间用空格隔开,第三个参数是一个 TCL 脚本,代表过程体。 proc 生成一个新的命令,可以象固有命令一样调用:
% add 1 2 |
此篇暂时这里结束,后又需要会继续记录
]]>本文参考资料为《TCL
语言教程》,感谢作者的分享,这里仅仅作为简单常用语法的入门,若有需要后期对本文进行添加补充。
TCL
(Tool Command Language)是一种解释执行的脚本语言(Scripting Language)。 它提供了 通用的编程能力:支持变量、过程和控制结构;同时 TCL
还拥有一个功能强大的固有的核心命令集。
由于TCL
的解释器是用一个C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL
看作一个C库,这个库中有丰富的用于扩展TCL
命令的C\C++过程和函数,可以很容易就在C\C++应用程序中嵌入TCL
,而且每个应用程序都可以根据自己的需要对TCL
语言进行扩展。我们可以针对某一特定应用领域对TCL
语言的核心命令集进行扩展,加入适合于自己的应用领域的扩展命令,如果需要,甚至可以加入新的控制结构,TCL
解释器将把扩展命令和扩展控制结构与固有命令和固有控制结构同等看待。扩展后的TCL
语言将可以继承TCL
核心部分的所有功能,包括核心命令、控制结构、数据类型、对过程的支持等。根据需要,我们甚至可以屏蔽掉TCL
的某些固有命令和固有控制结构。通过对TCL
的扩展、继承或屏蔽,用户用不着象平时定义一种计算机语言那样对词法、语法、语义、语用等各方面加以定义,就可以方便的为自己的应用领域提供一种功能完备的脚本语言。TCL
良好的可扩展性使得它能很好地适应产品测试的需要,测试任务常常会由于设计和需求的改变而迅速改变,往往让测试人员疲于应付。利用TCL
的可扩展性,测试人员就可以迅速继承多种新技术,并针对产品新特点迅速推出扩展TCL
命令集,以用于产品的测试中,可以较容易跟上设计需求的变化。
另外,因为TCL
是一种比C\C++ 语言有着更高抽象层次的语言,使用TCL
可以在一种更高的层次上编写程序,它屏蔽掉了编写C\C++程序时必须涉及到的一些较为烦琐的细节,可以大大地提高开发测试例的速度。而且, 使用TCL
语言写的测试例脚本,即使作了修改,也用不着重新编译就可以调用TCL
解释器直接执行。可以省却不少时间。TCL
目前已成为自动测试中事实上的标准。
(这里笔者对于TCL
脚本的用处目前还不是很明确,后期学习到了进行补充添加,此处作为EDA课程中的一部分进行学习)
直接打开终端(terminal),输入 sudo apt install tcl
即可进行安装,这里的截图是笔者安装成功后的实例。
之后输入tclsh
即可。
一个TCL
脚本可以包含一个或多个命令。命令之间必须用换行符或分号隔开,下面的两个脚本都
是合法的:
set a 1 |
TCL
解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,TCL
解释器运用规则把命令分成一个个独立的单词,同时进行必要的置换(substitution); 在执行阶段,TCL
解释器会把第
一个单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这个命令对应的C/C++过程,并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。
TCL
解释器在分析命令时,把所有的命令参数都当作字符串看待,例如:
%set x 10 //定义变量x,并把x的值赋为10 |
上例的第二个命令中,x被看作字符串x+100的一部分,如果我们想使用x的值’10’ ,就必须告诉TCL
解释器:我们在这里期望的是变量x的值,而非字符’x’。怎么告诉TCL
解释器呢,这就要用到TCL
语言中提供的置换功能。置换功能分为三种.TCL
提供三种形式的置换:变量置换、命令置换和反斜杠置换。每种置换都会导致一个或多个单词本身被其他的值所代替。置换可以发生在包括命令名在内的每一个单词中,而且置换可以嵌套。
graph LRA[置换功能] --> B[变量置换variable subtitution]A[置换功能] --> C[命令置换command substitution]A -->D[反斜杠置换backslash substitution]
变量置换由一个$
符号标记,变量置换会导致变量的值插入一个单词中。例如之前的一个例子
%set x 10 //定义变量x,并把x的值赋为10 |
命令置换是由[]
括起来的TCL
命令及其参数,命令置换会导致某一个命令的所有或部分单词被另一个命令的结果所代替。例如:
%set y [expr $x+100] |
这里当TCL
解释器遇到字符’[‘时,它就会把随后的expr作为一个命令名,从而激活与expr
对应的C/C++过程,并把expr
和变量置换后得到的10+100
传递给该命令过程进行处理。
TCL
语言中的反斜杠置换类似于C语言中反斜杠的用法,主要用于在单词符号中插入诸如换行符、空格、[、$等被TCL
解释器当作特殊符号对待的字符。
%set msg money\ \$3333\ \nArray\ a\[2] |
除了使用反斜杠外,TCL
提供另外两种方法来使得解释器把分隔符和置换符等特殊字符当作普通字符,而不作特殊处理,这就要使用双引号和花括号({}
)。TCL
解释器对双引号中的各种分隔符将不作处理,但是对换行符 及$
和[]
两种置换符会照常处理。而在花括号中,所有特殊字符都将成为普通字符,失去其特殊意义,TCL
解释器不会对其作特殊处理。
%set y "$x ddd" |
TCL
中的注释符是#
,#
和直到所在行结尾的所有字符都被TCL
看作注释,TCL
解释器对注释将不作任何处理。不过,要注意的是,#
必须出现在TCL
解释器期望命令的第一个字符出现的地方,才被当作注释。
%set a 100 # Not a comment |
变量分为简单变量和数组
一个 TCL
的简单变量包含两个部分:名字和值。名字和值都可以是任意字符串。
% set a 2 |
在最后一个命令行,我们希望把变量a.1的值付给b,但是TCL
解释器在分析时只把$符号之后直到第一个不是字母、数字或下划线的字符(这里是’.’)之间的单词符号(这里是’a’)当作要被置换的变量的名字,所以TCL
解释器把a置换成2,然后把字符串“2.1”付给变量b。这显然与我们的初衷不同。
当然,如果变量名中有不是字母、数字或下划线的字符,又要用置换,可以用花括号把变量名括起来。例如:
%set b ${a.1} |
数组是一些元素的集合。TCL
的数组和普通计算机语言中的数组有很大的区别。在TCL
中,不能单独声明一个数组,数组只能和数组元素一起声明。数组中,数组元素的名字包含两部分:数组名和数组中元素的名字,TCL
中数组元素的名字(下标〕可以为任何字符串。 例如:
set day(monday) 1 |
数组元素的置换和简单变量类似。例:
set a monday |
% unset a b day(monday) |
上面的语句中删除了变量a、b和数组元素day(monday),但是数组day并没有删除,其他元素还存在,要删除整个数组,只需给出数组的名字。
这两个命令提供了改变变量的值的简单手段。append
命令把文本加到一个变量的后面,例如:
% set txt hello |
incr
命令把一个变量值加上一个整数。incr要求变量原来的值和新加的值都必须是整数。
可以进行基本的数学函数计算
%expr 1 + 2*3 |
list这个概念在TCL
中是用来表示集合的。TCL
中list是由一堆元素组成的有序集合,list可以嵌套定
义,list每个元素可以是任意字符串,也可以是list。下面都是TCL
中的合法的list:
{} //空list |
list是TCL
中比较重要的一种数据结构,对于编写复杂的脚本有很大的帮助
语法: list ? value value…?
这个命令生成一个list,list的元素就是所有的value。例: |
使用置换将其相结合
% set a {1 2 3 4 {1 2}} |
语法:concat list ?list…?
这个命令把多个list合成一个list,每个list变成新list的一个元素。
% set a {1 2 3} |
语法:lindex list index
返回list的第index个(0-based)元素。例:
% lindex {1 2 {3 4}} 2 |
语法:llength list
返回list的元素个数。例
% llength {1 2 {3 4}} |
% set a {1 2 3} |
语法:linsert list index value ?value…?
返回一个新串,新串是把所有的value参数值插入list的第index个(0-based)元素之前得到。例:
% linsert {1 2 {3 4}} 1 7 8 {9 10} |
% set a {1 2 3} |
语法:lreplace list first last ?value value …?
返回一个新串,新串是把list的第firs (0-based)t到第last 个(0-based)元素用所有的value参数替换得到的。如果没有value参数,就表示删除第first到第last个元素。例:
% lreplace {1 7 8 {9 10} 2 {3 4}} 3 3 |
% set a {1 2 3} |
语法:lrange list first last
返回list的第first (0-based)到第last (0-based)元素组成的串,如果last的值是end。就是从第first个直到串的最后。
例:
% lrange {1 7 8 2 4 5 6} 3 end |
% set a {1 2 3} |
语法:lappend varname value ?value…?
把每个value的值作为一个元素附加到变量varname后面,并返回变量的新值,如果varname不存在,就生成这个变量。例:
% set a {1 2 3} |
语法:lsearch ?-exact? ?-glob? ?-regexp? list pattern
返回list中第一个匹配模式pattern的元素的索引,如果找不到匹配就返回-1。-exact、-glob、 -regexp是三种模式匹配的技术。-exact表示精确匹配;-glob的匹配方式和string match命令的匹配方式相同;-regexp表示正规表达式匹配。缺省时使用-glob匹配。例:
% set a { how are you } |
-all 返回一个列表,返回的列表中的数值就是字符在列表中的位置
默认全局匹配,返回第一个字符在列表中的位置,其位缺省状态
% lsearch {a b c d e} c |
匹配不到返回-1
% lsearch {a b c d e} g |
更详细的点击 查看。
这里有之后学习的更加详细的笔记,主要是对于所有的控制流,包括 if、while、for、foreach、switch、break、continue 等以及过程,source的介绍总结
TCL脚本语言的学习(二)更为详细!!
语法: if test1 body1 ?elseif test2 body2 elseif…. ? ?else bodyn?TCL
先把test1当作一个表达式求值,如果值非0,则把body1当作一个脚本执行并返回所得值,否则把test2当作一个表达式求值,如果值非0,则把body2当作一个脚本执行并返回所得值……。例如:
if { $x>0 } { |
if { $x<0 } { |
语法为: while test body
参数test是一个表达式,body是一个脚本,如果表达式的值非0,就运行脚本,直到表达式为0才停止循环,此时while命令中断并返回一个空字符串。
例如:假设变量 a 是一个链表,下面的脚本把a 的值复制到b:
% #首先生成一个集合 |
语法为: for init test reinit body
参数init是一个初始化脚本,第二个参数test是一个表达式,用来决定循环什么时候中断,第三个参数reinit是一个重新初始化的脚本,第四个参数body也是脚本,代表循环体。下例与上例作用相同:(注意这里复制打印顺序的不同)
% set a {1 2 3 4} |
例
% for {set i 0} {$i<4} {incr i} { |
这个命令有两种语法形式
1, foreach varName list body
第一个参数varName是一个变量,第二个参数list 是一个表(有序集合),第三个参数body是循环体。每次取得链表的一个元素,都会执行循环体一次。 下例与上例作用相同:
% set a {1 2 3 4} |
例子:
% foreach var {a b c d e f} { |
2, foreach varlist1 list1 ?varlist2 list2 ...? Body
这种形式包含了第一种形式。第一个参数varlist1是一个循环变量列表,第二个参数是一个列表list1,varlist1中的变量会分别取list1中的值。body参数是循环体。 ?varlist2 list2 …?表示可以有多个变量列表和列表对出现。例如:
set x {} |
例子:
% foreach i {a b c} j {d e f g} { |
这时总共有三次循环,x的值为”b a d c f e”。
set x {} |
这时总共有四次循环, x的值为”a d b e c f {} g” 。
set x {} |
这时总共有三次循环,x的值为”a d e b f g c {} {}”。
例子:
博主并不是很了解前端知识,只是想搭建一个自己的平台,留下自己的一点痕迹,有一个属于自己的网络小小天地。因此对于博客配置也是很简单的配置,博客也相对比较简单,基本上为小白白,因此教程笔记应该是很好复现的。有任何问题欢迎留言评论~
基础配置部分不进行介绍,参考官方的手册Butterfly 安装文档(一) 快速开始,这里进行一些重要的点的总结
_config.yml
在 hexo
的根目录创建一个文件 _config.butterfly.yml
,并把主题目录的 _config.yml
内容复製到 _config.butterfly.yml
去。( 注意: 复製的是主题的 _config.yml
,而不是 hexo
的 _config.yml
)_
注意: 不要把主题目录的 _config.yml
删掉
注意: 以后只需要在 _config.butterfly.yml
进行配置就行。
如果使用了 _config.butterfly.yml
, 配置主题的 _config.yml
将不会有效果。Hexo
会自动合并主题中的_config.yml
和 _config.butterfly.yml
里的配置,如果存在同名配置,会使用_config.butterfly.yml
的配置,其优先度较高。
hexo
的 _config.yml
配置需要安装插件
npm install hexo-deployer-git --save |
下面是博主部署的配置
# Deployment |
然后使用默认三连即可
预览三连: hexo clean && hexo g && hexo s
部署三连: hexo clean && hexo g && hexo d
参考:https://hexo.io/docs/one-command-deployment
url: https://tyxiumud.github.io |
实例如下,需要首先安装
deploy: |
本博客使用的是Twikoo
,Vercel
部署,免费,缺点是速度慢…..具体程度可以参考本网站的底部的评论。
再说说好处,教程很全,有对应的QQ群进行交流,作者的部署教程。很快捷的定义邮箱通知评论,评论管理方便。点击齿轮即可进行配置。页面很友好。
Butterfly主题如果需要使用到很多图片。尤其是访问github或者gitee总是速度不是很快。图片太大,会严重拖慢网站的加载速度。图片压缩能够有效的缓解这个问题。
imgbot
进行整个图床的压缩。改部分分为两个小节,普通音乐播放与全局固定模式。效果演示如下所示,配置添加方式详见请点击这里
/* 隐藏 Aplayer 的全局吸底音乐标签,在css中添加 */ |
实现效果如下
实现方式:添加下述代码,到themes\butterfly\layout\includes\footer.pug
<i id="heartbeat" class="fa fas fa-heartbeat"></i> |
将其复制到By与${config.author}
的中间,注意第6与第8行均需要复制,然后将如下指令复制到文件的最后一行即可。或者将By删除也是可以的,具体看自己喜好。
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/HCLonely/images@master/others/heartbeat.min.css"> |
参考:https://blog.csdn.net/weixin_42429718/article/details/105723193
在custom_text:项下输入如下指令
#博客年份 |
参考:https://www.cnblogs.com/yyyzyyyz/p/15542401.html
参考yyyz的设置。在我的themes\butterfly\source\css
目录下新建一个css文件。命名为my.css
写入如下内容
/*指针样式*/ |
在主题配置文件中引入即可。下面是我自己的配置,使用时根据自己的css名称进行修改
inject: |
参考:https://yyyzyyyz.cn/posts/2d51c9bd3490/
修改字体样式直接引入css文件和字体包即可。
1、首先寻找喜欢的字体,有些字体很好看并且是免费非商用的,我们可以拿来用。
这里推荐几个网址供参考:方正字库,第一字体网,字体天下,字体家,自由字体
2、将需要使用的字体文件放入博客目录下,我这里是放在themes\butterfly\source\css
下,方便css文件引入。
3、如有有css文件,就在最下面继续写;如果没有,则新建一个css文件,文件名任取。写入保存。引用方式同鼠标样式引入方式一致。
@font-face{ |
将你的字体放在你的根目录下 themes\butterfly
参考:https://yyyzyyyz.cn/posts/2d51c9bd3490/
页面效果点击查看
代码如下,自行下载srcJelly.js
文件即可,这里放在githhub或者是放在本地都是可以的。放在本地就是将其放置在themes\butterfly\source\js
如下目录即可。下载地址点击这里。内容如下,将其修改为你想修改的即可。
修改对应的index.xml
文件如下所示
<div class="entry-content"> |
css文件如下。可以新建一个,也可以直接写入之前的文件里。使用vscode可以查看基本的形式。使用F12,分析网页元素来进行查看对应的样式,需要有一丢丢前端的基础。不会的可以直接使用博主提供给的css文件。
/*文章页背景*//*分类页面*//*时间轴页面*/ |
下面提供两种方式进行查看配置。可以帮助根据需要查看修改自己的配置。
使用F12查找样式的方式
使用vscode查看样式
参考:
https://www.cnblogs.com/glory-yl/p/15399411.html
在 bottom 处插入以下代码。在 backimg 数组里替换自己想要的图片链接。即可。实现效果参见笔者的博客。
inject: |
推荐两个网站,可以下载高清图片,记得使用上述的压缩软件进行图片的压缩。
参考:
https://zfe.space/post/55346.html
两位都是大佬~
]]>Synopsys_工艺库格式是事实上的库标准。对库格式和延时计算方法的基本理解是成功综合的关键Synopsys工艺库可分为两大类:
逻辑库:包含仅与综合过程有关的信息且通过DC用于设计的综合和优化。如pin到pin的时序、面积、引脚类型等
物理库:包含单元的物理特征,如物理尺寸、层信息、单元方位等。
半导体厂商提供给我们DC兼容的工艺技术库——综合库来进行逻辑综合。大多数情况下,半导体厂商提供二进制格式的.db文件,也有可能只提供文本(ASCII)格式的.lib文件,或两者。DC使用的综合库必须是.db格式的库。因此,如果我们只有.lib文件,需要用Library Compiler将其转换为.db文件。
综合库的结构如下图所示。?
可以将其分为两个部分,标题部分与单元描述部分。我们使用smic180工艺下的typical.lib进行分析。
其中标题部分主要是介绍使用的延时模型,工艺角,库的名称等一些公共部分,后面的部分是库里单元的描述,也是这个文件的主要部分。文档一共214835行,其中第一部分一共由250行左右进行描述,剩下的都是对单元的描述。
对应的文本描述如下所示。下面也将通过介绍标题部分以及特定的几个单元描述来进行总结学习。参考的smic180-typical.lib。可能不同的库的内容有所不同,但都是大同小异的。
库组指令定义工艺库名。这个指令必须是在库文件中的第一个可执行行。例如:
library(my_library)
{
…}
包括以下属性
/* general attributes */ |
工艺属性定义用来区别时序分析的设计是基于那种类型的设计。目前有两种类型的设计需要时序分析,一种是ASIC设计,一种是FPGA设计。但是它们在设计流程上有很大的不同,所以在进行时序分析时也有所区别。因此工艺属性有两个设置值可以选择:CMOS和FPGA。
工艺属性识别库中使用的工艺类型:CMOS(预设值)、 FPGA。工艺类型必须先定义,放在属性清单的顶部。如果库中没有技术属性,Library Compiler预设其为cmos。
设计工具需要对设计进行时序和功耗优化,最基本的方法就是把不合适的单元替换成合适的单元。但是是否可以允许设计工具进行单元替换优化操作,需要在时序信息文件中通过单元优化替换属性进行定义。因此单元优化替换属性有两个设置值可以选择:match footprint和no swapping。
工艺库特征属性定义其他Synopsys工具可以使用具有该工艺库特征定义的命令进行设计。工艺库特征属性有5个设置值可以选择:report_delay_calculation、report_power_calculation、report_noise_calculation、report_user_data和allow_update_attribute。
指明在计算延迟时用的那个模型,主要有generic_cmos(默认值)、table-lookup(非线性模型)、piecewise-cmos(optional)、dcm(Delay Calculation Module)、polynomial。如果库组中没有定义延时模型属性,那么默认设置是generic_cmos。
大多数单元库都包括表格模型(table model),用于为单元的各种时序弧指定延迟并进行时序检查。 这些表格模型被称为NLDM(Non-Linear Delay Model),可用于延迟、输出压摆计算或其他时序检查。表格模型中提供了:在单元输入引脚处输入过渡时间和输出引脚处输出负载电容的各种组合下通过单元的延迟。
CMOS非线性延时计算模型(NLDM)是一种时序计算精度较高的延时计算模型。在Synopsys工艺库模型中,目前业界主要使用非线性延时计算模型。该延时模型由==输入信号转换时间==与==输出负载==作为索引,时序分析时以一个二维查找表的形式来计算延时,查找表中时序数据的实际构成如下图所示。
基于非线性延时计算模型通常的计算过程为:查找表中索引参数的某个采样点延时可直接查表得出,再通过插值算法来计算延时。通过非线性延时计算模型计算所能达到的精度有赖于采样点选取的合理性以及所用的插值算法。只要采样点较为合理,采用一般的多项式插值算法就能取得较好的延时结果。延时的一般插值计算方法如图所示
三维坐标中,X为输入端口信号的跳变时间Transition time(ns),y为输出端负载电容值Cload(pf),Z为延时值Tdelay(ns),计算式为Z=A+B·X+C·Y+D·X·Y
如果要计算X=0.32、Y=0.05时的Z值,只需取最接近X、Y的4个采样点。构建如下方程
A=0.2006,B=0.1983,C=0.2399,D=0.0677。带入X、Y即可
现已经通过查找表与插值的方式计算得到了单元延时。
Dc
是通过WLM
(wire load model)以及type_tree
来进行计算的,参看文章后续的这两个部分即可得到线延时。
如下图所示,计算逻辑门U1的Dcell值时,先确定输入端口的转换时间,U1输入端口的转换时间由前级单元U0的输出决定。当U0的输出为上升(rise)转换时间时,由于U1的时序弧为反向时序弧,因此U1的逻辑门延时应该在对应的U1下降时序弧查找表中进行插值计算。由于下降时序弧查找表是二维表,因此还需要确定U1输出端负载值,通过互连线负载模型和驱动节点负载值得到输出端总负载值。最后,根据U1输入端口转换时间和输出端负载电容值作为索引,在对应的U1下降时序弧二维查找表得到相应数据,并进行插值计算直接得到延时。
主要是库的版本、库的日期、还有注释。
revision : ***; |
Design Compiler工具本身是没有单位的。然而在建立工艺库和产生报告时,必须要有单位。库中有6个库级属性定义单位:
time_unit : "1ns"; 时间单位 |
单元描述中数值的单位都是在库中指定的,可使用Liberty命令集在库文件中声明单位。
指定了工艺、温度、电压以及RC树模型,用于设计的综合和时序分析。
这里就是对于库基本的情况进行了说明。会与slow.lib内容不同。主要是对于温度、电压等操作环境进行说明。
这里的工作条件与我们之前了解的PVT环境联系到了一起。
tree type属性定义了使用的环境互连模型,DC在计算互连延迟时使用这一属性值来选择合适的公式。
对于预布局估计,可以使用以下三种不同形式来表示互连RC树。请注意,每个互连线的总长度(以及电阻和电容估计值)在这三种情况下是相同的。
Best-case tree:在最佳情况树中,假定负载引脚在物理上与驱动引脚相邻。因此,到负载引脚的路径中都没有互连电阻,来自其它扇出引脚的所有互连线电容和引脚电容仍然作为驱动引脚上的负载。
Balanced tree:在这种情况下,假定每个负载引脚都在互连线的一部分上,并且每条到达负载引脚的路径上的总电阻和电容都相等。
Worst-case tree :在最差情况树中,假定所有负载引脚都集中在互连线的另一端。因此,每条到负载引脚的路径上都会有全部的互连线电阻和电容。
压摆值(slew)基于的是在库中指定的测量阈值点,大多数上一代的库(0.25um或更旧的库)都使用10%和90%作为压摆(或称过渡时间)的测量阈值点。
压摆阈值点的选择对应的是波形的线性部分。随着技术的发展,实际波形最线性的部分通常在30%至70%之间。 因此,大多数新一代时序库都将压摆测量阈值点指定为Vdd的30%和70%。但是,由于之前测得的过渡时间在10%至90%之间,因此在填充库时,通常将测得的30%至70%的过渡时间加倍,这由压摆降额系数(slew derate factor)指定,通常指定为0.5。压摆测量阈值点为30%和70%且压摆降额系数为0.5,等效于测量阈值点为10%和90%。 阈值设置的示例如下:
slew_lower_threshold_pct_fall : 30.0; |
上面的设置规定了要将表格中的过渡时间乘以0.5,以获得与阈值(30%-70%)设置相对应的过渡时间。这意味着表格中的值(以及相应的索引值)实际上是10%-90%阈值点的测量值。在标定过渡时间值时,首先在30%-70%处测量,然后再把测量值外推到10%至90%((70-30)/(90-10)= 0.5)。
未指定slew_derate_from_library(默认值为1.0),这意味着库中的过渡时间不会降额(derate)
/* default attributes */ |
大多数标准单元的设计都仅在输出或状态发生变化时才消耗功率。单元通了电但没有任何行为时,所有功耗都归因于泄漏电流(leakage current)。泄漏可能是由于MOS器件的亚阈值电流引起的,也可能是由于通过栅极氧化物的隧穿电流引起的。在以前的CMOS工艺技术中,漏电功率可以忽略不计,并且在设计过程中并不是主要考虑因素。但是,随着技术的发展,漏电功率变得越来越大,与有功功率相比,漏电功率已经无法忽略不计了。
如上所述,漏电功率主要有两个来源:MOS器件中的亚阈值电流和栅氧化物隧穿。通过使用高阈值电压单元,可以降低亚阈值电流;然而,由于高阈值电压单元的速度较低而存在一个折中(rde-of):高阈值电压单元的漏电较小,但速度较慢。同样,低阈值电压单元的漏电较大,但速度较高。无论是使用高阈值电压还是低阈值电压的单元,栅极氧化物隧穿带来的影响都差不多。因此,控制漏电功率的可能方法是使用高阈值电压的单元。类似于在高阈值电压和标准阈值电压单元之间进行选择,设计中使用的单元强度(strength)也是一种漏电和速度之间的折中。强度较高的单元具有较高的漏电功率,但速度较高。
MOS器件的亚阈值泄漏电流与温度具有很强的非线性特性,在大多数工艺技术中,随着器件温度从25°C升高到125°C,亚阈值泄漏电流可能会增加10倍至20倍。栅极氧化物隧穿带来的影响基本不随温度或器件阈值电压而改变,在100m及以上工艺技术中可以忽略的栅极氧化物隧穿已成为65nm或更精细技术在较低温度下漏电的主要原因。例如,对于65m或更精细的工艺技术,栅极氧化物隧穿漏电量可能等于室温下的亚阈值漏电量。而在高温下,亚阈值漏电仍然是导致漏电功率的主要因素。
这里提供了很多查找表的模板。
功耗查找表模板组(power lut template group)是库组中为其他功耗相关组所调用的查找表模板,通过该模板可以构成一维到三维的查找表结构,如下所示。
如上所示存在3个不同的变量:variable1、variable2和variable3,对应的变量参数值也存在3种:total_output_net_capacitance、equal_or_opposite_output_net_capacitance和input_transition_time。通过3个索引变量index1、index2和index3的值来确定最终的功耗结果。
举例如下:
power_lut_template(energy_template_7x3x3) { |
延时查找表模板组(lu_table_template_group)是库组中为其他延时相关组所调用的查找表模板,通过该模板可以构成一维到三维的查找表结构,如下所示。
与功耗查找表模板组结构类似,延时查找表模板组存在3个不同的变量:variable1、variable2和variable3,其中变量参数值根据所调用的延时相关组的不同而不同,主要包括以下变量参数值:input_voltage、output_voltagefanout_number、fanout_pin_capacitance、driver_slew、input_net_transition和total_output_net_capacitance等,通过3个索引变量index 1、index2和index3的值来确定最终的延时结果。
举例如下:
power_lut_template(energy_template_7x7) { |
这里还有很多其他的模板,不一一列举
库的表征是一个耗时的过程,针对各种工艺角(process corner)对库进行表征可能需要数周的时间,工艺变量的设置使得以特定工艺角为特征的库可以用于不同工艺角的时序计算。工艺的k-系数可用于完成从特征库工艺到目标工艺的延迟降额。如上所述,降额系数的使用在时序计算期间引入了不准确性,跨工艺条件进行降额尤其不准确,因此很少采用。总而言之,指定不同工艺变量值(例如1.0或任何其它值)的唯一功能就是在少数情况下允许跨工艺条件进行降额处理。
与作为物理量的温度和电压不同,工艺是不可量化的变量。就数字特征和验证而言,它可能是缓慢(slow)、典型(typical)或快速(fast)的工艺之一。 工作条件(nom_process、nom_temperature和nom_voltage)指定了对库进行表征的工艺、电压和温度, 也指定了使用该库中单元的条件。如果特征和工作条件不同,则需要对延迟计算过程中获得的时序值进行降额(derate)处理, 这可以通过使用库中指定的降额系数(k-系数)来实现 。使得时序分析的结果更接近真实值。
当延迟计算过程中工作条件的工艺、电压或温度与库中的标称条件不同时,可使用这些系数来进行计算。注意,k_volt系数为负,这意味着延迟随着电压的增加而减小,而k_temp因子为正,这意味着延迟通常随温度的升高而增加 。
形式如下所示:
/* k-factors */ |
定义I/O引脚的电平属性,告诉你输入是COMS还是TTL,什么时候达到高电平、什么时候是低电平。
/* pad attributes */ |
在进行布局规划(floorplanning)或布局(layout)之前,可以使用线负载模型(wireload models)来估计由互连线带来的电容、电阻以及面积开销。 线负载模型可用于根据扇出数量来估计网络的长度,线负载模型取决于块(block)的面积,具有不同面积的设计可以选择不同的线负载模型。线负载模型还可以将网络的估计长度映射(map)为电阻、电容以及由于布线而产生的相应面积开销。 形式如下:
/* wire-loads */ |
其中参数wire load定义线负载模型的名称,参数resistance定义互连线单位电阻值,参数capacitance定义互连线单位电容值,参数area定义互连线单位长度的面积值,参数slope定义扩展斜率值,参数fanout length定义对应扇出大小的互连线长度。
至此,我们得到了互连线的电阻与电容。
线负载模型(WLM
)是根据连线的扇出来估算连线的RC寄生参数那么RC是如何分配呢?
操作条件中有“tree-type’”的属性,该属性决定R和C的分配以计算时间延迟这也是tree-type与线负载模型的关系,也是笔者学习的时候不是很好理解的部分。
简单来说就是需要用线负载模型去计算一个R,C,那么RC是怎么影响延时的呢,就是看其在电路中的拓扑结构。
这里的图与上述tree_type部分介绍的实际上是一致的。
该部分提供了库里标准单元的描述。标准单元也可以在提供的doc下的文档中找到。文档标题如下
这里使用几个特殊的标准单元进行学习。DFFR
,以及INV
。其余基本上是一致的。
lib中的描述如下:
cell (INVX20) { |
单元的每个输入和输出都可以在引脚(pin)上指定电容。在大多数情况下,仅为单元输入引脚指定电容,而不为输出引脚指定
电容,即大多数单元库中的输出引脚电容为0。
内部开关功率在单元库中被称为internal power,这是当单元的输入或输出处于活动状态时单元内部的功耗。对于组合逻辑单元,输入引脚的电平跳变会导致输出引脚的电平跳变,从而导致内部开关功耗。
逻辑单元的时序模型(timing model)旨在为设计中的各种单元实例(instance)提供准确的时序信息。通常会从单元的详细电路仿真中获得时序模型,用以对单元工作时的实际情况进行建模,且需要为逻辑单元的每个时序弧都建立一个时序模型。
表征反相器的两种延迟是:
Tr:输出上升沿延迟
Tf:输出下降沿延迟
通过反相器的时序弧的延迟取决于两个因素 input_net_transition以及total_output_net_capacitance。
逻辑单元输出引脚的压摆(slew)主要取决于输出引脚电容:输出信号过渡时间会随着输出负载的增加而增加。 因此,在输入端压摆较大(输入信号过渡时间较长)的情况下,选择合适的单元类型及输出负载,可以改善输出端的压摆。 下图展示了通过调节逻辑单元的输出负载,可以改善或恶化单元输出信号过渡时间的情况。
一个简单的时序模型是 linear delay 模型,其中单元的延迟和输出转换时间表示为两个参数的线性函数:输入转换时间和输出负载电容。通过单元的延迟 D 的线性模型的一般形式如下所示:D=D0+D1*S+D2*C
其中D0,D1,D2是常数,S是输入过渡时间,C是输出负载电容
先看文档描述如下图,可以看到有四种不同驱动强度的,对应这不同的size。我们选择DFFRX4的工艺库文件进行学习。这是一个带复位的寄存器。
我们对DFFRX4的lib内容进行学习,开始同样是cellname,area以及功耗。我们略过看时序的部分。
setup_rising指相关引脚D的上升和下降建立时间。hold_rising是对应的保持时间。这就是我们STA里说到的。这里会进行计算。
脉冲宽度检查 。对于CK引脚有了脉冲宽度的检查,也是对时钟另一种约束,类似于出现毛刺,或者是超高频,DFF就不可以正常工作,这里随着工艺会不断改变。
对于复位引脚recover与removal的时序要求如上图所示。接下来就是输出了。
首先是对功能的描述,其次就是对PIN(Q)功耗的查找表。我们重点关注时序信息。
非单边类型(non-unate)的时序弧 。(在非单边(non-unate)时序弧中,仅仅从一个输入引脚的跳变方向是无法确定输出引脚电平将如何跳变的,还要取决于其他输入引脚的状态。 )
PIN(Q)与CK有关的传播延时。
对于Q还在引脚级别定义了功耗。
这里的时序弧类型是负单边(negative unate)类型
如果输入引脚上的上升沿跳变导致输出引脚电平下降(或不变),而输入引脚上的下降沿跳变导致输出引脚电平上升(或不变),则时序弧为负单边(negative unate)类型 。当复位有效时候,输输出变为0的延时时间。注意这里只有下降,很好理解,当你复位的时候,要是Q是0的话,也就不需要进行动作了。同时定义了max_capacitance。
对于引脚QN的时序模型。与Q的模型很类似,这里不进行分析。
总结一下对于DFFR的时序模型。CK对于D查建立时间,保持时间。对复位查恢复撤离时间,对于Q计算传播延时,对于CK本身,查脉冲宽度。
至此,前面总结了STA的相关知识,这里对于DC综合标准单元lib库进行了学习,后续将开始时钟的学习。
]]>Typora是一款Markdown编辑器,可以使得你的编辑所见即所得。Typora更多的快捷键以及可以和图床PicGo
进行联合使用(图床就是专门用来存放图片,允许你把图片对外连接的网上空间)。从而方便的进行文本编辑而不需要去关心图片的管理问题。其次使用简单,方便,保存都是在本地进行管理,可以保证数据的安全,页面简介简单,功能非常强大。
简单来说有以下的优点:
在Typora中,也可以使用快捷键Ctrl+1(2,3,4,5,6)
表示相对应的标题。Ctrl+0
表示段落。
一般使用的字体如下
字体描述 | 快捷键 |
---|---|
黑体 | Ctrl+B |
下划线 | Ctrl+U |
Alt+Shift+5 | |
斜体 | Ctrl+Shift+I |
选中字体使用快捷键即可,也可以直接使用后输入文本。
可以使用使用<font> </font>
标签来改变字体的颜色及大小。
如下:所示<font size=3 color="red">字体颜色为红色,大小为3</font>
<font size=4 color="blue">字体颜色为蓝色,大小为4</font>
<font size=6 color="violet">字体颜色为紫罗兰,大小为6</font>
字体颜色为红色,大小为3
字体颜色为蓝色,大小为4
字体颜色为紫罗兰,大小为6
使用==需要高亮的文字==
注意,这里的高亮需要打开文件->偏好设置
进行设置。或使用快捷键Ctrl+,
直接打开,设置如下图所示
使用Ctrl+T
进行表格
说明 | 快捷键 |
---|---|
创建表格 | Ctrl+T |
删除行 | Ctrl+Shift+Backspace |
添加行 | Ctrl+Enter |
可以添加有序列表与无序列表
列表 | 快捷键 |
---|---|
有序列表 | Ctrl + Shift + [ |
无序列表 | Ctrl + Shift + ] |
演示:
使用快捷键
Ctrl+Shift+Q
复制网址后直接使用快捷键Ctrl+K
点击我的博客跳转
直接使用[TOC]
在文章的开头即可
使用Typora的时候,直接使用Enter时候会有一个空格,需要使用shift+enter进行换行即可。举例如下:
直接使用Enter
这是第一行
这是第二行
使用shift+Enter进行换行
这是第一行
这是第二行
–建议这里使用github+PicGo+CDN
搭建自己的图床,简单好用,免费。具体设置如下–
PicGo
github地址:https://github.com/Molunerfinn/picgo/releases
选择latest版本即可,下载对应的版本,笔者使用的如下
下载完成后安装即可。
获取你github上的Token,填入即可,然后设定你的自定义域名如下https://cdn.jsdelivr.net/gh/
+tyxiumud/blog.img
我的仓库名称。这里仓库的建立于Token获取方式自行百度。
这里验证上传选项要是验证不通过也不用担心,编辑界面可以点击图片上传或者图片会自动上传到你的仓库。
数据无价,本地的或许是最安全的,每次写完一篇笔记文章建议进行对其中的图片进行保存C:\Users\username\AppData\Roaming\Typora\typora-user-images
可以找到对应的图片。
要是有需要的话将其自行整理保存即可。
将Typora的文章转到CSDN时候会出现问题。使用如下脚本替换图片显示的方式即可。参考链接
import re |
最后输出的文件复制到csdn即可。
]]>使用VIM或GVIM最基本的配置,不包含任何插件相关的设置,VIM用于写verilog,非常欢迎大家在评论区分享讨论。本文不进行插件的配置,不进行基本使用方式与使用技巧的说明,仅作为基本配置的分享交流
set nocompatible "不兼容vi |
在VIN中操作,为了使得双手脱离键盘,但是方向键距离手指较远,ESC同样,因此禁用掉方向键,同时使用jk代替ESC进入命令模式。
VIM中有三种模式:命令模式,输入模式,命令行模式,其map映射
在vim配置文件中经常会看到map、nmap、imap
n ——表示在普通模式下生效。
v ——表示在可视模式下生效。
i ——表示在插入模式下效。
具体配置方式见上
当我按下a的时候,弹出的提示框是包含所有a开头的提示,但是编辑器上只有a和光标,这个时候如果我需要再次使用b来进行过滤直接敲入b,编辑器上就是ab和光标,过滤出来的就是ab开头的单词。
该设置摘自vim自动补全的问题
设置行命令补时候,直接使用Ctrl-l即可,不用使用Ctrl-x Ctrl-l
imap <C-L> <C-X><C-L> |
改声明摘自博客,可以继续进行完善,使用F3即可调用
“调整格式以便对齐(例化后的)
:map <F6> :s/^ *\./ ./<cr>^f(i <ESC>f)i <ESC>^24ldw24ldwa <ESC>hdwj |
GVIM配置自动调整将F6映射为后面一长串指令,具体指令可以自行尝试
]]>IC学习的时候,需要搭建的EDA环境。以数字电路设计为例,需要进行代码编写,验证仿真,综合,形式验证,后端综合等,相关软件,本博文分享一篇EETOP论坛网友ZHZIC分享的安装方式与资源,笔者自行依据教程进行安装,可以运行相关数字设计所需要用的软件。
EDA虚拟机仅供个人学习使用,且为免费使用,切勿商用。如果商用,请购买正版工具。使用者禁止私自售卖该虚拟机,带来的侵权后果由使用者自行承担。
先给我的环境。
链接:https://pan.baidu.com/s/1WfbL6dcHg7nKVTDGq9hOzQ |
其中解压密码与root密码均是: 123456
目前已经集成了数字,模拟相关的基本工具,工艺库如下。
├── Cdence
│ ├── IC617
│ ├── IScape
│ ├── license
│ └── MMSIM151
├── iso
├── lib
│ ├── SMIC_018_MMRF_oa
│ └── tsmc180rf
├── Mentor
│ ├── calibre2018
│ └── license
├── Package
│ ├── cadence
│ └── synopsys2018
├── patch
└── Synopsys
├── Formality2018
├── ICC2018
├── installer
├── LC2018
├── PrimeTime2018
├── SCL_2018
├── SpyGlass2016
├── Starrc2018
├── syn2018
├── VCS2018
└── Verdi2018
现在的资源太多了,自己去找,会找到很多,不知道有用没用的,下面的教程笔者经过尝试可以安装运行。教程步骤非常齐全,且论坛坛友评价也很不错。链接如下
1,博文的推荐与安装方式
EDA软件安装教程,包括RHEL7.8、cadence软件、calibre、s家软件
2,SpyGlass的安装
SpyGlass2016.06安装破解教程
3,笔者安装环境展示
最后,根据教程,可以完成GVIM,SpyGalass,VCS,Verdi,DC,PT,FM,ICC等主要是数字相关的软件。有需要笔者可以提供安装好的虚拟机资源。后续笔者会提供各个软件使用的教程,主要是官方UG(User Guide)或者是SU(Student Guide)的lab学习总结或者是自行学习总结的小demo。
最后,感谢以上同学无私分享。
其他:
1,下面是自己在eetop开的帖子,有进一步问题可以进行参考。全套数字模拟设计EDA环境。带模拟工艺库
VM版本笔者使用的链接如下,带破解安装教程。要是有可以使用自己的即可。最开始使用的时候选择我已移动虚拟机。否则无法使用。会导致破解失败!!!
链接:https://pan.baidu.com/s/1H1gmtQf6GTGVczGQP1j_5g |
2,模拟的工艺库配置参考链接如下
Cadence Virtuoso IC617的启动和新建工程
使用yum进行安装软件的时候报错
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager |
yum 是一个软件安装管理的机制,通常情况下安装软件需要连接到网络上,从网络上的软件库进行软件的下载及安装,但是 RHEL 系统只有注册的用户才能用 yum 机制进行线上安装,可以直接将将 RHEL7 的 yum 源换成 Centos7 的。就可以进行安装了。
cat /etc/redhat-release |
要是版本一致后续的操作与博主一致,不一致的需要自行进行略微的改动。
查看已经安装的软件包
rpm -qa | grep yum |
删除
将黑体换为以上安装的软件包,将其意义删除
rpm -e yum-rhn-plugin-2.0.1-10.el7.noarch –nodeps
也可以使用如下命令,将其一次删除完
rpm -e PackageKit-yum-1.1.10-2.el7.x86_64 yum-3.4.3-167.el7.noarch –nodeps
可重新查看,检查是否已经去全部删除,确保已经完全删除
ping www.baidu.com |
使用Ctrl+C
可以终止访问
下载的网站为 http://mirrors.163.com/
进入找到你自己版本的对应文件,注意下载的需要与你上面删除的一致。CentOS几乎和RedHat是一样的,所以无需担心软件包是否可安装。
wget http://mirrors.163.com/centos/7/os/x86_64/Packages/PackageKit-yum-1.1.10-2.el7.centos.x86_64.rpm |
rpm -ivh *.rpm --force --nodeps |
新建一个终端,进入超级用户模式,进入目录cd /etc/yum.repos.d/
编辑文件gedit CentOS-Base.repo
在弹出的文本框输入
#CentOS-Base.repo |
保存退出
yum clean all |
使用如下yum -y install gvim
安装等待,完成时候会出现Complete!
打开一个终端,输入gvim
键入:q
退出
RedHat Linux 7安装CentOS 7 yum源
rpm安装软件时提示warning: *.rpm: Header V3 RSA/SHA256 Signature, keykey ID c105b9de: