最新日志

发表于:2008-7-23 23:38:35
标签:无标签

0

RVDS——ARM系统开发的首选工具

      昨天一个新同事过来找我,问我安装RVDS没有,我说去年的时候用过别人安装的,但是自己没有安装过,于是就过去帮他看看,嘿嘿,由于License太少,所以安装不是那么顺利,但是总有应对的方法,最后修改mac后成功了,去年也只是在应用els的时候用到了,但是自己没有怎么真正调试过,学习了解下。

      ARM公司开发的编译工具从诞生一刻起,就成为业界针对ARM处理器最有效率的工具,因为它是总结了无数经验技巧,由ARM处理器的开发者ARM公司推出的开发工具。而许多前人的经验技巧就隐藏在编译器的某个角落里,等待着你去发现并加以利用。
    本文就将与大家分享一些鲜为人知,但却可能使你大吃一惊的ARM编译、链接工具使用方法。

1.系统高效的关键字
    自从可编程的处理器出现之后,软件程序员就没有停止过对代码优化、代码高效的追求。在当今世界,电子产品领域每天都在更新,竞争异常激烈,单纯地追求系统能够正常运行、得到正确的结果,是远远不够的。现实要求系统开发人员在产品中实现最优化的代码。那么“高效”的具体含义是什么呢?站在开发者的角度,可以简单地归纳为以下几点:代码执行速度、代码密度、系统吞吐量和系统的功耗。毫无疑问,这4点正是衡量一个产品是否成功所需的关键字,而且这四者之间还有很多相互影响或者相互促进的联系。
    RVDS是ARM公司继SDT与ADS1.2之后主推的新一代开发工具,目前最高版本是3.0。它由RealView编译器(RVCT)、RealView汇编器(armasm)、RealView链接器(armlinker),以及RealView调试器(RVDebugger)组成。值得一提的是,在以上所提到的关键字中,有很多(如代码密度的提升、代码执行速度的提高)都可以由ARM开发工具RVDS自动实现,而不需要软件开发人员花费过多的时间手动优化高级语言代码。这也正是RVDS的优势所在。
    由于很多嵌入式软件工程师都对ARM的开发工具RVDS非常熟悉,很多OEM厂商都在使用ARM
    RVDS作为主要开发工具进行产品开发。所以本文将重点介绍ARM
RVDS工具的简单内部工作机理,这部分内容常常会被忽略,而掌握了这些内容很可能会帮助我们编写出更高效的代码。

2.使用RVDS编译器实现高效代码
   RVCT是RVDS的编译工具,它可以提供多种优化级别,帮助开发人员完成代码密度与代码执行速度上的不同层次优化。此外,RVCT的很多编译特性还可以帮助开发人员进一步提升代码效率。
   2.1  RVCT的优化级别与优化方向
    提到RVCT就不能不提armcc的4个优化级别和2个编译选项,分别是-O1、-O2、-O3、-O4,以及-Otime、-Ospace。-Ospace和-Otime负责提供代码优化的大方向,告知编译器编译任务的主要目标是代码密度(-Ospace)还是代码性能(-Otime);而-O1、-O2、-O3、-O4则分别代表4种逐次递进的不同优化级别。
  (1)Ospace还是Otime?
    显然代码密度与代码执行速度在很多情况下是一对矛盾体。以下面的代码为例。例1中左右两段代码可以完成相同的任务,但是左边的有较高的代码密度,右边的则有较高的执行速度。因为当expr  = 0且标志循环结束时,右边的代码可以顺序执行下去;而左边代码必须先跳转至循环体首部判断expr的值,随后再跳转至循环体尾,继续执行下一条指令。
   例1  代码执行速度与代码密度的对比。
        while (expr) {if (expr) do  {
            do
          body;{ body; }
            while (expr);
          }  }
    那么什么时候使用Otime,什么时候使用Ospace呢?这需要开发人员根据系统实际需求来决定,最好是在两者之间找到一个合适的平衡点,而不是单纯地追求高速度或者小尺寸。也就是针对不同的代码模块根据其特性分别使用不同的编译选项。
    此外,RVCT编译器支持很多非常有用的编译选项,如--no_inline(取消所有代码的内联函数)、--split_ldm(限制LDM/STM指令的最大操作寄存器数目)、--split_sections(将每个函数,而不是源文件,作为一个编译单元进行操作)等。
    编译器的所有这一切都可以严格满足开发者的要求,帮助开发人员得到系统真正需要的优化过的代码。
   (2)O3还是O2?
    老的开发工具(如ADS1.2)中,只有3种递进的代码优化级别。对应3种编译选项,即-O0(Minimum optimization)、-O1(Restricted optimization)和-O2(High optimization )。使用-O0编译选项时,RVCT编译器只对代码进行最基本的优化操作,编译结束后用户得到的代码与用户手写源代码之间的差距很小。这种特性的主要作用是方便用户在程序开发阶段的调试工作,避免由于优化而产生的调试屏障。此外,很多资深软件工程师偏向于手写优化代码,在这种情况下,由于代码已经被优化过,可以使用-O0编译选项以减小RVCT的工作量,节省编译链接的时间。
    -O1与-O2则是相对于-O0更加高级别的编译优化选项。前者提供有限的优化,后者可对代码进行较大程度的优化改进操作。RVDS中新增加了-O3(Maximum optimization)编译选项,它可以最大程度地发挥RVCT编译器的优势,将代码编译成最优。-O3与-O2都是较高级别的编译优化选项,但-O3的主要优势有以下几点。当用户使用O3选项时:
   编译器会自动对代码进行髙阶标量优化,即编译器根据代码特点,针对循环、指针等进行髙阶优化;编译器会把尽可能多的函数编译为内联(inline)函数;multifile compilation功能被自动使能。
   (3)对于循环与指针的髙阶优化
     当编译选项为-O3
    -Otime时,RVCT会根据代码的具体情况,针对循环、指针等部分进行髙阶优化,如循环解开、融合、位置调整、指针优化等。以例2的函数为例。
    例2  一段简单的C循环函数,在循环中含有数组指针调用。
      CodeA
      void increment(int *restrict b,  int *restrict c) {
        int i;
        for (i=0; i<100; i++) {
          c[i]=b[i] + 1;
        }
      }
      CodeB
        void increment(int *b, int *c) {
          int i;
          int *pb, *pc;
          int b3, b4;
          pb=b-1; pc="c-1";
          b3=pb[1];
          for (i = (100 / 2); i != 0; i--) {
            b4 = *(pb += 2);
            pc[1] = b3 + 1;
            b3 = pb[1];
            *(pc += 2) = b4 + 1;
          }
        }
   仔细观察可以发现,CodeA与CodeB可以实现同样的功能,即将数组b的每个成员加1赋值给数组c的对应成员。但是与CodeA相比,CodeB具有更高的执行速度。主要体现在:
① 循环100次变成了循环50次,减少了跳转次数;
② 数组变成了指针,减少了每次计算数组偏移量的指令;
③ 微调了不同代码操作的执行顺序,减少了流水线stall的情况
④  循环从++循环变成了--循环,可以使用ARM指令的条件位,为每次循环减少了一条判断指令。
    很多程序员就是通过手写不同的C代码,提高了代码执行效率。在RVDS中,使用-O3 -Otime编译选项,RVCT会自动帮助程序员进行这些髙阶标量优化,即直接将CodeA优化成以前由CodeB才能得到的汇编代码。虽然优化之后函数的代码尺寸大于原先的函数,但是执行速度也大大提高。经过统计,使用EEMBC benchmarking,-O3编译选项编译得到的最终代码平均性能相对于O1可以有10%的提升,而总体代码尺寸只增加了1%。
     
