OpenRisc-6-wishbone实验

来源:互联网 发布:网络小额贷款运营模式 编辑:程序博客网 时间:2024/06/14 01:47

引言

 学习和研究OR,wishbone是绕不开的问题。本小节就做一个简单的实验,进一步加深对wishbone总线的理解。

 

6.1 总线timing

请参考官方spec,链接如下:

http://opencores.org/opencores,wishbone

附:

http://blog.csdn.net/column/details/ce123-wishbone.html

 

6.2 实验内容

一个master,一个slave,master通过wishbone传递数据(两个操作数)给slave,slave做加法运算,将结果传给master。

如图:

 

 

6.3 用modelsim emulate 结果,可以看到1 + 2 = 3

6.4 实验code,写blog的编辑器xheditor真是无语了。这个实验的5个.v文件都是分开的,但是这个编辑器非要弄到一起,人工还修改不了。

 

1>master

[html] view plaincopyprint?
  1. //`include "wb_conbus_defines.v"  
  2. `timescale 1ns / 10ps  
  3.   
  4.   
  5. module my_master_model(clk, rst, adr, din, dout, cyc, stb, sel, we, ack, err, rty);  
  6.   
  7. input       ack, err, rty;  
  8. input       clk, rst;  
  9. input   [31:0]  din;  
  10.   
  11. output  [31:0]  adr;  
  12. output  [31:0]  dout;  
  13. output      cyc, stb;  
  14. output  [3:0]   sel;  
  15. output      we;  
  16.   
  17.   
  18. //external registers  
  19. reg [31:0] adr,dout;  
  20. reg cyc,stb,we;  
  21. reg [3:0] sel;  
  22. //internal registers  
  23. reg [31:0] result;  
  24.   
  25. initial   
  26. begin  
  27.   adr=32'hffff_ffff;  
  28.   dout=32'hxxxx_xxxx;  
  29.   cyc=0;  
  30.   stb=0;  
  31.   sel=4'hx;  
  32.   we=1'hx;  
  33.   result=32'hxxxx_xxxx;  
  34.   #10;  
  35.     
  36. end  
  37. task write_numbers;  
  38. input [31:0] slave_addr;  
  39. input [31:0] operd_a,operd_b;  
  40. begin  
  41.   @(posedge clk);  
  42.   adr=slave_addr;  
  43.   dout=operd_a;  
  44.   cyc=1;  
  45.   stb=1;  
  46.   we=1;  
  47.   @(posedge clk);  
  48.   while(~ack &~err)@(posedge clk);  
  49.   adr=slave_addr+32'h1;  
  50.   dout=operd_b;  
  51.   @(posedge clk);  
  52.   while(~ack &~err)@(posedge clk);  
  53.   @(posedge clk);  
  54.   @(posedge clk);  
  55.   adr=adr+32'h1;  
  56.   we=0;  
  57.   @(posedge clk);  
  58.   while(~ack &~err)@(posedge clk);  
  59.   result=din;  
  60.   cyc=0;  
  61.   stb=0;  
  62.   we=1'bx;  
  63.   adr=32'hxxxx_xxxx;  
  64.   dout=32'hxxxx_xxxx;  
  65.     
  66. end  
  67. endtask  
  68. always @(result,dout,adr)  
  69. $display("master model time: %t dout:%h  result:%h adr:%h ",$realtime,dout,result,adr);  
  70.   
  71.   
  72.   
  73. endmodule  


 

2>slave

[html] view plaincopyprint?
  1. //`include "wb_conbus_defines.v"  
  2. `timescale 1ns / 10ps  
  3.   
  4. module my_slave_model(clk, rst, adr, din, dout, cyc, stb, sel, we, ack, err, rty);  
  5.     
  6. input       clk, rst;  
  7. input   [31:0]  adr, din;  
  8. output  [31:0]  dout;  
  9. input       cyc, stb;  
  10. input   [3:0]   sel;  
  11. input       we;  
  12. output      ack, err, rty;  
  13.   
  14. //output registers  
  15. reg [31:0] dout;  
  16. reg ack;  
  17. //internal registers  
  18. reg [31:0]Cal_A,Cal_B;  
  19. reg [31:0] Result;  
  20. reg A_Status,B_Status,R_Status;  
  21. //reg Reslt_Enbl;  
  22. //reg Oprd_Enbl;  
  23. //reg Wrt_Continue;  
  24.   
  25. assign err=0;  
  26. assign rty=0;  
  27.   
  28. always @(posedge clk)  
  29. if(rst)  
  30.   begin  
  31.    A_Status<=0;  
  32.    B_Status<=0;  
  33.    Cal_A<=0;  
  34.    Cal_B<=0;   
  35.      
  36.   end  
  37. else if(A_Status &B_Status)  
  38.   begin  
  39.         Result<=Cal_A+Cal_B;  
  40.         R_Status<=1'b1;  
  41.         A_Status<=0;  
  42.         B_Status<=0;  
  43.   end  
  44. else if(cyc & stb & we)  
  45.   begin  
  46.   if(adr==32'h10000000 & !A_Status)  
  47.       begin  
  48.         Cal_A<=din;  
  49.         A_Status<=1'b1;  
  50.       end  
  51.     else if(adr==32'h10000001 & !B_Status)  
  52.       begin  
  53.         Cal_B<=din;  
  54.          B_Status<=1'b1;  
  55.       end  
  56.     end  
  57.   
  58.   
  59.     
  60.     
  61. /*  
  62.   always @(posedge clk)  
  63.   if(rst)  
  64.     begin  
  65.       Result<=0;  
  66.       Reslt_Enbl<=0;  
  67.     end  
  68.   else if(Oprd_Enbl)  
  69.     begin  
  70.       Result<=Cal_A+Cal_B;  
  71.       Reslt_Enbl<=1'b1;  
  72.     end  
  73.    */  
  74.    
  75.   always @(posedge clk)  
  76.   if(rst)  
  77.       dout<=0;  
  78.     else if(R_Status)  
  79.       begin  
  80.       dout<=Result;  
  81.       R_Status<=0;  
  82.     end  
  83.         
  84.       
  85.     always @(posedge clk)  
  86.     if(rst)  
  87.       begin  
  88.         ack<=0;  
  89.       end  
  90.     else if(stb & !ack)  
  91.       begin  
  92.         ack<=!ack;  
  93.       end  
  94.     else if(ack)  
  95.       ack<=0;  
  96.     
  97.     always @(din,adr,stb,we,cyc,Cal_A,Cal_B,Result)  
  98.     $display("slave model time:%t din:%h adr:%h stb:%b we:%b cyc:%b operd_a: %h  operd_b:%h result:%h",$realtime,din,adr,stb,we,cyc,Cal_A,Cal_B,Result);  
  99.   endmodule  


 

3>bus top

[html] view plaincopyprint?
  1. <pre class="html" name="code">/////////////////////////////////////////////////////////////////////  
  2. ////                                                             ////  
  3. ////  WISHBONE Connection Bus Top Level                      ////  
  4. ////                                                             ////  
  5. ////                                                             ////  
  6. ////  Author: Johny Chi                                  ////  
  7. ////          chisuhua@yahoo.com.cn                              ////  
  8. ////                                                             ////  
  9. ////                                                             ////  
  10. ////                                                             ////  
  11. /////////////////////////////////////////////////////////////////////  
  12. ////                                                              ////  
  13. //// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////  
  14. ////                                                              ////  
  15. //// This source file may be used and distributed without         ////  
  16. //// restriction provided that this copyright statement is not    ////  
  17. //// removed from the file and that any derivative work contains  ////  
  18. //// the original copyright notice and the associated disclaimer. ////  
  19. ////                                                              ////  
  20. //// This source file is free software; you can redistribute it   ////  
  21. //// and/or modify it under the terms of the GNU Lesser General   ////  
  22. //// Public License as published by the Free Software Foundation; ////  
  23. //// either version 2.1 of the License, or (at your option) any   ////  
  24. //// later version.                                               ////  
  25. ////                                                              ////  
  26. //// This source is distributed in the hope that it will be       ////  
  27. //// useful, but WITHOUT ANY WARRANTY; without even the implied   ////  
  28. //// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////  
  29. //// PURPOSE.  See the GNU Lesser General Public License for more ////  
  30. //// details.                                                     ////  
  31. ////                                                              ////  
  32. //// You should have received a copy of the GNU Lesser General    ////  
  33. //// Public License along with this source; if not, download it   ////  
  34. //// from http://www.opencores.org/lgpl.shtml                     ////  
  35. ////                                                              ////  
  36. //////////////////////////////////////////////////////////////////////  
  37. //  
  38. //  Description  
  39. //  1. Up to 8 masters and 8 slaves share bus Wishbone connection  
  40. //  2. no priorty arbitor , 8 masters are processed in a round  
  41. //     robin way,  
  42. //  3. if WB_USE_TRISTATE was defined, the share bus is a tristate  
  43. //     bus, and use less logic resource.  
  44. //  4. wb_conbus was synthesis to XC2S100-5-PQ208 using synplify,  
  45. //     Max speed >60M , and 374 SLICE if using Multiplexor bus  
  46. //      or 150 SLICE if using tri-state bus.  
  47. //  
  48. //`include "wb_conbus_defines.v"  
  49. `timescale 1ns / 10ps  
  50.   
  51. `define         dw   32     // Data bus Width  
  52. `define         aw   32     // Address bus Width  
  53. `define         sw   `dw / 8    // Number of Select Lines  
  54. `define         mbusw  `aw + `sw + `dw +4   //address width + byte select width + dat width + cyc + we + stb +cab , input from master interface  
  55. `define         sbusw    3  //  ack + err + rty, input from slave interface  
  56. `define         mselectw  8 // number of masters  
  57. `define         sselectw  8 // number of slavers  
  58.   
  59. //`define       WB_USE_TRISTATE  
  60.   
  61.   
  62. module wb_conbus_top(  
  63.     clk_i, rst_i,  
  64.   
  65.     // Master 0 Interface  
  66.     m0_dat_i, m0_dat_o, m0_adr_i, m0_sel_i, m0_we_i, m0_cyc_i,  
  67.     m0_stb_i, m0_ack_o, m0_err_o, m0_rty_o, m0_cab_i,  
  68.   
  69.     // Master 1 Interface  
  70.     m1_dat_i, m1_dat_o, m1_adr_i, m1_sel_i, m1_we_i, m1_cyc_i,  
  71.     m1_stb_i, m1_ack_o, m1_err_o, m1_rty_o, m1_cab_i,  
  72.   
  73.     // Master 2 Interface  
  74.     m2_dat_i, m2_dat_o, m2_adr_i, m2_sel_i, m2_we_i, m2_cyc_i,  
  75.     m2_stb_i, m2_ack_o, m2_err_o, m2_rty_o, m2_cab_i,  
  76.   
  77.     // Master 3 Interface  
  78.     m3_dat_i, m3_dat_o, m3_adr_i, m3_sel_i, m3_we_i, m3_cyc_i,  
  79.     m3_stb_i, m3_ack_o, m3_err_o, m3_rty_o, m3_cab_i,  
  80.   
  81.     // Master 4 Interface  
  82.     m4_dat_i, m4_dat_o, m4_adr_i, m4_sel_i, m4_we_i, m4_cyc_i,  
  83.     m4_stb_i, m4_ack_o, m4_err_o, m4_rty_o, m4_cab_i,  
  84.   
  85.     // Master 5 Interface  
  86.     m5_dat_i, m5_dat_o, m5_adr_i, m5_sel_i, m5_we_i, m5_cyc_i,  
  87.     m5_stb_i, m5_ack_o, m5_err_o, m5_rty_o, m5_cab_i,  
  88.   
  89.     // Master 6 Interface  
  90.     m6_dat_i, m6_dat_o, m6_adr_i, m6_sel_i, m6_we_i, m6_cyc_i,  
  91.     m6_stb_i, m6_ack_o, m6_err_o, m6_rty_o, m6_cab_i,  
  92.   
  93.     // Master 7 Interface  
  94.     m7_dat_i, m7_dat_o, m7_adr_i, m7_sel_i, m7_we_i, m7_cyc_i,  
  95.     m7_stb_i, m7_ack_o, m7_err_o, m7_rty_o, m7_cab_i,  
  96.   
  97.     // Slave 0 Interface  
  98.     s0_dat_i, s0_dat_o, s0_adr_o, s0_sel_o, s0_we_o, s0_cyc_o,  
  99.     s0_stb_o, s0_ack_i, s0_err_i, s0_rty_i, s0_cab_o,  
  100.   
  101.     // Slave 1 Interface  
  102.     s1_dat_i, s1_dat_o, s1_adr_o, s1_sel_o, s1_we_o, s1_cyc_o,  
  103.     s1_stb_o, s1_ack_i, s1_err_i, s1_rty_i, s1_cab_o,  
  104.   
  105.     // Slave 2 Interface  
  106.     s2_dat_i, s2_dat_o, s2_adr_o, s2_sel_o, s2_we_o, s2_cyc_o,  
  107.     s2_stb_o, s2_ack_i, s2_err_i, s2_rty_i, s2_cab_o,  
  108.   
  109.     // Slave 3 Interface  
  110.     s3_dat_i, s3_dat_o, s3_adr_o, s3_sel_o, s3_we_o, s3_cyc_o,  
  111.     s3_stb_o, s3_ack_i, s3_err_i, s3_rty_i, s3_cab_o,  
  112.   
  113.     // Slave 4 Interface  
  114.     s4_dat_i, s4_dat_o, s4_adr_o, s4_sel_o, s4_we_o, s4_cyc_o,  
  115.     s4_stb_o, s4_ack_i, s4_err_i, s4_rty_i, s4_cab_o,  
  116.   
  117.     // Slave 5 Interface  
  118.     s5_dat_i, s5_dat_o, s5_adr_o, s5_sel_o, s5_we_o, s5_cyc_o,  
  119.     s5_stb_o, s5_ack_i, s5_err_i, s5_rty_i, s5_cab_o,  
  120.   
  121.     // Slave 6 Interface  
  122.     s6_dat_i, s6_dat_o, s6_adr_o, s6_sel_o, s6_we_o, s6_cyc_o,  
  123.     s6_stb_o, s6_ack_i, s6_err_i, s6_rty_i, s6_cab_o,  
  124.   
  125.     // Slave 7 Interface  
  126.     s7_dat_i, s7_dat_o, s7_adr_o, s7_sel_o, s7_we_o, s7_cyc_o,  
  127.     s7_stb_o, s7_ack_i, s7_err_i, s7_rty_i, s7_cab_o  
  128.   
  129.     );  
  130.   
  131. ////////////////////////////////////////////////////////////////////  
  132. //  
  133. // Module Parameters  
  134. //  
  135.   
  136.   
  137. parameter       s0_addr_w = 4 ;         // slave 0 address decode width  
  138. parameter       s0_addr = 4'h0;         // slave 0 address  
  139. parameter       s1_addr_w = 4 ;         // slave 1 address decode width  
  140. parameter       s1_addr = 4'h1;         // slave 1 address   
  141. parameter       s27_addr_w = 8 ;        // slave 2 to slave 7 address decode width  
  142. parameter       s2_addr = 8'h92;        // slave 2 address  
  143. parameter       s3_addr = 8'h93;        // slave 3 address  
  144. parameter       s4_addr = 8'h94;        // slave 4 address  
  145. parameter       s5_addr = 8'h95;        // slave 5 address  
  146. parameter       s6_addr = 8'h96;        // slave 6 address  
  147. parameter       s7_addr = 8'h97;        // slave 7 address  
  148.   
  149.   
  150. ////////////////////////////////////////////////////////////////////  
  151. //  
  152. // Module IOs  
  153. //  
  154.   
  155. input       clk_i, rst_i;  
  156.   
  157. // Master 0 Interface  
  158. input   [`dw-1:0]   m0_dat_i;  
  159. output  [`dw-1:0]   m0_dat_o;  
  160. input   [`aw-1:0]   m0_adr_i;  
  161. input   [`sw-1:0]   m0_sel_i;  
  162. input           m0_we_i;  
  163. input           m0_cyc_i;  
  164. input           m0_stb_i;  
  165. input           m0_cab_i;  
  166. output          m0_ack_o;  
  167. output          m0_err_o;  
  168. output          m0_rty_o;  
  169.   
  170. // Master 1 Interface  
  171. input   [`dw-1:0]   m1_dat_i;  
  172. output  [`dw-1:0]   m1_dat_o;  
  173. input   [`aw-1:0]   m1_adr_i;  
  174. input   [`sw-1:0]   m1_sel_i;  
  175. input           m1_we_i;  
  176. input           m1_cyc_i;  
  177. input           m1_stb_i;  
  178. input           m1_cab_i;  
  179. output          m1_ack_o;  
  180. output          m1_err_o;  
  181. output          m1_rty_o;  
  182.   
  183. // Master 2 Interface  
  184. input   [`dw-1:0]   m2_dat_i;  
  185. output  [`dw-1:0]   m2_dat_o;  
  186. input   [`aw-1:0]   m2_adr_i;  
  187. input   [`sw-1:0]   m2_sel_i;  
  188. input           m2_we_i;  
  189. input           m2_cyc_i;  
  190. input           m2_stb_i;  
  191. input           m2_cab_i;  
  192. output          m2_ack_o;  
  193. output          m2_err_o;  
  194. output          m2_rty_o;  
  195.   
  196. // Master 3 Interface  
  197. input   [`dw-1:0]   m3_dat_i;  
  198. output  [`dw-1:0]   m3_dat_o;  
  199. input   [`aw-1:0]   m3_adr_i;  
  200. input   [`sw-1:0]   m3_sel_i;  
  201. input           m3_we_i;  
  202. input           m3_cyc_i;  
  203. input           m3_stb_i;  
  204. input           m3_cab_i;  
  205. output          m3_ack_o;  
  206. output          m3_err_o;  
  207. output          m3_rty_o;  
  208.   
  209. // Master 4 Interface  
  210. input   [`dw-1:0]   m4_dat_i;  
  211. output  [`dw-1:0]   m4_dat_o;  
  212. input   [`aw-1:0]   m4_adr_i;  
  213. input   [`sw-1:0]   m4_sel_i;  
  214. input           m4_we_i;  
  215. input           m4_cyc_i;  
  216. input           m4_stb_i;  
  217. input           m4_cab_i;  
  218. output          m4_ack_o;  
  219. output          m4_err_o;  
  220. output          m4_rty_o;  
  221.   
  222. // Master 5 Interface  
  223. input   [`dw-1:0]   m5_dat_i;  
  224. output  [`dw-1:0]   m5_dat_o;  
  225. input   [`aw-1:0]   m5_adr_i;  
  226. input   [`sw-1:0]   m5_sel_i;  
  227. input           m5_we_i;  
  228. input           m5_cyc_i;  
  229. input           m5_stb_i;  
  230. input           m5_cab_i;  
  231. output          m5_ack_o;  
  232. output          m5_err_o;  
  233. output          m5_rty_o;  
  234.   
  235. // Master 6 Interface  
  236. input   [`dw-1:0]   m6_dat_i;  
  237. output  [`dw-1:0]   m6_dat_o;  
  238. input   [`aw-1:0]   m6_adr_i;  
  239. input   [`sw-1:0]   m6_sel_i;  
  240. input           m6_we_i;  
  241. input           m6_cyc_i;  
  242. input           m6_stb_i;  
  243. input           m6_cab_i;  
  244. output          m6_ack_o;  
  245. output          m6_err_o;  
  246. output          m6_rty_o;  
  247.   
  248. // Master 7 Interface  
  249. input   [`dw-1:0]   m7_dat_i;  
  250. output  [`dw-1:0]   m7_dat_o;  
  251. input   [`aw-1:0]   m7_adr_i;  
  252. input   [`sw-1:0]   m7_sel_i;  
  253. input           m7_we_i;  
  254. input           m7_cyc_i;  
  255. input           m7_stb_i;  
  256. input           m7_cab_i;  
  257. output          m7_ack_o;  
  258. output          m7_err_o;  
  259. output          m7_rty_o;  
  260.   
  261. // Slave 0 Interface  
  262. input   [`dw-1:0]   s0_dat_i;  
  263. output  [`dw-1:0]   s0_dat_o;  
  264. output  [`aw-1:0]   s0_adr_o;  
  265. output  [`sw-1:0]   s0_sel_o;  
  266. output          s0_we_o;  
  267. output          s0_cyc_o;  
  268. output          s0_stb_o;  
  269. output          s0_cab_o;  
  270. input           s0_ack_i;  
  271. input           s0_err_i;  
  272. input           s0_rty_i;  
  273.   
  274. // Slave 1 Interface  
  275. output  [`aw-1:0]   s1_adr_o;  
  276. input   [`dw-1:0]   s1_dat_i;  
  277. output  [`dw-1:0]   s1_dat_o;  
  278. output  [`sw-1:0]   s1_sel_o;  
  279. output          s1_we_o;  
  280. output          s1_cyc_o;  
  281. output          s1_stb_o;  
  282. output          s1_cab_o;  
  283. input           s1_ack_i;  
  284. input           s1_err_i;  
  285. input           s1_rty_i;  
  286.   
  287. // Slave 2 Interface  
  288. input   [`dw-1:0]   s2_dat_i;  
  289. output  [`dw-1:0]   s2_dat_o;  
  290. output  [`aw-1:0]   s2_adr_o;  
  291. output  [`sw-1:0]   s2_sel_o;  
  292. output          s2_we_o;  
  293. output          s2_cyc_o;  
  294. output          s2_stb_o;  
  295. output          s2_cab_o;  
  296. input           s2_ack_i;  
  297. input           s2_err_i;  
  298. input           s2_rty_i;  
  299.   
  300. // Slave 3 Interface  
  301. input   [`dw-1:0]   s3_dat_i;  
  302. output  [`dw-1:0]   s3_dat_o;  
  303. output  [`aw-1:0]   s3_adr_o;  
  304. output  [`sw-1:0]   s3_sel_o;  
  305. output          s3_we_o;  
  306. output          s3_cyc_o;  
  307. output          s3_stb_o;  
  308. output          s3_cab_o;  
  309. input           s3_ack_i;  
  310. input           s3_err_i;  
  311. input           s3_rty_i;  
  312.   
  313. // Slave 4 Interface  
  314. input   [`dw-1:0]   s4_dat_i;  
  315. output  [`dw-1:0]   s4_dat_o;  
  316. output  [`aw-1:0]   s4_adr_o;  
  317. output  [`sw-1:0]   s4_sel_o;  
  318. output          s4_we_o;  
  319. output          s4_cyc_o;  
  320. output          s4_stb_o;  
  321. output          s4_cab_o;  
  322. input           s4_ack_i;  
  323. input           s4_err_i;  
  324. input           s4_rty_i;  
  325.   
  326. // Slave 5 Interface  
  327. input   [`dw-1:0]   s5_dat_i;  
  328. output  [`dw-1:0]   s5_dat_o;  
  329. output  [`aw-1:0]   s5_adr_o;  
  330. output  [`sw-1:0]   s5_sel_o;  
  331. output          s5_we_o;  
  332. output          s5_cyc_o;  
  333. output          s5_stb_o;  
  334. output          s5_cab_o;  
  335. input           s5_ack_i;  
  336. input           s5_err_i;  
  337. input           s5_rty_i;  
  338.   
  339. // Slave 6 Interface  
  340. input   [`dw-1:0]   s6_dat_i;  
  341. output  [`dw-1:0]   s6_dat_o;  
  342. output  [`aw-1:0]   s6_adr_o;  
  343. output  [`sw-1:0]   s6_sel_o;  
  344. output          s6_we_o;  
  345. output          s6_cyc_o;  
  346. output          s6_stb_o;  
  347. output          s6_cab_o;  
  348. input           s6_ack_i;  
  349. input           s6_err_i;  
  350. input           s6_rty_i;  
  351.   
  352. // Slave 7 Interface  
  353. input   [`dw-1:0]   s7_dat_i;  
  354. output  [`dw-1:0]   s7_dat_o;  
  355. output  [`aw-1:0]   s7_adr_o;  
  356. output  [`sw-1:0]   s7_sel_o;  
  357. output          s7_we_o;  
  358. output          s7_cyc_o;  
  359. output          s7_stb_o;  
  360. output          s7_cab_o;  
  361. input           s7_ack_i;  
  362. input           s7_err_i;  
  363. input           s7_rty_i;  
  364.   
  365.   
  366. ////////////////////////////////////////////////////////////////////  
  367. //  
  368. // Local wires  
  369. //  
  370.   
  371. wire    [`mselectw -1:0]    i_gnt_arb;  
  372. wire    [2:0]   gnt;  
  373. reg [`sselectw -1:0]    i_ssel_dec;  
  374. `ifdef  WB_USE_TRISTATE  
  375. wire    [`mbusw -1:0]   i_bus_m;  
  376. `else  
  377. reg     [`mbusw -1:0]   i_bus_m;        // internal share bus, master data and control to slave  
  378. `endif  
  379. wire        [`dw -1:0]      i_dat_s;    // internal share bus , slave data to master  
  380. wire    [`sbusw -1:0]   i_bus_s;            // internal share bus , slave control to master  
  381.   
  382.   
  383.   
  384. ////////////////////////////////////////////////////////////////////  
  385. //  
  386. // Master output Interfaces  
  387. //  
  388.   
  389. // master0  
  390. assign  m0_dat_o = i_dat_s;  
  391. assign  {m0_ack_o, m0_err_o, m0_rty_o} = i_bus_s & {3{i_gnt_arb[0]}};  
  392.   
  393. // master1  
  394. assign  m1_dat_o = i_dat_s;  
  395. assign  {m1_ack_o, m1_err_o, m1_rty_o} = i_bus_s & {3{i_gnt_arb[1]}};  
  396.   
  397. // master2  
  398.   
  399. assign  m2_dat_o = i_dat_s;  
  400. assign  {m2_ack_o, m2_err_o, m2_rty_o} = i_bus_s & {3{i_gnt_arb[2]}};  
  401.   
  402. // master3  
  403.   
  404. assign  m3_dat_o = i_dat_s;  
  405. assign  {m3_ack_o, m3_err_o, m3_rty_o} = i_bus_s & {3{i_gnt_arb[3]}};  
  406.   
  407. // master4  
  408.   
  409. assign  m4_dat_o = i_dat_s;  
  410. assign  {m4_ack_o, m4_err_o, m4_rty_o} = i_bus_s & {3{i_gnt_arb[4]}};  
  411.   
  412. // master5  
  413.   
  414. assign  m5_dat_o = i_dat_s;  
  415. assign  {m5_ack_o, m5_err_o, m5_rty_o} = i_bus_s & {3{i_gnt_arb[5]}};  
  416.   
  417. // master6  
  418.   
  419. assign  m6_dat_o = i_dat_s;  
  420. assign  {m6_ack_o, m6_err_o, m6_rty_o} = i_bus_s & {3{i_gnt_arb[6]}};  
  421.   
  422. // master7  
  423.   
  424. assign  m7_dat_o = i_dat_s;  
  425. assign  {m7_ack_o, m7_err_o, m7_rty_o} = i_bus_s & {3{i_gnt_arb[7]}};  
  426.   
  427.   
  428. assign  i_bus_s = {s0_ack_i | s1_ack_i | s2_ack_i | s3_ack_i | s4_ack_i | s5_ack_i | s6_ack_i | s7_ack_i ,  
  429.                    s0_err_i | s1_err_i | s2_err_i | s3_err_i | s4_err_i | s5_err_i | s6_err_i | s7_err_i ,  
  430.                    s0_rty_i | s1_rty_i | s2_rty_i | s3_rty_i | s4_rty_i | s5_rty_i | s6_rty_i | s7_rty_i };  
  431.   
  432. ////////////////////////////////  
  433. //  Slave output interface  
  434. //  
  435. // slave0  
  436. assign  {s0_adr_o, s0_sel_o, s0_dat_o, s0_we_o, s0_cab_o,s0_cyc_o} = i_bus_m[`mbusw -1:1];  
  437. assign  s0_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[0];  // stb_o = cyc_i & stb_i & i_ssel_dec  
  438.   
  439. // slave1  
  440.   
  441. assign  {s1_adr_o, s1_sel_o, s1_dat_o, s1_we_o, s1_cab_o, s1_cyc_o} = i_bus_m[`mbusw -1:1];  
  442. assign  s1_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[1];  
  443.   
  444. // slave2  
  445.   
  446. assign  {s2_adr_o, s2_sel_o, s2_dat_o, s2_we_o, s2_cab_o, s2_cyc_o} = i_bus_m[`mbusw -1:1];  
  447. assign  s2_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[2];  
  448.   
  449. // slave3  
  450.   
  451. assign  {s3_adr_o, s3_sel_o, s3_dat_o, s3_we_o, s3_cab_o, s3_cyc_o} = i_bus_m[`mbusw -1:1];  
  452. assign  s3_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[3];  
  453.   
  454. // slave4  
  455.   
  456. assign  {s4_adr_o, s4_sel_o, s4_dat_o, s4_we_o, s4_cab_o, s4_cyc_o} = i_bus_m[`mbusw -1:1];  
  457. assign  s4_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[4];  
  458.   
  459. // slave5  
  460.   
  461. assign  {s5_adr_o, s5_sel_o, s5_dat_o, s5_we_o, s5_cab_o, s5_cyc_o} = i_bus_m[`mbusw -1:1];  
  462. assign  s5_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[5];  
  463.   
  464. // slave6  
  465.   
  466. assign  {s6_adr_o, s6_sel_o, s6_dat_o, s6_we_o, s6_cab_o, s6_cyc_o} = i_bus_m[`mbusw -1:1];  
  467. assign  s6_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[6];  
  468.   
  469. // slave7  
  470.   
  471. assign  {s7_adr_o, s7_sel_o, s7_dat_o, s7_we_o, s7_cab_o, s7_cyc_o} = i_bus_m[`mbusw -1:1];  
  472. assign  s7_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[7];  
  473.   
  474. ///////////////////////////////////////  
  475. //  Master and Slave input interface  
  476. //  
  477.   
  478. `ifdef  WB_USE_TRISTATE  
  479. // input from master interface  
  480. assign  i_bus_m = i_gnt_arb[0] ? {m0_adr_i, m0_sel_i, m0_dat_i, m0_we_i, m0_cab_i, m0_cyc_i, m0_stb_i} : 72'bz ;  
  481. assign  i_bus_m = i_gnt_arb[1] ? {m1_adr_i, m1_sel_i, m1_dat_i, m1_we_i, m1_cab_i,m1_cyc_i, m1_stb_i} : 72'bz ;  
  482. assign  i_bus_m = i_gnt_arb[2] ? {m2_adr_i, m2_sel_i, m2_dat_i,  m2_we_i, m2_cab_i, m2_cyc_i, m2_stb_i} : 72'bz ;  
  483. assign  i_bus_m = i_gnt_arb[3] ? {m3_adr_i, m3_sel_i, m3_dat_i,  m3_we_i, m3_cab_i, m3_cyc_i, m3_stb_i} : 72'bz ;  
  484. assign  i_bus_m = i_gnt_arb[4] ? {m4_adr_i, m4_sel_i, m4_dat_i,  m4_we_i, m4_cab_i, m4_cyc_i, m4_stb_i} : 72'bz ;  
  485. assign  i_bus_m = i_gnt_arb[5] ? {m5_adr_i, m5_sel_i, m5_dat_i, m5_we_i, m5_cab_i, m5_cyc_i,  m5_stb_i} : 72'bz ;  
  486. assign  i_bus_m = i_gnt_arb[6] ? {m6_adr_i, m6_sel_i, m6_dat_i, m6_we_i, m6_cab_i, m6_cyc_i, m6_stb_i} : 72'bz ;  
  487. assign  i_bus_m = i_gnt_arb[7] ? {m7_adr_i, m7_sel_i, m7_dat_i, m7_we_i, m7_cab_i, m7_cyc_i,m7_stb_i} : 72'bz ;  
  488. // input from slave interface  
  489. assign  i_dat_s = i_ssel_dec[0] ? s0_dat_i: 32'bz;  
  490. assign  i_dat_s = i_ssel_dec[1] ? s1_dat_i: 32'bz;  
  491. assign  i_dat_s = i_ssel_dec[2] ? s2_dat_i: 32'bz;  
  492. assign  i_dat_s = i_ssel_dec[3] ? s3_dat_i: 32'bz;  
  493. assign  i_dat_s = i_ssel_dec[4] ? s4_dat_i: 32'bz;  
  494. assign  i_dat_s = i_ssel_dec[5] ? s5_dat_i: 32'bz;  
  495. assign  i_dat_s = i_ssel_dec[6] ? s6_dat_i: 32'bz;  
  496. assign  i_dat_s = i_ssel_dec[7] ? s7_dat_i: 32'bz;  
  497.   
  498. `else  
  499.   
  500. always @(gnt , m0_adr_i, m0_sel_i, m0_dat_i, m0_we_i, m0_cab_i, m0_cyc_i,m0_stb_i,  
  501.         m1_adr_i, m1_sel_i, m1_dat_i, m1_we_i, m1_cab_i, m1_cyc_i,m1_stb_i,  
  502.         m2_adr_i, m2_sel_i, m2_dat_i, m2_we_i, m2_cab_i, m2_cyc_i,m2_stb_i,  
  503.         m3_adr_i, m3_sel_i, m3_dat_i, m3_we_i, m3_cab_i, m3_cyc_i,m3_stb_i,  
  504.         m4_adr_i, m4_sel_i, m4_dat_i, m4_we_i, m4_cab_i, m4_cyc_i,m4_stb_i,  
  505.         m5_adr_i, m5_sel_i, m5_dat_i, m5_we_i, m5_cab_i, m5_cyc_i,m5_stb_i,  
  506.         m6_adr_i, m6_sel_i, m6_dat_i, m6_we_i, m6_cab_i, m6_cyc_i,m6_stb_i,  
  507.         m7_adr_i, m7_sel_i, m7_dat_i, m7_we_i, m7_cab_i, m7_cyc_i,m7_stb_i)  
  508.         case(gnt)  
  509.             3'h0:   i_bus_m = {m0_adr_i, m0_sel_i, m0_dat_i, m0_we_i, m0_cab_i, m0_cyc_i,m0_stb_i};  
  510.             3'h1:   i_bus_m = {m1_adr_i, m1_sel_i, m1_dat_i, m1_we_i, m1_cab_i, m1_cyc_i,m1_stb_i};  
  511.             3'h2:   i_bus_m = {m2_adr_i, m2_sel_i, m2_dat_i, m2_we_i, m2_cab_i, m2_cyc_i,m2_stb_i};  
  512.             3'h3:   i_bus_m = {m3_adr_i, m3_sel_i, m3_dat_i, m3_we_i, m3_cab_i, m3_cyc_i,m3_stb_i};  
  513.             3'h4:   i_bus_m = {m4_adr_i, m4_sel_i, m4_dat_i, m4_we_i, m4_cab_i, m4_cyc_i,m4_stb_i};  
  514.             3'h5:   i_bus_m = {m5_adr_i, m5_sel_i, m5_dat_i, m5_we_i, m5_cab_i, m5_cyc_i,m5_stb_i};  
  515.             3'h6:   i_bus_m = {m6_adr_i, m6_sel_i, m6_dat_i, m6_we_i, m6_cab_i, m6_cyc_i,m6_stb_i};  
  516.             3'h7:   i_bus_m = {m7_adr_i, m7_sel_i, m7_dat_i, m7_we_i, m7_cab_i, m7_cyc_i,m7_stb_i};  
  517.             default:i_bus_m =  72'b0;//{m0_adr_i, m0_sel_i, m0_dat_i, m0_we_i, m0_cab_i, m0_cyc_i,m0_stb_i};  
  518. endcase           
  519.   
  520. assign  i_dat_s = i_ssel_dec[0] ? s0_dat_i :  
  521.                   i_ssel_dec[1] ? s1_dat_i :  
  522.                   i_ssel_dec[2] ? s2_dat_i :  
  523.                   i_ssel_dec[3] ? s3_dat_i :  
  524.                   i_ssel_dec[4] ? s4_dat_i :  
  525.                   i_ssel_dec[5] ? s5_dat_i :  
  526.                   i_ssel_dec[6] ? s6_dat_i :  
  527.                   i_ssel_dec[7] ? s7_dat_i : {`dw{1'b0}};   
  528. `endif  
  529. //  
  530. // arbitor   
  531. //  
  532. assign i_gnt_arb[0] = (gnt == 3'd0);  
  533. assign i_gnt_arb[1] = (gnt == 3'd1);  
  534. assign i_gnt_arb[2] = (gnt == 3'd2);  
  535. assign i_gnt_arb[3] = (gnt == 3'd3);  
  536. assign i_gnt_arb[4] = (gnt == 3'd4);  
  537. assign i_gnt_arb[5] = (gnt == 3'd5);  
  538. assign i_gnt_arb[6] = (gnt == 3'd6);  
  539. assign i_gnt_arb[7] = (gnt == 3'd7);  
  540.   
  541. wb_conbus_arb   wb_conbus_arb(  
  542.     .clk(clk_i),   
  543.     .rst(rst_i),  
  544.     .req({  m7_cyc_i,  
  545.         m6_cyc_i,  
  546.         m5_cyc_i,  
  547.         m4_cyc_i,  
  548.         m3_cyc_i,  
  549.         m2_cyc_i,  
  550.         m1_cyc_i,  
  551.         m0_cyc_i}),  
  552.     .gnt(gnt)  
  553. );  
  554.   
  555. //////////////////////////////////  
  556. //      address decode logic  
  557. //  
  558. wire [7:0]  m0_ssel_dec, m1_ssel_dec, m2_ssel_dec, m3_ssel_dec, m4_ssel_dec, m5_ssel_dec, m6_ssel_dec, m7_ssel_dec;  
  559. always @(gnt, m0_ssel_dec, m1_ssel_dec, m2_ssel_dec, m3_ssel_dec, m4_ssel_dec, m5_ssel_dec, m6_ssel_dec, m7_ssel_dec)  
  560.     case(gnt)  
  561.         3'h0: i_ssel_dec = m0_ssel_dec;  
  562.         3'h1: i_ssel_dec = m1_ssel_dec;  
  563.         3'h2: i_ssel_dec = m2_ssel_dec;  
  564.         3'h3: i_ssel_dec = m3_ssel_dec;  
  565.         3'h4: i_ssel_dec = m4_ssel_dec;  
  566.         3'h5: i_ssel_dec = m5_ssel_dec;  
  567.         3'h6: i_ssel_dec = m6_ssel_dec;  
  568.         3'h7: i_ssel_dec = m7_ssel_dec;  
  569.         default: i_ssel_dec = 7'b0;  
  570. endcase  
  571. //  
  572. //  decode all master address before arbitor for running faster  
  573. //    
  574. assign m0_ssel_dec[0] = (m0_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);  
  575. assign m0_ssel_dec[1] = (m0_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);  
  576. assign m0_ssel_dec[2] = (m0_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);  
  577. assign m0_ssel_dec[3] = (m0_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);  
  578. assign m0_ssel_dec[4] = (m0_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);  
  579. assign m0_ssel_dec[5] = (m0_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);  
  580. assign m0_ssel_dec[6] = (m0_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);  
  581. assign m0_ssel_dec[7] = (m0_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);  
  582.   
  583. assign m1_ssel_dec[0] = (m1_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);  
  584. assign m1_ssel_dec[1] = (m1_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);  
  585. assign m1_ssel_dec[2] = (m1_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);  
  586. assign m1_ssel_dec[3] = (m1_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);  
  587. assign m1_ssel_dec[4] = (m1_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);  
  588. assign m1_ssel_dec[5] = (m1_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);  
  589. assign m1_ssel_dec[6] = (m1_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);  
  590. assign m1_ssel_dec[7] = (m1_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);  
  591.   
  592. assign m2_ssel_dec[0] = (m2_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);  
  593. assign m2_ssel_dec[1] = (m2_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);  
  594. assign m2_ssel_dec[2] = (m2_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);  
  595. assign m2_ssel_dec[3] = (m2_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);  
  596. assign m2_ssel_dec[4] = (m2_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);  
  597. assign m2_ssel_dec[5] = (m2_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);  
  598. assign m2_ssel_dec[6] = (m2_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);  
  599. assign m2_ssel_dec[7] = (m2_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);  
  600.   
  601. assign m3_ssel_dec[0] = (m3_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);  
  602. assign m3_ssel_dec[1] = (m3_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);  
  603. assign m3_ssel_dec[2] = (m3_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);  
  604. assign m3_ssel_dec[3] = (m3_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);  
  605. assign m3_ssel_dec[4] = (m3_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);  
  606. assign m3_ssel_dec[5] = (m3_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);  
  607. assign m3_ssel_dec[6] = (m3_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);  
  608. assign m3_ssel_dec[7] = (m3_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);  
  609.   
  610. assign m4_ssel_dec[0] = (m4_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);  
  611. assign m4_ssel_dec[1] = (m4_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);  
  612. assign m4_ssel_dec[2] = (m4_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);  
  613. assign m4_ssel_dec[3] = (m4_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);  
  614. assign m4_ssel_dec[4] = (m4_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);  
  615. assign m4_ssel_dec[5] = (m4_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);  
  616. assign m4_ssel_dec[6] = (m4_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);  
  617. assign m4_ssel_dec[7] = (m4_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);  
  618.   
  619. assign m5_ssel_dec[0] = (m5_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);  
  620. assign m5_ssel_dec[1] = (m5_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);  
  621. assign m5_ssel_dec[2] = (m5_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);  
  622. assign m5_ssel_dec[3] = (m5_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);  
  623. assign m5_ssel_dec[4] = (m5_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);  
  624. assign m5_ssel_dec[5] = (m5_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);  
  625. assign m5_ssel_dec[6] = (m5_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);  
  626. assign m5_ssel_dec[7] = (m5_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);  
  627.   
  628. assign m6_ssel_dec[0] = (m6_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);  
  629. assign m6_ssel_dec[1] = (m6_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);  
  630. assign m6_ssel_dec[2] = (m6_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);  
  631. assign m6_ssel_dec[3] = (m6_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);  
  632. assign m6_ssel_dec[4] = (m6_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);  
  633. assign m6_ssel_dec[5] = (m6_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);  
  634. assign m6_ssel_dec[6] = (m6_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);  
  635. assign m6_ssel_dec[7] = (m6_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);  
  636.   
  637. assign m7_ssel_dec[0] = (m7_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);  
  638. assign m7_ssel_dec[1] = (m7_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);  
  639. assign m7_ssel_dec[2] = (m7_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);  
  640. assign m7_ssel_dec[3] = (m7_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);  
  641. assign m7_ssel_dec[4] = (m7_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);  
  642. assign m7_ssel_dec[5] = (m7_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);  
  643. assign m7_ssel_dec[6] = (m7_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);  
  644. assign m7_ssel_dec[7] = (m7_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);  
  645.   
  646. //assign i_ssel_dec[0] = (i_bus_m[`mbusw -1 : `mbusw - s0_addr_w ] == s0_addr);  
  647. //assign i_ssel_dec[1] = (i_bus_m[`mbusw -1 : `mbusw - s1_addr_w ] == s1_addr);  
  648. //assign i_ssel_dec[2] = (i_bus_m[`mbusw -1 : `mbusw - s27_addr_w ] == s2_addr);  
  649. //assign i_ssel_dec[3] = (i_bus_m[`mbusw -1 : `mbusw - s27_addr_w ] == s3_addr);  
  650. //assign i_ssel_dec[4] = (i_bus_m[`mbusw -1 : `mbusw - s27_addr_w ] == s4_addr);  
  651. //assign i_ssel_dec[5] = (i_bus_m[`mbusw -1 : `mbusw - s27_addr_w ] == s5_addr);  
  652. //assign i_ssel_dec[6] = (i_bus_m[`mbusw -1 : `mbusw - s27_addr_w ] == s6_addr);  
  653. //assign i_ssel_dec[7] = (i_bus_m[`mbusw -1 : `mbusw - s27_addr_w ] == s7_addr);  
  654.   
  655. always @(m0_ssel_dec,s1_dat_o)  
  656. $display("top model time: %t mo_ssel_dec: %b s1_data_in:%h",$realtime,m0_ssel_dec,s1_dat_o);  
  657. endmodule  
  658.   
  659. </pre><br>  
  660. <pre> </pre>  
  661. <pre> </pre>  
  662. <pre> </pre>  
  663. <pre> </pre>  
  664. <pre> </pre>  
  665. <pre>//=====================================================================</pre>  
  666. <pre> </pre>  
  667. <pre> </pre>  
  668. <pre> </pre>  
  669. <pre> </pre>  
  670. <p> </p>  
  671. <p>4>bus arbiter</p>  
  672. <pre class="html" name="code">/////////////////////////////////////////////////////////////////////  
  673. ////                                                             ////  
  674. ////  General Round Robin Arbiter                                ////  
  675. ////                                                             ////  
  676. ////                                                             ////  
  677. ////  Author: Rudolf Usselmann                                   ////  
  678. ////          rudi@asics.ws                                      ////  
  679. ////                                                             ////  
  680. ////                                                             ////  
  681. ////  Downloaded from: http://www.opencores.org/cores/wb_conmax/ ////  
  682. ////                                                             ////  
  683. /////////////////////////////////////////////////////////////////////  
  684. ////                                                             ////  
  685. //// Copyright (C) 2000-2002 Rudolf Usselmann                    ////  
  686. ////                         www.asics.ws                        ////  
  687. ////                         rudi@asics.ws                       ////  
  688. ////                                                             ////  
  689. //// This source file may be used and distributed without        ////  
  690. //// restriction provided that this copyright statement is not   ////  
  691. //// removed from the file and that any derivative work contains ////  
  692. //// the original copyright notice and the associated disclaimer.////  
  693. ////                                                             ////  
  694. ////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////  
  695. //// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////  
  696. //// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////  
  697. //// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////  
  698. //// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////  
  699. //// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////  
  700. //// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////  
  701. //// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////  
  702. //// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////  
  703. //// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////  
  704. //// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////  
  705. //// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////  
  706. //// POSSIBILITY OF SUCH DAMAGE.                                 ////  
  707. ////                                                             ////  
  708. /////////////////////////////////////////////////////////////////////  
  709.   
  710.   
  711. //  
  712. //  copy from wb_conmax  
  713. //  
  714. //  
  715. //  
  716. //  
  717. //                          
  718.   
  719. //`include "wb_conbus_defines.v"  
  720. `timescale 1ns / 10ps  
  721.   
  722. module wb_conbus_arb(clk, rst, req, gnt);  
  723.   
  724. input       clk;  
  725. input       rst;  
  726. input   [7:0]   req;        // Req input  
  727. output  [2:0]   gnt;        // Grant output  
  728. //input     next;       // Next Target  
  729.   
  730. ///////////////////////////////////////////////////////////////////////  
  731. //  
  732. // Parameters  
  733. //  
  734.   
  735.   
  736. parameter   [2:0]  
  737.                 grant0 = 3'h0,  
  738.                 grant1 = 3'h1,  
  739.                 grant2 = 3'h2,  
  740.                 grant3 = 3'h3,  
  741.                 grant4 = 3'h4,  
  742.                 grant5 = 3'h5,  
  743.                 grant6 = 3'h6,  
  744.                 grant7 = 3'h7;  
  745.   
  746. ///////////////////////////////////////////////////////////////////////  
  747. //  
  748. // Local Registers and Wires  
  749. //  
  750.   
  751. reg [2:0]   state, next_state;  
  752.   
  753. ///////////////////////////////////////////////////////////////////////  
  754. //  
  755. //  Misc Logic   
  756. //  
  757.   
  758. assign  gnt = state;  
  759.   
  760. always@(posedge clk or posedge rst)  
  761.     if(rst)     state <= #1 grant0;  
  762.     else        state <= #1 next_state;  
  763.   
  764. ///////////////////////////////////////////////////////////////////////  
  765. //  
  766. // Next State Logic  
  767. //   - implements round robin arbitration algorithm  
  768. //   - switches grant if current req is dropped or next is asserted  
  769. //   - parks at last grant  
  770. //  
  771.   
  772. always@(state or req )  
  773.    begin  
  774.     next_state = state; // Default Keep State  
  775.     case(state)     // synopsys parallel_case full_case  
  776.        grant0:  
  777.         // if this req is dropped or next is asserted, check for other req's  
  778.         if(!req[0] )  
  779.            begin  
  780.             if(req[1])  next_state = grant1;  
  781.             else  
  782.             if(req[2])  next_state = grant2;  
  783.             else  
  784.             if(req[3])  next_state = grant3;  
  785.             else  
  786.             if(req[4])  next_state = grant4;  
  787.             else  
  788.             if(req[5])  next_state = grant5;  
  789.             else  
  790.             if(req[6])  next_state = grant6;  
  791.             else  
  792.             if(req[7])  next_state = grant7;  
  793.            end  
  794.        grant1:  
  795.         // if this req is dropped or next is asserted, check for other req's  
  796.         if(!req[1] )  
  797.            begin  
  798.             if(req[2])  next_state = grant2;  
  799.             else  
  800.             if(req[3])  next_state = grant3;  
  801.             else  
  802.             if(req[4])  next_state = grant4;  
  803.             else  
  804.             if(req[5])  next_state = grant5;  
  805.             else  
  806.             if(req[6])  next_state = grant6;  
  807.             else  
  808.             if(req[7])  next_state = grant7;  
  809.             else  
  810.             if(req[0])  next_state = grant0;  
  811.            end  
  812.        grant2:  
  813.         // if this req is dropped or next is asserted, check for other req's  
  814.         if(!req[2] )  
  815.            begin  
  816.             if(req[3])  next_state = grant3;  
  817.             else  
  818.             if(req[4])  next_state = grant4;  
  819.             else  
  820.             if(req[5])  next_state = grant5;  
  821.             else  
  822.             if(req[6])  next_state = grant6;  
  823.             else  
  824.             if(req[7])  next_state = grant7;  
  825.             else  
  826.             if(req[0])  next_state = grant0;  
  827.             else  
  828.             if(req[1])  next_state = grant1;  
  829.            end  
  830.        grant3:  
  831.         // if this req is dropped or next is asserted, check for other req's  
  832.         if(!req[3] )  
  833.            begin  
  834.             if(req[4])  next_state = grant4;  
  835.             else  
  836.             if(req[5])  next_state = grant5;  
  837.             else  
  838.             if(req[6])  next_state = grant6;  
  839.             else  
  840.             if(req[7])  next_state = grant7;  
  841.             else  
  842.             if(req[0])  next_state = grant0;  
  843.             else  
  844.             if(req[1])  next_state = grant1;  
  845.             else  
  846.             if(req[2])  next_state = grant2;  
  847.            end  
  848.        grant4:  
  849.         // if this req is dropped or next is asserted, check for other req's  
  850.         if(!req[4] )  
  851.            begin  
  852.             if(req[5])  next_state = grant5;  
  853.             else  
  854.             if(req[6])  next_state = grant6;  
  855.             else  
  856.             if(req[7])  next_state = grant7;  
  857.             else  
  858.             if(req[0])  next_state = grant0;  
  859.             else  
  860.             if(req[1])  next_state = grant1;  
  861.             else  
  862.             if(req[2])  next_state = grant2;  
  863.             else  
  864.             if(req[3])  next_state = grant3;  
  865.            end  
  866.        grant5:  
  867.         // if this req is dropped or next is asserted, check for other req's  
  868.         if(!req[5] )  
  869.            begin  
  870.             if(req[6])  next_state = grant6;  
  871.             else  
  872.             if(req[7])  next_state = grant7;  
  873.             else  
  874.             if(req[0])  next_state = grant0;  
  875.             else  
  876.             if(req[1])  next_state = grant1;  
  877.             else  
  878.             if(req[2])  next_state = grant2;  
  879.             else  
  880.             if(req[3])  next_state = grant3;  
  881.             else  
  882.             if(req[4])  next_state = grant4;  
  883.            end  
  884.        grant6:  
  885.         // if this req is dropped or next is asserted, check for other req's  
  886.         if(!req[6] )  
  887.            begin  
  888.             if(req[7])  next_state = grant7;  
  889.             else  
  890.             if(req[0])  next_state = grant0;  
  891.             else  
  892.             if(req[1])  next_state = grant1;  
  893.             else  
  894.             if(req[2])  next_state = grant2;  
  895.             else  
  896.             if(req[3])  next_state = grant3;  
  897.             else  
  898.             if(req[4])  next_state = grant4;  
  899.             else  
  900.             if(req[5])  next_state = grant5;  
  901.            end  
  902.        grant7:  
  903.         // if this req is dropped or next is asserted, check for other req's  
  904.         if(!req[7] )  
  905.            begin  
  906.             if(req[0])  next_state = grant0;  
  907.             else  
  908.             if(req[1])  next_state = grant1;  
  909.             else  
  910.             if(req[2])  next_state = grant2;  
  911.             else  
  912.             if(req[3])  next_state = grant3;  
  913.             else  
  914.             if(req[4])  next_state = grant4;  
  915.             else  
  916.             if(req[5])  next_state = grant5;  
  917.             else  
  918.             if(req[6])  next_state = grant6;  
  919.            end  
  920.     endcase  
  921.    end  
  922.   
  923. endmodule   
  924. </pre><pre class="html" name="code"> </pre><pre class="html" name="code"> </pre><pre class="html" name="code"></pre><p>//==================================================================================================================</p><p> </p><p> </p><p>5>top</p><pre class="html" name="code">/////////////////////////////////////////////////////////////////////  
  925. ////                                                             ////  
  926. ////  Top Level Test Bench                                       ////  
  927. ////                                                             ////  
  928. ////                                                             ////  
  929. ////  Author: Rudolf Usselmann                                   ////  
  930. ////          rudi@asics.ws                                      ////  
  931. ////                                                             ////  
  932. ////                                                             ////  
  933. ////                                                             ////  
  934. /////////////////////////////////////////////////////////////////////  
  935. ////                                                             ////  
  936. //// Copyright (C) 2000-2002 Rudolf Usselmann                    ////  
  937. ////                         www.asics.ws                        ////  
  938. ////                         rudi@asics.ws                       ////  
  939. ////                                                             ////  
  940. //// This source file may be used and distributed without        ////  
  941. //// restriction provided that this copyright statement is not   ////  
  942. //// removed from the file and that any derivative work contains ////  
  943. //// the original copyright notice and the associated disclaimer.////  
  944. ////                                                             ////  
  945. ////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////  
  946. //// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////  
  947. //// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////  
  948. //// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////  
  949. //// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////  
  950. //// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////  
  951. //// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////  
  952. //// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////  
  953. //// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////  
  954. //// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////  
  955. //// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////  
  956. //// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////  
  957. //// POSSIBILITY OF SUCH DAMAGE.                                 ////  
  958. ////                                                             ////  
  959. /////////////////////////////////////////////////////////////////////  
  960.   
  961.   
  962. //  
  963. //  
  964. //  rewrite from test the wb_conbus module  
  965. //  
  966. //  
  967.   
  968.   
  969. //`include "wb_conbus_defines.v"  
  970. `timescale 1ns / 10ps  
  971.   
  972. module tb_wb_conbus;  
  973.   
  974. reg     clk;  
  975. reg     rst;  
  976.   
  977. // IO Prototypes  
  978. wire    [31:0]  m0_data_i;  
  979. wire    [31:0]  m0_data_o;  
  980. wire    [31:0]  m0_addr_i;  
  981. wire    [3:0]   m0_sel_i;  
  982. wire        m0_we_i;  
  983. wire        m0_cyc_i;  
  984. wire        m0_stb_i;  
  985. wire        m0_ack_o;  
  986. wire        m0_err_o;  
  987. wire        m0_rty_o;  
  988.   
  989. wire    [31:0]  s1_data_i;  
  990. wire    [31:0]  s1_data_o;  
  991. wire    [31:0]  s1_addr_o;  
  992. wire    [3:0]   s1_sel_o;  
  993. wire        s1_we_o;  
  994. wire        s1_cyc_o;  
  995. wire        s1_stb_o;  
  996. wire        s1_ack_i;  
  997. wire        s1_err_i;  
  998. wire        s1_rty_i;  
  999.   
  1000.   
  1001. // Test Bench Variables  
  1002. reg [31:0]  wd_cnt;  
  1003. integer     error_cnt;  
  1004. integer     verbose;  
  1005.   
  1006. // Misc Variables  
  1007.   
  1008. /////////////////////////////////////////////////////////////////////  
  1009. //  
  1010. // Defines   
  1011. //  
  1012.   
  1013.   
  1014. /////////////////////////////////////////////////////////////////////  
  1015. //  
  1016. // Simulation Initialization and Start up Section  
  1017. //  
  1018.   
  1019.   
  1020. initial  
  1021.    begin  
  1022.     $timeformat(-9, 1, " ns", 10);  
  1023.   
  1024.     $display("\n\n");  
  1025.     $display("*****************************************************");  
  1026.     $display("* WISHBONE Connection Matrix Simulation started ... *");  
  1027.     $display("*****************************************************");  
  1028.     $display("\n");  
  1029.   
  1030. `ifdef WAVES  
  1031.     $shm_open("waves");  
  1032.     $shm_probe("AS",test,"AS");  
  1033.     $display("INFO: Signal dump enabled ...\n\n");  
  1034. `endif  
  1035.     wd_cnt = 0;  
  1036.     error_cnt = 0;  
  1037.     clk = 1;  
  1038.     rst = 1;  
  1039.     verbose = 1;  
  1040. /*  
  1041.     repeat(5)   @(posedge clk);  
  1042.     s0.delay = 1;  
  1043.     s1.delay = 1;  
  1044.     s2.delay = 1;  
  1045.     s3.delay = 1;  
  1046.     s4.delay = 1;  
  1047.     s5.delay = 1;  
  1048.     s6.delay = 1;  
  1049.     s7.delay = 1;  
  1050. */  
  1051.     #1;  
  1052.     rst = 0;  
  1053.     repeat(5)   @(posedge clk);  
  1054.   
  1055.     // HERE IS WHERE THE TEST CASES GO ...  
  1056.   
  1057. if(1)   // Full Regression Run  
  1058.    begin  
  1059.     $display(" ......................................................");  
  1060.     $display(" :                                                    :");  
  1061.     $display(" :    Regression Run ...                              :");  
  1062.     $display(" :....................................................:");  
  1063.     verbose = 0;  
  1064.   
  1065. //  test_dp1;  
  1066. //  test_rf;  
  1067. //  test_arb1;  
  1068. //  test_arb2;  
  1069. //  test_dp2;  
  1070.    m0.write_numbers(32'h1000_0000,32'h0000_0001,32'h0000_0002);  
  1071.    end  
  1072. else  
  1073. if(1)   // Debug Tests  
  1074.    begin  
  1075.     $display(" ......................................................");  
  1076.     $display(" :                                                    :");  
  1077.     $display(" :    Test Debug Testing ...                          :");  
  1078.     $display(" :....................................................:");  
  1079.   
  1080. //  test_dp2;  
  1081.   
  1082.    end  
  1083.   
  1084. repeat(1000)    @(posedge clk);  
  1085. $finish;  
  1086. end // End of Initial  
  1087.   
  1088. /////////////////////////////////////////////////////////////////////  
  1089. //  
  1090. // Clock Generation  
  1091. //  
  1092.   
  1093. always #5   clk = ~clk;  
  1094.   
  1095. /////////////////////////////////////////////////////////////////////  
  1096. //  
  1097. // Watchdog Counter  
  1098. //  
  1099.   
  1100. always @(posedge clk)  
  1101.     if(m0_ack_o )  
  1102.         wd_cnt = 0;  
  1103.     else  
  1104.         wd_cnt = wd_cnt +1;  
  1105.   
  1106. always @(wd_cnt)  
  1107.     if(wd_cnt > 5000000)  
  1108.        begin  
  1109.         $display("\n*******************************************");  
  1110.         $display("*** ERROR: Watchdog Counter Expired ... ***");  
  1111.         $display("*******************************************\n");  
  1112.         $finish;  
  1113.        end  
  1114.   
  1115. /////////////////////////////////////////////////////////////////////  
  1116. //  
  1117. // IO Monitors  
  1118. //  
  1119.   
  1120. /////////////////////////////////////////////////////////////////////  
  1121. //  
  1122. // WISHBONE Inter Connect  
  1123. //  
  1124.   
  1125. wb_conbus_top   #(4,  
  1126.         4'h0,  
  1127.         4,  
  1128.         4'h1,  
  1129.         4,  
  1130.         4'h2,  
  1131.         4'h3,  
  1132.         4'h4,  
  1133.         4'h5,  
  1134.         4'h6,  
  1135.         4'h7  
  1136.         )  
  1137.         conbus(  
  1138.         .clk_i(     clk     ),  
  1139.         .rst_i(     rst     ),  
  1140.         .m0_dat_i(  m0_data_i   ),  
  1141.         .m0_dat_o(  m0_data_o   ),  
  1142.         .m0_adr_i(  m0_addr_i   ),  
  1143.         .m0_sel_i(  m0_sel_i    ),  
  1144.         .m0_we_i(   m0_we_i     ),  
  1145.         .m0_cyc_i(  m0_cyc_i    ),  
  1146.         .m0_stb_i(  m0_stb_i    ),  
  1147.         .m0_ack_o(  m0_ack_o    ),  
  1148.         .m0_err_o(  m0_err_o    ),  
  1149.         .m0_rty_o(  m0_rty_o    ),   
  1150.           
  1151.         .s1_dat_i(  s1_data_i   ),  
  1152.         .s1_dat_o(  s1_data_o   ),  
  1153.         .s1_adr_o(  s1_addr_o   ),  
  1154.         .s1_sel_o(  s1_sel_o    ),  
  1155.         .s1_we_o(   s1_we_o     ),  
  1156.         .s1_cyc_o(  s1_cyc_o    ),  
  1157.         .s1_stb_o(  s1_stb_o    ),  
  1158.         .s1_ack_i(  s1_ack_i    ),  
  1159.         .s1_err_i(  s1_err_i    ),  
  1160.         .s1_rty_i(  s1_rty_i    )     
  1161.         );  
  1162.   
  1163.   
  1164. /////////////////////////////////////////////////////////////////////  
  1165. //  
  1166. // WISHBONE Master Models  
  1167. //  
  1168.   
  1169. my_master_model m0( .clk(       clk     ),  
  1170.         .rst(       rst     ),  
  1171.         .adr(       m0_addr_i   ),  
  1172.         .din(       m0_data_o   ),  
  1173.         .dout(      m0_data_i   ),  
  1174.         .cyc(       m0_cyc_i    ),  
  1175.         .stb(       m0_stb_i    ),  
  1176.         .sel(       m0_sel_i    ),  
  1177.         .we(        m0_we_i     ),  
  1178.         .ack(       m0_ack_o    ),  
  1179.         .err(       m0_err_o    ),  
  1180.         .rty(       m0_rty_o    )  
  1181.         );  
  1182.   
  1183.   
  1184. /////////////////////////////////////////////////////////////////////  
  1185. //  
  1186. // WISHBONE Slave Models  
  1187. //  
  1188.   
  1189. my_slave_model  s1( .clk(       clk     ),  
  1190.         .rst(       rst     ),  
  1191.         .adr(       s1_addr_o   ),  
  1192.         .din(       s1_data_o   ),  
  1193.         .dout(      s1_data_i   ),  
  1194.         .cyc(       s1_cyc_o    ),  
  1195.         .stb(       s1_stb_o    ),  
  1196.         .sel(       s1_sel_o    ),  
  1197.         .we(        s1_we_o     ),  
  1198.         .ack(       s1_ack_i    ),  
  1199.         .err(       s1_err_i    ),  
  1200.         .rty(       s1_rty_i    )  
  1201.         );  
  1202.   
  1203. //`include "tests.v"  
  1204.   
  1205. endmodule  
  1206. </pre>  
  1207. <p> </p>  
  1208. <pre></pre>  
  1209. <pre></pre>