在MICAS的这段时间,我深刻体会到了Linux系统与写脚本做仿真、做综合、做分析的重要性,对于一个硬件开发者而言,学会Linux系统的操作也是以编写脚本、运行脚本为目的的。这篇随笔我会记录一些最基本的Linux命令,以及四种脚本的使用方法以及一些实例。
想系统学习可以上这个网:https://www.runoob.com/linux/linux-tutorial.html,但我建议先了解然后现学现用
- 什么是Shell
- Shell是一个应用程序,连接了用户和linux内核,shell在开机时就会启动等待接收命令并作出响应,相当于一个解释器,解释用户的指令,直观来看就是命令窗口。个人理解是,windows也有类似shell的应用程序,只不过windows中的shell做成了gui的形式,只需要用鼠标点一点就输入一个shell指令打开网页或是打开应用程序。
- Bash Shell:打开linux的命令窗口就相当于进入了bash shell,也是linux中缺省的shell,我们键入的命令都是由bash shell解释器解释给内核并完成操作的。
- cd <folder name>:进入目录;ls:展示当前窗口的文件;rm <file name>:删除文件;rm -rf <folder name>:删除文件夹;mkdir<folder name>:创建文件夹。
- vim/kate <file name>:打开文件,其中进入vim界面后,可以按i进入输入模式,按esc回到控制模式。控制模式下,:q为退出,:wq为保存并退出。这个指令也可以用于创建文件
- echo $<var>:显示该变量当前的值,其中$<var>永远用于表示这个变量当前的值,echo相当于一个显示命令。
- source<filename>:在命令窗口中执行文件中的每一行
- /../表示上级目录,因此cd ..表示回到上级;/./表示当前目录;/~/表示主目录;\表示下一行是接在本行后面的,执行时会当成一行
- command -<op>,其中-表示该指令的选项(缩写),相当于--<option>。例如cd -h <==>cd --help,打开帮助界面
- nautilus表示打开主文件夹gui界面,nautilus .表示打开当前文件夹gui界面
- 键入tab可以自动补全命令/文件名等,非常好用
- 通配符*,如*.txt即为该目录下所有txt文件
- 当然,当你在某个软件打开的情况下,可以使用软件内部的命令,如打开ncverilog后ncverilog -f<file>就是编译<file>内所有列出的verilog文件,primetime <script>就是在primetime软件内执行后面列出的脚本。可以查阅相关手册以编写。
- Makefile脚本(https://www.gnu.org/software/make/manual/make.html)
- makefile在我看来是一种特殊脚本,有着严格的格式,要执行makefile的内容需要使用make指令,当你键入make -<op>后该指令会自动在本目录下寻找makefile文件并读取其中的规则执行。其中command命令利用bash shell编译
- makefile的格式如下:
<target>:<prerequisite>
<tab> <command1>
<tab> <command2>
...
- 举个例子
clean:
\rm -rf INCA_libs
nc: clean
reset; ncverilog +sv -f ../lst/files_verilog.txt +nc64bit +nctimescale+1ns/10ps +access+rwc -ALLOWREDEFINITION
nc_with_netlist:
rm -r INCA_libs reset; ncverilog +sv -f ../lst/files_verilog_with_netlist.txt +nc64bit +nctimescale+1ns/10ps +access+rwc -ALLOWREDEFINITION
- 以上这段makefile目的是对verilog进行仿真,我们如果在命令窗口键入make nc,则会编译nc后的字段:1.执行clean模块后的命令,即删除后面的文件夹以让上次结果不影响本次编译。2.按顺序执行下列commands。如果键入make nc_with_netlist则会执行该模块下的命令。
- bash脚本
- 第一行加入#!/bin/bash告诉系统这个脚本用bash编译器编译,文件后缀.sh。
- 可以让这个脚本变成可执行文件,就是直接键入文件名就给你执行,但我认为source <script name>效果一样,若想使用,编写完成bash文件后输入如下命令:
chmod +x ./filename.sh #使脚本具有执行权限
#######命令行输入./filename.sh可以直接执行该脚本
- 变量定义直接说,双引号表示字符串“string”,不然表示整数
- bash文件中的所有命令利用bash shell执行,因此就和在命令行中输入命令一样。这里加入介绍判断和循环语法,用例子说明,大家体会一下,百度也可
#################files_tb.txt里面装了10个testbench,利用这个循环我可以生成10个测试文件,并输出10个vcd文件做分析for i in {1..10}#i的值从1到10循环
do
ncverilog +sv -f ./files_with_netlist.txt +sv $(sed -n "$i p" ./files_tb.txt) +nc64bit
done
##############网上抄的,大家看看结构
if [ $1 -gt 100 ]
then
echo Hey that\‘s a large number.
pwd
fi
- tcl脚本
- 个人感觉tcl脚本和bash脚本非常像,后缀.tcl,但一般而言tcl脚本在进入软件后使用,source <script name>进行调用。具体语法可以百度,比我说的全:)
- python脚本
- python脚本就相当于写python程序,非常非常非常好用,但是要在第一行加上#!/usr/bin/python/
- 不想把脚本编程可在命令行输入python <filename>.py
- 语法就是完完全全的python语法,本菜鸡在这里不说了,有问题百度
- 正则表达
- 正则表达:regular expression,用单个字符串匹配描述、匹配一系列不同的字符串,可以用于替换一个文本文件中的所有相同字符串。在python中有了re库后,python就可以使用正则表达式了,我最常用的linecache就可以用。
- bash shell中sed、awk、grep等命令也可以用正则表达式
#######################插播一个latchup######################
- latchup是如何产生的?
- 在代码层面上,latch主要是由于if、case以及for等循环判断语句没有写完整导致的(缺少else、default或是for循环中有些信号没有定义),也可能是always后的敏感事件列表中没有完全列出模块内赋值号右边的变量,综合时这些不完整的代码有时候会被综合成latch并对网表级仿真造成一定影响,因此在综合后我们需要查看综合日志以确认无latch产生。同时,对于一些需要综合的数字设计,我们也要注意补全else、default等语句,对所有可能出现的情况进行判断。
- latch和flip-flop的区别?
- 简单来说就是latch是电平触发而flip-flop是边沿触发,虽说都有存储数据的功能,但出现latch后在功能上会与设计有出入,同时latch并不是同步电路,因此不可以同步复位,上电后会处于不定态,从而在网表仿真中出现错误。同时latch也会使得时序分析变得更加复杂,不能过滤毛刺,在设计中我们一般会避免latch的出现。