2.2  multifile compilation
     按照传统的编译方式,先把各个C或C++文件单独编译成.obj文件,再将这些目标文件链接在一起。虽然在编译单独的C或C++文件时,编译器会充分发挥其优化特性;但此时编译器无法关注到大量的C或C++文件接口之间可以优化的部分。所以在传统的编译结果里,还有许多优化的余地。如何才能让编译器同时关注和编译所有的源代码呢?
     multifile compilation是RVDS一个较新的特性,它可以帮助开发人员将所有的源文件作为一个compilation unit进行编译,并最终生成一个大的目标文件。mutifile compilation给软件开发人员带来的直接优势有以下几点:
     ① 增大了inline的可能性。由于inline只能发生在一个compilation unit中,所以在没有使用mutifile compilation时,inline只能发生在一个源文件范围内。multifile compilation将一个compilation unit扩大到了所有源文件的范围上,所以直接增加了inline发生的几率。
     ② 增大了基地址与函数间优化的可能性。同inline一样,所有的基地址与函数间的优化也必须在一个compilation unit中,随着conpilation unit的扩大这种优化的可能性也增加了。
     ③ 降低了scatter file的复杂性。

还在网上搜到了一篇英文参考手册:

pdf

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 整理

评论(0) | 阅读(18)
发表于:2008-7-8 23:03:59
标签:无标签

0

手记

    OK,正好老大也回来了,是自己开始认真工作的时候,现在其实想想以前总是让着累啊累的,其实现在自己真的最怕的是太空闲,反倒自己忙碌的时候感觉是充实的,呵呵。心情低落了,找点资料都找不到了,发点资料吧

吐血 ,真是郁闷,这都跟我作对,本来上传点PCI的资料的,结果总是提示我过大,得了,不发了,改天心情好再上传。

点击此处查看原文 >>

系统分类: 接口电路   |    用户分类:    |    来源: 整理

评论(0) | 阅读(66)
发表于:2008-7-2 22:03:23
标签:无标签

0

VMM验证方法在AXI总线系统中的实现

哈哈,转一篇非常不错的文章,在网上找了很久,很少有VMM实质有用的东西,个人感觉还是http://www.edacn.net/bbs/index.php上的资料更多一点,有兴趣的可以看看,哈哈这篇文章也不错,说不准下一个项目就用他喽~~

芯片验证越来越像是软件而不是硬件工作,这点已逐渐成为业界的共识。本文以软件工程的视角切入,分析中科院计算所某片上系统(SoC)项目的验证平台,同时也介绍当前较为流行的验证方法,即以专门的验证语言结合商用的验证模型,快速建立测试平台(Test-bench)并在今后的项目中重用。

本文提及的高级验证语言、方法学、验证基本库和仿真模型,这一套方法在近几年中正逐渐被业界广为采用。计算所的工作就是以这些最新成果为起点,对基于AXI总线协议的SoC建立测试平台。

这种新方法可大幅度提高芯片验证的效率,尤其是项目初期投入极大地降低,原因之一是面向对象编程等软件工程方法的大量引入。当然,这也对验证工程师的技能提出了新的要求。

验证方法

在验证领域,显见的趋势是语言划一、仿真平台统一、更加正规和高效。以本文介绍的项目为例,语言是SystemVerilog,平台则基于VMM构建,更有验证模型(Verification IP)助力,大幅提升了效率。正是因为部件可重用、平台结构化、以覆盖率为导向和高度自动化等特点,验证工作也愈加正规,有流程可循。

专门的验证语言,面世已有数年之久。它们出自于传统的纯粹Verilog(有时部分引入C/C++)描述的验证系统,并有很大发展。Vera、e语言和目前已成IEEE标准的SystemVerilog就是这段时期技术创新的成果。

面向对象编程特性,溯其源头便是C++语言。早在纯Verilog语言验证的时代,已有利用C++开发可重用验证代码的做法。工程师们看中的恰是OOP的封装、继承、多态及可重用等优异特性。

验证语言没有相应函数库的支持,语言本身也很难发挥效力。举一个大家熟知的例子,视窗(Windows)编程中,使用C语言直接调用视窗系统的编程接口(API)实现,是较为传统的做法,可目前却鲜有视窗程序员这样应用。为什么?工作量巨大,需维护的信息太多,从窗口尺寸、菜单列表到程序算法,都要加以考虑。因而作为解决方案之一的微软基本库(MFC)才得以大行其道。与之相得益彰的是,C++作为微软基本库的描述语言,也随视窗系统的传播,广为流行开来。

现代芯片验证领域,无例外地也出现了类似状况。大量新方法、新模型和新类库不断涌现,减轻了验证工程师们重复开发底层代码的负担,将更多精力投入到实际项目上。这一套新思路中,主要构成部分便是验证语言(如Vera、SystemVerilog),验证基本库(RVM、VMM)和相应的验证模型。

VMM的应用

VMM不仅是方法学,更是该方法的具体实现。它包括一系列的类库(class library)、类对象(object)联接关系以及用户定制的代码。如图1所示的测试平台中,各部件或即对象,是VMM基本类/扩展类的实例化(Instantiate)。所涉及到的VMM基本类有vmm_xactor、vmm_scenario_gen和vmm_data等。

点击看大图
图1:测试平台框图。

联接各部件,构成一个整体还需要其它一些基本类,包括vmm_env、vmm_channel以及vmm_xactor_callbacks等。除此之外,用户要根据芯片的实际状况,添加或修改约束条件、接口联线、执行步骤、覆盖率定义和自动比对机制(auto-check)。

1. 背景

该种类型的验证平台充分利用了软件工程的成果,将整个测试平台按照所实现的功能,分门别类予以切割,实现各模块独自开发、分别维护。目前,芯片规模趋于庞大,协议愈形复杂,通常要传递海量数据,并拥有数目繁多的端口。如果还以先前纯Verilog的方式建立验证系统,将很难满足芯片开发和投片的进度。

简而言之,简单地激励DUT输入端口、监控相应的输出端口和编写临时性的代码来做数据比对,这种验证方法已相当落后了。当然,我们也看到某些结构简单的芯片还有一定市场,纯粹Verilog语言的验证平台也可以做到非常复杂(但是很难维护),并且学习面向对象编程的代价容易令人望而却步。但这些都是主流之外的个例,故对此本文不深入展开。

现代验证系统,尽管包含数量众多的模块、多样的数据类型/协议及各模块间复杂的信息传递(保持同步、共享数据等),它仍然是继承传统方法,归纳以往的验证经验,依照惯常的步骤建立测试平台。

VMM方法也概莫能外。依照通常的流程,它为所有应用VMM的测试平台设定了九个步骤,定义在vmm_env中:gen_cfg、build、reset_dut、cfg_dut、start、wait_for_end、stop、cleanup和report。

另一方面,VMM平台的架构按抽象层次划分,由以下部件组成:测试例(test)、场景发生器(generator)、驱动部件(driver)、监控部件(monitor)、数据比对部件(scoreboard)、数据对象(data object)、数据传输管道(channel)、回调函数集(callback)、配置总集(dut_cfg与sys_cfg)、覆盖率统计部件,以及联接并集成以上所有部件的环境对象(environment object),如图2中所示。

点击看大图
图2:在测试平台中使用验证IP可大为降低工作量。

VMM中各个部件的使用,可参看Synopsys与ARM共同出版的手册。

2. 评估标准

该研究所之前的验证工作均采用高级验证语言Vera,使用SystemVerilog则是第一次。VMM方法的引入,究竟能在多大程度上提高验证效率?该项目既是实际工作又是一次评估。

