APP下载

VLIW架构处理器软件模拟器设计

2014-07-28黄光红王昊

电脑知识与技术 2014年18期

黄光红++王昊

摘要:分析VLIW架构处理器特点,设计周期级精确的指令集模拟器。模拟器被按照功能划分为若干具有规范接口的模块。通过修改、替换模块可快速构建新模型,具有较好的可扩展性。采用高效的二进制指令译码算法和JIT-CCS技术提高性能。实践表明,本模拟器在处理器设计过程中起到重要作用。

关键词:超长指令字;处理器设计;指令集模拟器;周期级精确

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)18-4286-04

Design of Simulator for VLIW Processor

HUANG Guang-hong, WANG Hao

(East China Research Institute of Electronic Engineering, Hefei 230031 , China)

Abstract: Analyzing VLIW architecture processor, this paper designs a instruction set simulator with cycle accurate. According function, the simulator is divided to several module which with standard interface. The simulator is flexible and is able to become other processor prototype fast by modification and replacing。Adopting efficient decoding arithmetic for binary instruction and JIT-CCS, the simulator obtains excellent performance. The result demonstrates that the simulator can work effectively for design VLIW processor.

Key words:VLIW; processor design; instruction set simulator; cycle accurate

处理器研究和设计是一项消耗资源多、持续时间长的科研工程。特别是嵌入式处理器设计,面对竞争日益激烈的市场环境,研发人员必须尽量缩短上市时间获取市场先机。为了在有限时间内设计功能正确、性能高效的处理器,指令集模拟器(Instruction Set Simulator,简称ISS)不可或缺。指令集模拟器在各阶段发挥着重要作用。在研发初期,可以为处理器架构设计提供评估、分析系统瓶颈。在设计和验证阶段,更精确的模型可以为硬件模型提供设计参考和验证比对。到用户使用阶段,指令集模拟器为软硬件系统并行开发提供基础。指令集模拟器按照模拟精确度分为指令精确 (Instruction Accurate)和周期精确 (Cycle Accurate) [1]。若需要精确模拟目标处理器流水线行为,则必须实现周期精确模型。该文研究的目标处理器是一款数据信号处理器(DSP),属于计算密集的嵌入式处理器。通过分析指令的流水线行为可以优化算法。因此本文研究的模型器是周期精确的。

1 VLIW架构DSP建模技术

本文DSP采用超长指令字(Very Long Instruction Word,简称VLIW)体系架构。VLIW是提高指令级并行性的主要技术之一。VLIW处理器包含多个独立的计算单元,具有同时执行多条指令的能力。与超标量多发射处理器不同,VLIW处理器的指令级并行性由软件编译器发掘。这就减小了硬件设计复杂度。编译器采用静态调度的方式将多条可以并行发射的指令,组装为一条长指令,称为指令束[2]。指令束中的指令必须满足编程约束,由约束检查器保证。该文DSP最大发射宽度为8指令字,即32bit至256bit。

本文DSP具备指令并行性高和计算性能强等特点,属于哈弗结构,采用独立的程序空间和数据空间。指令集为RISC类型,指令字占用32bit,数据存储器只能通过load/store指令访问。从软件模拟器建模角度分析,其硬件系统架构如图1所示。

硬件系统架构如图显示,处理器具有4个完全相同的计算单元X、Y、Z、T。计算单元包含一组计算部件,由4个加法器(ALU)、2个乘法器(MUL)、2个移位器(SFT)和64个寄存器组成。每个计算单元只能使用自身的寄存器作为操作数。计算单元通过单元间寄存器赋值指令传输数据。为了提升访存效率,处理器设计了专用的地址产生单元,它包括3个完全相同的地址产生器,能同时产生3个访存地址供访存指令使用,每个地址产生器具有16个地址寄存器。充足的计算部件和地址产生器提高了指令级并行性。

