脚本怎么写???

在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的出现。

相关推荐