我们设定预期值,是基于以下几点考虑:

a. 建立一个范例平台(包含简单的数据交易、自检测、覆盖率统计)需要多长时间?

b. 可扩展性,即随机测试向量的约束条件更改、自动比对机制按需求定制、功能覆盖点的添加及AXI协议的监控是否完备。

c. 验证流程可控性,如在已有的九步骤中插入额外动作;通过系统配置的改变,来控制各步骤执行的顺序和次数(比如一次reset多次cfg_dut以实现在线重复测试)。

d. 易用性也应当考虑在内。毕竟,VMM方法涵盖的内容很广,工程师们要完全掌握仍有个过程。在无法知其所以然的时候,能不能很快地知其然,并开展工作,显得非常重要。

后文的叙述都将围绕着这几方面展开。

AXI-VIP的集成

如前所述,VMM方法具备抽象分层结构、有九个执行步骤等优点,但它只是一个通用的方法,能否符合前边提出的四点判定标准还成问题。举例来说,计算所的AXI主设备(master)仿真模型是以Verilog编写的,无法在短期内实现与VMM平台的互联;完整的AXI协议检测,对本所第一颗基于该总线的片上系统显得尤为重要;由于时间仓促,AXI仿真模型还有待修正。这些都是项目进程中无法回避的问题,而VMM方法本身又没有提供解决方法。

1. 商用验证模型

AXI验证模型(VIP)是Synopsys公司的商用模型,可配置、数据交易严格符合AXI协议,具备完整的协议检查功能。最重要的一点是,AXI-VIP提供与VMM平台的接口。实际上,这个VIP本身就实现了VMM平台的驱动部件(Driver)加监控部件(Monitor)的功能:向下层是与DUT通过端口相联,向上层则有基于vmm_channel/vmm_xactor_callbacks的数据传输管道。如图2所示,除Test、Generator和Scoreboard之外的部分,AXI-VIP都已实现。这个商用模型对开发进度的实际贡献将取决于工程师能否快速上手。换言之,VIP的易用性决定了它的价值。

有鉴于此,Synopsys公司提供一个基于AXI-VIP的VMM范例。其中,DUT部分以AXI Bus VIP替代,TB部分实现了如图2所示的分层架构。工程师作为用户只需做如下修改,便能得到包含有简单数据交易、自检测、覆盖率统计等功能的验证平台:替换DUT,并修改接口信号名;改写测试例test_1的约束条件,得到自己的测试例;增加对DUT的配置操作。上述工作于一天内完成,仿真输出结果有波形文件、Log文件及覆盖率报告。

2. AXI-VIP支持的类

AXI- VIP定义的类都有相同的前缀名“dw_vip_axi”,它们构成vmm_env当中的大部分:

a. dw_vip_axi_master_rvm;

b. dw_vip_axi_slave_rvm;

c. dw_vip_axi_monitor_rvm;

d. dw_vip_axi_master_transaction_scenario_gen;

e. dw_vip_axi_port_model_configuration;

f. dw_vip_axi_system_model_configuration;

g. dw_vip_axi_master_transaction_channel;

h. dw_vip_axi_slave_resp_transaction_channel;

i. dw_vip_axi_monitor_transaction_channel。

这些类将例化产生主设备部件、从设备部件、监控部件、配置对象、数据对象和数据传输管道等等。它们有着各自的变量、函数,提供了丰富的控制功能,涵盖所有类型的操作。

功能的完备并未损害AXI-VIP的易用性,这点在项目中得到了印证。通过三天的培训与实做,工程师们能够通过"修改约束条件来随机产生测试向量",按照芯片测试规范改写"自动比对机制",添加"功能覆盖点",并利用AXI监控部件"自动检查协议"并收集与AXI协议相关的覆盖率。

这当中,按照芯片测试规范改写“自动比对机制”没有现成的VMM基本类可用。我们是从Synopsys提供的简单范例入手,利用AXI-VIP提供的回调函数集,获取数据交易信息,并实时地比对流出与流入数据。如同其他的验证系统,这部分工作是最多样化,也是最为核心的任务,所以占用三天当中的大部分时间,也在意料之中。

基于VMM的Scoreboard实现

本所验证组以VMM方法为指导,利用AXI-VIP提供的回调函数集,快速建立了该测试平台的自动比对机制。尽管还不能最终应用在十几个主/从设备的全系统中,但是,由于这部分代码封装在自定义的Scoreboard类当中,可重用、可扩展,并且符合VMM平台的接口要求,可以很方便地合入将来的系统中。该Scoreboard类的核心部分SystemVerilog代码由Synopsys提供,如图3所示。

点击看大图
图3:自检测单元的结构框图。

左端是主设备数据缓冲及比对,右端为从设备数据缓冲及比对,中间的1到N和N到1转换,实现数据比对任务的分配。N个从设备的比对代码,都扩展自相同的类。正因为这种设计它是可无限扩展的。基于本项目只有两个主设备的特点,我们对左边的结构做了大幅度简化。

核心的比对部分之外,关键任务就是实时地获取各主/从设备的数据流。这在AXI-VIP(也包括Synopsys公司的其他VIP)中,已经有现成函数可用。本所工程师在两天时间内就学会使用,并结合实际完成了代码的开发与调试。

AXI-VIP包括主设备、从设备与监控设备,它们在数据交易的几个关键点将得到一次函数回调的机会,如表1所示。

点击看大图
表1:回调函数与相应管道的对应关系表。

依据这些回调函数对应的数据交易阶段,我们选取主设备的post_input_channel_get,从设备的pre_output_channel_put两函数来获取交易数据。

其它函数也可以用来获取数据,如监控设备的pre_activity_channel_put,就可以得到输入、输出两方面的数据。具体请参看AXI-VIP使用手册。另外,VMM回调函数还可以用于控制验证流程、插入错误数据等等,限于篇幅,本文不再展开。

本文小结

因为芯片验证工作的趋势是需要更多的软件知识和技巧。本文以中科院计算所的SoC项目为例,讲解了如何充分利用专业的验证语言基本库和商用的仿真模型快速建立测试平台。文中详细介绍了各部件的使用和AXI-VIP对象如何纳入VMM框架,以及这样做的实际意义。

VMM方法基于SystemVerilog语言,提供了完整的函数库,而作为补充的AXI-VIP,功能完备且易用性强。基于这一新方法,本所验证组工程师在五个工作日内快速建立了一套可方便扩展的测试平台。建立新系统的过程中,发现一个设计的漏洞,充分体现了该方法的高效性。

张珩

中科院计算所

辜帆

Fan.Gu@synopsys.com

Synopsys公司

转自:http://www.eetchina.com/ART_8800464445_480301_TA_3efd022a.HTM

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类:    |    来源: 整理

评论(0) | 阅读(88)
发表于:2008-7-2 21:50:09
标签:无标签

0

[转]NAND和NOR flash

      今天有一个同事在选择flash时,问了一些关于nand和nor的区别,自己以前只知道两者的价格和存储容量及一些简单特性有些区别。今天回来特上网整理些,以详细学习一下。

  NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。紧接着,1989年,东芝公司发表了NAND flash结构,强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级。但是经过了十多年之后,仍然有相当多的硬件工程师分不清NOR和NAND闪存。

   “flash存储器”经常可以与“NOR存储器”互换使用。许多业内人士也搞不清楚NAND闪存技术相对于NOR技术的优越之处,因为大多数情况下闪存只是用来存储少量的代码,这时NOR闪存更适合一些。而NAND则是高数据存储密度的理想解决方案。
  NOR的特点是芯片内执行(XIP, eXecute In Place),这样应用程序可以直接在flash闪存内运行,不必