软件模拟器有三个重要指标:精确度、性能、可扩展性[3]。为了评估流水线性能、协同验证硬件流水线模型、指导用户编写尽可能少的数据相关汇编程序,该文模拟器必须设计周期级精确的流水线模型。性能主要指模拟器的指令模拟运行速度,精度越高,速度越慢。对于运行计算密集的大型测试程序,性能显著影响验证效率。可扩展性反映模拟器的修改、重用难易程度。对于快速修改已有模拟器用于新处理器架构评估情况,可扩展性越好越易实现。三个指标相互影响,设计时需要综合考虑。该文设计目标是达到周期级精确要求、采用优化技术提升性能、提供较好可扩展性满足易于修改和重用的需求。

2 VLIW架构模拟器设计

指令集模拟器建模,首先需要建立目标处理器的状态机,每个时钟周期都对应确定状态,它主要由处理器的寄存器、存储器体现。目标处理器指令序列是状态机的输入,随着每个时钟周期的指令输入,状态机都有确定状态输出。再者,是组合逻辑建模。状态机的变换过程是由组合逻辑完成的,如流水线各级的处理逻辑、计算部件的计算逻辑、程序控制模块的控制逻辑等。该文设计周期级精确的流水线模型,指令流过流水线各级对状态机影响都具有精确反映。译码模块是影响模拟器性能的关键节点,该文采用优化技术重点优化译码模块。为了增强可扩展性,采用面向对象设计技术和模块化的设计思想构建模拟器的软件体系架构,使用C++高级语言实现模拟器。endprint

2.1 软件模拟器架构设计

模拟器软件架构与性能、可扩展性紧密相关,设计合理的架构会提升性能、改善可扩展性。根据硬件处理器结构,将模拟器按照功能划分为若干模块。软件模拟器架构如图2所示。

CMD Interface为用户命令行接口模块,接收用户参数。Program Memory、Data Memory和Register分别模拟程序存储器、数据存储器和寄存器。Unit模拟计算部件。Fetch为取指令模块,从cache或程序存储器取指令发射到流水线上执行。Decode是指令束译码模块。Predictor是分支预测模块。controller是程序控制器。Pipeline为流水线模块。Debug为调试驱动模块,接收调试器命令驱动模拟器执行,返回调试结果。Simulator Kernel即模拟器内核,按照时钟周期驱动所有模块运行。根据目标处理器建模需要,图中有些模块是可选的。每个模块对外具有规范接口,易于集成和替换。下文详细描述若干重要模块设计。

2.2 流水线模型设计

流水线是提高指令并行性的重要技术之一,是处理器设计的核心。流水线是由若干流水段(Stage)串联组成的。指令束执行过程就是依次流过各流水段的过程。该文流水线包含7段,如图3所示。

图中灰色方框表示各流水段的状态集,保存流水段信息,如流水段PC值,流水段指令束等。图中的箭头连线表示各段的处理逻辑。各段依次表示取指令、缓存指令、发射指令、译码、取操作数、执行和写回。数据相关会造成流水段停顿(stall),控制相关会操作流水段清空(flush)。流水段需要具有stall和flush属性。流水段和流水线类型定义如图4所示,其中Pipeline::addPipelineStage接口具有定制流水线功能,从而增强流水线的可扩展性。

2.3 译码和计算部件设计

处理器在执行指令束前,必须先对每个指令字译码。该文DSP译码位于流水线DC段。DC段处理逻辑调用Decode模块实现译码。译码是根据指令编码规则提取操作码和操作数。操作码掩码和操作数掩码体现编码规则。操作码掩码是与指令等长、对应操作码位域为1、其它位为0的比特序列。操作数掩码定义同理。同一指令可有多个操作数和操作数掩码。该文使用指令索引号标识每条指令。指令的编码规则等信息使用Operator类型表示。

译码的关键是快速匹配指令字与Operator。该文采用基于决策森林的二进制指令译码算法,实现高效译码。算法过程是先构建由多棵决策树组成的决策森林,给定指令字,依次遍历每棵决策树,直到找到匹配的操作码叶子节点则返回成功,否则译码失败。译码得到的信息保存在InstructionInfo中。Operator类型和InstructionInfo类型定义如图5所示。

