新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 可以获得同RTL设计一样的I/O速度

可以获得同RTL设计一样的I/O速度

——
作者:时间:2005-09-10来源:EDN电子设计技术收藏
可以获得同RTL设计一样的I/O速度
 可配置处理器基于队列与端口的机制
  对于SoC设计中的许多任务而言,将一个处理器中的所有输入和输出接口都映象成存储器地址既无必要也无效率。有时候将输入/输出接口映象到存储器地址可以让程序员或者编译器去动态地选择几个计算部件的源和目的。然而,如果动态寻址不那么重要的话,那么将外部信号和处理器执行部件直接相连能够进一步加速系统的性能并可以减少复杂度。基于硬线连接的接口对许多RTL设计人员来说也是非常熟悉的,它允许处理器在不改变现存RTL模块中各个模块接口(“pin”)定义的情况下去替换那些硬件模块。
  Tensilica为SoC设计的Xtensa LX可配置处理器可以将信号直接与其SoC逻辑模块中的执行部件进行连接,而且其输出信号可以直接与其它SoC模块连接,而不需要利用其传统的总线。因此,数据搬移就不需要传统的加载和存储指令,所以数据输入/输出就不会有额外的开销。这些附加的访问处理器端口可由Tensilica的指令扩展语言TIE进行建立,TIE语言包含了两个新的适用于Xtensa LX处理器的技术特征,即TIE端口和队列技术。

本文引用地址:http://www.eepw.com.cn/article/8465.htm

  两种基本的接口握手信号风格适合不同的输入和输出环境,用于将处理器与外部信号直接互连:
  ● 通过端口进行数值输入和状态输出;
  ● 输入和输出队列。
  考虑图1所示的一个简单的硬件功能模块框图。该功能模块基本的输入和输出信号可以简化成模块边界的硬线连接。
  输入和输出端口可以用于可配置处理器操作的源操作数和目的操作数,这样可以确保快速而灵活的硬件接口。下面的程序是图1中的功能模块的实现,用TIE语言写成。该例子采用队列技术将数据从功能模块中搬入和搬出。
  1: state state1 24 add_read_write
  2: state state2 24 add_read_write
  3: state lastinput1 24
  4: state nextoutput1 24
  5: queue input1 24 in
  6: queue input2 24 in
  7: queue output1 24 out
  8: operation lookup.mul.mul {} {in input1, in input2, in state1, in state2, inout lastinput1, out output1, inout nextoutput1, out VAddr, in MemDataIn32} {
  9: assign VAddr = {8'h0, lastinput1 + state1};
  10: assign lastinput1 = input1;
  11: wire [23:0] mulout = MemDataIn32[23:0] * input2;
  12: assign output1 = nextoutput1;
  13: assign nextoutput1 = mulout * state2;}
  14: schedule inst_sched {lookup.mul.mul} {use state2 4; use nextoutput1 3; use input1 2; use input2 2; def lastinput1 3; def nextoutput1 4; def mulout 3; def output1 3; }
  以上为具有输入和输出队列的数据通路TIE实现示例。
  在上面的例子中,第14行schedule语句中的“use”和“def”变量说明Xtensa处理器流水线各级中输入队列接口有数据(use),而处理器输出队列接口则接收从流水线(def)中来的输出数据。输入队列接口在流水线访存级(第2级)有数据,而输出队列接口在流水线写回级(第3级)接收数据。状态lastinput1和 状态nextoutput1允许后输入到队列中的数据用于后续的指令,而前面指令中后计算出来的结果则被送入到输出队列。


  队列输入和输出直接和硬线结构相连接。对相应队列结构的访问将自动从输入队列中弹出数据以及从输出队列中压入数据。队列控制机制采用指令消除方法(由于其它各种事件所引起),并确保即使在处理遇到未期望的错误条件下也能够没有额外的数据压入或者弹出队列。
  队列是指令映象连接的一种方式。它们非常适合专用处理器中的操作数数据流,因为请求/应答握手信号已经是队列接口的一部分,如图2所示。
  队列输入表示数据流被处理器上运行的应用程序所使用。使用的指令顺序执行,执行结果也是顺序可见的。类似地,队列输出表示应用程序处理器产生的一系列数据。数据的生产和消费(使用)可以由硬件进行管理,因此可能的指令执行消除效应都被隐藏了,并且不需要显式的请求/应答握手信号。如果没有产生出足够多的数据,那么处理器就会暂停使用这些操作数。如果消费处理器落后的话,那么产生处理器就会暂停产生操作数,并允许数据填入输入缓冲区。这些队列会在处理器之间形成一种高效的数据流连接,尤其是当几个处理器形成一个大规模的计算流水线时更是如此。
  第二种接口直接连接的方式是基于端口,即基于一组硬线的数据输入和状态输出。这些端口在执行诸如测试外部状态、条件信息或者控制其它逻辑功能这些任务时尤其有用。
  上面的例子也可以采用输入数据和输出状态方式来实现,如下面图所示。该实现使用一个显式的数据输出信号next_data来指示input1和input2所需要的新的数据值,并且一个新的输出数据在output1信号线上出现。系统开发人员负责确保外部逻辑在下一次使用input1和input2端口前有足够的时间来响应输出的next_data信号。上面的保证对中等程度性能的应用程序而言是非常容易实现的,只需要在一个输入数据和其后的下一个输入之间占用几十个时钟周期。然而,数据队列对于超高速数据速率输入的情况下一般是非常简单和快速的。注意到,指令集和程序必须显式说明next_data信号来请求新的输入数据,并指示一个新的输出数据可用


关键词: Tensilica公司

评论


技术专区

关闭