再把代码读到系统RAM中。NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入
和擦除速度大大影响了它的性能。
  NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困
难在于flash的管理和需要特殊的系统接口。

性能比较
  flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何flash器件的写入操
作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执
行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。
  由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除
NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。
  执行擦除时块尺寸的不同进一步拉大了NOR和NADN之间的性能差距,统计表明,对于给定的一套写入操作
(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行。这样,当选择存储解决方案时,设计
师必须权衡以下的各项因素。
  ● NOR的读速度比NAND稍快一些。
  ● NAND的写入速度比NOR快很多。
  ● NAND的4ms擦除速度远比NOR的5s快。
  ● 大多数写入操作需要先进行擦除操作。
  ● NAND的擦除单元更小,相应的擦除电路更少。

接口差别
  NOR flash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。
  NAND器件使用复杂的I/O口来串行地存取数据,各个产品或厂商的方法可能各不相同。8个引脚用来传送
控制、地址和数据信息。
  NAND读和写操作采用512字节的块,这一点有点像硬盘管理此类操作,很自然地,基于NAND的存储器就
可以取代硬盘或其他块设备。

容量和成本
  NAND flash的单元尺寸几乎是NOR器件的一半,由于生产过程更为简单,NAND结构可以在给定的模具尺
寸内提供更高的容量,也就相应地降低了价格。
  NOR flash占据了容量为1~16MB闪存市场的大部分,而NAND flash只是用在8~128MB的产品当中,这
也说明NOR主要应用在代码存储介质中,NAND适合于数据存储,NAND在CompactFlash、Secure Digital、PC Cards和MMC存储卡市场上所占份额最大。

可靠性和耐用性
  采用flahs介质时一个需要重点考虑的问题是可靠性。对于需要扩展MTBF的系统来说,Flash是非常合适
的存储方案。可以从寿命(耐用性)、位交换和坏块处理三个方面来比较NOR和NAND的可靠性。
  
寿命(耐用性)
  在NAND闪存中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次。NAND存储器除了具有10
比1的块擦除周期优势,典型的NAND块尺寸要比NOR器件小8倍,每个NAND存储器块在给定的时间内的删除次数要少一些。
  
位交换
  所有flash器件都受位交换现象的困扰。在某些情况下(很少见,NAND发生的次数要比NOR多),一个比特
位会发生反转或被报告反转了。
  一位的变化可能不很明显,但是如果发生在一个关键文件上,这个小小的故障可能导致系统停机。如果
只是报告有问题,多读几次就可能解决了。
  当然,如果这个位真的改变了,就必须采用错误探测/错误更正(EDC/ECC)算法。位反转的问题更多见于
NAND闪存,NAND的供应商建议使用NAND闪存的时候,同时使用EDC/ECC算法。
  这个问题对于用NAND存储多媒体信息时倒不是致命的。当然,如果用本地存储设备来存储操作系统、配
置文件或其他敏感信息时,必须使用EDC/ECC系统以确保可靠性。
  
坏块处理
  NAND器件中的坏块是随机分布的。以前也曾有过消除坏块的努力,但发现成品率太低,代价太高,根本
不划算。
  NAND器件需要对介质进行初始化扫描以发现坏块,并将坏块标记为不可用。在已制成的器件中,如果通
过可靠的方法不能进行这项处理,将导致高故障率。

易于使用
  可以非常直接地使用基于NOR的闪存,可以像其他存储器那样连接,并可以在上面直接运行代码。
  由于需要I/O接口,NAND要复杂得多。各种NAND器件的存取方法因厂家而异。
  在使用NAND器件时,必须先写入驱动程序,才能继续执行其他操作。向NAND器件写入信息需要相当的技
巧,因为设计师绝不能向坏块写入,这就意味着在NAND器件上自始至终都必须进行虚拟映射。

软件支持
  当讨论软件支持的时候,应该区别基本的读/写/擦操作和高一级的用于磁盘仿真和闪存管理算法的软件,
包括性能优化。
  在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常需要驱动程序,也就
是内存技术驱动程序(MTD),NAND和NOR器件在进行写入和擦除操作时都需要MTD。
  使用NOR器件时所需要的MTD要相对少一些,许多厂商都提供用于NOR器件的更高级软件,这其中包括M-
System的TrueFFS驱动,该驱动被Wind River System、Microsoft、QNX Software System、Symbian和
Intel等厂商所采用。
  驱动还用于对DiskOnChip产品进行仿真和NAND闪存的管理,包括纠错、坏块处理和损耗平衡。

(纠正一点:NOR擦除时,是全部写1,不是写0,而且,NOR FLASH SECTOR擦除时间视品牌、大小不同而不同,比如,4M FLASH,有的SECTOR擦除时间为60ms,而有的需要最大6S。)

NOR FLASH的主要供应商是INTEL ,MICRO等厂商,曾经是FLASH的主流产品,但现在被NAND FLASH挤的比较难受。它的优点是可以直接从FLASH中运行程序,但是工艺复杂,价格比较贵。

NAND FLASH的主要供应商是SAMSUNG东芝,在油盘、各种存储卡、MP3播放器里面的都是这种FLASH,由于工艺上的不同,它比NOR FLASH拥有更大存储容量,而且便宜。但也有缺点,就是无法寻址直接运行程序,只能存储数据。另外NAND FLASH 非常容易出现坏区,所以需要有校验的算法。

       在掌上电脑里要使用NAND FLASH 存储数据和程序,但是必须有NOR FLASH来启动。除了SAMSUNG处理器,其他用在掌上电脑的主流处理器还不支持直接由NAND FLASH 启动程序。因此,必须先用一片小的NOR FLASH 启动机器,在把OS等软件从NAND FLASH 载入SDRAM中运行才行,挺麻烦的。
以上转自老古开发网:http://www.laogu.com/wz_687.htm

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类:    |    来源: 整理

评论(0) | 阅读(72)
发表于:2008-6-29 0:20:47
标签:无标签

0

cache 学习

           最近工作不是很忙了,跑的TC都需要时间比较长了,所以终于有时间可以学习一下自己的感兴趣的东西,自己想想,整天自己算作SOC组的,那soc主要的是什么啊,说白了还是在玩IP,呵呵,那最关键的是什么呢,不用说当然是arm,大家当然得听脑袋发话干事了,但是发现自己一直用的就是一个arm的模型而已,自己对它的了解还真是少的可怜,得,慢慢学吧,先学习最近用得比较多的cache吧。

ARM920T的MMU与Cache

Cache是高性能CPU解决总线访问速度瓶颈的方法,然而它的使用却是需要权衡的,因为缓存本身的动作,如块拷贝和替换等,也是很消耗CPU时间的。MMU的重要性勿庸置疑,ARM920T(和ARM720T)集成了MMU是其最大的卖点;有了MMU,高级的操作系统(虚拟地址空间,平面地址,进程保护等)才得以实现。二者都挺复杂,并且在920T中又高度耦合,相互配合操作,所以需要结合起来研究。同时,二者的操作对象都是内存,内存的使用是使用MMU/Cache的关键。另外,MMU和Cache的控制寄存器不占用地址空间,CP15是操纵MMU/Cache的唯一途径。             Cache/Write Buffer的功能

Cache通过预测CPU即将要访问的内存地址(一般都是顺序的),预先读取大块内存供CPU访问,来减少后续的内存总线上的读写操作,以提高速度。然而,如果程序中长跳转的次数很多,Cache的命中率就会显著降低,随之而来,大量的替换操作发生,于是,过多的内存操作反而降低了程序的性能。

ARM920T内部采用哈佛结构,将内部指令总线和数据总线分开,分别连接到ICache和DCache,再通过AMBA总线接口连接到ASB总线上去访问内存。Cache由Line组成,Line是Cache进行块读取和替换的单位。

Writer Buffer是和DCache相逆过程的一块硬件,目的也是通过减少memory bus的访问来提高性能。

MMU的功能

在内存中维护一张或几张表,就看你怎么给内存划分page和section了。通过CP15指定好转换表的位置,920T的硬件会自动将转换表的一部分读到TLB中。CPU每次进行内存读写时,发出虚拟地址,参照TLB中的转换表转换到物理地址,并读取相应entry中的信息,以决定是否可以有权限读写和缓存。

mmugen这个工具就是帮你构造这个表的,省的自己写程序了。

操作MMU,实际上就是如何分配和使用你的内存,并记录在translationtable里。

ARM920T中,MMU的每条entry包括Cachable和Buffable位来指定相应的内存是否可以用Cache缓存。此处就是MMU与Cache的交互作用处。

实际上,MMU和Cache的使用是操作系统设计者根据系统软硬件配置而考虑的事情。操作系统针对分配给应用程序的地址空间作内存保护和缓存优化。在没有操作系统的情况下,就需要我们自己来掌控它们了。其中,主要是合理分配内存。

我认为,以下几点需要着重考虑:

1) 安全第一! -- 避免MMU和Cache的副作用。