译码是模拟器执行的关键路径,优化译码模块对模拟器性能提升作用显著。该文采用JIT-CCS(Just-in-time cache compiled simulation) [4]优化技术提高译码效率。它借用cache原理,将已经译码的指令信息保存在缓存中,若指令再次执行,则直接使用译码信息,从而节约译码时间提高性能。为了获取较好性能,该文实现一个大小为8M指令字的译码cache,使用LRU算法作为cache替换策略。

计算部件的行为可以抽象为给定输入,经过处理,返回唯一输出,这与函数的特性一致。模拟器使用仿真函数模拟计算部件,每个指令都有对应的仿真函数。为了快速定位指令仿真函数,该文采用指令索引号直接映射仿真函数指针的方法,有效提升模拟器性能。

2.4 程序控制器设计

程序控制器主要作用是计算NextPC,即下一个取指令地址。一般情况下,取指模块按照地址递增顺序取指令。但跳转指令、子程序调用和返回指令、中断响应事件和中断返回指令会改变程序流,它们是通过改变NextPC值实现的。跳转指令、子程序调用和返回指令、中断返回指令在改变程序流的同时,需要清空流水线的某些段。如条件跳转指令流到EX段时,EX段之前的所有段都必须清空,NextPC修改为跳转目的地址。取指模块从跳转目的地址处重新取指。当程序控制器检测到中断请求时,计算中断是否被响应。若响应,则修改NextPC为中断处理函数地址,并清空EX段之前的所有段。改变程序流的指令对流水线性能影响较大,针对这类指令的设计优化能显著提高处理器性能。因此对它们进行周期级精确模拟尤为重要。

2.5 调试模块设计

模拟器调试模块具有硬件调试仿真器和JTAG调试电路的功能,通过调试模块可以实现多种调试功能,如读写寄存器、读写存储器、断点、运行、单步等。调试模块通过TCP/IP协议与软件调试器通信,接收调试器命令,执行命令,并向调试器返回执行结果[5]。调试模块提供的主要调试接口见表1。具备调试接口的模拟器与调试器集成形成完整平台,为尽早进行软硬件系统协同验证提供条件。

表1 调试功能接口

3 结束语

本文实现了一款VLIW架构的、周期级精确的软件模拟器。文中详细讲述了软件架构设计,给出了流水线、译码和调试等关键模块设计方法。通过对模拟器部分功能模块的修改、替换,能快速适应处理器设计变化,易于移植到新处理器。高效译码算法和JIT-CCS显著提高了模拟器性能。为了进一步提高运行效率,模拟器程序的并行化运行是下一步研究内容。

参考文献:

[1] 严迎建,徐劲松.基于指令集模拟器的处理器建模与验证[J].计算机工程, 2008,34 (5):248-250.

[2] John L.Hennessy,David A.Patterson.Computer Architecture: A Quantitative Approach, Fourth Edition[M].Publishing House of Electronics Industry, 79-82.

[3] 许建卫,陈明宇.计算机体系结构模拟器技术和发展[J].系统仿真学报,2009, 21(20):6325-6331.

[4] Achim Nohl,Gunnar Braun etc.A universal Technique for fast and Flexible Instruction set Architecture simulation[C].Design Automation Conference, 2002.

[5] 邵作之,刘莉娟.基于SystemC 的ISS与软件调试器集成方法分析[J].华北电力大学学报,2006, 33(5):85-88.endprint

2.1 软件模拟器架构设计

模拟器软件架构与性能、可扩展性紧密相关,设计合理的架构会提升性能、改善可扩展性。根据硬件处理器结构,将模拟器按照功能划分为若干模块。软件模拟器架构如图2所示。

