码迷,mamicode.com
首页 > 其他好文 > 详细

OR1200处理器中Wishbone总线接口模块WB_BIU介绍

时间:2014-07-01 15:31:19      阅读:550      评论:0      收藏:0      [点我收藏+]

标签:or1200 openrisc 软核处理   cache   or1200 软核处理器   开源   软核   

以下内容摘自《步步惊芯——软核处理器内部设计分析》一书

 

      WB_BIU模块是OR1200处理器与外部Wishbone总线连接的接口模块,15.1节给出了WB_BIU模块的对外连接关系,并指出WB_BIU模块的三个作用。因为OR1200处理器支持Wishbone B3版本,所以在15.2节介绍了Wishbone B3版本中的寄存反馈总线周期,重点说明了其中的周期类型识别地址标签CTI_O/CTI_I、突发类型扩展地址标签BTE_O/BTE_I的作用。

15.1 WB_BIU模块的对外连接关系

      通过图1.6可以发现,OR1200处理器使用了两个WB_BIUWishbone Bus Interface Unit)模块,分别作为处理器的指令Wishbone总线接口单元、数据Wishbone总线接口单元。处理器通过这些总线接口单元进行取指、加载存储数据等操作。读者朋友可能会有疑问:为何不去掉WB_BIU,使得ICacheSB直接与外部的Wishbone总线连接,毕竟ICacheSB模块的对外接口信号也符合Wishbone总线规范。这就涉及到WB_BIU模块的作用,本节在后面对其接口的介绍中会给出WB_BIU模块的作用,届时读者就会明白。

      WB_BIU模块的接口以及对外连接关系如图15.1所示。