当你在无OS的裸机上开发程序时,初始化运行环境的代码很重要,比如:各种模式堆栈指针的初始化;将代码和RW data从ROM拷贝到RAM;初始化.bss段(zero initialized)空间等。此时会有大量的内存操作,如果你enable了Cache,那么在拷贝完代码之后,一定要invalidate ICache和flush DCache。否则将会出现缓存中的代码或数据与内存中的不一致,程序跑飞。

另外,有时候我们需要自己作loader来直接运行ELF文件,情况也是一样,拷贝完代码后一定要刷新Cache,以免不测。

还有,对硬件的操作要小心。很多寄存器值都是被硬件改变的,读写时,要保证确实访问到它的地址。首先,在C语言代码中声明为volatile变量,以防止内存读写被编译器优化掉;另外,设置好TLB,使得寄存器映射的地址空间不被缓存。

总之,缓存和内存中代码的不一致,是一定要避免的。

2) 弄巧成拙! -- 只对频繁访问的地址空间进行Cache优化。

我们很清楚自己的程序中,那里有大量的运算,哪里有无数的循环或递归,而这正是Cache的用武之地,我们将这些空间进行缓存将大大提高运行速度。但是,很多函数或子程序往往仅仅运行很少几次,若是对它们也缓存,只会捡了芝麻丢了西瓜,造成不必要的缓存和替换操作,反而增加了系统负担,降低了整体性能。

3) 断点哪儿去了? -- 如何调试“加速”了的代码?

据我所知,一般,debugger都是通过扫描地址总线,在断点处暂停CPU。ARM9TDMI中集成的JTAG调试口,也是这样。

当我们调试使用Cache的代码时,将会出现问题。比如:CPU访问某断点所在地址之前的地址时,发生缓存操作,断点处代码被提前读入Cache,此时地址总线上出现了断点地址,CPU被debugger暂停,并且断点之后的指令也被Cache缓存。于是,当你从断点处step时,程序却停不了了,因为地址总线上不再出现断点之后的下一个地址了。

   再举个例子:

       int i,a;

       for (i=0; i<100; i++) {

    ->     a++;    /* set breakpoints */

       }

 

当地址总线上第一次出现断点地址时,CPU暂停;之后,就再也不会停了。因为,之后CPU会从cache中直接去代码了。(当然,后来,Cache的代码有可能会被替换掉,断点又可到达。)  所幸的是,我用的debugger提供JTAG Monitor,允许断点跟踪使用cache的程序。

Cache的工作原理
    1.Cache的引入
    请注意下面两种情况:
    ①大容量主存一般采用DRAM,相对SRAM速度慢,而SRAM速度快,但价格高。
    ②程序和数据具有局限性,即在一个较短的时间内,程序或数据往往集中在很小的存储器地址范围内。    
    因此,在主存和CPU之间可设置一个速度很快而容量相对较小的存储器,如图3.35所示。在其中存放CPU当前正在使用以及一个较短的时间内将要使用的程序和数据,这样,可大大加快CPU访问存储器的速度,提高机器的运行效率。


 
    通过上面的例子,可以这样来描述(2ache最基本的工作原理:在存储系统中设置了Cache的情况下,CPU进行存储器访问时,首先访问Cache标记,判是否命中,如果命中,就访问Cache(数据部分),否则访问主存。
    将访问的数据在Cache中的次数(即命中的次数)与总的访问次数之比称为命中率。影响命中率的因素主要有三个:Cache的容量、Cache块的划分以及Cache块与主存块之间的映像关系。一般来说,Cache的容量大一些,会提高命中率,但达到一定程度时,命中率的提高并不明显。目前,一般为256 KB或512 KB,命中率可达98%左右。
    下面还是通过例子来说明引入Cache块的好处。已知Cache的存取周期为50 ns,主存的存取周期为250 ns。设命中率为98%,即100次访问存储器的操作有98次在Cache中,只有2次需要访问主存,则这100次访问存储器操作的平均存取周期为(50 ns×98+250 ns×2)÷100=54 ns。由此可见,由于引入了Cache,使得CPU访问存储器的平均存取周期由不采用Cache时的250 ns降到了54 ns。也就是说,以较小的硬件代价使Cache/主存储器系统的平均访问时间大大缩短,从而大大提高了整个微机系统的性能。   
需要指出,Cache的功能全部由硬件实现,涉及Cache的所有操作对程序员都是透明的。
3.Cache的读/写操作
    CPU进行存储器读操作时,根据主存地址可分成命中和未命中两种情况。对于前者,从Cache中可直接读到所需的数据;对于后者,需访问主存,并将访问单元所在的整个块从内存中全部调入Cache,接着要修改Cache标记。若Cache已满,需按一定的替换算法,替换掉一个旧块。   
  CPU进行存储器写操作时,也可分成两种情况。一是所要写入的存储单元根本不在Cache中,这时写操作直接对主存进行操作(与Cache无关);二是所要写入的存储单元在Cache中。对于第二种情况需做一些讨论。Cache中的块是主存相应块的副本,程序执行过程中如果遇到对某块的单元进行写操作时,显然应保证相应的Cache块与主存块的一致。
这里有两种处理方式。一是暂时只向Cache写入,并用标志注明,直到这个块被从Cache,中替换出来时,才一次写入主存,称之为回写式;二是每次写入Cache的同时也写入主存,称之为通写式。两种方式各有优缺点。回写式占用总线时间少,写速度快,但不能随时保证Cache与主存保持一致,如果此期间发生DMA操作,则可能出错(DMA操作将在第四章介绍,暂时可将其理解为在输入/输出设备与存储器之间直接进行数据传送,这种操作不需要CPU参与。所以,可能出现CPU和DMA控制器同时访问同一主存块的情况);通写式可使Cache块和主存块始终保持一致,但占用总线时间长,总线冲突较多。

转自: http://www.shufacn.com/supe/html/02/n-1402.html

Cache的原理、设计及实现

Cache的原理、设计及实现 cM{`04#z  
b/0\DD0<  
)%I ;7=<  
前言 RG +0pqB*  
EHQ_Xq  
  虽然CPU主频的提升会带动系统性能的改善,但系统性能的提高不仅仅取决于CPU,还与系统架构、指令结构、信息在各个部件之间的传送速度及存储部件的存取速度等因素有关,特别是与CPU/内存之间的存取速度有关。 1C-J  
,C.daL8  
  若CPU工作速度较高,但内存存取速度相对较低,则造成CPU等待,降低处理速度,浪费CPU的能力。 ,0"3G^;nv{  
@rG!@s;  
  如500MHz的PⅢ,一次指令执行时间为2ns,与其相配的内存(SDRAM)存取时间为10ns,比前者慢5倍,CPU和PC的性能怎么发挥出来? 2>/.qopY  
}, vCDW,@  
  如何减少CPU与内存之间的速度差异?有4种办法: ?aHk>a]}!  
qz`B^3[8}  
  一种是在基本总线周期中插入等待,但这样会浪费CPU的能力。 |GxlE}IF  
_>#-NI_  
  另一种方法是采用存取时间较快的SRAM作存储器,这样虽然解决了CPU与存储器间速度不匹配的问题,但却大幅提升了系统成本。 oeuw,}S  