CMD Interface为用户命令行接口模块,接收用户参数。Program Memory、Data Memory和Register分别模拟程序存储器、数据存储器和寄存器。Unit模拟计算部件。Fetch为取指令模块,从cache或程序存储器取指令发射到流水线上执行。Decode是指令束译码模块。Predictor是分支预测模块。controller是程序控制器。Pipeline为流水线模块。Debug为调试驱动模块,接收调试器命令驱动模拟器执行,返回调试结果。Simulator Kernel即模拟器内核,按照时钟周期驱动所有模块运行。根据目标处理器建模需要,图中有些模块是可选的。每个模块对外具有规范接口,易于集成和替换。下文详细描述若干重要模块设计。

2.2 流水线模型设计

流水线是提高指令并行性的重要技术之一,是处理器设计的核心。流水线是由若干流水段(Stage)串联组成的。指令束执行过程就是依次流过各流水段的过程。该文流水线包含7段,如图3所示。

图中灰色方框表示各流水段的状态集,保存流水段信息,如流水段PC值,流水段指令束等。图中的箭头连线表示各段的处理逻辑。各段依次表示取指令、缓存指令、发射指令、译码、取操作数、执行和写回。数据相关会造成流水段停顿(stall),控制相关会操作流水段清空(flush)。流水段需要具有stall和flush属性。流水段和流水线类型定义如图4所示,其中Pipeline::addPipelineStage接口具有定制流水线功能,从而增强流水线的可扩展性。

2.3 译码和计算部件设计

处理器在执行指令束前,必须先对每个指令字译码。该文DSP译码位于流水线DC段。DC段处理逻辑调用Decode模块实现译码。译码是根据指令编码规则提取操作码和操作数。操作码掩码和操作数掩码体现编码规则。操作码掩码是与指令等长、对应操作码位域为1、其它位为0的比特序列。操作数掩码定义同理。同一指令可有多个操作数和操作数掩码。该文使用指令索引号标识每条指令。指令的编码规则等信息使用Operator类型表示。

译码的关键是快速匹配指令字与Operator。该文采用基于决策森林的二进制指令译码算法,实现高效译码。算法过程是先构建由多棵决策树组成的决策森林,给定指令字,依次遍历每棵决策树,直到找到匹配的操作码叶子节点则返回成功,否则译码失败。译码得到的信息保存在InstructionInfo中。Operator类型和InstructionInfo类型定义如图5所示。

译码是模拟器执行的关键路径,优化译码模块对模拟器性能提升作用显著。该文采用JIT-CCS(Just-in-time cache compiled simulation) [4]优化技术提高译码效率。它借用cache原理,将已经译码的指令信息保存在缓存中,若指令再次执行,则直接使用译码信息,从而节约译码时间提高性能。为了获取较好性能,该文实现一个大小为8M指令字的译码cache,使用LRU算法作为cache替换策略。

计算部件的行为可以抽象为给定输入,经过处理,返回唯一输出,这与函数的特性一致。模拟器使用仿真函数模拟计算部件,每个指令都有对应的仿真函数。为了快速定位指令仿真函数,该文采用指令索引号直接映射仿真函数指针的方法,有效提升模拟器性能。

2.4 程序控制器设计

程序控制器主要作用是计算NextPC,即下一个取指令地址。一般情况下,取指模块按照地址递增顺序取指令。但跳转指令、子程序调用和返回指令、中断响应事件和中断返回指令会改变程序流,它们是通过改变NextPC值实现的。跳转指令、子程序调用和返回指令、中断返回指令在改变程序流的同时,需要清空流水线的某些段。如条件跳转指令流到EX段时,EX段之前的所有段都必须清空,NextPC修改为跳转目的地址。取指模块从跳转目的地址处重新取指。当程序控制器检测到中断请求时,计算中断是否被响应。若响应,则修改NextPC为中断处理函数地址,并清空EX段之前的所有段。改变程序流的指令对流水线性能影响较大,针对这类指令的设计优化能显著提高处理器性能。因此对它们进行周期级精确模拟尤为重要。

