在较短时间内开发出高性能的硬件产品是硬件设计工程师面临的设计挑战之一,本文介绍的Handel-C语言设计方法能提供功能强大的设计环境。采用新的方法,软件工程师就能设计、建立和优化硬件,并在具有完整功能的硬件原型中看到设计结果,所需的时间比传统方法大为缩短,因而Handel-C具备替代传统复杂IC设计方法的潜力。 创新实验室(Creative Labs Inc.)发明了一种新的采用Celoxica Handel-C语言(一种类似于C语言的高级设计语言)的设计方法,它能提供功能强大的设计环境,在这种环境下设计人员能以最快的速度设计出符合要求的硬件产品。对于创新实验室的开发人员来说,Handel-C是一种非常值得开发的语言。由于还没有实际数据能显示这种新设计环境与设计方法的优越性,创新的两位软件工程师在没有一点硬件设计和Handel-C使用经验的情况下,仍接受了开发音频硬件处理器以验证这种语言功能的任务。 这项任务的最初阶段是为期两天的理论学习,即对Handel-C语言的技术文档及相关环境(Celoxica DK1设计套件的开发版本)的深入学习。这两位工程师从中发现相对于传统的RTL设计语言如Verilog或VHDL来说,Handel-C语言能使设计人员用更高层次的抽取来描述硬件。 对Handel-C语言有了一定的了解后,这两位工程师制定了能满足关键目标要求(即音频流的实时性与高分辨率处理要求)的基本功能框图。通常音频处理适合采用管线结构以及硬件的并行处理方式,具体到这个实际项目,两位工程师把设计分成了以下几个阶段: - 数字音频提取和PCM样值格式化。这一阶段主要是从ATAPI CD-ROM中提取音频数据,并对立体声样值进行编码前的去交织处理。
- 滤波。在这一阶段数据将从时域变换到频域,并被分成32个子波段。
- 编码。这是数据压缩与编码阶段,将对前面处理过的数据进行高压缩率处理。
- 输出阶段。该阶段将编码过的数据进行交织成帧处理,然后输出最终的数据比特流。
在本次设计中,设计人员采用了多个表来实现对管线处理的支持。由于Handel-C非常方便设计的分割,因此设计人员能尝试用多种方法实现片上ROM和RAM以及片外RAM之间的分割表。为了支持繁重的乘法任务,设计人员并行配置了二个乘法器来提升性能。最终设计采用了四级并行管线结构,允许高度共享各种资源,如乘法器、查询表和共享RAM库。 这两位工程师在设计的最初阶段采用了具有一万行代码的现成音频处理器软件实现方案。他们利用软件工程师所熟知的增量微调技术先将内核代码组件转换为硬件, 在模块级工作一段时间后他们就进入了详细编码阶段。Handel-C变换一般是先将浮点变量和公式转换成整数代码,这种转换根据现成算法,并且非常容易在线测试。在本例中,设计人员对整数长度进行了修改,然后测试硬件结果,并通过重新编译代码和重新配置硬件实现来分析辨别音频质量的细微变化。 经过重新编译与重新配置后,设计人员能通过编写一段快速测试基本功能的程序来评估对Handel-C的理解程度,比如用于实现直接存储访问数据传送的简单代码模块程序。事实上,Handel-C能使设计人员通过分析实际的硬件实现来方便地进行功能验证,而VLSI设计方法的验证要求相对来说要复杂得多。 工程师采用了基于现有音频处理器软件算法的简单有效的开发策略。由于设计是一个模块一个模块进行的,设计人员只需简单地用实际硬件替代各个软件管线级。现有的软件版本可以作为硬件管线功能的验证平台。硬件管线级可以被馈入相同的输入以测试软件版本功能,然后越来越多的硬件管线成品又可以被馈入剩余的软件管线以测试总体性能。因此这种方案下设计人员只需简单地将部分硬件管线的测试结果插入到软件版本中就能得到总的验证结果。 从这个意义上讲,主要的开发工作就是软件。硬件开发的主要挑战性在于要了解哪里的资源能得到高效利用,并开发最有效的管线技术来达到较高的时钟速率,因为这要比非管线设计需要更多的逻辑电路。 开发人员每周都会在管线方面有所进步,他们必须将软件版本的每个模块一行一行地转换成Handel-C语句。开发人员的工作重心是如何将每个值提升到分数幂, 因为用硬件实现指数运算的成本是非常高的,因此他们采用了一个大型的查询表(128k字节),通过该表能取得量化功能中分段线性的近似值,对于指数运算来说所达到的精度已经足够了。 在对每个模块的转换过程中,开发人员要么去仿真新的Handel-C程序,要么将它们直接转换成硬件,并在硬件环境中对它们进行测试。在转换工作结束后,再开发和测试I/O模块,最后将整个音频处理器设计集成到单个FPGA中。工作原型机设计花费了两位工程师六个星期的时间,其中包括最初的学习阶段。 由于本方案非常灵活易用,设计小组决定再花一周时间来优化硬件设计,并开发出不同的查询表共享片上或片外存储区间分割的方案。最终设计人员发现能将多个表合并以减少表的数量,并能被管线的不同级共享。他们还在内部环中增加了更多的精确并行过程,这样可以提高每个时钟周期的运算量。 快速的设计过程 工程师仅用了七周的时间就设计出了性能比实时系统还要好的音频处理器,而且时钟速度只有6MHz,据说处理器的性能仍有提升的余地。最终设计占用了93%的FPGA资源,如果采用模块RAM还能进一步减少资源占用率,但在所用的开发版的DK1编译器中还没有提供这一可选功能。 与软件实现相比,硬件音频处理器的最大好处是单个时钟周期内的性能。工作于6MHz时钟的硬件性能要比工作于奔腾166MHz的软件版本的实时性能好得多,这主要得益于可从算法中提取的并行机制。例如设计中的许多DSP类操作能在单个时钟周期内获得多个乘法器资源。 另外,Celoxica公司的设计服务咨询人员能提供空间与时延优化方面的建议,有助于创新实验室工作小组决定何处并如何共享资源与管线。滤波器级经过一名Celoxica公司设计服务工程师的优化后,速度一下提高了近两倍。 对于创新实验室来说,Handel-C以及相关的开发环境的功能非常强大,能使设计人员在较短的时间内开发出高性能的硬件产品。采用这种类似C语言的高级语言后,软件工程师就能设计、建立和优化硬件,并在具有完整功能的硬件原型中看到结果,而所需的时间只是传统方法所需时间的一小部分。对于今天的电子企业来说,Handel-C能提供替代传统复杂IC设计方法的快速开发方式。 算法化的硬件设计 采用Handel-C硬件设计方法的C-savvy工程师只需要专注于满足目标应用的算术要求。事实上,这些工程师在进行硬件设计时无需过多地考虑实现细节问题,因为依靠Handel-C编译器内部的Celoxica技术就能产生XNF或EDIF网表文件。 基于ISO-ANSI C的Handel-C语言是一种同步编程语言,其中最基本的概念就是时序。Handel-C编译器采用一个或多个连续运转的全局时钟来构建同步电路,这些时钟再用来激活控制或数据信号。程序中的每个控制指令映射为硬件中的一对控制信号(开始与结束),所有用户程序中的变量都映射为构建于触发器组的硬件寄存器,而这些触发器组专属于特定的目标器件。全局时钟用来激活每个同时与时钟连接的触发器,并将其作为一种原始活动形式。 结果如图1所示,用于赋值语句“R=Exp;”的控制电路将开始信号作为时钟,因此激活了赋值目标寄存器所用的信号。在赋值周期的最后阶段,表达式硬件会计算出新的值,然后装载入目标寄存器中。开始信号需要延迟一个时钟周期以便为结束信号提供这样的控制流程。这样的安排主要源于以下事实:赋值过程通常在一个时钟周期内完成,速度很快。而Handel-C语言拥有足够的组合逻辑,即使是很复杂的表达式也能在一个时钟周期完成所有的赋值操作。 Handel-C编译器可以简单地将位转换操作翻译成组合硬件电路,如“&”操作符翻译为“n AND”门,此处n是操作数的位宽;“|”和“^”操作符同样如此。“~”操作符则代表n反相器。同样,其它基本的操作也被映射为组合逻辑,或用来开发目标器件的其它一些功能。 为了定义硬件中的并行结构,Handel-C提供了语句并行执行的par指令:par{S1, S2, ... Sn}。该语句将控制同时送给所有的并行语句S1,S2. . . Sn以初始化并行执行操作(图2)。只有当所有组件结束时,Par{}指令才结束。这样,并行控制电路将各个独立的结束信号收集到一组触发器中,并在最终结束信号一生成就产生它自己的结束信号。另外,该结束信号还能复位同步触发器,使它们作好使用准备。 Handel-C编译器吸取了传统软件编译技术以及逻辑优化技术的精华,在编译过程中,编译器先将输入代码变换成抽象语法树。在这一变换过程中,编译器将执行宽度推断、常量堆叠和其它语法方面的扩展工作,如宏表达、再生器扩展等等。接着编译器会将抽象语法树变换为包含粗略功能模块的高层网表。该网表优化后才扩展为专业技术性低级网表,这种低级网表能充分利用目标器件的特定结构特点,如快速运载链、片上RAM、专用乘法电路等等。编译器最后还会在低级网表级进一步优化。 Michael P.Songy
设计工程服务部总监
Celoxica公司 Mat Newman
技术部高级副总裁
Celoxica公司 |