\|=&@$A!x\  
  第3种方法是在慢速的DRAM和快速CPU之间插入一速度较快、容量较小的SRAM,起到缓冲作用;使CPU既可以以较快速度存取SRAM中的数据,又不使系统成本上升过高,这就是Cache法。 rc*L~?  
 )cQX  
  还有一种方法,采用新型存储器。 z9q0DdR7  
`%5s%]-  
  目前,一般采用第3种方法。它是PC系统在不大增加成本的前提下,使性能提升的一个非常有效的技术。 ]f3Yd@j  
E*tj^ h  
  本文简介了Cache的概念、原理、结构设计以及在PC及CPU中的实现。 JNN!d  
h L!?27pH  
v<3i*5"  
  Cache的工作原理 qV zb  
 {>R#=t  
  Cache的工作原理是基于程序访问的局部性。 )xvyf8tU  
hnBY) x  
  对大量典型程序运行情况的分析结果表明,在一个较短的时间间隔内,由程序产生的地址往往集中在存储器逻辑地址空间的很小范围内。指令地址的分布本来就是连续的,再加上循环程序段和子程序段要重复执行多次。因此,对这些地址的访问就自然地具有时间上集中分布的倾向。 qu+1)/p7X  
H\i>H9`O  
  数据分布的这种集中倾向不如指令明显,但对数组的存储和访问以及工作单元的选择都可以使存储器地址相对集中。这种对局部范围的存储器地址频繁访问,而对此范围以外的地址则访问甚少的现象,就称为程序访问的局部性。 JEx)ivHO,  