2.5 调试模块设计

模拟器调试模块具有硬件调试仿真器和JTAG调试电路的功能,通过调试模块可以实现多种调试功能,如读写寄存器、读写存储器、断点、运行、单步等。调试模块通过TCP/IP协议与软件调试器通信,接收调试器命令,执行命令,并向调试器返回执行结果[5]。调试模块提供的主要调试接口见表1。具备调试接口的模拟器与调试器集成形成完整平台,为尽早进行软硬件系统协同验证提供条件。

表1 调试功能接口

3 结束语

本文实现了一款VLIW架构的、周期级精确的软件模拟器。文中详细讲述了软件架构设计,给出了流水线、译码和调试等关键模块设计方法。通过对模拟器部分功能模块的修改、替换,能快速适应处理器设计变化,易于移植到新处理器。高效译码算法和JIT-CCS显著提高了模拟器性能。为了进一步提高运行效率,模拟器程序的并行化运行是下一步研究内容。

参考文献:

[1] 严迎建,徐劲松.基于指令集模拟器的处理器建模与验证[J].计算机工程, 2008,34 (5):248-250.

[2] John L.Hennessy,David A.Patterson.Computer Architecture: A Quantitative Approach, Fourth Edition[M].Publishing House of Electronics Industry, 79-82.

[3] 许建卫,陈明宇.计算机体系结构模拟器技术和发展[J].系统仿真学报,2009, 21(20):6325-6331.

[4] Achim Nohl,Gunnar Braun etc.A universal Technique for fast and Flexible Instruction set Architecture simulation[C].Design Automation Conference, 2002.

[5] 邵作之,刘莉娟.基于SystemC 的ISS与软件调试器集成方法分析[J].华北电力大学学报,2006, 33(5):85-88.endprint

2.1 软件模拟器架构设计

模拟器软件架构与性能、可扩展性紧密相关,设计合理的架构会提升性能、改善可扩展性。根据硬件处理器结构,将模拟器按照功能划分为若干模块。软件模拟器架构如图2所示。

CMD Interface为用户命令行接口模块,接收用户参数。Program Memory、Data Memory和Register分别模拟程序存储器、数据存储器和寄存器。Unit模拟计算部件。Fetch为取指令模块,从cache或程序存储器取指令发射到流水线上执行。Decode是指令束译码模块。Predictor是分支预测模块。controller是程序控制器。Pipeline为流水线模块。Debug为调试驱动模块,接收调试器命令驱动模拟器执行,返回调试结果。Simulator Kernel即模拟器内核,按照时钟周期驱动所有模块运行。根据目标处理器建模需要,图中有些模块是可选的。每个模块对外具有规范接口,易于集成和替换。下文详细描述若干重要模块设计。

2.2 流水线模型设计

流水线是提高指令并行性的重要技术之一,是处理器设计的核心。流水线是由若干流水段(Stage)串联组成的。指令束执行过程就是依次流过各流水段的过程。该文流水线包含7段,如图3所示。

图中灰色方框表示各流水段的状态集,保存流水段信息,如流水段PC值,流水段指令束等。图中的箭头连线表示各段的处理逻辑。各段依次表示取指令、缓存指令、发射指令、译码、取操作数、执行和写回。数据相关会造成流水段停顿(stall),控制相关会操作流水段清空(flush)。流水段需要具有stall和flush属性。流水段和流水线类型定义如图4所示,其中Pipeline::addPipelineStage接口具有定制流水线功能,从而增强流水线的可扩展性。

2.3 译码和计算部件设计

处理器在执行指令束前,必须先对每个指令字译码。该文DSP译码位于流水线DC段。DC段处理逻辑调用Decode模块实现译码。译码是根据指令编码规则提取操作码和操作数。操作码掩码和操作数掩码体现编码规则。操作码掩码是与指令等长、对应操作码位域为1、其它位为0的比特序列。操作数掩码定义同理。同一指令可有多个操作数和操作数掩码。该文使用指令索引号标识每条指令。指令的编码规则等信息使用Operator类型表示。

