|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 hbhbts 于 2013-12-5 12:24 编辑
首先,来eetop也有两年了,在这里很感谢eetop!
回到正题,我准备利用周末的时间把前段时间学习的AHB spec相关知识做一个verilog AHB bus。
实际上verilog module完成只花了一点时间,但是验证这个module估计要花很长时间,目前正在使用UVM验证中...
等验证完,我会将verilog代码贴到论坛上。
下面关于我写的这个ahb bus 一些说明:
1)支持4个master port 和 4 个slave port,其中最后1个master port 如果没有使用(undefine master port:UMP),则需要
设置为default master (per AHB spec), default 作用是为了当bus没有owner时,指定一个只发IDLE trans的master。具体实现
可以set hbusreq=1, htrans=IDLE; 由于总线切换需要slave的hready和hresp信号的支持,所以,最好在system reset之后需要
所有的slave都能提供hready = 1 和 hresp = OKAY, 以支持总线的owner从default master 切换到需要transfer的master。
2)在verilog coding时,已经考虑到以后可能扩展到16 master port 和16 slave port, 因此该veriog代码的扩展性不错
3)该bus采用固定优先级总裁的方式, master port 编号越低,优先级越高,最后一个如果是UMP,那么就定义为default master
4)该bus不会在一个完整的busrt transfer完成之前将总线的owner切换,为此arbiter需要monitor master的htrans和hburst信号,在一个burst的最后一个transaction beat之前进行仲裁(per AHB spec),因此我需要提前知道该burst的长度, 该feature不支持INCR 不定长传输方式。
5)为了4)中的feature能在SINGLE 方式下依然可以支持,bus的hgrant信号需要做成组合逻辑。即:当仲裁使能信号有效时,arbiter会根据各个master的hbusreq信号立即给出响应(hgrant), 结合4)master在发定长的burst时,不需要一直拉着hbusreq,可以最短只拉一周期,如果一直拉着hbusreq且该master优先级较高的话,可以保证后续的transfer跟该transfer pipeling在一起,否者,在有default master的情况下,该master会丢掉bus access的权利,后续的transfer不得不重新申请总线,而浪费一个cycle。
6)master的hlock信号与hbusreq信号一样是在同一时间被bus arbiter访问的, 但是hlock需要在整个burst transfer都要拉着,不能像hbusreq只拉一小段cycles。为了能够handle slave response RETRY和SPLIT,master的hlock最好持续到burst的最后一个beat的后一个cycle。(per AHB SPEC)
7)对于hresp中的RETRY和SPLIT的支持,RETRY不需要bus做特别要求, 但SPLIT需要, 为此需要给每个master的busreq设定一个mask 信号,bus arbiter需要每个cycle都monitor slave的hresp信号是不是SPLIT, 如果是则要当hready==0的时候将对应的master的mask给打上,在下一个时钟(hready为高,hresp为SPLIT,master的htrans为IDLE)进行总线仲裁,从而让其他的mster获得access权利。同时,arbiter也要每个cycle都要monitor slave的hsplit信号,这个hsplit信号可将所有的slave的respose 的 split信号按位或在一起得到,如果发现有为1的bit位,就会将其对应的master的mask设为0,取消屏蔽,让该master能够重新获得access bus的权利(per AHB spec)
8)总线access的权利的切换只能在hready为高时进行。
ps:啰啰嗦嗦写了这些,肯定有些不对的地方,望请指正,谢谢! |
|