【分享】SOC参数自动配置设计方法与功耗优化 1 |
引 言
片上系统( system on chip ,SOC) 已经成为21世纪全球瞩目的关键核心技术。 SOC 具有垂直整合的特性,并注重创新和创意,产品非常个人化、应用差异化、样式多元化。 SOC 应用需求的广泛性,以及大部分SOC 应用功能单一、性质确定的特点,决定了SOC 目前大多是针对专门的应用领域进行专门设计来满足高性能、低成本和低功耗的要求。 目前SOC 的发展趋势是: 体系结构需要在新技术与产品、市场和应用需求之间取得平衡;设计方法趋向于走专用、定制和自动化的道路。
一方面由于SOC 的专用化设计要求,另一方面由于IP 提供商的支持, SOC 的集成设计方**向参数化设计发展。 SOC 的参数可能影响系统功耗、性能和面积,每个参数的选择范围是一个有限集合,因此一个SOC 设计可以理解为一组SOC 参数的选择。在系统结构形成后,SOC 设计问题就转变为参数配置问题。随着参数的增多,手工对代码进行修改是不可接受的,这不仅效率低,而且会增加错误率。本文对原有的硬件描述语言进行扩展,并建立了参数自动配置环境,通过分析SOC 参数属性,利用邻域搜索算法针对功耗进行自动参数优化。
参数自动配置设计方法
采用传统的硬件描述语言(HDL) ,参数自动配置的难点在于:首先模块本身的描述随参数配置的改变而变化;其次当模块被更上层的父模块例化(instance) 时,其接口逻辑在不同参数配置下也可能不同。在进行参数化设计时,只能采用硬件描述语言的宏定义,这种方法不仅不够灵活,而且代码复杂,冗余很多。
参数自动配置环境由一组运行脚本组成,主要通过两个工具Eperl 和Vperl 来进行参数配置,实现了代码的即配置即生成。 Eperl 的作用是定制内部的逻辑,Vperl 的作用是生成模块间的连接关系。 基于Verilog 硬件描述语言的参数自动配置过程如下。
1) 参数首先被送到3.evp 文件,这是同时包括Eperl 语法和Vperl 语法的文件,因为Eperl 和Vperl 电路的语法非常简洁,所以设计师不仅不用担心会在这里陷入困境,反而会大大减少设计强度。
2) 3.evp 文件经过Eperl 处理后生成3.vp 文件,这是只包含Vperl 语法的文件,这时所有的参数都被解析,模块内参数配置都已经完成了。
3) 3.vp 经过Vperl 处理后, 最后生成3.v 文件, 即电路的Verilog 描述。因此在参数化设计中,与传统设计不同,设计师的描述文件是3.evp 文件,而Verilog 代码只是作为设计的中间代码出现。参数自动配置环境建立了一系列脚本程序来自动解析相关文件的相互关系,并生成整个系统的硬件描述语言描述。
Eperl 最初用作HTML 页面生成,适合于静态文本相当多,但是又有一部分代码需要动态生成的场合。因为大多数硬件描述是静态代码,只有一小部分需要可配置,所以Eperl 非常适用于电路的硬件描述。 Eperl 结合了Perl 的解释功能,相当于在原文本结构中插入了一段内嵌代码。 这段内嵌代码最终可以生成想要配置的硬件结构。 Eperl 利用Print 结构来传递所有的内嵌代码。 Eperl 所做的相当于程序员写一个用于生成代码的Perl 脚本。 下面所示程序段是从dma _fifo.evp 文件中提取的一部分代码。
∥Synchronous FIFO.fifo_depth x fifo_width bit words.
&ModuleBeg ;
&Ports ;
&Regs ;
&Wires ;
< : $width_msb=$fifo_width21 ;
$depth_msb=$fifo_depth21 ;
$ptr_width=log ( $fifo_depth)/log (2) ;
$ptr_msb=$ptr_msb21 ;
: >
&Force (mem,fifomem, < :=$width_msb : >,0,
< :=$depth_msb : >,0) ;
……
∥Update FIFO memory.
always @(posedge clk) begin
if ( rstp== 1′b0 & & writep== 1′b1 & &
fullp== 1′b0)
fifomem [ head ] <=din [ < :=$width_msb :
> :0 ] ;
end
∥Update the head register.
always @(posedge clk) begin
if ( rstp== 1’b1)
head [<:=$ptr_msb:>:0]<=<:=$ptr_width:>′b0 ;
else
if (writep== 1′b1 & & fullp== 1′b0)
head [ < :=$pt r_msb : > :0 ] < =
head [ < :=$pt r_msb : > :0 ] + 1 ;
end
..
在< :…… : > 中的就是Eperl 代码,以& 开始的是Vperl 代码, 如&ModuleBeg 表示模块的开始。 在FIFO 中,可配置的参数主要是2 个: FIFO 深度和FIFO 宽度,所以dma_fif.evp 文件对外只有2 个参数可调, 而其他的比如定义信号所需要的FIFO 寄存器的最高位width_msb 、head 指针的宽度ptr_width 等都可以用Eperl 脚本生成。 这与宏定义相比体现了Eperl 的灵活性。再比如可以通用寄存器组gpr.evp 文件利用for 循环来例化每一个寄存器,更充分地体现了使用Eperl 的灵活性。 for 循环的代码如下所示。
for($i = 0;$i<$reg _num;$i++) {
print&Instance (\iu_register\,\iu_register_$i\ );\n ;
}
: >
……
3.evp 格式的文件经过Eperl 解析后生成
3.vp格式的文件。 dma _fifo.evp 经过Eperl 解析后生成的3.vp 文件如下所示。
∥Synchronous FIFO.fifo_depth x fifo _width bit words。
&ModuleBeg ;
&Ports ;
&Regs ;
&Wires ;
&Force (mem ,fifomem ,15 ,0 ,3 ,0) ;
……
∥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
……
|
|