bubuko.com,布布扣

      图15.1中,WB_BIU模块对处理器外部的接口名称都是wb_xxx_x的形式,对处理器内部的接口名称都是biu_xxx_x的形式,这一点需要注意,在后面代码分析中,可以据此判断某一信号是WB_BIU与处理器外部模块之间的信号,还是WB_BIU与处理器内部模块之间的信号。

      从图15.1中还可以发现:WB_BIU与处理器外部模块之间的信号比WB_BIU与处理器内部模块之间的信号多,重点就是图中使用斜体标示的6个信号,这6个信号揭示了WB_BIU模块的作用:

      (1clmodewb_rst_iwb_clk_i

      处理器外部Wishbone总线的时钟可以小于处理器的时钟,这样做的目的是降低系统功耗,这三个信号的作用就是在Wishbone总线时钟与处理器时钟不一致时,协调WB_BIU模块对处理器内部、外部的Wishbone总线信号,使其正常工作。其中wb_rst_iwb_clk_i是外部Wishbone总线的复位信号、时钟信号,clmode是时钟模式选择信号,长度是两位,可以设置如下:

  •   2’b00:外部Wishbone总线时钟wb_clk_i等于处理器时钟clk
  •   2’b01:外部Wishbone总线时钟wb_clk_i等于处理器时钟clk的一半
  •   2’b10:未定义
  •   2’b11:外部Wishbone总线时钟wb_clk_i等于处理器时钟clk1/4

      (2wb_rty_i

      当外部设备回复重试信号时(wb_rty_i1),WB_BIU模块会再次与外部设备开始Wishbone总线操作周期,只有当重试次数超过一个阈值(默认是64次)的时候,才向处理器报告Wishbone总线操作错误,这样可以提高系统的容错能力。

      (3wb_cti_iwb_bte_i

      wb_cti_i是周期类型识别地址标签,wb_bte_i是突发类型扩展地址标签,两者都是在Wishbone规范B3版中使用的信号,作用是实现Wishbone寄存反馈总线周期,本章第2节会介绍Wishbone寄存反馈总线周期的含义。此处读者只需要知道在处理器内部的Wishbone总线中没有这两个信号,所以WB_BIU模块还起一个不同Wishbone总线规范之间转换的作用。目前Wishbone已经制定了B4版,如果要使得OR1200支持新版本,只需要修改WB_BIU模块即可,提高了系统的移植能力。

      在上面对接口的分析中,已经揭示了WB_BIU模块的作用,如果去掉WB_BIU,那么需要将这些作用在ICacheSB模块中分别实现,显然不是一种好的设计方法,所以不可以去掉WB_BIU模块。

 

15.2 Wishbone寄存反馈总线周期

      如果读者朋友是从本书的开始一章一章阅读到这里的,那么应该会对Wishbone总线的操作周期有一个基本印象:

      (1)单次读操作的过程:主设备置位CYC_O/STB_O表示总线操作周期开始,然后通过ADR_O接口送出地址信号,WE_I置低表示读操作,若干个时钟周期后,主设备的ACK_I变为高电平,表示数据读取到,主设备从DAT_I读取数据,同时置低CYC_O/STB_O表示总线操作周期结束,从设备也置低ACK_O

      (2)单次写操作的过程:主设备置位CYC_O/STB_O表示总线操作周期开始,然后通过ADR_O接口送出地址信号,DAT_O接口送出要写入的数据,WE_I置高表示写操作,若干个时钟周期后,主设备的ACK_I变为高电平,表示数据写入,主设备置低CYC_O/STB_O表示总线操作周期结束,从设备也置低ACK_O

      (3)块读操作的过程:主设备置位CYC_O/STB_O表示总线操作周期开始,然后通过ADR_O接口送出地址信号,WE_I置低表示读操作,若干个时钟周期后,主设备的ACK_I变为高电平,表示数据读取到,主设备从DAT_I读取数据,从设备置低ACK_O,主设备再次通过ADR_O接口送出新的地址信号,若干个时钟周期后,主设备的ACK_I又变为高电平,表示新数据读取到,主设备从DAT_I读取数据,从设备再次置低ACK_O,如此反复直到主设备置低CYC_O/STB_O,表示总线操作周期结束。

      (4)块写操作的过程:主设备置位CYC_O/STB_O表示总线操作周期开始,然后通过ADR_O接口送出地址信号,DAT_O接口送出要写入的数据,WE_I置高表示写操作,若干个时钟周期后,主设备的ACK_I变为高电平,表示数据写入,从设备置低ACK_O,主设备再次通过ADR_ODAT_O接口送出新的地址信号、数据信号,若干个时钟周期后,主设备的ACK_I又变为高电平,表示新数据写入,从设备再次置低ACK_O,如此反复直到主设备置低CYC_O/STB_O,表示总线操作周期结束。

      其中块读、写操作的过程在第13章分析DCache时都接触过,在第13章示例程序的第8步,当第一次使用l.sw指令加载数据时,会发生DCache失靶,如果配置的是回写法,那么处理器会从外部RAM中连续读入4个字填充到DCache(也可以称为突发读入4个字),代码如下:

##############################           第8步            ##############################
指令地址             指令                      指令对应的二进制
0x800078           l.addi r1,r0,0x10           0x9c200010
_loop1:
0x80007C           l.sw 0x0(r1),r1             0xd4010800  //第一次执行该指令时会发生DCache失靶
0x800080           l.sfeqi r1,0x1C             0xbc01001c
0x800084           l.bnf _loop1                0x0ffffffe
0x800088           l.addi r1,r1,0x4            0x9c210004

      ModelSim仿真波形如图15.2所示,这里就是块读操作的过程。

bubuko.com,布布扣

      从图中可知,每次都是在主设备收到ACK_I1后,才给出新的地址,然后从设备依据新的地址开始下一次操作,假如从设备事先知道主设备将要发起新的操作,并且知道新的地址,那么就可以在上次操作后,立即开始下一次操作,而不用等待从主设备接收到新的地址后才开始,从而可以节省时钟周期,提高系统的吞吐量,这种方式就是“Wishbone寄存反馈总线周期”。

      在Wishbone寄存反馈总线周期中,从设备需要事先知道在当前操作完成后,主设备是否将发起新的总线操作,这是通过周期类型识别地址标签CTI_O/CTI_I、突发类型扩展地址标签BTE_O/BTE_I完成的。

      CTI_O/CTI_I提供描述当前操作突发模式的信息,从设备可以根据该信息确定在下一个时钟周期如何操作,其具体定义如表15.1所示。

 

bubuko.com,布布扣

      恒定地址突发总线周期指的是在一个总线周期中完成多次操作,但是地址不变,这种方式的典型应用是以DMA方式读写FIFO;递增突发总线周期指的是在一个总线周期中完成多次操作,但是地址递增,且地址增加方式分为线性增加、折叠增加。BTE_O/BTE_I描述的就是地址增加方式,如表15.2所示。

bubuko.com,布布扣

      在线性增加中,新的地址总是比旧的地址大一个单位增加值,单位增加值取决于总线的宽度和粒度,对于粒度为8的总线,当总线宽度是8时,单位增加值为1,当总线宽度是16时,单位增加值为2,当宽度是32时,单位增加值为4。在折叠增加中,分为叠4增加、叠8增加、叠16增加,新地址的获得方式为在旧地址的部分位上加1,比如:叠4增加,且单位增加值为4时,那么通过在旧地址的2-3位上加1获得新地址,之前ICacheDCache中突发读入4个字时采用的就是这种地址计算方法。

      从设备可以依据其输入信号CTI_IBTE_I的值,提前知道下一个操作的地址,从而可以提前进行操作,节省了时钟周期。当主设备将CTI_O置为3’b111时,表示当前操作是当前突发的最后一个操作,主设备在当前操作结束后紧接着的时钟周期不再发起操作,Wishbone寄存反馈总线周期结束。

      主设备和从设备若以寄存反馈总线周期工作,至少必须同时支持CTI_O/CTI_I信号。若主设备或从设备之一不支持CTI_O/CTI_I,那么只能以传统总线周期方式工作,此时主设备或者从设备必须将CTI_O/CTI_I置为3’b000或者3’b111,两者是等价的。

      在11.5节,简单SOPC的建立过程中,修改了OR1200WB_BIU模块的代码,如下,读者可以暂时认为其中的信号wb_cti_nxt就是WB_BIU与处理器外部Wishbone总线之间的CTI_O接口信号:

or1200_wb_biu.v
 always @(wb_fsm_state_cur or burst_len or wb_err_i or wb_rty_i or wb_ack or  wb_cti_o 
           or wb_sel_o or wb_stb_o or wb_we_o or biu_cyc_i or  biu_stb or biu_cab_i 
           or biu_sel_i or biu_we_i) begin
     case(wb_fsm_state_cur)
	     wb_fsm_idle : begin
	       wb_cyc_nxt = biu_cyc_i & biu_stb;
	       wb_stb_nxt = biu_cyc_i & biu_stb;
	       
	       //原值为wb_cti_nxt = {!biu_cab_i, 1'b1, !biu_cab_i};
	       wb_cti_nxt = {1'b1, 1'b1, 1'b1};         
	       ……


 

      有了Wishbone寄存反馈总线周期的知识,读者就可以理解为何作上述修改了,解释如下:

      在修改之前,wb_cti_nxt的值是{!biu_cab_i, 1‘b1, !biu_cab_i},以指令Wishbone总线接口为例,biu_cab_i来自ICache的输出icbiu_cab_o,回忆一下12.8.3节,当ICache失靶时,需要从外部RAM连续读入4个字,此时会设置icbiu_cab_o1,从而使得WB_BIU模块的wb_cti_nxt的值为3’b010,参考表15.1可知,也就是采用递增突发总线周期,但是简单SOPCOR1200处理器挂接在Wishbone总线互联矩阵WB_CONMAX模块上,而WB_CONMAX并不支持Wishbone B3版本,也就是没有CTI_O/CTI_IBTE_I/BTE_O接口,所以会出错,上述修改就是使得WB_BIUwb_cti_nxt信号保持为3’b111,从而强制使用传统总线操作周期,这样虽然效率低一些,但不会出错。对于数据Wishbone总线接口单元也存在同样的问题。

      此外,还可以发现,修改之前wb_cti_nxt的值是{!biu_cab_i, 1‘b1, !biu_cab_i},中间的一位恒定为1,这说明OR1200处理器中的WB_BIU模块只支持传统总线周期或递增突发总线周期,而不支持恒定地址突发总线周期。

 

 


 

 

 

 

 

 

OR1200处理器中Wishbone总线接口模块WB_BIU介绍,布布扣,bubuko.com

OR1200处理器中Wishbone总线接口模块WB_BIU介绍

标签:or1200 openrisc 软核处理   cache   or1200 软核处理器   开源   软核   

原文地址:http://blog.csdn.net/leishangwen/article/details/36183181

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!