玩命加载中 . . .

block level clock gating

如果某个模块或者功能可以打开或关闭,且logic相对独立,则可以在这部分logic的时钟上加手动插入一个ICG,用模块是能控制ICG的开关,这样能最大限度的提升gating效率。

  1. ICG最好选取驱动能力较大的,以便于驱动足够多的DFF。

  2. ICG建议加一个wrapper,这样当需要替换其他工艺时,只需要将wrapper里的instance 换掉。

  3. 综合时对此类ICG设置don’t touch

electron-vue环境配置

工作环境centos8,切换到root用户安装npm、yarn、vue_cli

yum install npm
npm install yarn -g
npm install vue_cli -g

切换到工作用户,使用淘宝源下载库更快速

npm config set registry=http://registry.npm.taobao.org
yarn config set registry https://registry.npm.taobao.org
yarn config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/

使用npm config listyarn config list查看切换源是否成功

边界扫描

在JTAG调试当中,边界扫描(Boundary-Scan)是一个很重要的概念。边界扫描技术的基本思想是在靠近芯片的输入输出管脚上增加一个移位寄存器单元。因为这些移位寄存器单元都分布在芯片的边界上(周围),所以被称为边界扫描寄存器(Boundary-Scan Register Cell)。当芯片处于调试状态的时候,这些边界扫描寄存器可以将芯片和外围的输入输出隔离开来。通过这些边界扫描寄存器单元,可以实现对芯片输入输出信号的观察和控制。对于芯片的输入管脚,可以通过与之相连的边界扫描寄存器单元把信号(数据)加载倒该管脚中去;对于芯片的输出管脚,也可以通过与之相连的边界扫描寄存器“捕获”(CAPTURE)该管脚上的输出信号。在正常的运行状态下,这些边界扫描寄存器对芯片来说是透明的,所以正常的运行不会受到任何影响。这样,边界扫描寄存器提供了一个便捷的方式用以观测和控制所需要调试的芯片。另外,芯片输入输出管脚上的边界扫描(移位)寄存器单元可以相互连接起来,在芯片的周围形成一个边界扫描链(Boundary-Scan Chain)。一般的芯片都会提供几条独立的边界扫描链,用来实现完整的测试功能。边界扫描链可以串行的输入和输出,通过相应的时钟信号和控制信号,就可以方便的观察和控制处在调试状态下的芯片。

利用边界扫描链可以实现对芯片的输入输出进行观察和控制。下一个问题是:如何来管理和使用这些边界扫描链?对边界扫描链的控制主要是通过TAP(Test Access Port) Controller来完成的。在下一节,我们一起来看看TAP是如何工作的。

Boundary-scan Architechture

相较于AXI3,AXI4新增内容:

  • support for burst lengths up to 256 beats
  • Quality of Service (QoS) signaling
  • support for multiple region interfaces
  • updated write response requirements
  • updated AWCACHE and ARCACHE signaling details
  • additional information on Ordering requirements
  • details of optional User signaling
  • removal of locked transactions
  • removal of write interleaving

论坛里面讨论low power RTL前端设计的帖子好像不多,许多大牛的书上来就谈工艺,半导体结构,让我高山仰止,但也只能心向往之(实在有些看不懂)。

工艺的提升带来的收益可能远比RTL深度优化高,如TSMC 40LP vs TSMC 28HPC+, 后者基本上比前者面积小一半,速度快一倍,dynamic power小40 ~ 50%,代价是leakage高3~4倍。在老工艺上如何绞尽脑汁优化设计,可能也很难达到这种效果。

但作为前端RTL designer, 一旦工艺选定,我们只能在自己的一亩三分地里面做到最好,本帖就此抛砖迎玉,结合自己的工作经验讨论下low power RTLdesign, 挖个坑,希望坛子里的大牛一起帮忙填坑

刚入行做design时,考虑的是Area 和 speed,近些年来,power变成了越来越重要的指标,有时候更是牺牲Area和speed来换取power的收益,毕竟有些领域, 电池容量是很难增大的。

有人做过大体统计,降低功耗的方法和收益大体如下,对于前端RTL 设计,最好用的还是clock gating, 收益最显巨,代价最小,
其他方法也能有可观的收益,具体还的依靠具体应用场景分析。

我们知道在芯片设计中,降低动态功耗的方法有很多种。比如clock gating,power gating等。今天想介绍一个通过减小移动数据位宽来降低动态功耗的方法。

动态功耗的来源是信号的传播,翻转。clock gating通过减少时钟信号的翻转,降低了寄存器clk pin本身的功耗,并且通过寄存器的特性,间接减少了Q pin的翻转,从而降低了数据链路的功耗。而power gating更绝,直接将电路断电,更无翻转可言。这两种方式本质上都是在电路或者某些寄存器没有数据更新需求的时候减少无谓的信号翻转,以此来降低功耗。而减小传播数据的位宽,可以在有数据更新需求的时候减少动态功耗。毕竟传递的数据少了,需要翻转的信号自然也少了。但是这样做需要考虑上减小数据位宽所带来的一点额外逻辑开销造成的功耗。不过大多数时候都能得到正收益,特别是当数据位宽较大的时候。

今天想分享几种流保序策略。保序问题在不同的应用领域都会遇到,毕竟硬件电路本质上是需要很多数据流传输的。各种协议的接口,处理器的数据处理,指令处理等都离不开对应数据有序的传输。

如果只有一条数据流,可以直接使用一个FIFO保序。如果是多数据流,多个读写口,可以分不同ID使用不同FIFO保序。今天想讨论的是多数据流混合场景下只有1个读口和1个写口的保序。不同的数据流有对应不同的ID,大致有以下5种不同的保序策略。

首先来看一下场景,这是一个在大多数设计中都会遇到的数据包调度问题。有A,B两个输入通道,向数据调度模块DUT输入数据。该调度模块DUT有一个输出通道C。A,B和DUT,DUT和C都是通过简单的握手传输数据。

img

两个输入通道都有数据包输入,可以同时输入。数据包以packet为单位,每个packet为128bit。不同的数据包有不同的id,id是4个bit。A和B通道不会同时输入同ID的数据。每个packet带有2bit的qos,qos越高,可以理解为该id的packet优先级相对于其他id的packet优先级越高。输出通道没有反压,只要有数据就可以出去。输入通道接受反压。数据输出的条件是,同id的packet要保序输出,不同id的packet,优先级较高的需要尽量先输出。

为什么使用正则表达式?

典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。

通过使用正则表达式,可以:

  • 测试字符串内的模式。
    例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。
  • 替换文本
    可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
  • 基于模式匹配从字符串中提取子字符串。
    可以查找文档内或输入域内特定的文本。

terminal shell配置

采用oh-my-zsh

  1. 安装zsh:
sudo apt install zsh
  1. 安装ohmyzsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
  1. 在~/.zshrc添加
# cd then ls
function chpwd() {
    emulate -L zsh
    ls
}

alias g='gvim'
alias gz='gvim ~/.zshrc'
alias gv='gvim ~/.vimrc'
alias ss='source ~/.bashrc'
alias dakai='xdg-open'