打印

【分享】SOC参数自动配置设计方法与功耗优化 2

[复制链接]
1804|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jie4567|  楼主 | 2010-8-30 11:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
【分享】SOC参数自动配置设计方法与功耗优化 2
当然IP 模块的不同配置会造成SOC 系统信号的不同。 如向系统中添加通用异步收发器(UART)模块,SOC 系统就要增加输入输出端口,并且要增加很多内部的连线,比如把IP 总线引入UART.Vperl 程序可以解决这个问题。

Vperl 的工作原理是通过分析模块内使用的信号的属性来确定模块的信号定义。 HDL 具有一定的语法结构,比如Verilog 有2 种信号类型,always 块中的<= 操作符左边一定是reg 类型信号,由此取reg 类型的补集就是wire 类型,除非显式地通过&Force()声明为其他类型,如在dma_fifo.vp 中的第6 行代码,声明为二维reg 数组类型。分析模块也可以确定模块的输入输出,如果一个信号在模块中自始至终没有被赋值过,那么这个信号必然是input信号;同理,如果一个信号被赋值但从来没被使用过,就是output 信号; 如果既被赋值过,又被使用过,那么这个信号有很大可能是这个模块的内部信号,不是模块的端口,除非显式地通过&Force ( ) 声明为inout类型。 对于模块中例化的子模块(在3.vp 中用&Instance() 语句声明) ,Vperl 程序首先分析模块间的从属关系,并先处理最底层的子模块代码,在自动分析子模块接口的输入输出属性后,缺省地把子模块的输入输出信号作为上层模块的接入信号,并在上层模块中自动进行连接,当然Vperl 也提供了&Connect () 语句来更改子模块接入上层模块的信号名。 所以用Vperl 的格式书写的文件3.vp不需要在文件头部定义信号名。 如下所示是dma_fifo.vp 文件的示例代码。

∥Synchronous FIFO.fifo _depth x fifo _width bit words。
module dma _fifo (clk,rstp,din,writep,readp,dout ,emptyp,fullp);
input clk;
input rstp;
input [15:0] din;
input readp;
input writep;
output [15:0]dout;
output emptyp;
output fullp;
reg emptyp;
reg fullp;
reg [15:0]dout;
reg [ (DEPTH-1):0 ]  tail;
reg [ (DEPTH-1):0 ]  head;
reg [ (DEPTH-1):0 ]  count;
reg [15:0 ] fifomem [0:MAX_COUNT];
……
∥Update FIFO memory。
always @(posedge clk) begin
if ( rstp==1′b0 && writep==1′b1 &&fullp==1′b0)
  fifomem [head]<= din [15:0];
end
∥Update the head register。
always @(posedge clk) begin
  if ( rstp==1′b1)
    head[1:0 ]<=2′b0;
  else
   if (writep==1′b1 & & fullp==1′b0)
     head[1:0 ]<=head[1:0 ] + 1;
end
……

在上述程序段中, din [15:0 ] 对应参数fifo_width=16 的情况, 如果在dma_top 模块中用Vperl 语法例化了dma_fifo ( &Instance(dmafifo);) ,那么Vperl把din[15:0]连接进dma_top ,并进而生成dma_top.v 代码,即dma_top.v 的信号定义。

Vperl 实际上是接管了模块间的信号连接工作,使得设计师不用担心参数改变对模块间关系的影响。 另外,Vperl 的另一项优点就是省去了每个HDL 文件中繁琐的信号定义,避免因为信号定义引起的语法错误(比如信号忘记定义、信号名打错等) ,大大加快源代码的编写速度。 当然,使用Vperl 需要遵循一定的语法。

在参数自动配置机制中,结合Eperl 和Vperl这两种工具就可以由选定的参数组合自动地配置硬件结构。 对于软件而言,由C 语言编写的应用程序不需要修改,但是编译器需要针对不同的执行单元的配置增加减少指令并进行优化。

SOC 参数优化

一个SOC 中包括了P1 , P2 , P3 , ..., Pn 等参数。每个参数的值都可以从一个有限集合中选取。为了选择最优的参数值,也就是为了达到最优的系统配置,使功耗、性能和面积达到合理的目标,需要进行参数优化。一种方法是运行一次仿真后,记录下指令序列(trace) ,将不同的参数配置结合指令序列通过纯软件的行为分析器进行分析。这种方法的优势是速度快。但是在不同的结构参数下,指令序列差别很大,特别是当指令集都发生改变时,结果的可信度大大降低;而且行为分析器对一些动态参数,比如动态电压,对功耗的影响无法估计,所以可能不得不进行多次仿真来获得较准确的功耗估计。由于仿真时间一般较长,参数的优化算法对设计周期的影响很大。

参数的属性
        
在SOC 设计中的定制概念不再是晶体管级的定制,而是体现在模块级层面上,具体表现为系统的结构参数。 SOC 的系统参数具有一些属性,如大多数系统参数是相互影响的,这些相关性必须在参数配置时予以考虑。 相关性可以区分为数值相关和性能相关。参数自身也有单调性和层次性。

数值相关 
        
两参数的数值相关意味着一个参数的选择限制了另一个参数的选择范围。 例如对于容量限制为64 ×8 bit s 的直接存储器存取(DMA) 缓冲区,可以缓冲64 个8 位数据,但是当用于缓冲32 位数据时,只能放16 个数据。 在这里数据个数和数据格式是数值相关的。再如可配置处理器的乘法器(MUL) 单元一般不会和乘累加器(MAC)单元一起出现,因为两者的功能是重叠的。在进行参数选择时,利用数值相关性可以去除一些不可能的参数值,缩小参数的选择范围。

性能相关 
        
两参数的性能相关意味着一个参数的改变会影响另一个参数的最优选择。性能相关是有方向性的,如果参数B 与A 性能相关, 则参数A 是B 的主动参数,参数B 是A 的随动参数。 在参数选择时,可以先确定A 再确定B 。如寄存器的个数相关与MUL 单元相关意味着MUL 单元是主动参数,而寄存器个数是随动参数。 两个参数也可能互相相关,也就是说参数A 和B 之间形成环路。这时两个参数必须同时调整才能得到最优的方案。 例如高速缓存的组参数和每个缓存块的容量参数的性能是相关的。在进行参数选择时,性能不相关的参数可以独立选取最优解。

单调性 
        
很多参数对某一优化目标而言是单调函数。 例如决定UART 缓冲区大小的参数,对功耗这一优化目标,一般是缓冲区越大功耗越大。参数的方向性也可以缩小参数的选择范围。

层次性 
        
模块参数只影响模块自身,比如Cache 容量、Cache 行大小和关联组个数。多个模块参数可以形成一个系统参数,比如从系统角度来看,Cache 失配率就是一个系统参数。 利用参数的层次性可以进行局部优化。

邻域搜索算法
        
参数的性能相关性是参数优化的主要难题。 首先需要一种数据结构来表征性能相关性。 图1 较好地表示了参数的性能相关性。其中,参数用节点表示,而节点与节点间的连线表示两参数的性能相关。节点和节点之间的连线是有方向性的,从A 到B 的边表示参数B 与A 的性能相关。

图1  功耗性能相关图


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

71

帖子

1

粉丝