发明内容
为了提供C*CORE310处理器的周期精确和位精确的系统级模型,能够为基于C*CORE310处理器的SoC设计提供性能评估;并且能够为软件工程师提供软硬件协同开发和验证平台,本发明提供了一种嵌入式微处理器的周期精确和位精确系统级模型,详见下文描述:
一种嵌入式微处理器的周期精确和位精确系统级模型,所述嵌入式微处理器为C*CORE310处理器,所述系统级模型包括:指令集仿真器和SystemC Wrapper,所述SystemC Wrapper运用系统级语言在抽象层次上封装所述指令集仿真器,调用指令集仿真器的运行函数,对指令进行取指、译码、执行和相应寄存器写回操作,通过VCI接口方法实现指令集仿真器与总线的指令和数据的交互;所述C*CORE310处理器包括:用户编程模式和管理员编程模式,在所述用户编程模式下,访问16个32位通用寄存器和进位标志位;在所述管理员编程模式下,访问16个32位通用寄存器、16个替换寄存器以及特殊功能单元寄存器。
通过所述SystemC Wrapper调用所述指令集仿真器中的运行函数来控制所述指令集仿真器进行取指、译码、执行和所述相应寄存器写回操作。
所述SystemC Wrapper包括:transition()进程和genMoore()进程,所述transition()进程在时钟上升沿被触发,实现指令状态机、数据状态机和命令操作状态机的状态转换,根据所述相应寄存器的现有值和输入信号来计算所述相应寄存器下一状态的值;所述genMoore()进程在时钟下降沿被触发,通过所述VCI接口方法实现所述指令集仿真器的命令、数据和地址分别与总线的通信;根据所述相应寄存器的现有值和输入信号来产生所述相应寄存器的输出值。
所述指令集仿真器包括:请求取指子模块、指令响应子模块、译码子模块、指令执行子模块、数据请求子模块和数据响应子模块,
所述请求取值子模块用于请求所述指令集仿真器的指令信息;
所述指令响应子模块用于获取指令;
所述译码子模块用于执行指令译码操作;
所述指令执行子模块用于完成相应的指令执行操作;
所述数据请求子模块用于请求所述指令集仿真器的数据;
所述数据响应子模块将从存储器中取得的数据赋给所述通用寄存器。
所述系统级模型采用多级索引进行译码操作,将16字长的指令平均分为4段,每一个字段长4位,在内存中建立多级索引表。
所述系统级模型采用多级索引进行译码操作具体为:
以指令的第一个字段为地址在第一级索引表中寻找,判断查找成功标志是否为真,若为真,则译码成功;否则该行给出第二级索引表的起始地址;以指令的第二个字段为地址在第二级索引表中寻找,判断所述查找成功标志是否为真,若为真,则译码成功;否则该行给出第三级索引表的起始地址;以指令的第三个字段为地址在第三级索引表寻找,判断所述查找成功标志是否为真,若为真,则译码成功;否则该行给出第四级索引表的起始地址;依此类推,最终完成译码操作。
当所述指令状态机在指令空闲状态时,通过调用所述指令请求子模块判断是否有指令请求信号以及阻塞指令读操作是否为假,若所述指令请求信号为真且所述阻塞指令读操作为假,则转入指令等待状态;当同时存在所述指令请求信号和数据请求信号时,所述命令操作状态机的空状态先响应所述指令请求信号,直到取到指令之后响应所述数据请求信号;
所述命令操作状态机在时钟的上升沿被触发,当所述命令操作状态机进入指令读响应状态时,给出读指令是否成功信号,所述指令状态机检测到所述读指令是否成功信号,转入所述指令空闲状态,进入下一个指令周期;
当所述数据状态机在数据空闲状态时,通过调用所述数据请求子模块判断是否有所述数据请求信号以及数据读信号是否为真,若所述数据请求信号为真且所述数据读信号为真,则转入数据读等待状态;通过调用所述数据请求子模块判断是否有所述数据请求信号以及数据写信号是否为真,若所述数据请求信号为真且所述数据写信号为真,则转入数据写等待状态;
当所述命令操作状态机进入数据读响应状态时,给出读数据是否成功信号,所述数据状态机检测到所述读数据是否成功信号,转入所述数据空闲状态;当所述命令操作状态机进入数据写响应状态时,给出写数据是否成功信号,所述数据状态机检测到所述写数据是否成功信号,转入所述数据空闲状态;
当所述命令操作状态机在命令空闲状态时,接收到数据写请求信号,转入数据写命令状态,在时钟的下降沿所述C*CORE310处理器给总线发送所述数据请求信号以及写数据和地址等信息;在下一个时钟的上升沿,所述命令操作状态机判断总线是否有返回的握手信号,若有,则进入数据写响应状态;在此时钟的下降沿,所述C*CORE310处理器发出数据请求成功信号;在时钟的上升沿,判断总线是否有返回的握手信号,若有,则进入所述命令空闲状态。
本发明提供的技术方案的有益效果是:
本发明提供了一种嵌入式微处理器的周期精确和位精确系统级模型,本发明针对C*CORE310嵌入式微处理器,采用新兴的ESL设计方法在不同的抽象层次上建立C*CORE310处理器的周期精确和位精确的系统级模型,该抽象模型包括周期精确和位精确的C*CORE310ISS和SystemC Wrapper等,可辅助设计者完成以C*CORE310处理器为核心的SoC功能验证与性能评测;同时也为基于C*CORE310处理器的SoC产品的顺利推广提供技术支持与保障;将所建立的周期精确和位精确的系统级模型与传统的RTL级模型比较,实验表明所建立的系统级模型可以获得与RTL级模型相似的精确度。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
为了提供C*CORE310处理器的周期精确和位精确的系统级模型,能够为基于C*CORE310处理器的SoC设计提供性能评估;并且能够为软件工程师提供软硬件协同开发和验证平台,本发明实施例提供了一种嵌入式微处理器的周期精确和位精确系统级模型,详见下文描述:
参见图1,一种嵌入式微处理器的周期精确和位精确系统级模型,嵌入式微处理器为C*CORE310处理器,系统级模型包括:指令集仿真器ISS和SystemC Wrapper,SystemC Wrapper运用系统级语言在抽象层次上封装指令集仿真器,调用指令集仿真器的运行函数,对指令进行取指、译码、执行和相应寄存器写回操作,通过VCI接口方法实现指令集仿真器与总线的指令和数据的交互。
指令集仿真器ISS作为C*CORE310处理器模型的核心,是运用C或C++语言在非定时抽象层次上描述的事务级模型。SystemC Wrapper运用SystemC系统级语言,在周期精确和位精确的抽象层次上封装指令集仿真器ISS,通过VCI信号转换接口技术实现ISS与总线的指令和数据的交互,具有时序的精确性。参见图1,C*CORE310ISS的模型运用了改进型的基于解释的技术,在译码阶段根据C*CORE310指令集独有的特点采用多级索引译码技术,改进了传统的译码方法。基于解释技术的指令集仿真策略是目前应用较广泛的一种仿真器实现技术,该仿真器实现技术与基于编译的技术相比具有实现简单、运用灵活的特点。在C*CORE310ISS模型过程中,首先在内存中建立有关C*CORE310处理器状态的数据结构,然后根据C*CORE310指令的流水线分别对指令进行取指、译码、执行和写回等操作,完成指令流水的仿真功能。
为了得到周期精确和位精确的C*CORE310处理器模型,采用SystemC封装指令集仿真器ISS,在SystemC进程中通过SystemC Wrapper调用指令集仿真器ISS中的运行函数来控制指令集仿真器ISS进行取指、译码、执行和相应寄存器写回操作。
VCI信号转换接口定义两个SC_METHOD进程,即transition()进程和genMoore()进程。transition()进程在时钟上升沿被触发,实现指令状态机、数据状态机和操作命令状态机的状态转换;而genMoore()进程在时钟下降沿被触发,通过VCI信号转换接口实现C*CORE310ISS的命令、数据、地址等信号与总线的通信。
参见图2,指令集仿真器ISS的模型描述了基于改进型解释技术的ISS模型过程,基于高级语言描述的应用经过C*CORE310处理器的交叉编译器得到二进制可执行代码,被装载器加载到虚拟的存储器中,SystemC Wrapper调用指令集仿真器ISS中的运行函数,对指令进行取指、译码、执行和寄存器写回等操作。按照图2中所示循环执行,直到程序结束或异常退出。
C*CORE310处理器定义了两种编程模式,分别是用户编程模式和管理员编程模式。在用户编程模式下,程序可访问16个32位通用寄存器和进位标志位(C位);在管理员编程模式下,程序可访问16个32位通用寄存器、16个替换寄存器以及特殊功能单元寄存器(例如:异常屏蔽寄存器EPSR、EPC、FPSRFPC,向量基址寄存器VBR等)。
指令集仿真器包括:请求取指子模块、指令响应子模块、译码子模块、指令执行子模块、数据请求子模块和数据响应子模块,
其中,请求取指子模块用于得到指令集仿真器ISS指令请求的参数,通过请求取指函数getInstructionRequest(bool&req,uint32_t&address)实现,req代表请求信号,address代表指令请求地址,在该函数每次被调用时,req被赋值为真。
其中,指令响应子模块用于获取指令,通过指令响应函数setInstruction(bool error,uint32_t ins)实现,error代表从存储器中取回的指令是否有错,error等于1表示有错;ins代表请求得到的指令。
其中,译码子模块用于执行指令译码操作,译码子模块通过译码函数decode()实现。
传统的指令译码逻辑针对每一条指令操作码给出其最大值和最小值,当进行指令译码时,将指令操作码的值逐一比较,查找到正确的区间完成译码。尽管这种译码逻辑简单易于实施,但是软件需要大量开销,严重降低了指令的仿真速度。针对C*CORE310指令集操作码长度不固定的特点,采用多级索引技术进行译码操作,将16长的指令平均分为4段,每一个字段长4位,在内存中建立多级索引表,参见图3,描述了一个三级索引表,第一级索引表中每一行的地址对应指令的第一字段值(高四位),第二级索引表中每一行的地址对应指令的第二字段值,依此类推。索引表的第一列指明译码成功的指令或者下一级索引表的起始地址,第二列是查找成功标志Flag。下面结合图4来说明基于多级索引技术的指令译码过程:
以指令的第一个字段(高四位)为地址在第一级索引表中寻找,判断查找成功标志Flag是否为真,若为真,则译码成功;否则该行给出第二级索引表的起始地址;以指令的第二个字段为地址在第二级索引表中寻找,判断查找成功标志Flag是否为真,若为真,则译码成功;否则该行给出第三级索引表的起始地址;以指令的第三个字段为地址在第三级索引表寻找,判断查找成功标志Flag是否为真,若为真,则译码成功;否则该行给出第四级索引表的起始地址;依此类推,最终完成译码操作。
其中,指令执行子模块用于完成相应的指令执行操作。
step()函数是ISS模型的重要入口函数,该函数调用了译码逻辑、指令执行逻辑及对异常做出相应处理。指令执行逻辑是由102个函数组成,每一个函数的实现都对应一条指令的功能,下面给出jmp跳转指令的具体实现方式:
在step()函数中根据所译码出的操作码,运用函数指针的具体方法找到相应的指令执行函数,完成指令执行操作。C*CORE310处理器的大部分指令是在1个周期内完成的,少部分的指令执行周期大于1,为了得到延迟精确的指令,setInsDelay()函数被用于多周期指令集中,下面给出setInsDelay()函数具体实现方式:
其中,数据请求子模块用于得到指令集仿真器ISS数据请求的数据,通过数据请求函数void getDataRequest(bool &req,enum DataAccessType&type,uint32_t&addr,uint32_t wdata[16],uint32_t&rnum,uint32_t&wnum)实现,req代表数据请求信号,type表明数据访问类型,address表示数据请求地址。由于C*CORE310处理器存在burst操作的存取指令,例如STM和LDM等指令,用函数参数wdata、rnum和wnum来支持burst操作的存取指令。dataAccessType支持读字、读半字和写字节等一系列访存操作,下面给出了具体实现方式:
其中,数据响应子模块将从虚拟存储器中取得的数据赋给通用寄存器,通过数据响应函数void setDataResponse(bool error,uint32_t rdata[16],uint32_t mum)实现,rdata[16]表示读操作数组,用于单个读操作或burst读操作,rnum是读请求的数目。虚拟部件接口VCI调用该数据响应函数,将从虚拟存储器中取得的数据赋给C*CORE310中的通用寄存器。
SystemC Wrapper是C*CORE310ISS的指令和数据控制器,通过由时钟驱动的SC_METHOD进程来控制指令集仿真器ISS与总线进行指令和数据的交互,能够达到周期精确和位精确。SystemC Wrapper用SystemC语言定义了transition()和genMoore()两种SC_METHOD进程。其中,genMoore()进程在时钟下降沿被触发,根据相应寄存器的现有值和输入信号来产生相应寄存器的输出值;另外,transition()进程根据相应寄存器的现有值和输入信号来计算相应寄存器下一状态的值,它包含三个状态机的转换,即指令状态机,数据状态机以及命令操作状态机,在时钟上升沿被触发,实现指令状态、数据状态和命令操作状态的转换。
参见图5,指令状态机在指令空闲状态INS_IDLE时,通过调用指令请求子模块判断是否有指令请求信号ireq.valid以及阻塞指令读操作r_block是否为假,若指令请求信号ireq.valid为真且阻塞指令读操作r_block为假,则转入指令等待状态INS_WAIT;当同时存在指令请求信号和数据请求信号时,命令操作状态机的空状态CMD_IDLE先响应指令请求信号,直到取到指令之后才响应数据请求信号,但此时下一条指令请求信号亦存在,阻塞指令读操作r_block的作用在于阻塞该指令的数据请求信号。
命令操作状态机在时钟上升沿被触发,当命令操作状态机进入指令读响应状态INS_READ_RSP时,给出读指令是否成功信号r_ins_rsp,指令状态机检测到该读指令是否成功信号r_ins_rsp,转入指令空闲状态INS_IDLE,从而进入下一个指令周期。
参见图6,数据状态机在数据空闲状态DATA_IDLE时,通过调用数据请求子模块判断是否有数据请求信号dreq.valid以及数据读信号read是否为真,若数据请求信号dreq.valid为真且数据读信号read为真,则转入数据读等待状态DATA_READ_WAIT;通过调用数据请求子模块判断是否有数据请求信号dreq.valid以及数据写信号write是否为真,若数据请求信号dreq.valid为真且数据写信号write为真,则转入数据写等待状态DATA_WRITE_WAIT。
当命令操作状态机进入数据读响应状态DATA_READ_RSP时,给出读数据是否成功信号r_data_read_rsp,数据状态机检测到读数据是否成功信号r_data_read_rsp,转入数据空闲状态DATA_IDLE;当命令操作状态机进入数据写响应状态DATA_WRITE_RSP时,给出写数据是否成功信号r_data_write_rsp,数据状态机检测到写数据是否成功信号r_data_write_rsp,转入数据空闲状态DATA_IDLE。
命令操作状态机使用虚拟部件接口VCI的标准协议以控制指令集仿真器ISS的指令和数据分别与总线的交互。参见图7,展示了作为VCI发起者的C*CORE310处理器与作为VCI接收者的总线,通过两次握手进行通信的例子。握手协议的目的是通过在两个方向上传输控制信息来同步VCI发起者和VCI接收者。在请求方向上,握手信号被称为CMDVAL和CMDACK,而在响应方向上,握手信号被称为RSPVAL和RSPACK。
参见图8,当命令操作状态机在命令空闲状态CMD_IDLE时,接收到数据写请求信号r_data_write_req,转入数据写命令状态DATA_WRITE_CMD,在时钟的下降沿作为VCI发起者的C*CORE310处理器给作为VCI接收者的总线发送握手信号p_vci.cmdval以及写数据和地址等信息;在下一个时钟的上升沿,判断总线是否有返回的握手信号p_vci.cmdack,若有,则进入数据写响应状态DATA_WRITE_RSP;在时钟的下降沿,VCI发起者的C*CORE310处理器发出数据请求成功信号p_vci.rspack;在时钟的上升沿,判断总线是否有返回的握手信号p_vci.rspval,若有,则进入命令空闲状态CMD_IDLE,此时,完成了一个完整的写操作。
综上所述,本发明实施例提供了一种嵌入式微处理器的周期精确和位精确系统级模型,本发明实施例针对C*CORE310嵌入式微处理器,采用新兴的ESL设计方法在不同的抽象层次上建立C*CORE310处理器的周期精确和位精确的系统级模型,该抽象模型包括周期精确和位精确的C*CORE310处理器的ISS和SystemC Wrapper等,可辅助设计者完成以C*CORE310处理器为核心的SoC功能验证与性能评测;同时也为基于C*CORE310处理器的SoC产品的顺利推广提供技术支持与保障;将所建立的周期精确和位精确的系统级模型与传统的RTL级模型比较,实验表明所建立的系统级模型可以获得与RTL级模型相似的精确度。
本领域技术人员可以理解附图只是一个优选实施例的示意图,上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。