Zeu=.1*,  
  根据程序的局部性原理,可以在主存和CPU通用寄存器之间设置一个高速的容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主存调入这个存储器,供CPU在一段时间内使用。这对提高程序的运行速度有很大的作用。这个介于主存和CPU之间的高速小容量存储器称作高速缓冲存储器(Cache)。 ]{ T N 3W  
ye{~}+  
  系统正是依据此原理,不断地将与当前指令集相关联的一个不太大的后继指令集从内存读到Cache,然后再与CPU高速传送,从而达到速度匹配。 '/5n2v6$T  
6D2 80E[  
  CPU对存储器进行数据请求时,通常先访问Cache。由于局部性原理不能保证所请求的数据百分之百地在Cache中,这里便存在一个命中率。即CPU在任一时刻从Cache中可靠获取数据的几率。 ](8]$S`MR  
3%"?\I0  
  命中率越高,正确获取数据的可靠性就越大。一般来说,Cache的存储容量比主存的容量小得多,但不能太小,太小会使命中率太低;也没有必要过大,过大不仅会增加成本,而且当容量超过一定值后,命中率随容量的增加将不会有明显地增长。 &U5SW6eZ  
%*\Opi,B$  
  只要Cache的空间与主存空间在一定范围内保持适当比例的映射关系,Cache的命中率还是相当高的。 0y@>aD_3  
3O=2J:WGI  
  一般规定Cache与内存的空间比为4:1000,即128kB Cache可映射32MB内存;256kB Cache可映射64MB内存。在这种情况下,命中率都在90%以上。至于没有命中的数据,CPU只好直接从内存获取。获取的同时,也把它拷进Cache,以备下次访问。 _Q,Wo,ISp  
0'T=qsEmcX  
.[33Hc+  
mM2mX5P  
Cache的基本结构 O="/"ix:zl`  
Iy9Y3sYhC  
  Cache通常由相联存储器实现。相联存储器的每一个存储块都具有额外的存储信息,称为标签(Tag)。当访问相联存储器时,将地址和每一个标签同时进行比较,从而对标签相同的存储块进行访问。Cache的3种基本结构如下: |Q_UGK  
WOiEcZg2!  
全相联Cache LDm /K[  
,k[iB,q`  
  在全相联Cache中,存储的块与块之间,以及存储顺序或保存的存储器地址之间没有直接的关系。程序可以访问很多的子程序、堆栈和段,而它们是位于主存储器的不同部位上。 NHt_mlN"  
Bum.s !em  
  因此,Cache保存着很多互不相关的数据块,Cache必须对每个块和块自身的地址加以存储。当请求数据时,Cache控制器要把请求地址同所有地址加以比较,进行确认。 C!tq'(R5N=  
o|ETp2"   
  这种Cache结构的主要优点是,它能够在给定的时间内去存储主存器中的不同的块,命中率高;缺点是每一次请求数据同Cache中的地址进行比较需要相当的时间,速度较慢。 9]?Wx>(c(  
pdGX%1  
Xk]n$iz'  
直接映像Cache  #19&Um:  
3 ]HKK"T  
  直接映像Cache不同于全相联Cache,地址仅需比较一次。 jFguyi?F5  
uVSl 
  在直接映像Cache中,由于每个主存储器的块在Cache中仅存在一个位置,因而把地址的比较次数减少为一次。其做法是,为Cache中的每个块位置分配一个索引字段,用Tag字段区分存放在Cache位置上的不同的块。  J6HfT()  
rbIx2]<  
  单路直接映像把主存储器分成若干页,主存储器的每一页与Cache存储器的大小相同,匹配的主存储器的偏移量可以直接映像为Cache偏移量。Cache的Tag存储器(偏移量)保存着主存储器的页地址(页号)。 O|~Oj*U`  
mJbQr<^"U  
  以上可以看出,直接映像Cache优于全相联Cache,能进行快速查找,其缺点是当主存储器的组之间做频繁调用时,Cache控制器必须做多次转换。 V[F<]+-.  
{C$L\{OB4  
组相联Cache |WGK\  
6\,WC<:  
  组相联Cache是介于全相联Cache和直接映像Cache之间的一种结构。这种类型的Cache使用了几组直接映像的块,对于某一个给定的索引号,可以允许有几个块位置,因而可以增加命中率和系统效率。 4.vK]:p  
sXpl{>  
/ -lqO  
9XbaFe:9  
Cache与DRAM存取的一致性 x@z@_$%  
@J <4<,c  
  在CPU与主存之间增加了Cache之后,便存在数据在CPU和Cache及主存之间如何存取的问题。读写各有2种方式。 #[H2v86WQ5  
\=Ve4f7  
贯穿读出式(Look Through) Y;`._I  
v)z 1ly)  
  该方式将Cache隔在CPU与主存之间,CPU对主存的所有数据请求都首先送到Cache,由Cache自行在自身查找。如果命中,则切断CPU对主存的请求,并将数据送出;不命中,则将数据请求传给主存。 '=R:n=4  
oSv}~TV8:  
  该方法的优点是降低了CPU对主存的请求次数,缺点是延迟了CPU对主存的访问时间。 xprIb*L  
d%/. xZb  
旁路读出式(Look Aside) B{B.:fWF  
'NE@r6  
  在这种方式中,CPU发出数据请求时,并不是单通道地穿过Cache,而是向Cache和主存同时发出请求。由于Cache速度更快,如果命中,则Cache在将数据回送给CPU的同时,还来得及中断CPU对主存的请求;不命中,则Cache不做任何动作,由CPU直接访问主存。 a9Y[NxT*K  
u-$ForrQ  
  它的优点是没有时间延迟,缺点是每次CPU对主存的访问都存在,这样,就占用了一部分总线时间。 Zr1 lr}  
A01W"-< ]V  
写穿式(Write Through) >$ (=jcPC  
l}>J[eX  
  任一从CPU发出的写信号送到Cache的同时,也写入主存,以保证主存的数据能同步地更新。 1XW['x'>>  
c e~P][  
  它的优点是操作简单,但由于主存的慢速,降低了系统的写速度并占用了总线的时间。 f)3~|\}  
{q8_5k.R  
回写式(Copy Back) LX+HT{F#D  
?Krtvup  
  为了克服贯穿式中每次数据写入时都要访问主存,从而导致系统写速度降低并占用总线时间的弊病,尽量减少对主存的访问次数,又有了回写式。 {&\t@iaH3Q  
.B?}x8Dt"  
  它是这样工作的:数据一般只写到Cache,这样有可能出现Cache中的数据得到更新而主存中的数据不变(数据陈旧)的情况。但此时可在Cache 中设一标志地址及数据陈旧的信息,只有当Cache中的数据被再次更改时,才将原更新的数据写入主存相应的单元中,然后再接受再次更新的数据。这样保证了Cache和主存中的数据不致产生冲突。 N^I >GW>gh  
;GdZ`!"e  
2dP5Ak_  
er4>$~  
Cache的分级体系设计 &^ C$*=l!  
! W!?t1<  
  微处理器性能由如下几种因素估算: .N]s]lc&  
a4(   
  性能=k(f??1/CPI-(1-H)??N) n20M#nQ8  
>r?Ws P  
  式中:k为比例常数,f为工作频率,CPI为执行每条指令需要的周期数,H为Cache的命中率,N为存储周期数。 )lN&FwD  
/H'MgpP[  
  虽然,为了提高处理器的性能,应提高工作频率,减少执行每条指令需要的周期数,提高Cache的命中率。同时分发多条指令和采用乱序控制,可以减少CPI值;采用转移预测和增加Cache容量,可以提高H值。为了减少存储周期数N,可采用高速的总线接口和不分块的Cache方案。 nTB7gqa  
3 &^Vyr   
  以前提高处理器的性能,主要靠提高工作频率和提高指令级的并行度,今后则主要靠提高Cache的命中率。设计出无阻塞Cache分级结构。 :,{O^yt  
r=hL  
  Cache分级结构的主要优势在于,对于一个典型的一级缓存系统的80%的内存申请都发生在CPU内部,只有20%的内存申请是与外部内存打交道。而这20%的外部内存申请中的80%又与二级缓存打交道。因此,只有4%的内存申请定向到DRAM中。 .8DX-i'  
|NL5fq 6]  
  Cache分级结构的不足在于高速缓存组数目受限,需要占用线路板空间和一些支持逻辑电路,会使成本增加。综合比较结果还是采用分级Cache。 e~ P{/K.  
VTr 
  L1 Cache的设计有在片一级分离和统一设计两种方案。 U [dTp$  
"yn]i*hT  
  Intel、AMD、原DEC等公司将L1 Cache设计成指令Cache与数据Cache分离型。因为这种双路高速缓存结构减少了争用高速缓存所造成的冲突,改进了处理器效能,以便数据访问和指令调用在同一时钟周期内进行。 U"huUD[g  
`"HL0]>  
  但是,仅依靠增加在片一级Cache的容量,并不能使微处理器性能随之成正比例地提高,还需设置二级Cache。  fqZ%  
`- $=j+  
  在L1 Cache结构方面,一般采用回写式静态随机存储器(SRAM)。目前,L1 Cache容量有加大的趋势。 ;~U{i&E'L"  
.*r eYa]  
  L2 Cache的设计分芯片内置和外置两种设计。 O ?:)   
IRg*;r  
  如AMD K6-3内置的256kB L2 Cache与CPU同步工作。外置L2 Cache,一般都要使二级Cache与CPU实现紧密耦合,并且与在片一级Cache形成无阻塞阶层结构。同时还要采用分离的前台总线(外部I/O总线)和后台总线(二级Cache总线)模式。 vH,3GXd)S`  
u}cd+v }   
  显然,将来随着半导体集成工艺的提高,如果CPU与二级Cache集成在单芯片上,则CPU与二级Cache的耦合效果可能更佳。 cCD&2\*`A  
Ee\{N  
  由于L2 Cache内置,因此,还可以在原主板上再外置大容量缓存1MB~2MB,它被称为L3 Cache。 ?Rv/CIT2   
0x)DFrrB8  
7$vM{(%Y2_  
!s$x'^!i  
PC中的Cache技术的实现 hGqn%'~x1  
@9C83j1  
  PC中Cache的发展是以80386为界的。 qQ"|;  
M5/%ynO  
结语 &2QAeI  
MH9]/9  
  目前,PC系统的发展趋势之一是CPU主频越做越高,系统架构越做越先进,而主存DRAM的结构和存取时间改进较慢。因此,Cache技术愈显重要,在PC系统中Cache越做越大。广大用户已把Cache做为评价和选购PC系统的一个重要指标。本文小结了Cache的源脉。希望可以给广大用户一个较系统的参考。  yjmsv8  

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 整理

评论(0) | 阅读(110)
发表于:2008-6-19 22:56:50
标签:无标签

2

ARM芯片的地址重映射

ARM芯片的地址重映射


by winday


    映射就是一一对应的意思。重映射就是重新分配这种一一对应的关系。
    我们可以把存储器看成一个具有输出和输入口的黑盒子。如下图所示,输入量是地址,输出的是对应地址上存储的数据。当然这个黑盒子是由很复杂的半导体电路具现的,具体的实现的方式我们现在不管。存储单位一般是字节。这样,每个字节的存储单元对应一个地址,当一个合法地址从存储器的地址总线输入后,该地址对应的存储单元上存储的数据就会出现在数据总线上面。


1


   普通的单片机把可执行代码和数据存放到存储器中。单片机中的CPU从储器中取指令代码和数据。其中存储器中每个物理存储单元与其地址是一一对应而且是不可变的。如图1CPU读取0x00000000地址上存储单元的过程。



2


      ARM比较复杂。ARM芯片与普通单片机在存储器地址方面的不同在于:ARM芯片中有些物理存储单元的地址可以根据设置变换。就是说一个物理存储单元现在对应一个地址,经过设置以后,这个存储单元就对应了另外一个地址了。图3是随意举了个例子(不要与ARM芯片对应),旨在说明地址重映射的过程。图3表示把0x00000000地址上的存储单元映射到新的地址0x00000007上。CPU存取0x00000007就是存取0x00000000上的物理存储单元。

点击看大图


3


    图4,图5是对ARM芯片的两种地址重映射方式的图示。图3 假设我们的应用程序存放在外扩FLASH当中,那么应用程序的异常向量表就存放在0x80000000起始的64个(其中有32个存放异常向量)物理存储单元中。但是ARM核发生异常(中断)后是从0x00000000~0x0000003F地址范围取异常向量的。所以要把0x80000000~0x8000003F范围内的存储单元重新映射到0x00000000~0x0000003F地址范围上。以后CPU存取0x00000000~0x0000003F地址就是存取0x80000000~0x8000003F范围内的存储单元。图4只显示出第一个异常向量的地址重映射,整个异常向量表的地址重映射等同这个过程。

点击看大图


4


    图5图示了ARM芯片的另外一种映射方式。这个映射可以由用户决定采用还是不采用(相关代码在工程文件的startup.s中,这个文件是第三方提供,用户可以修改)。这个映射主要是为了提高应用程序异常相应得速度。当我们把应用程序存放在片内FLASH的时候,异常向量表存放在0x00000000~0x0000003F存储单元内。每次发生异常,CPU0x00000000~0x0000003F地址上取异常向量。但是对RAM的存取速度远高于对FLASH

点击看大图


5


    存取速度,所以为了提高异常相应速度我们采取以下做法:


(1)       先把0x00000000~0x0000003FFLASH)存储单元内的异常向量表复制到0x40000000~0x4000003F(片内RAM的最低端64个字节的存储单元)范围内存储单元中。


(2)       0x40000000~0x4000003F范围内存储单元地址重新映射到0x00000000~0x0000003F地址范围。


    这样做了以后,当异常发生的时候,CPU取异常向量就是从RAM区中的异常向量表中区,速度快了。比如复位中断发生,CPU从地址0x00000000取指令,但此时由于已经过地址重新映射,这个0x00000000被地址转换器转换成0x40000000CPU实际上是取的RAM区中0x400000000这个存储单元内的指令(异常向量)。


当然用户可以不进行这种映射。片内FLASH0x00000000~0x0000003F存储单元具有一模一样的异常向量表。只不过不进行这种处理,异常相应速度慢一点。但是这种速度上的差别很多情况下是不必要在意的。


    图中的地址转换器受控制寄存器MENMAP的控制,用户可以设置MENMAP实现对地址重映射的控制。这个地址转换器显然是通过内部硬件电路实现的。

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 转贴

评论(2) | 阅读(123)
发表于:2008-6-17 22:49:10
标签:无标签

0

MIPS是个啥子东西??

      MIPS以前只知道是每秒处理的百万级指令,还知道跟arm一样也是一家高科技公司,再深点还真不是很清楚了,今天在公司看arm的时候,又用到它来衡量arm的性能,当时还奇怪怎么不直接用Mhz得了贝,也不知道两者是怎么样进行换算的,还非得用它,整理一些资料,也学习一下。

ARM中的MIPS和MHz联系

       MIPS即Million Instruction Per Second 的简写--计算机每秒种执行的百万指令数。是衡量计算机速度的指标。

       现如今CPU的频率越来越高,又是流水线又是超标量计算又是双核多核的,单纯以时钟频率来衡量计算机的速度已经不再科学,用MIPS来衡量相对比较合理。

        以ARM7为内核的S3C44B0X的推荐最高工作频率为66MHz,按照按照ARM公司提供的技术资料,ARM7类CPU的运算速度可按如下公式计算:MIPS=0.9×MHz,由此可得出,S3C44B0X的最大运算速度大约为0.9×66MHz=59.4MIPS。6M的51单片机通常是12 或24个时钟周期才能完成1条指令,乘法和除法指令更需要48个时钟周期。这样,我初步估算6M的51单片机的运算速度应该在0.2~0.5MIPS之间。可见8位机与32位机的运算速度还是有巨大的差异的。

       在一项试验中,我用6M的51系统修正一个Pt温度传感器的10000个点的数据,大约需要20~60秒的时间。按照我上述的估算,如果用ARM7来完成,只需要不到1秒钟的时间。

        哈哈,下面再补充点mips的基本信息,给自己也扫扫盲

         Million Instructions Per Second的缩写,每秒处理的百万级的机器语言指令数。这是衡量速度的一个指标。像是一个Intel 80386 电脑可以每秒处理3百万到5百万机器语言指令,既我们可以说80386是3到5MIPS的只是衡量性能的指标。这是一种过时的而且不科学的衡量处理器速度与性能的度量单位,不过依然在用。

      MIPS技术公司是一家设计制造高性能、高档次及嵌入式32位和64位处理器的厂商,在RISC处理器方面占有重要地位。1984年,MIPS计算机公司成立。1992年,SGI收购了MIPS计算机公司。1998年,MIPS脱离SGI,成为MIPS技术公司。
MIPS公司设计RISC处理器始于二十世纪八十年代初,1986年推出R2000处理器,1988年推R3000处理器,1991年推出第一款64位商用微处器R4000。之后又陆续推出R8000(于1994年)、R10000(于1996年)和R12000(于1997年)等型号。
    随后,MIPS公司的战略发生变化,把重点放在嵌入式系统。1999年,MIPS公司发布MIPS32和MIPS64架构标准,为未来MIPS处理器的开发奠定了基础。新的架构集成了所有原来NIPS指令集,并且增加了许多更强大的功能。MIPS公司陆续开发了高性能、低功耗的32位处理器内核(core)MIPS324Kc与高性能64位处理器内核MIPS64 5Kc。2000年,MIPS公司发布了针对MIPS32 4Kc的版本以及64位MIPS 64 20Kc处理器内核。

        同时MIPS还是世界上很流行的一种RISC处理器。MIPS的意思是“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。它最早是在80年代初期由斯坦福(Stanford)大学Hennessy教授领导的研究小组研制出来的。MIPS公司的R系列就是在此基础上开发的RISC工业产品的微处理器。这些系列产品为很多计算机公司采用构成各种工作站和计算机系统。

     哈哈,下面就顺便也介绍一下这种体系架构,有兴趣的可以看看一本非产不错的书《MIPS处理器设计透视》。非常不错的!

第一章 RISCs与MIPS

MIPS是高效精简指令集计算机(RISC)体系结构中最优雅的一种;即使连MIPS的竞争对手也这样认为,这可以从MIPS对于后来研制的新型体系结构比如DEC的Alpha和HP的Precision产生的强烈影响看出来。虽然自身的优雅设计并不能保证在充满竞争的市场上长盛不衰,但是MIPS微处理器却经常能在处理器的每个技术发展阶段保持速度最快的同时保持设计的简洁。
        相对的简洁对于MIPS来说是一种商业需要,MIPS起源于一个学术研究项目,该项目的设计小组连同几个半导体厂商合伙人希望能制造出芯片并拿到市场上去卖。结果是该结构得到了工业领域内最大范围的具有影响力的制造商们的支持。从生产专用集成电路核心(ASIC Cores)的厂家(LSI Logic,Toshiba, Philips, NEC)到生产低成本CPU的厂家(NEC, Toshiba,和IDT),从低端64位处理器生产厂家(IDT, NKK, NEC)到高端64位处理器生产厂家(NEC, Toshiba和IDT).
        低端的CPU物理面积只有1.5平方毫米(在SOC系统里面肉眼很难找到).而高端的R10000处理器,第一次投放市场时可能是世界上最快的CPU,它的物理面积几乎有1平方英寸,发热近30瓦特.虽然MIPS看起来没什么优势,但是足够的销售量使其能健康发展:1997年面市的44M的MIPS CPU,绝大多数使用于嵌入式应用领域.
        MIPS CPU是一种RISC结构的CPU, 它产生于一个特殊的蓬勃发展的学术研究与开发时期.RISC(精简指令集计算机)是一个极有