译码的关键是快速匹配指令字与Operator。该文采用基于决策森林的二进制指令译码算法,实现高效译码。算法过程是先构建由多棵决策树组成的决策森林,给定指令字,依次遍历每棵决策树,直到找到匹配的操作码叶子节点则返回成功,否则译码失败。译码得到的信息保存在InstructionInfo中。Operator类型和InstructionInfo类型定义如图5所示。

译码是模拟器执行的关键路径,优化译码模块对模拟器性能提升作用显著。该文采用JIT-CCS(Just-in-time cache compiled simulation) [4]优化技术提高译码效率。它借用cache原理,将已经译码的指令信息保存在缓存中,若指令再次执行,则直接使用译码信息,从而节约译码时间提高性能。为了获取较好性能,该文实现一个大小为8M指令字的译码cache,使用LRU算法作为cache替换策略。

计算部件的行为可以抽象为给定输入,经过处理,返回唯一输出,这与函数的特性一致。模拟器使用仿真函数模拟计算部件,每个指令都有对应的仿真函数。为了快速定位指令仿真函数,该文采用指令索引号直接映射仿真函数指针的方法,有效提升模拟器性能。

2.4 程序控制器设计

程序控制器主要作用是计算NextPC,即下一个取指令地址。一般情况下,取指模块按照地址递增顺序取指令。但跳转指令、子程序调用和返回指令、中断响应事件和中断返回指令会改变程序流,它们是通过改变NextPC值实现的。跳转指令、子程序调用和返回指令、中断返回指令在改变程序流的同时,需要清空流水线的某些段。如条件跳转指令流到EX段时,EX段之前的所有段都必须清空,NextPC修改为跳转目的地址。取指模块从跳转目的地址处重新取指。当程序控制器检测到中断请求时,计算中断是否被响应。若响应,则修改NextPC为中断处理函数地址,并清空EX段之前的所有段。改变程序流的指令对流水线性能影响较大,针对这类指令的设计优化能显著提高处理器性能。因此对它们进行周期级精确模拟尤为重要。

2.5 调试模块设计

模拟器调试模块具有硬件调试仿真器和JTAG调试电路的功能,通过调试模块可以实现多种调试功能,如读写寄存器、读写存储器、断点、运行、单步等。调试模块通过TCP/IP协议与软件调试器通信,接收调试器命令,执行命令,并向调试器返回执行结果[5]。调试模块提供的主要调试接口见表1。具备调试接口的模拟器与调试器集成形成完整平台,为尽早进行软硬件系统协同验证提供条件。

表1 调试功能接口

3 结束语

本文实现了一款VLIW架构的、周期级精确的软件模拟器。文中详细讲述了软件架构设计,给出了流水线、译码和调试等关键模块设计方法。通过对模拟器部分功能模块的修改、替换,能快速适应处理器设计变化,易于移植到新处理器。高效译码算法和JIT-CCS显著提高了模拟器性能。为了进一步提高运行效率,模拟器程序的并行化运行是下一步研究内容。

参考文献:

[1] 严迎建,徐劲松.基于指令集模拟器的处理器建模与验证[J].计算机工程, 2008,34 (5):248-250.

[2] John L.Hennessy,David A.Patterson.Computer Architecture: A Quantitative Approach, Fourth Edition[M].Publishing House of Electronics Industry, 79-82.

[3] 许建卫,陈明宇.计算机体系结构模拟器技术和发展[J].系统仿真学报,2009, 21(20):6325-6331.

[4] Achim Nohl,Gunnar Braun etc.A universal Technique for fast and Flexible Instruction set Architecture simulation[C].Design Automation Conference, 2002.

[5] 邵作之,刘莉娟.基于SystemC 的ISS与软件调试器集成方法分析[J].华北电力大学学报,2006, 33(5):85-88.endprint